diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index fb0b2e1171..87f66a0859 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.17
+ OPENRCT2_VERSION: 0.4.18
# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value
concurrency:
@@ -111,21 +111,21 @@ jobs:
echo "certificate=$certificate"
echo "sign=$sign" >> $GITHUB_OUTPUT
echo "certificate=$certificate" >> $GITHUB_OUTPUT
- lint-commit:
- name: Lint Commit Message
- if: github.event_name == 'pull_request'
- runs-on: ubuntu-latest
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- steps:
- - name: Checkout
- uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Lint Commit Messages
- uses: wagoid/commitlint-github-action@v5
- with:
- configFile: .commitlint.json
+ # lint-commit:
+ # name: Lint Commit Message
+ # if: github.event_name == 'pull_request'
+ # runs-on: ubuntu-latest
+ # env:
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ # steps:
+ # - name: Checkout
+ # uses: actions/checkout@v4
+ # with:
+ # fetch-depth: 0
+ # - name: Lint Commit Messages
+ # uses: wagoid/commitlint-github-action@v5
+ # with:
+ # configFile: .commitlint.json
check-code-formatting:
name: Check code formatting
runs-on: ubuntu-latest
@@ -518,16 +518,18 @@ jobs:
linux-docker:
name: Ubuntu Linux (Docker)
needs: [check-code-formatting, build_variables]
- if: github.repository == 'OpenRCT2/OpenRCT2' && github.ref == 'refs/heads/develop'
runs-on: ubuntu-latest
steps:
- name: Checkout image
+ if: github.repository == 'OpenRCT2/OpenRCT2' && github.ref == 'refs/heads/develop'
uses: actions/checkout@v4
with:
repository: OpenRCT2/openrct2-docker
- name: Build image
+ if: github.repository == 'OpenRCT2/OpenRCT2' && github.ref == 'refs/heads/develop'
run: docker build -t openrct2/openrct2-cli:develop develop/cli
- name: Push image
+ if: github.repository == 'OpenRCT2/OpenRCT2' && github.ref == 'refs/heads/develop'
env:
OPENRCT2_DOCKER_USER: ${{ secrets.OPENRCT2_DOCKER_USER }}
OPENRCT2_DOCKER_PASS: ${{ secrets.OPENRCT2_DOCKER_PASS }}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 09cb5d3852..38a7072f10 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -69,9 +69,9 @@ set(TITLE_SEQUENCE_VERSION "0.4.14")
set(TITLE_SEQUENCE_URL "https://github.com/OpenRCT2/title-sequences/releases/download/v${TITLE_SEQUENCE_VERSION}/title-sequences.zip")
set(TITLE_SEQUENCE_SHA1 "6c04781b959b468e1f65ec2d2f21f5aaa5e5724d")
-set(OBJECTS_VERSION "1.4.11")
+set(OBJECTS_VERSION "1.5.0")
set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v${OBJECTS_VERSION}/objects.zip")
-set(OBJECTS_SHA1 "da04330679de2eff53a94a6505802512bfec6403")
+set(OBJECTS_SHA1 "90c26f416ddaeb0c35490b7af89f4c6f9d6351f3")
set(OPENSFX_VERSION "1.0.5")
set(OPENSFX_URL "https://github.com/OpenRCT2/OpenSoundEffects/releases/download/v${OPENSFX_VERSION}/opensound.zip")
@@ -81,9 +81,9 @@ set(OPENMSX_VERSION "1.6")
set(OPENMSX_URL "https://github.com/OpenRCT2/OpenMusic/releases/download/v${OPENMSX_VERSION}/openmusic.zip")
set(OPENMSX_SHA1 "ba170fa6d777b309c15420f4b6eb3fa25082a9d1")
-set(REPLAYS_VERSION "0.0.84")
+set(REPLAYS_VERSION "0.0.85")
set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v${REPLAYS_VERSION}/replays.zip")
-set(REPLAYS_SHA1 "90B848AB344E29A2CF1E3E48539F06F5845772C3")
+set(REPLAYS_SHA1 "2B0939953A41D2CE82809CB7C21FC3883578383F")
option(FORCE32 "Force 32-bit build. It will add `-m32` to compiler flags.")
option(WITH_TESTS "Build tests")
diff --git a/contributors.md b/contributors.md
index 416169021f..a7dfe0ed66 100644
--- a/contributors.md
+++ b/contributors.md
@@ -293,7 +293,7 @@ Appreciation for contributors who have provided substantial work, but are no lon
* Norwegian - Hugo Wallenburg (Goddesen)
* Polish - Adrian Wielgosik (adrian17), (lopezloo), Michał Janiszewski (janisozaur)
* Portuguese (BR) - (kaudy), (renansimoes), Tulio Paschoalin Leao (tupaschoal)
-* Russian - (Soosisya)
+* Russian - (Soosisya), (andOlga)
* Spanish - Josué Acevedo (Wirlie), Diego Mateos (dimateos), (frenchiveruti), (mdtrooper), Daniel Trujillo Viedma (gDanix); small fixes: (teapartycthulu)
* Swedish - (Jinxit), (mharrys), (Slimeyo), Matte Andersson (Nubbie)
* Ukrainian - (CsyeCokTheSolly), (Veydzher), (Saba4ara)
diff --git a/data/language/ar-EG.txt b/data/language/ar-EG.txt
index b280c760da..5f11f02f35 100644
--- a/data/language/ar-EG.txt
+++ b/data/language/ar-EG.txt
@@ -1159,17 +1159,6 @@ STR_1773 :Only one on-ride photo section allowed per ride
STR_1774 :Only one cable lift hill allowed per ride
STR_1777 :موسيقي الرحلة
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume
STR_1790 :Select uniform colour for this type of staff
STR_1791 :{WINDOW_COLOUR_2}Uniform colour:
STR_1792 :Responding to {STRINGID} breakdown call
diff --git a/data/language/ca-ES.txt b/data/language/ca-ES.txt
index 085c541dae..c145721435 100644
--- a/data/language/ca-ES.txt
+++ b/data/language/ca-ES.txt
@@ -1165,17 +1165,6 @@ STR_1773 :Només es permet una secció de fotos de record per atracció.
STR_1774 :Només es permet un cable d’elevació per atracció.
STR_1777 :Música de l’atracció
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Disfressa de panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Disfressa de tigre
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Disfressa d’elefant
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Disfressa de romà
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Disfressa de goril·la
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Disfressa de ninot de neu
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Disfressa de cavaller
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Disfressa d’astronauta
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Disfressa de bandit
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Disfressa de xèrif
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Disfressa de pirata
STR_1790 :Seleccioneu el color de l’uniforme d’aquest tipus d’empleats.
STR_1791 :{WINDOW_COLOUR_2}Color de l’uniforme:
STR_1792 :Responent la trucada d’avaria de {STRINGID}.
diff --git a/data/language/cs-CZ.txt b/data/language/cs-CZ.txt
index ab04e6905e..74dda35372 100644
--- a/data/language/cs-CZ.txt
+++ b/data/language/cs-CZ.txt
@@ -1161,17 +1161,6 @@ STR_1773 :Je povolena jen jedna fotobuňka na atrakci
STR_1774 :Je povolen pouze jeden výtah na atrakci
STR_1777 :Hudba atrakcí
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tygr
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Slon
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Říman
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorila
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Sněhulák
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Rytíř
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Skafandr
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandita
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Šerif
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirát
STR_1790 :Vybrat barvu uniformy těchto zaměstnanců
STR_1791 :{WINDOW_COLOUR_2}Barva uniformy:
STR_1792 :Reaguje na poruchu {STRINGID}
diff --git a/data/language/da-DK.txt b/data/language/da-DK.txt
index 7e6c94baf3..a274e017fc 100644
--- a/data/language/da-DK.txt
+++ b/data/language/da-DK.txt
@@ -1162,17 +1162,6 @@ STR_1773 :Kun en on-ride foto sektion, tilladt per forlystelse
STR_1774 :Kun et trækspil er tilladt per forlystelse.
STR_1777 :Forlystelses musik
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda kostume
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger kostume
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefant kostume
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Gladiator kostume
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla kostume
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snemands kostume
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ridder kostume
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut kostume
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit kostume
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff kostume
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirat kostume
STR_1790 :vælg uniforms farve for denne type personale
STR_1791 :{WINDOW_COLOUR_2}Uniforms farve:
STR_1792 :Reagerer på et kald til {STRINGID} på grund af nedbrud
diff --git a/data/language/de-DE.txt b/data/language/de-DE.txt
index a7a99efc9d..a7e2b19e7e 100644
--- a/data/language/de-DE.txt
+++ b/data/language/de-DE.txt
@@ -1161,17 +1161,6 @@ STR_1773 :Nur ein Fahrtfoto-Bereich pro Bahn erlaubt
STR_1774 :Nur ein Kabellifthügel pro Bahn erlaubt
STR_1777 :Attraktionsmusik
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandakostüm
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigerkostüm
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefantenkostüm
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Römerkostüm
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorillakostüm
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Schneemannkostüm
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ritterkostüm
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenkostüm
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditenkostüm
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostüm
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostüm
STR_1790 :Uniformfarbe für diesen{NEWLINE}Mitarbeiter auswählen
STR_1791 :{WINDOW_COLOUR_2}Uniformfarbe:
STR_1792 :Unterwegs zur Reparatur von {STRINGID}
diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt
index c5acd146ab..af3b4df569 100644
--- a/data/language/en-GB.txt
+++ b/data/language/en-GB.txt
@@ -1164,17 +1164,6 @@ STR_1773 :Only one on-ride photo section allowed per ride
STR_1774 :Only one cable lift hill allowed per ride
STR_1777 :Ride music
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume
STR_1790 :Select uniform colour for this type of staff
STR_1791 :{WINDOW_COLOUR_2}Uniform colour:
STR_1792 :Responding to {STRINGID} breakdown call
@@ -2212,7 +2201,7 @@ STR_3188 :Path Signs
STR_3189 :Legacy footpaths
STR_3190 :Path Extras
STR_3191 :Scenery Groups
-STR_3192 :Park Entrance
+STR_3192 :Park Entrances
STR_3193 :Water
STR_3195 :Invention List
STR_3196 :{WINDOW_COLOUR_2}Research Group: {BLACK}{STRINGID}
@@ -2617,7 +2606,7 @@ STR_5368 :Reset crash status
STR_5371 :Object selection
STR_5372 :Invert right mouse dragging
STR_5373 :Name {STRINGID}
-STR_5374 :Date {STRINGID}
+STR_5374 :Date modified {STRINGID}
STR_5375 :▲
STR_5376 :▼
STR_5404 :Name already exists
@@ -3787,5 +3776,19 @@ STR_6709 :Enter Smooth Strength between {COMMA16} and {COMMA16}
STR_6710 :Stable sort
STR_6711 :Filename:
STR_6712 :Save
-STR_6713 :Export emscripten data
-STR_6714 :Import emscripten data
+STR_6713 :{COMMA32} {STRINGID}
+STR_6714 :Filename
+STR_6715 :Date modified
+STR_6716 :File size
+STR_6717 :File size {STRINGID}
+STR_6718 :Peep Animations
+STR_6719 :At least one guest peep animations object must be selected
+STR_6720 :At least one handyman peep animations object must be selected
+STR_6721 :At least one mechanic peep animations object must be selected
+STR_6722 :At least one security peep animations object must be selected
+STR_6723 :At least one entertainer peep animations object must be selected
+STR_6724 :Scenario Texts
+STR_6725 :X:
+STR_6726 :Y:
+STR_6727 :Export emscripten data
+STR_6728 :Import emscripten data
diff --git a/data/language/eo-ZZ.txt b/data/language/eo-ZZ.txt
index afb04b8417..c60b5efd1f 100644
--- a/data/language/eo-ZZ.txt
+++ b/data/language/eo-ZZ.txt
@@ -1164,17 +1164,6 @@ STR_1773 :Nur unu sur-atrakcia fotoparto estas permesita po atrakcio
STR_1774 :Nur unu kablolifta monteto estas permesita po atrakcio
STR_1777 :Muziko de atrakcio
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandokostumo
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigrokostumo
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefantokostumo
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Romianokostumo
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilokostumo
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Neĝhomokostumo
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Kavalirokostumo
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaŭtokostumo
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditokostumo
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Ŝerifokostumo
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratokostumo
STR_1790 :Elekti uniformkoloron de tiaj dungitoj
STR_1791 :{WINDOW_COLOUR_2}Uniformkoloro:
STR_1792 :Reagas al paneovoko de {STRINGID}
@@ -3783,3 +3772,5 @@ STR_6707 :(neniu elektita)
STR_6708 :Glata forteco
STR_6709 :Entajpu glatan fortecon inter {COMMA16} kaj {COMMA16}
STR_6710 :Stabila ordigo
+STR_6711 :Dosiernomo:
+STR_6712 :Konservi
diff --git a/data/language/es-ES.txt b/data/language/es-ES.txt
index 5774693e4f..5f9b162266 100644
--- a/data/language/es-ES.txt
+++ b/data/language/es-ES.txt
@@ -1161,17 +1161,6 @@ STR_1773 :Sólo se permite una sección de fotos por atracción.
STR_1774 :Sólo un cable de elevación por atracción.
STR_1777 :Música de atracción
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Disfraz de panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Disfraz de tigre
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Disfraz de elefante
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Disfraz de romano
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Disfraz de gorila
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Disfraz de muñeco de nieve
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Disfraz de caballero
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Disfraz de astronauta
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Disfraz de bandido
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Disfraz de sheriff
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Disfraz de pirata
STR_1790 :Selecciona el color del uniforme para este tipo de empleados
STR_1791 :{WINDOW_COLOUR_2}Color del uniforme:
STR_1792 :Dirigiéndose a {STRINGID}
diff --git a/data/language/fi-FI.txt b/data/language/fi-FI.txt
index 9314d9385c..72765c10fa 100644
--- a/data/language/fi-FI.txt
+++ b/data/language/fi-FI.txt
@@ -1164,17 +1164,6 @@ STR_1773 :Vain yksi valokuvaosio sallittu per laite
STR_1774 :Vain yksi nostomäki sallittu per laite
STR_1777 :{WINDOW_COLOUR_2}Musiikki
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandapuku
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiikeripuku
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Norsupuku
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roomalaispuku
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorillapuku
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Lumimiespuku
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ritaripuku
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronauttipuku
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Rosvopuku
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Seriffipuku
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Merirosvopuku
STR_1790 :Valitse virka-asun väri tälle henkilöstötyypille
STR_1791 :{WINDOW_COLOUR_2}Virka-asun väri:
STR_1792 :Matkalla korjaamaan laitetta {STRINGID}
diff --git a/data/language/fr-FR.txt b/data/language/fr-FR.txt
index 7819a321a0..f4d97ac4c5 100644
--- a/data/language/fr-FR.txt
+++ b/data/language/fr-FR.txt
@@ -1169,17 +1169,6 @@ STR_1773 :Une seule section photo sur le vif autorisée par attraction
STR_1774 :Une seule remontée à chaîne autorisée par attraction
STR_1777 :Musique de l’attraction
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Costume de panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Costume de tigre
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Costume d’éléphant
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Costume romain
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Costume de gorille
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Costume de bonhomme de neige
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Costume de chevalier
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Costume d’astronaute
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Costume de bandit
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Costume de shérif
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Costume de pirate
STR_1790 :Sélectionnez la couleur de l’uniforme pour ce type d’employé
STR_1791 :{WINDOW_COLOUR_2}Couleur d’uniforme :
STR_1792 :Va réparer {STRINGID}
diff --git a/data/language/gl-ES.txt b/data/language/gl-ES.txt
index a66770ec53..9772a4a24c 100644
--- a/data/language/gl-ES.txt
+++ b/data/language/gl-ES.txt
@@ -1164,17 +1164,6 @@ STR_1773 :Só se permite unha sección de fotos por atracción.
STR_1774 :Só un cable de elevación por atracción.
STR_1777 :Música de atracción
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Traxe de panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Traxe de tigre
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Traxe de elefante
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Traxe romano
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Traxe de gorila
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Traxe de boneco de neve
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Traxe de cabaleiro
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Traxe de astronauta
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Traxe de bandido
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Traxe de shériff
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Traxe de pirata
STR_1790 :Seleccione a cor do uniforme para este tipo de empregados
STR_1791 :{WINDOW_COLOUR_2}Cor uniforme:
STR_1792 :enderezo {STRINGID}
diff --git a/data/language/hu-HU.txt b/data/language/hu-HU.txt
index 94f9869862..8dbab5b75e 100644
--- a/data/language/hu-HU.txt
+++ b/data/language/hu-HU.txt
@@ -1160,17 +1160,6 @@ STR_1773 :Csak egy élményfotó-szakasz engedélyezett játékonként
STR_1774 :Csak egy kábeles felvonószakasz engedélyezett játékonként
STR_1777 :Játékok zenéje
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda jelmez
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigris jelmez
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefánt jelmez
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Római jelmez
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla jelmez
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Hóember jelmez
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Lovag jelmez
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Űrhajós jelmez
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandita jelmez
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Seriff jelmez
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Kalóz jelmez
STR_1790 :A választott típusú alkalmazottak által viselt egyenruha színének kiválasztása
STR_1791 :{WINDOW_COLOUR_2}Egyenruha színe:
STR_1792 :{STRINGID} segélykérésére válaszol
diff --git a/data/language/it-IT.txt b/data/language/it-IT.txt
index f435208bb7..4e23cfff5f 100644
--- a/data/language/it-IT.txt
+++ b/data/language/it-IT.txt
@@ -1163,17 +1163,6 @@ STR_1773 :Può esserci soltanto una sezione di foto-in-corsa per attrazione
STR_1774 :Può esserci soltanto una salita per il traino con cavo per attrazione
STR_1777 :Musica attrazioni
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Costume da panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Costume da tigre
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Costume da elefante
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Costume da antico romano
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Costume da gorilla
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Costume da pupazzo di neve
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Costume da cavaliere
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Costume da astronauta
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Costume da bandito
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Costume da sceriffo
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Costume da pirata
STR_1790 :Scegli il colore dell’uniforme per questo tipo di dipendente
STR_1791 :{WINDOW_COLOUR_2}Colore dell’uniforme:
STR_1792 :Sta accorrendo al guasto di {STRINGID}
diff --git a/data/language/ja-JP.txt b/data/language/ja-JP.txt
index 3b3ca8f451..2c775ca02c 100644
--- a/data/language/ja-JP.txt
+++ b/data/language/ja-JP.txt
@@ -1160,17 +1160,6 @@ STR_1773 :乗物からの写真の場所は、各乗物につき一箇所だ
STR_1774 :ケーブルリフトヒルは、各乗物につき一箇所だけです
STR_1777 :音楽
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} パンダのコスチューム
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} トラのコスチューム
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} 象のコスチューム
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} ローマのコスチューム
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} ゴリラのコスチューム
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} 雪だるまのコスチューム
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} ナイトのコスチューム
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} 宇宙飛行士のコスチューム
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} 泥棒のコスチューム
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} シェリフのコスチューム
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 海賊のコスチューム
STR_1790 :このスタッフのタイプの制服の色を選択:
STR_1791 :{WINDOW_COLOUR_2}制服の色:
STR_1792 :{STRINGID}の故障の電話を返事中
diff --git a/data/language/ko-KR.txt b/data/language/ko-KR.txt
index 2ab5820fcc..8407e0017f 100644
--- a/data/language/ko-KR.txt
+++ b/data/language/ko-KR.txt
@@ -1166,17 +1166,6 @@ STR_1773 :한 놀이기구에는 하나의 탑승 사진 섹션만 만들 수
STR_1774 :한 놀이기구에는 하나의 케이블 리프트만 만들 수 있습니다
STR_1777 :놀이기구 음악
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} 판다 복장
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} 호랑이 복장
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} 코끼리 복장
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} 로마 전사 복장
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} 고릴라 복장
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} 눈사람 복장
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} 기사 복장
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} 우주비행사 복장
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} 산적 복장
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} 보안관 복장
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 해적 복장
STR_1790 :이 직종의 유니폼 색상을 선택하세요
STR_1791 :{WINDOW_COLOUR_2}유니폼 색상:
STR_1792 :{STRINGID} 고장 연락을 받음
diff --git a/data/language/nb-NO.txt b/data/language/nb-NO.txt
index 4351df4a82..758c851d5f 100644
--- a/data/language/nb-NO.txt
+++ b/data/language/nb-NO.txt
@@ -1158,17 +1158,6 @@ STR_1773 :Kun én fotoseksjon tillatt per bane
STR_1774 :Kun ett kabeltrekk tillatt per bane
STR_1777 :Attraksjonsmusikk
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda-kostyme
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger-kostyme
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefant-kostyme
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Romer-kostyme
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla-kostyme
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snømann-kostyme
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ridder-kostyme
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut-kostyme
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditt-kostyme
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff-kostyme
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirat-kostyme
STR_1790 :Velg uniform-farge for denne typen personale
STR_1791 :{WINDOW_COLOUR_2}Uniform-farge:
STR_1792 :Svarer på {STRINGID} beskjed om sammenbrudd
diff --git a/data/language/nl-NL.txt b/data/language/nl-NL.txt
index 443dd83e64..a653cdeb36 100644
--- a/data/language/nl-NL.txt
+++ b/data/language/nl-NL.txt
@@ -1163,17 +1163,6 @@ STR_1773 :Een attractie mag maar één actiefotogedeelte hebben
STR_1774 :Een attractie mag maar één kabellift hebben
STR_1777 :Attractiemuziek
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandapak
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tijgerpak
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Olifantenpak
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Romeins kostuum
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorillapak
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Sneeuwpoppak
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Ridderkostuum
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautenpak
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandietenkostuum
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffkostuum
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratenkostuum
STR_1790 :Selecteer de uniformkleur voor dit type werknemer
STR_1791 :{WINDOW_COLOUR_2}Uniformkleur:
STR_1792 :Gaat {STRINGID} repareren
@@ -3781,3 +3770,6 @@ STR_6706 :{WINDOW_COLOUR_2}Geselecteerd bestand: {BLACK}{STRING}
STR_6707 :(n.v.t.)
STR_6708 :Afrondsterkte
STR_6709 :Voer een afrondsterkte in tussen {COMMA16} en {COMMA16}
+STR_6710 :Stabiel sorteren
+STR_6711 :Bestandsnaam:
+STR_6712 :Opslaan
diff --git a/data/language/pl-PL.txt b/data/language/pl-PL.txt
index 1b693e185e..aec3b5cae6 100644
--- a/data/language/pl-PL.txt
+++ b/data/language/pl-PL.txt
@@ -1164,17 +1164,6 @@ STR_1773 :Tylko jedna sekcja fotograficzna dostępna na atrakcję
STR_1774 :Tylko jedna wyciągarka dostępna na atrakcję
STR_1777 :{WINDOW_COLOUR_2}Muzyka atrakcji
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Kostium pandy
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Kostium tygrysa
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Kostium słonia
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Kostium rzymianina
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Kostium goryla
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Kostium bałwana
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Kostium rycerza
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Kostium astronauty
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Kostium bandyty
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Kostium szeryfa
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Kostium pirata
STR_1790 :Wybierz kolor uniformu dla tego typu pracownika
STR_1791 :{WINDOW_COLOUR_2}Kolor uniformu:
STR_1792 :Zmierza naprawić {STRINGID}
@@ -2617,7 +2606,7 @@ STR_5368 :Zresetuj wypadki
STR_5371 :Wybór obiektów
STR_5372 :Odwróć przeciąganie prawym przyciskiem myszy
STR_5373 :Nazwa {STRINGID}
-STR_5374 :Data {STRINGID}
+STR_5374 :Data modyfikacji {STRINGID}
STR_5375 :▲
STR_5376 :▼
STR_5404 :Nazwa już istnieje
@@ -3782,4 +3771,11 @@ STR_6706 :{WINDOW_COLOUR_2}Bieżący plik obrazu: {BLACK}{STRING}
STR_6707 :(brak)
STR_6708 :Siła wygładzania
STR_6709 :Wprowadź siłę wygładzania pomiędzy {COMMA16} a {COMMA16}:
-STR_6710 :Włącz stabilne sortowanie
\ No newline at end of file
+STR_6710 :Włącz stabilne sortowanie
+STR_6711 :Nazwa pliku:
+STR_6712 :Zapisz
+STR_6713 :{COMMA32} {STRINGID}
+STR_6714 :Nazwa pliku
+STR_6715 :Data modyfikacji
+STR_6716 :Rozmiar pliku
+STR_6717 :Rozmiar {STRINGID}
diff --git a/data/language/pt-BR.txt b/data/language/pt-BR.txt
index f691f6eaac..f5dddab6c8 100644
--- a/data/language/pt-BR.txt
+++ b/data/language/pt-BR.txt
@@ -1164,17 +1164,6 @@ STR_1773 :Somente uma seção de fotos é permitida por atração
STR_1774 :Somente uma subida com cabo de elevação é permitida por atração
STR_1777 :Música da atração
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Fantasia de panda
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Fantasia de tigre
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Fantasia de elefante
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Fantasia de romano
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Fantasia de gorila
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Fantasia de boneco de neve
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Fantasia de cavaleiro
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Fantasia de astronauta
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Fantasia de bandido
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Fantasia de xerife
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Fantasia de pirata
STR_1790 :Selecione a cor do uniforme para este tipo de funcionário
STR_1791 :{WINDOW_COLOUR_2}Cor do uniforme:
STR_1792 :Respondendo a chamada de quebra da {STRINGID}
@@ -2617,7 +2606,7 @@ STR_5368 :Redefinir status de acidente
STR_5371 :Seleção de Objetos
STR_5372 :Inverter seleção do botão direito do mouse
STR_5373 :Nome {STRINGID}
-STR_5374 :Data {STRINGID}
+STR_5374 :Data de modificação {STRINGID}
STR_5375 :▲
STR_5376 :▼
STR_5404 :Este nome já existe
@@ -3783,3 +3772,16 @@ STR_6707 :(nenhum selecionado)
STR_6708 :Intensidade da Suavização
STR_6709 :Digite a intensidade da suavização entre {COMMA16} e {COMMA16}
STR_6710 :Ordenação estável
+STR_6711 :Nome do arquivo:
+STR_6712 :Salvar
+STR_6713 :{COMMA32} {STRINGID}
+STR_6714 :Nome do arquivo
+STR_6715 :Data de modificação
+STR_6716 :Tamanho do arquivo
+STR_6717 :Tamanho do arquivo {STRINGID}
+STR_6718 :Animações das Pessoinhas
+STR_6719 :Ao menos um objeto de animação de pessoinha de visitante deve ser selecionado
+STR_6720 :Ao menos um objeto de animação de pessoinha de faxineiro deve ser selecionado
+STR_6721 :Ao menos um objeto de animação de pessoinha de mecânico deve ser selecionado
+STR_6722 :Ao menos um objeto de animação de pessoinha de segurança deve ser selecionado
+STR_6723 :Ao menos um objeto de animação de pessoinha de animador deve ser selecionado
diff --git a/data/language/ru-RU.txt b/data/language/ru-RU.txt
index e5fe376a8a..d6b62380b7 100644
--- a/data/language/ru-RU.txt
+++ b/data/language/ru-RU.txt
@@ -244,8 +244,8 @@ STR_0831 :Отдалить
STR_0832 :Вращать на 90° по часовой стрелке
STR_0833 :Пауза
STR_0834 :Настройки
-STR_0839 :{UINT16} x {UINT16}
-STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} x {UINT16}
+STR_0839 :{UINT16} × {UINT16}
+STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} × {UINT16}
STR_0847 :Про ‘OpenRCT2’
STR_0850 :{WINDOW_COLOUR_2}Copyright © 2002 Sawyer, все права принадлежат
STR_0851 :{WINDOW_COLOUR_2}Chris Sawyer
@@ -254,7 +254,7 @@ STR_0853 :{WINDOW_COLOUR_2}Звук и музыка: Allister Brimble
STR_0854 :{WINDOW_COLOUR_2}Запись дополнительных звуков: David Ellis
STR_0855 :{WINDOW_COLOUR_2}Представительство: Jacqui Lyons из Marjacq Ltd.
STR_0856 :{WINDOW_COLOUR_2}Благодарность:
-STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, and John Wardley
+STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth, и John Wardley
STR_0865 :{STRINGID}
STR_0866 :{POP16}{STRINGID}
STR_0867 :{POP16}{POP16}{STRINGID}
@@ -360,7 +360,7 @@ STR_0969 :+405°
STR_0970 :+450°
STR_0971 :+495°
STR_0972 :Отмена
-STR_0973 :OK
+STR_0973 :ОК
STR_0974 :Аттракционы
STR_0975 :Магазины и лотки
STR_0976 :Служебные здания
@@ -559,7 +559,7 @@ STR_1168 :Опции
STR_1169 :(Нет)
STR_1170 :{STRING}
STR_1171 :{RED}Закрыто - -
-STR_1172 :{YELLOW}{STRINGID} - -
+STR_1172 :{YELLOW}{STRINGID}
STR_1173 :Построить дорожки и заграждения
STR_1174 :На пути баннер
STR_1175 :Нельзя это строить на наклонной дорожке
@@ -605,8 +605,8 @@ STR_1214 :Выберите макс. время ожидания перед
STR_1215 :{WINDOW_COLOUR_2}Синхронизировать со смежными станциями
STR_1216 :Выберите, синхронизировать ли отправление со смежными станциями (для ‘гонок’)
STR_1217 :{COMMA16} секунд
-STR_1218 :{BLACK}➕
-STR_1219 :{BLACK}➖
+STR_1218 :{BLACK}+
+STR_1219 :{BLACK}-
STR_1220 :Только выход
STR_1221 :Нет входа
STR_1222 :Нет выхода
@@ -1125,7 +1125,7 @@ STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COM
STR_1738 :Нельзя изменить число кругов…
STR_1739 :Гонку выиграл гость {INT32}
STR_1740 :Гонку выиграл {STRINGID}
-STR_1741 :Еще не построено !
+STR_1741 :Ещё не построено !
STR_1742 :{WINDOW_COLOUR_2}Макс. людей на аттракционе:
STR_1743 :Максимум людей, находящихся на аттракционе
STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
@@ -1156,19 +1156,8 @@ STR_1770 :Число полных качений
STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1773 :Допускается только одна фото секция
STR_1774 :Допускается только один кабельный лифт
-STR_1777 :{WINDOW_COLOUR_2}Музыка:
+STR_1777 :{WINDOW_COLOUR_2}Музыка
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Костюм панды
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Костюм тигра
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Костюм слона
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Костюм гориллы
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Костюм снеговика
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Костюм рыцаря
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Костюм космонавта
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Костюм бандита
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Костюм шерифа
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Костюм пирата
STR_1790 :Выберите цвет униформы для этого типа работников
STR_1791 :{WINDOW_COLOUR_2}Цвет формы:
STR_1792 :Отвечает на вызов по {STRINGID}
@@ -1252,7 +1241,6 @@ STR_1870 :Число полных оборотов
STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16}
STR_1873 :{WINDOW_COLOUR_2}Доход: {BLACK}{CURRENCY} в час
STR_1874 :{WINDOW_COLOUR_2}Прибыль: {BLACK}{CURRENCY} в час
-STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID}
STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Проверять аттракционы
STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Чинить аттракционы
STR_1878 :{WINDOW_COLOUR_2}Наблюдение:
@@ -1575,7 +1563,7 @@ STR_2213 :Показать список артистов
STR_2214 :Нельзя строить во время паузы!
STR_2215 :{STRINGID}{NEWLINE}({STRINGID})
STR_2216 :{WINDOW_COLOUR_2}{COMMA16}°C
-STR_2217 :{WINDOW_COLOUR_2}{COMMA16}F
+STR_2217 :{WINDOW_COLOUR_2}{COMMA16}°F
STR_2218 :{RED}{STRINGID} на аттр. {STRINGID} не возвращается к {STRINGID}!{NEWLINE}Нужна помощь.
STR_2219 :{RED}{COMMA16} людей погибло на {STRINGID}
STR_2220 :{WINDOW_COLOUR_2}Рейтинг парка: {BLACK}{COMMA16}
@@ -1709,8 +1697,8 @@ STR_2353 :{WINDOW_COLOUR_2}Мусора вымел: {BLACK}{COMMA32}
STR_2354 :{WINDOW_COLOUR_2}Урн вынес: {BLACK}{COMMA32}
STR_2355 :{WINDOW_COLOUR_2}Аттр. починил: {BLACK}{COMMA32}
STR_2356 :{WINDOW_COLOUR_2}Аттр. осмотрел: {BLACK}{COMMA32}
-STR_2358 :ед.
-STR_2359 :в метрах
+STR_2358 :игровые единицы
+STR_2359 :выбранные единиицы
STR_2360 :{WINDOW_COLOUR_2}Разрешение:
STR_2361 :Сглаживание
STR_2362 :Включает сглаживание местности на краях
@@ -1926,7 +1914,7 @@ STR_2703 :Каждые 1 минут
STR_2704 :Каждые 30 минут
STR_2705 :Каждый час
STR_2706 :Никогда
-STR_2707 :Использовать системное диалоговое окно
+STR_2707 :Использовать системный диалог
STR_2708 :{WINDOW_COLOUR_1}Вы уверены, что хотите перезаписать {STRINGID}?
STR_2709 :Перезаписать
STR_2710 :Укажите имя файла.
@@ -1950,7 +1938,7 @@ STR_2734 :{COMMA16}миль/час
STR_2735 :{COMMA16}км/ч
STR_2736 :{MONTH}, год {COMMA16}
STR_2737 :{STRINGID} {MONTH}, год {COMMA16}
-STR_2738 :Музыка на главном экране:
+STR_2738 :Музыка главного меню:
STR_2739 :Нет
STR_2740 :RollerCoaster Tycoon 1
STR_2741 :RollerCoaster Tycoon 2
@@ -1961,17 +1949,17 @@ STR_2751 :Все элементы вниз
STR_2752 :Очистить траву
STR_2753 :Подстричь траву
STR_2754 :Полить растения
-STR_2755 :Исправить вандализм
+STR_2755 :Исправ. вандализм
STR_2756 :Убрать мусор
STR_2763 :???
STR_2765 :Группа гостей
STR_2766 :Выиграть сценарий
-STR_2767 :Заблок. климат
+STR_2767 :Заблокировать климат
STR_2769 :Открыть парк
STR_2770 :Закрыть парк
STR_2773 :Оконный режим
STR_2774 :Полный экран
-STR_2775 :Полный экран (окно без рамок)
+STR_2775 :Окно без рамок
STR_2776 :Язык:
STR_2777 :{MOVE_X}{10}{STRING}
STR_2778 :»{MOVE_X}{10}{STRING}
@@ -2045,7 +2033,7 @@ STR_2844 :{TOPAZ}Ваш парк получил награду как ‘Па
STR_2845 :{TOPAZ}Ваш парк получил награду как ‘Парк с самыми удивительными цветовыми схемами’!
STR_2846 :{TOPAZ}Ваш парк получил награду как ‘Парк с самой неудобной схемой’!
STR_2847 :{TOPAZ}Ваш парк получил награду как ‘Парк с самыми лучшими спокойными аттракционами’!
-STR_2848 :{WINDOW_COLOUR_2}Давно нет наград
+STR_2848 :{WINDOW_COLOUR_2}У вашего парка нет наград
STR_2849 :Новый сценарий успешно установлен
STR_2850 :Новый дизайн треков успешно установлен
STR_2851 :Сценарий уже установлен
@@ -2251,8 +2239,8 @@ STR_3234 :Опции - Парк
STR_3235 :Параметры финансов
STR_3236 :Параметры гостей
STR_3237 :Параметры парка
-STR_3238 :Нет Денег
-STR_3239 :Делает этот парк без денег и без финансовых ограничений
+STR_3238 :Отключить деньги
+STR_3239 :Отключает все финансовые ограничения для парка
STR_3240 :{WINDOW_COLOUR_2}Нач. средства:
STR_3241 :{WINDOW_COLOUR_2}Начальный заем:
STR_3242 :{WINDOW_COLOUR_2}Максимальн. заем:
@@ -2352,7 +2340,7 @@ STR_3339 :{BLACK}{COMMA16} доступно или собственный д
STR_3340 :{BLACK}{COMMA16} доступно или собственный дизайн
STR_3341 :Инструменты
STR_3342 :Редактор сценариев
-STR_3343 :Конвертировать игру в сценарий
+STR_3343 :Конвертировать сохр. игру в сценарий
STR_3344 :Редактор треков
STR_3345 :Менеджер треков
STR_3346 :Невозможно сохранить дизайн трека…
@@ -2404,19 +2392,19 @@ STR_3446 :Отменить участок
STR_5120 :Финансы
STR_5121 :Исследования
STR_5122 :Выбирать аттракцион по типу трека (как в RCT1)
-STR_5123 :Обновить аттракционы
-STR_5125 :Всё уничтожаемое
+STR_5123 :Обнов. аттр.
+STR_5125 :Разрешить уничтожение всего
STR_5126 :Случайная заглавная музыка
STR_5127 :Окрас ландшафта перетаскиванием, вместо изменения высоты
STR_5128 :Размер выделения
STR_5129 :Введите размер выделения в диапазоне от {COMMA16} до {COMMA16}
STR_5130 :Размер карты
STR_5131 :Введите размер карты в диапазоне от {COMMA16} до {COMMA16}
-STR_5132 :Отремонтировать все аттракционы
+STR_5132 :Отрем. все аттр.
STR_5133 :Изменить малую площадь прав на землю
STR_5134 :Изменить большую площадь прав на землю
STR_5135 :Купить права на землю и строительство
-STR_5136 :Права собственности на землю
+STR_5136 :Земля
STR_5137 :Отключить операционные ограничения
STR_5138 :{WINDOW_COLOUR_2}{STRINGID}
STR_5139 :{WHITE}{STRINGID}
@@ -2524,7 +2512,7 @@ STR_5256 :Создать новую тему для внесения изме
STR_5257 :Создать новую тему на основании текущей
STR_5258 :Удалить текущую тему
STR_5259 :Переименовать текущую тему
-STR_5260 :Гигантский скриншот
+STR_5260 :Огромный скриншот
STR_5261 :Фильтр
STR_5262 :Wacky Worlds
STR_5263 :Time Twister
@@ -2564,7 +2552,7 @@ STR_5299 :{LIGHTPINK}{STRINGID}
STR_5300 :Быстрое увольнение работников
STR_5301 :Сбросить ваш заём
STR_5302 :Сбросить заём
-STR_5303 :Разрешить строительсво в режиме паузы
+STR_5303 :Разрешить строительсво при паузе
STR_5304 :Заставка главного экрана:
STR_5305 :RollerCoaster Tycoon 1
STR_5306 :RollerCoaster Tycoon 1 (AA)
@@ -2596,28 +2584,28 @@ STR_5353 :{BLACK}Энергия:
STR_5354 :{BLACK}Голод:
STR_5355 :{BLACK}Жажда:
STR_5356 :{BLACK}Тошнота:
-STR_5357 :{BLACK}Толерантность к тошноте:
+STR_5357 :{BLACK}Тошн. выносливость:
STR_5358 :{BLACK}Туалет:
STR_5359 :Удалить гостей
STR_5360 :Убирать с карты всех гостей
STR_5361 :Раздать всем гостям:
-STR_5362 :{BLACK}Устанавливает всем гостям предпочитаемый уровень интенсивности аттракционов:
+STR_5362 :{BLACK}Уст. предпоч. уровень интенсивности:
STR_5363 :Более 1
STR_5364 :Менее 15
STR_5365 :{BLACK}Скорость работников:
STR_5366 :Нормальная
STR_5367 :Быстрая
-STR_5368 :Сбросить историю аварий
+STR_5368 :Сброс. ист. аварий
STR_5371 :Выбор объекта
-STR_5372 :Инвертировать направление перетаскивания правой кнопкой мыши
+STR_5372 :Инвертировать перетаскивание правой кнопкой мыши
STR_5373 :Имя {STRINGID}
-STR_5374 :Дата {STRINGID}
+STR_5374 :Дата изменения {STRINGID}
STR_5375 :▲
STR_5376 :▼
STR_5404 :Такое имя уже существует
STR_5440 :Сворачивать окно при потере фокуса
-STR_5442 :Принудительно установить рейтинг парка:
+STR_5442 :Фикс. рейтинг парка:
STR_5447 :Тип {STRINGID}
STR_5448 :Аттракцион / траспорт {STRINGID}
STR_5449 :Уменьшить скорость игры
@@ -2634,7 +2622,7 @@ STR_5459 :Повернуть против часовой стрелке
STR_5460 :Повернуть вид против часовой стрелке
STR_5461 :Установить параметры гостя
STR_5462 :{CURRENCY}
-STR_5463 :Goal: Веселитесь!
+STR_5463 :Цель: Веселитесь!
STR_5464 :Общие
STR_5465 :Погода
STR_5466 :Персонал
@@ -2664,6 +2652,1124 @@ STR_6034 :{BLACK}{STRING}
STR_6062 :{OUTLINE}{GREEN}+ {CURRENCY2DP}
STR_6063 :{OUTLINE}{RED}- {CURRENCY2DP}
STR_6164 :{WHITE}❌
-
-# This language is unmaintained. All untranslated strings have been removed.
-# If you intend to become the maintainer, please copy the missing strings from en-GB.txt and translate them.
+STR_0097 :Классические стоячие горки
+STR_0098 :Горки с запуском ЛСМ
+STR_0099 :Классический деревянный твистер
+STR_0607 :Интенсивный аттракцион старого стиля с петлями, предназначенный для стоячей езды
+STR_0608 :Поезда этого аттракциона ускоряются линейно-синхронными моторами и несутся через петли и кручения на высокой скорости
+STR_0609 :Старый деревянный аттракцион с быстрой и резкой ездой, с сочленёнными поездами, большим количеством времени в воздухе, и кручённым треком
+STR_5487 :Показать недавные сообщения
+STR_5489 :Показать только отслеживаемых гостей
+STR_5490 :Отключить звук при потере фокуса
+STR_5491 :Список изобретений
+STR_5492 :Опции сценария
+STR_5493 :Отправить сообщение
+STR_5495 :Список игроков
+STR_5496 :Игрок
+STR_5497 :Пинг
+STR_5498 :Список серверов
+STR_5499 :Имя игрока:
+STR_5500 :Добавить сервер
+STR_5501 :Запустить сервер
+STR_5502 :Онлайн
+STR_5503 :Введите доменное имя или IP-адрес:
+STR_5504 :Показать статус онлайн-игры
+STR_5505 :Не удалось подключиться к серверу
+STR_5506 :Гостям все равно на интенсивность
+STR_5510 :Устройство звука по умолчанию
+STR_5511 :(НЕИЗВЕСТНО)
+STR_5512 :Сохранить игру как…
+STR_5513 :(Быстрое) сохранение игры
+STR_5514 :Отключить вандализм
+STR_5515 :Ности не будут разрушать ваш парк, когда они злятся.
+STR_5516 :Чёрный
+STR_5517 :Серый
+STR_5518 :Белый
+STR_5519 :Тёмно-фиолетовый
+STR_5520 :Светло-фиолетовый
+STR_5521 :Ярко-фиолетовый
+STR_5522 :Тёмно-синий
+STR_5523 :Светло-синий
+STR_5524 :Ледяной
+STR_5525 :Тёмно-водный
+STR_5526 :Светло-водный
+STR_5527 :Насыщено-зеленый
+STR_5528 :Тёмно-зеленый
+STR_5529 :Мох
+STR_5530 :Ярко-зелёный
+STR_5531 :Маслина
+STR_5532 :Тёмная маслина
+STR_5533 :Ярко-жёлтый
+STR_5534 :Жёлтый
+STR_5535 :Тёмно-желтый
+STR_5536 :Светло-оранжевый
+STR_5537 :Тёмно-оранжевый
+STR_5538 :Светло-коричневый
+STR_5539 :Насыщено-коричневый
+STR_5540 :Тёмно-коричневый
+STR_5541 :Лосось
+STR_5542 :Бордовый
+STR_5543 :Насыщено-красный
+STR_5544 :Ярко-красный
+STR_5545 :Тёмно-розовый
+STR_5546 :Ярко-розовый
+STR_5547 :Светло-розовый
+STR_5548 :Показать все операционные режимы
+STR_5549 :Год/месяц/день
+STR_5550 :{POP16}{POP16}Год {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID}
+STR_5551 :Год/день/месяц
+STR_5552 :{POP16}{POP16}Год {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH}
+STR_5553 :Пауза при открытии Steam Overlay
+STR_5554 :Включить интсрумент "гора"
+STR_5555 :Показ машин с других типов трека
+STR_5556 :Выбросить игрока
+STR_5557 :Не рвать подключение при рассинхроне (онлайн)
+STR_5558 :Эта настройка вступит в силу при следующем запуске OpenRCT2
+STR_5559 :10 мин. инспекции
+STR_5560 :Устанавливает время инспекций на 10 мин для всех аттракицонов
+STR_5561 :Не удалось загрузить язык
+STR_5562 :ВНИМАНИЕ!
+STR_5563 :Эта опция нестабильна, будьте осторожны
+STR_5566 :Пароль:
+STR_5567 :Рекламироввать
+STR_5568 :Требуется пароль
+STR_5569 :Этот сервер требует ввод пароля
+STR_5570 :Запр. список серв.
+STR_5571 :Войти в игру
+STR_5572 :Добавить в закладки
+STR_5573 :Убрать из закладок
+STR_5574 :Имя сервера:
+STR_5575 :Макс. игроков:
+STR_5576 :Порт:
+STR_5577 :Корейские воны (W)
+STR_5578 :Российские рубли (₽)
+STR_5579 :Масштаб окна:
+STR_5580 :Чешские коруны (Kč)
+STR_5581 :Показать FPS
+STR_5582 :Захватить курсор мыши в окне
+STR_5583 :{COMMA1DP16} м/с
+STR_5584 :SI
+STR_5585 :Разблокирует операционные лимиты аттракционов, разрешая, например, подъёмы со скростью {VELOCITY}
+STR_5586 :Автоматически открывать магазины
+STR_5587 :Магазины будут автоматически переключаться в "открытое" состояние после их постройки
+STR_5588 :Играйте с другими игроками
+STR_5589 :Настройки уведомлений
+STR_5590 :Награды парка
+STR_5591 :Маркетинговая кампания завершена
+STR_5592 :Предупреждения о парке
+STR_5593 :Предупреждения о рейтигне
+STR_5594 :Аттр. сломался
+STR_5595 :На аттр. произошла авария
+STR_5596 :Предупреждения о аттр.
+STR_5597 :Аттр. / пейзаж исследован
+STR_5598 :Предупреждения о гостях
+STR_5600 :Гость ушёл из парка
+STR_5601 :Гость в очереди на аттр.
+STR_5602 :Гость на аттр.
+STR_5603 :Гость ушёл с аттр.
+STR_5604 :Гость купил объект
+STR_5605 :Гость использовал служебное помещение
+STR_5606 :Гость умер
+STR_5607 :Насильно удаляет элемент с карты
+STR_5608 :БВ
+STR_5609 :ВР
+STR_5610 :Удаляет текущий элемент с карты насильным образом. Вы не получите за это денег, будьте осторожны.
+STR_5611 :Пр
+STR_5612 :Флаг призрачности
+STR_5613 :Сл
+STR_5614 :Флаг сломанности
+STR_5615 :Пс
+STR_5616 :Последний элемент для флага плитки
+STR_5617 :Передвинуть выбранный элемент вверх.
+STR_5618 :Передвинуть выбранный элемент вниз.
+STR_5619 :RollerCoaster Tycoon
+STR_5620 :Added Attractions
+STR_5621 :Loopy Landscapes
+STR_5622 :RollerCoaster Tycoon 2
+STR_5623 :Wacky Worlds
+STR_5624 :Time Twister
+STR_5625 :"Реальные" парки
+STR_5626 :Другие парки
+STR_5627 :Группировка списка по:
+STR_5628 :Оригинальной игре
+STR_5629 :Уровню сложности
+STR_5630 :Отключить "слишком сложные" сценарии
+STR_5631 :Оригинальные DLC
+STR_5632 :Постройте свой…
+STR_5634 :OPTION +
+STR_5635 :{WINDOW_COLOUR_2}Потрачено денег: {BLACK}{CURRENCY2DP}
+STR_5636 :{WINDOW_COLOUR_2}Запущено комманд: {BLACK}{COMMA16}
+STR_5637 :Не могу сделать это…
+STR_5638 :Нет прав
+STR_5639 :Показать список игроков
+STR_5640 :Управление группами
+STR_5641 :Умолч. группа:
+STR_5642 :Группа
+STR_5643 :Добавить группу
+STR_5644 :Убрать группу
+STR_5645 :Чат
+STR_5646 :Терраформинг
+STR_5647 :Вкл/выкл. паузы
+STR_5648 :Установить уровень воды
+STR_5649 :Создать аттр.
+STR_5650 :Убрать аттр.
+STR_5651 :Построить аттр.
+STR_5652 :Свойства аттр.
+STR_5653 :Пейзаж
+STR_5654 :Тропа
+STR_5655 :Гость
+STR_5656 :Сотрудник
+STR_5657 :Свойства парка
+STR_5658 :Финансирование парка
+STR_5659 :Выкинуть игрока
+STR_5660 :Изменить группы
+STR_5661 :Установить группу игрока
+STR_5662 :Нет
+STR_5663 :Очистить ландшафт
+STR_5664 :Чит
+STR_5665 :Вкл/выкл. пейзажного кластера
+STR_5666 :Вход без пароля
+STR_5701 :{WINDOW_COLOUR_2}Последние действие: {BLACK}{STRINGID}
+STR_5702 :Найти последнее действие игрока
+STR_5703 :Не могу выкинуть хоста
+STR_5704 :Последнее действие
+STR_5705 :Не могу установить на эту группу
+STR_5706 :Не могу убрать группу, в которой есть игроки
+STR_5707 :Эту группу нельзя изменять
+STR_5708 :Не могу изменить группу, которой принадлежит хост
+STR_5709 :Переименовать группу
+STR_5710 :Имя группы
+STR_5711 :Введите новое имя для этой группы:
+STR_5712 :Не могу изменить права, которых у вас нет
+STR_5713 :Выкинуть игрока
+STR_5714 :Показать окно настроек
+STR_5715 :Новая игра
+STR_5716 :Запрещено в онлайн-режиме
+STR_5717 :Сетевая версия: {STRING}
+STR_5718 :Сетевая версия: {STRING}
+STR_5719 :Солнечно
+STR_5720 :Част. облачность
+STR_5721 :Облачно
+STR_5722 :Дождь
+STR_5723 :Ливень
+STR_5724 :Гроза
+STR_5725 :{BLACK}Изменить погоду:
+STR_5726 :Устанавливает текущую погоду в парке
+STR_5734 :Отрисовка
+STR_5735 :Онлайн статус
+STR_5736 :Игрок
+STR_5737 :Закрыто, {COMMA16} гость ещё на аттр.
+STR_5738 :Закрыто, {COMMA16} гостей ещё на аттр.
+STR_5739 :{WINDOW_COLOUR_2}Гостей на аттр.: {BLACK}{COMMA16}
+STR_5740 :Бесконечные маркетинговые кампании
+STR_5741 :Маркетинговые компании никогда не заканчиваются
+STR_5742 :Аутентификация…
+STR_5743 :Подключение…
+STR_5744 :Разрешение…
+STR_5745 :Обнаружен сетевой рассинхрон
+STR_5746 :Отключено
+STR_5747 :Отключено: {STRING}
+STR_5748 :Выброшено
+STR_5749 :Прочь с сервера!
+STR_5750 :Подключение закрыто
+STR_5751 :Данных нет
+STR_5752 :{OUTLINE}{RED}{STRING} отключился
+STR_5753 :{OUTLINE}{RED}{STRING} отключился ({STRING})
+STR_5754 :Плохое имя игрока
+STR_5755 :Неверная версия игры (у сервера {STRING})
+STR_5756 :Плохой пароль
+STR_5757 :Сервер переполнен
+STR_5758 :{OUTLINE}{GREEN}{STRING} подключился к игре
+STR_5759 :Скачивание карты…
+STR_5760 :Доллары Гонг-Конгы (HK$)
+STR_5761 :Тайванские доллары (NT$)
+STR_5762 :Китайские Юани (CN¥)
+STR_5763 :Все файлы
+STR_5764 :Неверный тип аттр.
+STR_5765 :Нельзя редактировать аттракционы неверного типа
+STR_5766 :Венгерские форинты (Ft)
+STR_5767 :Доход
+STR_5768 :Всего гостей
+STR_5769 :Всего доход
+STR_5770 :Гостей в час
+STR_5771 :Цена работы
+STR_5772 :Возраст
+STR_5773 :Всего гостей: {COMMA32}
+STR_5774 :Всего доход: {CURRENCY2DP}
+STR_5775 :Гостей: {COMMA32} в час
+STR_5776 :Построен в этом году
+STR_5777 :Построен в прошлом году
+STR_5778 :Построен {COMMA16} лет назад
+STR_5779 :Доход: {CURRENCY2DP} в час
+STR_5780 :Цена работы: {CURRENCY2DP} в час
+STR_5781 :Цена работы: неизвестно
+STR_5782 :Вы подключены. Нажмите ‘{STRING}’, чтобы использовать чат.
+STR_5783 :{WINDOW_COLOUR_2}Сценарий заблокирован.
+STR_5784 :{BLACK}Пройдите сценарии выше по списку чтобы открыть его.
+STR_5785 :Не могу переименовать группу…
+STR_5786 :Неверное имя группы
+STR_5787 :{COMMA32} игроков в сети
+STR_5788 :Интервал инспекций:
+STR_5789 :Отключить эффект молнии
+STR_5790 :Включает цены в стиле RCT1{NEWLINE}(платный вход + платные аттракционы)
+STR_5791 :Сбрасывает надежность всех аттракционов до 100%{NEWLINE}и делает их построенными "в этом году"
+STR_5792 :Чинит все сломанные аттракционы
+STR_5793 :Сбрасывает историю аварий.{NEWLINE}Гости не будут жаловаться на небезопасные поездки.
+STR_5794 :Некоторые сценарии запрещают редактирование существующих аттракционов.{NEWLINE}Этот чит снимет ограничение.
+STR_5795 :Гости могут ездить на любых аттракционах в вашем парке,{NEWLINE}даже тех, у которых очень высокая интенсивность.
+STR_5796 :Насильно открывает/закрывает парк
+STR_5797 :Запрещает изменение погоды с текущего состояния
+STR_5798 :Разрешает строительство в режиме паузы
+STR_5799 :Запрещает поломки аттракционов из-за проблем с тормозами
+STR_5800 :Запрещает поломки аттракицонов
+STR_5801 :Отключить мусор
+STR_5802 :Гости не будут разбрасывать по вашему парку мусор и рвоту.
+STR_5803 :Повернуть выбранный элемент карты
+STR_5804 :Отключить звук
+STR_5805 :Добавит ваш севрер в общий список для упрощения поиска
+STR_5806 :Переключить оконный режим
+STR_5807 :{WINDOW_COLOUR_2}Число аттракционов: {BLACK}{COMMA16}
+STR_5808 :{WINDOW_COLOUR_2}Число магазинов: {BLACK}{COMMA16}
+STR_5809 :{WINDOW_COLOUR_2}Число служебных зданий: {BLACK}{COMMA16}
+STR_5810 :Снять ограничения на количество машин
+STR_5811 :Если включено, можно строить до{NEWLINE}255 машин на поезд и{NEWLINE}31 поездов на аттракцион.
+STR_5812 :Показать онлайн-окно
+STR_5813 :“{STRING}”
+STR_5814 :{WINDOW_COLOUR_1}“{STRING}”
+STR_5815 :Показывать счетчик FPS в игре
+STR_5816 :Масштабирует игровой интерфейс.{NEWLINE}Помогает при игре на экранах с высоким разрешением.
+STR_5819 :[Требует аппаратное отображание]{NEWLINE}Поставить игру на паузу при открытии Steam Overlay
+STR_5820 :Сворачивает игру{NEWLINE}при потере фокуса в полноэкранном режиме
+STR_5822 :Цикл день-ночь в зависимости от времени игры.{NEWLINE}Полный цикл занимает один игровой месяц.
+STR_5823 :Показывает весь текст на баннерах большими буквами (как в RCT1)
+STR_5824 :Выключает визуальный эффект молнии во время гроз.
+STR_5825 :Не позволять курсору покидать окно
+STR_5826 :Инверсия перетаскивания игрового поля правой кнопкой мыши
+STR_5827 :Изменить цвета графического интерфейса
+STR_5828 :Изменить единицу измерения для расстояний и скорости
+STR_5829 :Изменить валюту, используемую в игре.{NEWLINE}Курсы обмена не являются точными.
+STR_5830 :Изменить язык игры
+STR_5831 :Изменить формат отображения температуры
+STR_5832 :Показывать высоту в игровых "единицах" вместо{NEWLINE}формата, выбранного в пункте "расстояние и скорость"
+STR_5833 :Изменить формать даты
+STR_5834 :Выберите аудио-устройство для OpenRCT2.
+STR_5835 :Выключить звук при потере игрового фокуса.
+STR_5836 :Выберите музыку для главного меню.{NEWLINE}Треки из RCT1 требуют установки RCT1 на вкладке "Дополнительно".
+STR_5837 :Создавать и управлять темами интерфейса
+STR_5838 :Показывает отдельную кнопку для окна финансов на панели инструментов
+STR_5839 :Показывает отдельную кнопку для окна исследований на панели инструментов
+STR_5840 :Показывает отдельную кнопку для окна с чит-кодами на панели инструментов
+STR_5841 :Показывает отдельную кнопку для окна новостей на панели инструментов
+STR_5842 :Сортирует сценарии по их сложности (как в RCT2) или по игре, откуда они импортированы (как в RCT1).
+STR_5843 :Не позволяет выбирать сценарии с высокой сложностью, если сценарии с более низкой ещё не пройдены.
+STR_5844 :Оставляет подключение к онлайн-серверу,{NEWLINE}даже если произошёл рассинхрон или иная ошибка.
+STR_5845 :Добавляет кнопку для инструментов отладки на панель инструментов.{NEWLINE}Включает горячую клавишу для консоли.
+STR_5846 :Установить частоту автосохранений.
+STR_5847 :Выбрать заставку на главном меню.{NEWLINE}Заставки из RCT1 требуют установки RCT1 на вкладке "Дополнительно".
+STR_5849 :Автоматически задает местоположение только-что-нанятных сотрудников.
+STR_5851 :Интервал инспецкий для ново-построенных аттракционов.
+STR_5853 :Включить/выключить звуковые эффекты
+STR_5854 :Включить/выключить музыку от аттракционов
+STR_5855 :Установить полный экран (с рамками или без) или оконный режим
+STR_5856 :Установить разрешение для полноэкранного режима
+STR_5857 :Опции игры
+STR_5858 :Использовать ваш GPU для отображения игры. Улучшает совместимость с программами захвата экрана. Может уменьшить производительность.
+STR_5859 :Включает генерацию кадров для более визуально-гладкого геймплея.{NEWLINE}Если выключено, игра будет работать на 40 FPS.
+STR_5860 :Использовать оригинальное/декомпилирование рисование треков
+STR_5861 :Ошибка верификации ключа.
+STR_5862 :Блокировать неизвестных игроков.
+STR_5863 :Блокировать игроков с неизвестными ключами.
+STR_5864 :Этот севрер использует "белый список" для подключения игроков.
+STR_5865 :Логировать чаты.
+STR_5866 :Логирует всю историю чата в файл в вашей пользовательской папке.
+STR_5867 :{WINDOW_COLOUR_2}Имя провайдера: {BLACK}{STRING}
+STR_5868 :{WINDOW_COLOUR_2}Почта провайдера: {BLACK}{STRING}
+STR_5869 :{WINDOW_COLOUR_2}Сайт провайдера: {BLACK}{STRING}
+STR_5870 :Показать информацию о сервере
+STR_5871 :Отключить увядание растений
+STR_5872 :Растения не будут увядать со временем.
+STR_5873 :Цепной подъем на всех частях трека
+STR_5874 :Любая часть трека может быть использованя для цепного подъема
+STR_5875 :Графический драйвер:
+STR_5876 :Драйвер, используемый для отображения игровой графики
+STR_5877 :Программный
+STR_5878 :Прог. + аппаратное отображение
+STR_5879 :OpenGL (эксп.)
+STR_5880 :Только выбранные
+STR_5881 :Только не-выбранные
+STR_5882 :Настраиваемвая валюта
+STR_5883 :Конфигурация настраиваемой валюты
+STR_5884 :{WINDOW_COLOUR_2}Курс обмена:
+STR_5885 :{WINDOW_COLOUR_2}= {COMMA32} фунтов Стерлинга (£)
+STR_5886 :{WINDOW_COLOUR_2}Символ валюты:
+STR_5887 :Префикс
+STR_5888 :Суффикс
+STR_5889 :Символ настраиваемой валюты
+STR_5890 :Введите отображаемый символ для своей валюты
+STR_5891 :Умолч.
+STR_5892 :Перейти в папку по умолчанию
+STR_5893 :Курс обмена
+STR_5894 :Введите курс обмена
+STR_5895 :Сохранить трек
+STR_5896 :Не удалось сохранить трек!
+STR_5898 :{BLACK}Не могу загрузить трек. {NEWLINE}Возможно, файл повреждён или удалён.
+STR_5899 :Вкл/выкл. окна отладки отрисовки
+STR_5900 :Использовать оригинальный код отрисовки
+STR_5901 :Показать высоты сегментов
+STR_5902 :Показать ограничительные рамки
+STR_5903 :Показать окно отладки отрисовки
+STR_5904 :Сбросить дату
+STR_5905 :Инструмент, автоматически генерирующий ландшафт для карты
+STR_5906 :Масштаб на позицию курсора
+STR_5907 :Если включено, масштабирование будет приближаться к позиции курсора, а не к центру окна
+STR_5908 :Изменение типа аттракциона
+STR_5909 :Разрешает изменять тип аттракциона.{NEWLINE}Может привести к сбоям игры.
+STR_5910 :Применить
+STR_5911 :Прозрачные тропы
+STR_5912 :Вкл/выкл. прозрачные тропы
+STR_5913 :Чат
+STR_5914 :Неизв. аттракцион
+STR_5915 :Игрок
+STR_5916 :{COMMA16} игрок
+STR_5917 :{COMMA16} игроков
+STR_5920 :Погодные эффекты
+STR_5921 :Дождь и темнота будут отображаться при плохой погоде.
+STR_5922 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}Макс. {STRINGID}
+STR_5923 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}Макс. {COMMA16} {STRINGID} на поезд
+STR_5924 :Свойства поверхности
+STR_5925 :Свойства тропы
+STR_5926 :Свойства трека
+STR_5927 :Свойства пейзажа
+STR_5928 :Свойства входа
+STR_5929 :Свойства стены
+STR_5930 :Свойства большого пейзажа
+STR_5931 :Свойства баннера
+STR_5932 :Свойства повреждённого элемента
+STR_5933 :Свойства
+STR_5934 :Текстура почвы: {BLACK}{STRINGID}
+STR_5935 :Край почвы: {BLACK}{STRINGID}
+STR_5936 :Владение землёй: {BLACK}{STRINGID}
+STR_5937 :Нет владения и прав на покупку
+STR_5938 :Уровень воды: {BLACK}{COMMA16}
+STR_5939 :Убрать заборы парка
+STR_5940 :Вернуть заборы парка
+STR_5941 :Базовая высота:
+STR_5942 :Имя тропы: {BLACK}{STRINGID}
+STR_5943 :Добавки: {BLACK}{STRINGID}
+STR_5944 :Добавки: {BLACK}Никаких
+STR_5945 :Связанные грани:
+STR_5946 :Тип аттр.: {BLACK}{STRINGID}
+STR_5947 :ID аттр.: {BLACK}{COMMA16}
+STR_5948 :Имя аттр.: {BLACK}{STRINGID}
+STR_5949 :Цепной подъём
+STR_5950 :Применить изменение ко всей части трека
+STR_5951 :ID части трека: {BLACK}{COMMA16}
+STR_5952 :Номер последовательности: {BLACK}{COMMA16}
+STR_5953 :Отсортировать элементы на текущей плитке по высоте.
+STR_5954 :Возраст пейзажа: {BLACK}{COMMA16}
+STR_5955 :Квадрант размещения: {BLACK}{STRINGID}
+STR_5956 :Юго-запад
+STR_5957 :Северо-запад
+STR_5958 :Северо-восток
+STR_5959 :Юго-восток
+STR_5960 :Квадрант размещения:
+STR_5961 :Индекс записи: {BLACK}{COMMA16}
+STR_5962 :Обнаружение коллизий:
+STR_5963 :Поднятые углы:
+STR_5964 :Диагональ
+STR_5965 :Тип входа: {BLACK}{STRINGID}
+STR_5966 :Часть входа в парк: {BLACK}{STRINGID}
+STR_5967 :Средний
+STR_5968 :Левый
+STR_5969 :Правый
+STR_5970 :ID входа: {BLACK}{COMMA16}
+STR_5971 :ID выхода: {BLACK}{COMMA16}
+STR_5972 :ID аттр.: {BLACK}{COMMA16}
+STR_5973 :Приравнять к следующей
+STR_5974 :Изменяет высоту таким образом, чтобы она совпадала со следующим элементом на текущей плитке. Это упростит строительство на плитке.
+STR_5975 :Наклон:
+STR_5976 :Плоский
+STR_5977 :Правая сторона сверху
+STR_5978 :Левая сторона сверху
+STR_5979 :Тип стены: {BLACK}{COMMA16}
+STR_5980 :Текст баннера: {BLACK}{STRINGID}
+STR_5981 :Не баннер
+STR_5982 :Тип большого пейзажа: {BLACK}{COMMA16}
+STR_5983 :ID части большого пейзажа: {BLACK}{COMMA16}
+STR_5984 :Заблокированные тропы:
+STR_5985 :Новая папкв
+STR_5986 :Введите имя новой папки.
+STR_5987 :Невозможно создать папку
+STR_5988 :Нет продаваемых прав на землю
+STR_5989 :Нет продаваемых прав на строительсво
+STR_5990 :Нет продаваемых прав на землю/строительство
+STR_5991 :Не могу вставить элемент…
+STR_5992 :Достигнут лимит на элементы на карте
+STR_5993 :Копировать элемент
+STR_5994 :Вставить элемент
+STR_5995 :Ускоритель
+STR_5996 :Скорость ускорителя
+STR_5997 :Добавить/установить деньги
+STR_5998 :Доб. деньги
+STR_5999 :Уст. деньги
+STR_6000 :Введите новое значение
+STR_6001 :Эффекты освещения (экспериментально)
+STR_6002 :Лампы и аттракционы загораются ночью.{NEWLINE}Требует аппаратного отображения.
+STR_6003 :Вид "в разрезе"
+STR_6004 :Вид "в разрезе"
+STR_6005 :Включить вид "в разрезе"
+STR_6006 :Вид "в разрезе" п оказыват элементы только ниже заданной высоты и внутри выбранной области.
+STR_6007 :Высота
+STR_6008 :Переключить значение в игровых<->выбранных еденицах
+STR_6009 :Выбрать высоту разреза
+STR_6010 :{COMMA2DP32}м
+STR_6011 :{COMMA1DP16} футов
+STR_6013 :Гости будут платить за вход в парк и обслуживание.{NEWLINE}Поездки бесплатны.
+STR_6014 :Гости будут платить за обслуживание и поездки.{NEWLINE}Вход в парк бесплатный.
+STR_6015 :Наклон
+STR_6016 :Изменить плитку
+STR_6017 :Пожалуйста, помедленее
+STR_6018 :Строительство - Левый поворот
+STR_6019 :Строительство - Правый поворот
+STR_6020 :Строительство - Исп. умолч. трек
+STR_6021 :Строительство - Наклон вниз
+STR_6022 :Строительство - Наклон вверх
+STR_6023 :Строительство - Вкл/выкл. цепной подъём
+STR_6024 :Строительство - Крен налево
+STR_6025 :Строительство - Крен направо
+STR_6026 :Строительство - Прошлый трек
+STR_6027 :Строительство - Следующий трек
+STR_6028 :Строительство - Построить текущий
+STR_6029 :Строительство - Снести текущий
+STR_6030 :Пейзажная пипетка. Нажмите на любой элемент пейзажа на карте, чтобы построить такой же.
+STR_6031 :Описание сервера:
+STR_6032 :Приветствие сервера:
+STR_6033 :Путь к инсталляции RCT1:
+STR_6035 :Пожалуйста, выберите вашу папку RCT1
+STR_6036 :Очистить
+STR_6037 :Эта папка не содержит инсталляции RCT1.
+STR_6038 :Если у вас есть копия RCT1, вы можете импортировать её сценарии, музыку, итд.
+STR_6039 :Быстрый снос аттр.
+STR_6040 :Править настройки сценария
+STR_6041 :{BLACK}Не нанято ни одного механика!
+STR_6042 :Загрузить heightmap
+STR_6043 :Выбрать heightmap
+STR_6044 :Сгладить heightmap
+STR_6045 :Сила:
+STR_6046 :Нормализовать heightmap
+STR_6047 :Сгладить края плиток
+STR_6048 :Ошибка heightmap
+STR_6049 :Ошибка чтения PNG
+STR_6050 :Ошибка чтения bitmap
+STR_6052 :Heightmap слишком большой и будет обрезан
+STR_6053 :Heightmap не может быть нормализован
+STR_6054 :Поддеживается только 24-bit bitmap
+STR_6055 :Файл Heightmap для OpenRCT2
+STR_6056 :Выключить звук
+STR_6057 :Показывать отдельную кнопку для отключения звука в панели инструментов
+STR_6058 :Звук
+STR_6060 :Показывать анимацию при покупках
+STR_6061 :Анимированный эффект с суммой{NEWLINE}при покупках от гостей.
+STR_6064 :Овл. всей землёй
+STR_6065 :Лог действ. пользов.
+STR_6066 :Логирует действия всех пользователей в файл в вашей пользовательской папке.
+STR_6067 :Сервер запущен.
+STR_6068 :Сервер выключен.
+STR_6069 :{STRING} был выброшен с сервера пользователем {STRING}.
+STR_6070 :{STRING} был добавлен в группу ‘{STRING}’ пользователем {STRING}.
+STR_6071 :{STRING} создал новую группу игроков ‘{STRING}’.
+STR_6072 :{STRING} удалил группу игроков ‘{STRING}’.
+STR_6073 :{STRING} изменил права группы игроков ‘{STRING}’.
+STR_6074 :{STRING} изменил имя группы игроков ‘{STRING}’ на ‘{STRING}’.
+STR_6075 :{STRING} изменил умолч. группу игроков на ‘{STRING}’.
+STR_6076 :{STRING} использовал чит ‘{STRING}’.
+STR_6077 :Добавить деньги
+STR_6078 :{STRING} создал аттр. ‘{STRING}’.
+STR_6079 :{STRING} снёс аттр. ‘{STRING}’.
+STR_6080 :{STRING} изменил внешний вид аттр. ‘{STRING}’.
+STR_6081 :{STRING} изменил статус аттр. ‘{STRING}’ на закрытый.
+STR_6082 :{STRING} изменил статус аттр. ‘{STRING}’ на открытый.
+STR_6083 :{STRING} изменил статус аттр. ‘{STRING}’ на режим тестирования.
+STR_6084 :{STRING} изменил настройки машин на аттр. ‘{STRING}’.
+STR_6085 :{STRING} настройки аттр. ‘{STRING}’.
+STR_6086 :{STRING} переименовал аттр. ‘{STRING}’ в ‘{STRING}’.
+STR_6087 :{STRING} изменил цену поездки на аттр. ‘{STRING}’ на {STRING}
+STR_6088 :{STRING} изменил вторичную цену поездки на аттр. ‘{STRING}’ на {STRING}
+STR_6089 :{STRING} переименовал парк ‘{STRING}’ в ‘{STRING}’.
+STR_6090 :{STRING} открыл парк.
+STR_6091 :{STRING} закрыл парк.
+STR_6092 :{STRING} изменил цену на вход в парк на {STRING}
+STR_6093 :{STRING} добавил новый пейзаж.
+STR_6094 :{STRING} убрал пейзаж.
+STR_6095 :{STRING} изменил пейзаж.
+STR_6096 :{STRING} установил имя знака ‘{STRING}’.
+STR_6097 :{STRING} создал трек для аттр. ‘{STRING}’.
+STR_6098 :{STRING} удалил трек для аттр.
+STR_6099 :Вы подключились к серверу.
+STR_6100 :Вы отключились от сервера.
+STR_6101 :Предпочитаемая цена аттр. не снижается
+STR_6102 :Гости не будут считать старые аттракционы слишком дорогими.
+STR_6103 :Эта опция не доступна в онлайн-играх.
+STR_6105 :Гипер-горки
+STR_6107 :Монстро-машины
+STR_6109 :Гипер-твистер
+STR_6111 :Классические мини-горки
+STR_6113 :Высокий аттракцион без переворотов, но с большими падениями, высокой скоростью и комфортабельными поездами, имеющими только ограничения безопасности для ног
+STR_6115 :Гигантские электрические грузовики размером 4 × 4, которые могут подниматься на большие наклоны
+STR_6116 :Широкие поезда скользят по плавной стали этого аттракциона, проходя через несколько переворотов
+STR_6119 :Дешёвый аттракцион, который просто строить. Однако, есть ограничение высоты.
+STR_6120 :{BABYBLUE}Новая машина доступна для {STRINGID}:{NEWLINE}{STRINGID}
+STR_6121 :Расширяет права на землю парка до краёв карты
+STR_6122 :В этом сценарии слишком мало аттракционов!
+STR_6123 :Ошибка загрузки объектов парка
+STR_6124 :Имя объекта
+STR_6125 :Тип объекта
+STR_6126 :Неизв. тип
+STR_6127 :Файл: {STRING}
+STR_6128 :Этот файл не мог быть загружен, т.к. некоторые из его объектов остутствуют или повреждены. Список таких объектов предоставлен ниже.
+STR_6129 :Копировать
+STR_6130 :Копировать все
+STR_6131 :Источник объекта
+STR_6132 :Игнорировать статус исследования
+STR_6133 :Открывает доступ к аттаркционам, которые ещё не изобретены.
+STR_6134 :Очистить пейзаж
+STR_6135 :Клиент отправил неверный запрос
+STR_6136 :Сервер отправил неверный запрос
+STR_6137 :OpenRCT2, бесплатная open-source реимлпементация и дополнение к Roller Coaster Tycoon 2.
+STR_6138 :OpenRCT2 является работой многих авторов, и полный список можно найти по кнопке "Участники". Для дополнительной информации, посетите http://github.com/OpenRCT2/OpenRCT2
+STR_6139 :Все имена товаров и компаний принадлежат их обладателям. Их использование не подразумевает поддержку этих правообладателей или наличие каких-либо связей с ними.
+STR_6140 :Changelog…
+STR_6141 :Нижняя панель инструментов RCT1
+STR_6142 :{WINDOW_COLOUR_2}Имя трека: {BLACK}{STRING}
+STR_6143 :{WINDOW_COLOUR_2}Тип аттр.: {BLACK}{STRINGID}
+STR_6144 :Показывать грязную графику
+STR_6145 :Установить ограничение скорости для ускорителей
+STR_6146 :Разрешить все части трека
+STR_6147 :Разрешает использовать любую часть трека при строительстве, даже если используемая машина её не поддерживает.
+STR_6148 :Подключение к главному серверу…
+STR_6149 :Не удалось подключится к главному серверу
+STR_6150 :Неверный ответ от главного сервера (no JSON number)
+STR_6151 :Главный сервер не вернул список серверов
+STR_6152 :Неверный ответ от главного сервера (no JSON array)
+STR_6153 :Оплата за вход в парк/за поездку
+STR_6154 :По причинам безопасности, запуск OpenRCT2 от имени администратора не рекомендуется.
+STR_6155 :Не найдено KDialog или Zenity. Установите хотя бы один из них, или настройте OpenRCT2 через терминал.
+STR_6156 :Имя зарезервировано.
+STR_6157 :Консоль
+STR_6160 :{WINDOW_COLOUR_2}Доступные машины: {BLACK}{STRING}
+STR_6161 :Переключатель отображения сетки
+STR_6162 :Вращающаяся мышка
+STR_6163 :Машины в форме мышей проходят острые углы и небольшие подения на высокой скорости, мягко вращаясь, чтобы дизориентировать гостей.
+STR_6165 :Использовать V-Sync
+STR_6166 :Синхронизует отображение кадров со скоростью монитора.{NEWLINE}Помогает избежать горизонтальных полос во время игры.
+STR_6167 :Дополнительно
+STR_6168 :Заставка на основном экране
+STR_6169 :Выбор сценария
+STR_6170 :Модификации интерфейса
+STR_6171 :Поиск
+STR_6172 :Поиск
+STR_6173 :Введите имя для поиска:
+STR_6188 :Рвота
+STR_6189 :Утка
+STR_6191 :Поверхность
+STR_6192 :Стена
+STR_6193 :{COMMA16} гость
+STR_6194 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} гость
+STR_6195 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} гость
+STR_6196 :{BLACK}Год:
+STR_6197 :{BLACK}Месяц:
+STR_6198 :{BLACK}День:
+STR_6199 :Установить дату
+STR_6200 :Сбросить дату
+STR_6202 :Стиль виртуального пола:
+STR_6203 :Если включено, виртуальный "пол" будет отображаться при зажатии Ctrl или Shift для упрощения вертикального размещения элементов.
+STR_6215 :Строительство
+STR_6216 :Использование
+STR_6217 :Доступность аттракционов/треков
+STR_6218 :Оффициально от OpenRCT2
+STR_6219 :Показать проблемы с тропами
+STR_6220 :Активировать
+STR_6221 :Установит положение входа/выхода на аттр. на текущую плитку. Только один вход/выход может быть активным на станции.
+STR_6222 :Не могу разместить точку входа гостей здесь…
+STR_6223 :Должно быть за пределами парка!
+STR_6224 :{STRING} разместил точку входа гостей.
+STR_6225 :Не поддерживается с граф. драйвером OpenGL
+STR_6226 :Разрешить раннее завершение сценария
+STR_6227 :Завершает сценарий если все цели выполнены даже до даты завершения
+STR_6228 :Опции сценариев
+STR_6232 :Заморожено
+STR_6233 :Вид "в разрезе"
+STR_6234 :Показать проблемы с тропами
+STR_6235 :Информация о сервере
+STR_6236 :Игроки
+STR_6237 :Группы
+STR_6238 :Опции онлайн-игры
+STR_6239 :Верт. ограничение
+STR_6240 :Гориз. ограничение
+STR_6241 :Выбрать область
+STR_6242 :Сбросить выбор
+STR_6243 :Обновляет аттр.,{NEWLINE}возвращая его надежность в изначальное состояние
+STR_6244 :Не могу обновить аттр…
+STR_6245 :Аттр. не нуждается в обновлении.
+STR_6246 :Обновить
+STR_6247 :Обновить аттр.
+STR_6248 :{WINDOW_COLOUR_1}Вы хотите обновить {STRINGID} за {CURRENCY}?
+STR_6249 :{WINDOW_COLOUR_1}Вы хотите обновить {STRINGID}?
+STR_6250 :{WINDOW_COLOUR_1}Вы точно хотите снести {STRINGID} и получить {CURRENCY}?
+STR_6251 :Аттр. еще не пуст
+STR_6255 :URL недействителен
+STR_6256 :Эффекты отрисовки
+STR_6257 :Стеклянный (полупрозрачный)
+STR_6258 :Прозрачный
+STR_6259 :Отключить
+STR_6260 :Показать заблокированные плитки
+STR_6261 :Показать широкие тропы
+STR_6262 :Основная громкость
+STR_6263 :Включить/выключить все звуки
+STR_6264 :Использовать системный файловый диалог
+STR_6265 :Если включено, мы будем использовать файловый диалог вашей ОС вместо того, что встроен в OpenRCT2.
+STR_6266 :Открыть папку пользовательского контента
+STR_6267 :Открыть инспектор плиток
+STR_6268 :Перейти на следующий tick
+STR_6269 :Неверное ID климата
+STR_6270 :Поверхности почвы
+STR_6271 :Края почвы
+STR_6272 :Станции
+STR_6273 :Музыка
+STR_6274 :Не могу установить цветовую тему…
+STR_6275 :{WINDOW_COLOUR_2}Стиль станций:
+STR_6276 :{RED}Гости застревают на {STRINGID}, возможно, из-за неверного типа аттр. или режима работы.
+STR_6277 :Индекс станции: {BLACK}{STRINGID}
+STR_6278 :Кол-во автосохранений:
+STR_6279 :Максимальное количество автосохранений (старые удаляются)
+STR_6280 :Чат
+STR_6281 :Показывать кнопку чата в панели инструментов
+STR_6282 :Чат
+STR_6283 :Chat not available at this time. Are you connected to a server?
+STR_6293 :Б
+STR_6294 :КБ
+STR_6295 :МБ
+STR_6296 :ГБ
+STR_6297 :ТБ
+STR_6298 :{STRING}/с
+STR_6299 :Скачать все
+STR_6300 :Скачать все недостающие объекты, если они доступны по сети.
+STR_6301 :Скопировать имя выбранного объекта в буфер.
+STR_6302 :Скопировать весь список недостающих объектов в буфер.
+STR_6303 :Скачивание объекта ({COMMA16} из {COMMA16}): [{STRING}]
+STR_6304 :Открыть выбор пейзажа
+STR_6305 :Многопоточность
+STR_6306 :Экспериментальная опция для многопоточного отображения графики.{NEWLINE}Может вызвать нестабильность.
+STR_6307 :Цветовая схема: {BLACK}{STRINGID}
+STR_6308 :{TOPAZ}“{STRINGID}{OUTLINE}{TOPAZ}”{NEWLINE}{STRINGID}
+STR_6309 :Переподключиться
+STR_6310 :{WINDOW_COLOUR_2}Позиция: {BLACK}{INT32} {INT32} {INT32}
+STR_6311 :{WINDOW_COLOUR_2}Следующая: {BLACK}{INT32} {INT32} {INT32}
+STR_6312 :(поверхность)
+STR_6313 :(наклон {INT32})
+STR_6314 :{WINDOW_COLOUR_2}Назначение: {BLACK}{INT32}, {INT32} tolerance {INT32}
+STR_6315 :{WINDOW_COLOUR_2}Цель поиска пути: {BLACK}{INT32}, {INT32}, {INT32} dir {INT32}
+STR_6316 :{WINDOW_COLOUR_2}История поиска пути:
+STR_6317 :{BLACK}{INT32}, {INT32}, {INT32} dir {INT32}
+STR_6318 :Обнаружен сетевой рассинхрон.{NEWLINE}Лог-файл: {STRING}
+STR_6319 :Блочный тормоз закрыт
+STR_6320 :Неразрушимый
+STR_6321 :Добавка сломана
+STR_6322 :{WINDOW_COLOUR_2}ID сущности: {BLACK}{INT32}
+STR_6323 :Симуляция
+STR_6324 :Симулировать
+STR_6325 :Симулировать аттр.
+STR_6326 :Не могу симулировать {STRINGID}…
+STR_6327 :Прозрачный фон для огромных скриншотов
+STR_6328 :Если эта опция включена, у огромных скриншотов фон будет прозрачным, а не чёрным.
+STR_6330 :Скачивание [{STRING}] из {STRING} ({COMMA16} из {COMMA16})
+STR_6331 :Создать уток
+STR_6332 :Убрать уток
+STR_6333 :Увеличить масштаб
+STR_6334 :Уменьшить масштаб
+STR_6336 :Испектор плиток: Копировать элемент
+STR_6337 :Испектор плиток: Вставить элемент
+STR_6338 :Испектор плиток: Удалить элемент
+STR_6339 :Испектор плиток: Передвинуть элемент вверх
+STR_6340 :Испектор плиток: Передвинуть элемент вниз
+STR_6341 :Испектор плиток: Увеличить X координату
+STR_6342 :Испектор плиток: Уменьшить X координату
+STR_6343 :Испектор плиток: Увеличить Y координату
+STR_6344 :Испектор плиток: Уменьшить Y координату
+STR_6345 :Испектор плиток: Увеличить высоту элемента
+STR_6346 :Испектор плиток: Уменьшить высоту элемента
+STR_6347 :Добавки к путям не должны находиться на плоских перекрёстках!
+STR_6348 :Удалите плоский перекрёсток!
+STR_6349 :Случайная заставка
+STR_6350 :Разброс
+STR_6351 :Инструмент разброса пейзажа
+STR_6352 :Плотность
+STR_6353 :Низкая плотность
+STR_6354 :Средняя плотность
+STR_6355 :Высокая плотность
+STR_6356 :Вызывает уток, если в парке есть вода
+STR_6357 :Убирает всех уток с карты
+STR_6358 :Страница {UINT16}
+STR_6359 :{POP16}{POP16}Страница {UINT16}
+STR_6361 :Эффекты освещения на аттракционах (эксп.)
+STR_6362 :Если включено, машины аттракционов будут освещаться ночью.
+STR_6363 :Текст скопирован в буфер
+STR_6364 :{RED}{COMMA16} человек умерло в аварии на {STRINGID}
+STR_6365 :Смерти на аттр.
+STR_6366 :Застрявшие машины
+STR_6367 :Кадр анимации:
+STR_6368 :Для лучшей совместимости, мы не рекомендуем запускать OpenRCT2 через Wine. У нас есть нативная поддержка для macOS, Linux, FreeBSD и OpenBSD.
+STR_6369 :Строительство треков на любой высоте
+STR_6370 :Разрешает размещать части трека на любых высотных интервалах.
+STR_6371 :Этот путь содержит инсталляцию RCT1, но в нём нет файла “csg1i.dat”. Скопируйте этот файл с диска Loopy Landscapes или RCT Deluxe в папку “Data” вашей инсталляции RCT1.
+STR_6372 :Этот путь содержит инсталляцию RCT1, но эта версия не поддерживается. OpenRCT2 необходима инсталляция версии "Loopy Landscapes" или "Deluxe" для правильной работы.
+STR_6373 :Вкл/выкл. проверки разрешений
+STR_6374 :C
+STR_6375 :Неизвестный аттр.
+STR_6376 :{WINDOW_COLOUR_2}Машина аттр.:{NEWLINE}{BLACK}{STRINGID} для {STRINGID}
+STR_6377 :{WINDOW_COLOUR_2}Тип: {BLACK}{STRINGID} для {STRINGID}
+STR_6378 :Получение списка объектов…
+STR_6379 :Получены неверные данные
+STR_6380 :Доступно обновление!
+STR_6381 :Подключайтесь к серверу OpenRCT2 в Discord!
+STR_6382 :Доступен новый релиз OpenRCT2: {STRING}!
+STR_6383 :Открыть страницу скачивания
+STR_6384 :Снег
+STR_6385 :Метель
+STR_6386 :Буран
+STR_6387 :Не могу опустить элемент…
+STR_6388 :Не могу поднять элемент…
+STR_6389 :Неверные разрешения
+STR_6390 :OpenRCT2 нужны файлы из оригинального RollerCoaster Tycoon 2 или RollerCoaster Tycoon Classic. Пожалуйста, выберите папку куда вы установили RCT2 или RCT Classic.
+STR_6391 :Выберите папку RCT2 или RCTC
+STR_6392 :{STRING} не найдено по этому пути.
+STR_6393 :Выбор цели
+STR_6394 :Цель
+STR_6395 :Чистка парка
+STR_6396 :Отключить энергосберегающие функции
+STR_6397 :Отключает screensaver, затемнение экрана и прочие энергосберегающие опции во время работы OpenRCT2.
+STR_6398 :Файл содержит неподдерживаемые типы аттр. Пожалуйста, обновитесь до последней версии OpenRCT2.
+STR_6399 :OpenRCT2 нужны файлы из оригинального RollerCoaster Tycoon 2 или RollerCoaster Tycoon Classic. Пожалуйста, установите переменную “game_path” в файле config.ini на путь установки RTC2 или RTC Classic, и перезапустите игру.
+STR_6400 :У меня есть офлайн-установщик GOG для RollerCoaster Tycoon 2, но он ещё не установлен
+STR_6401 :У меня есть установленная копия RollerCoaster Tycoon 2 или RollerCoaster Tycoon Classic
+STR_6402 :Настройки данных OpenRCT2
+STR_6403 :Выберите ваш вариант
+STR_6404 :Выберите установщик GOG для RollerCoaster Tycoon 2.
+STR_6405 :Выберите установщик GOG
+STR_6406 :Установщик GOG для RollerCoaster Tycoon 2
+STR_6407 :Это может занять несколько минут.
+STR_6408 :Пожалуйста, установите “innoextract” и перезапустите OpenRCT2, чтобы воспользоваться установщиком GOG.
+STR_6409 :Этот файл не являтеся офлайн-установщиком GOG для RCT2. Возможно, вы скачали установщик GOG Galaxy, или выбрали не тот файл.
+STR_6410 :Масштаб
+STR_6411 :Показать кнопки уменьшения/увеличения масштаба на панели инструментов
+STR_6412 :NumPad Enter
+STR_6413 :Shift
+STR_6414 :L Shift
+STR_6415 :R Shift
+STR_6416 :Ctrl
+STR_6417 :L Ctrl
+STR_6418 :R Ctrl
+STR_6419 :Alt
+STR_6420 :L Alt
+STR_6421 :R Alt
+STR_6422 :Cmd
+STR_6423 :L Cmd
+STR_6424 :R Cmd
+STR_6425 :Joy Left
+STR_6426 :Joy Right
+STR_6427 :Joy Up
+STR_6428 :Joy Down
+STR_6429 :Joy {INT32}
+STR_6430 :LMB
+STR_6431 :RMB
+STR_6432 :Mouse {INT32}
+STR_6433 :Удалить
+STR_6434 :Удалить все клавишы для этого действия.
+STR_6435 :{WINDOW_COLOUR_2}Вандалов остановлено: {BLACK}{COMMA32}
+STR_6436 :Вкл/выкл. невидимость
+STR_6437 :Видимо
+STR_6438 :{MOVE_X}{2}👁
+STR_6439 :Инспектор плиток: Вкл/выкл. невидимость
+STR_6440 :Прозрачная вода
+STR_6441 :Должен быть выбран хотя бы один поверхностный объект, не являющийся тропой очереди.
+STR_6442 :Должен быть выбран хотя бы один поверхностный объект, являющийся тропой очереди.
+STR_6443 :Должен быть выбран хотя бы один поверхностный объект, являющийся тропой с рельсами.
+STR_6444 :Поверхности троп
+STR_6445 :Рельсы троп
+STR_6446 :{WINDOW_COLOUR_2}Имя поверхности: {BLACK}{STRINGID}
+STR_6447 :{WINDOW_COLOUR_2}Имя рельса: {BLACK}{STRINGID}
+STR_6448 :Неподдерживаемыый формат объекта
+STR_6449 :{WINDOW_COLOUR_2}Треки:
+STR_6450 :{BLACK}“{STRING}”
+STR_6451 :{BLACK}“{STRING}” - {STRING}
+STR_6452 :{WINDOW_COLOUR_2}Продает: {BLACK}{STRING}
+STR_6453 :Скопировать информацию о версии
+STR_6454 :Не могу переименовать баннер…
+STR_6455 :Не могу переименовать знак…
+STR_6456 :Огромный скриншот
+STR_6457 :Сообщить о неполадке (через GitHub)
+STR_6458 :Следовать за этим на главном экране
+STR_6460 :D
+STR_6461 :Направление
+STR_6462 :Энергичность
+STR_6463 :Энергичность: {COMMA2DP32}
+STR_6464 :Интенсивность
+STR_6465 :Интенсивность: {COMMA2DP32}
+STR_6466 :Тошнотворность
+STR_6467 :Тошнотворность: {COMMA2DP32}
+STR_6468 :Пока неизвестно
+STR_6469 :Уменьшить область патрулирования
+STR_6470 :Увеличить область патрулирования
+STR_6471 :Прозрачные растения
+STR_6472 :Прозрачные машины
+STR_6473 :Прозрачные столбы
+STR_6474 :Невидимые гости
+STR_6475 :Невидимые сотрудники
+STR_6476 :Невидимые растения
+STR_6477 :Невидимый пейзаж
+STR_6478 :Невидимые тропы
+STR_6479 :Невидимые аттракционы
+STR_6480 :Невидимые машины
+STR_6481 :Опции прозрачности
+STR_6482 :Опции прозрачности
+STR_6483 :Открыть опции прозрачности
+STR_6484 :Переключатель прозрачности растений
+STR_6485 :Переключатель прозрачности машин
+STR_6486 :Переключатель видимости гостей
+STR_6487 :Переключатель видимости сотрудников
+STR_6488 :{RED}Гости жалуются на длину ваших очередей.{NEWLINE}Попробуйте уменьшить длину проблематичных очередей, или построить аттракционы с большим количеством пассажиров.
+STR_6489 :Ошибка: несовместимая версия парка
+STR_6490 :Предупреждение: частично-совместимая версия парка
+STR_6491 :Этот парк был создан в более новой версии OpenRCT2. Парк был создан в v{INT32}, и для его загрузки нужна хотя бы v{INT32}. Ваша версия: v{INT32}.
+STR_6492 :Этот парк был создан в более старой версии OpenRCT2, и не может быть открыт в этой версии. Версия парка: v{INT32}.
+STR_6493 :Этот парк был создан в более новой версии OpenRCT2, и некоторые данные могут быть утеряны. Версия парка: v{INT32}. Ваша версия: v{INT32}.
+STR_6494 :Группировка по типу
+STR_6495 :Группирует все аттракционы по их типу, вместо отдельного отображения.
+STR_6496 :{WINDOW_COLOUR_2}{STRINGID}
+STR_6497 :Щёлкните на плитку, чтобы показать её элементы.{NEWLINE}Ctrl + щелчок для выбора.
+STR_6498 :Включите это, чтобы сделать карту квадратной.
+STR_6499 :Тип машины не поддерживается форматом дизайна трека
+STR_6500 :Элементы трека не поддерживаются форматом дизайна трека
+STR_6501 :Случайный цвет
+STR_6502 :Введите значение между {COMMA16} и {COMMA16}
+STR_6503 :Должна быть выбрана хотя бы одна станция
+STR_6504 :Должна быть выбрана хотя бы одна поверхность почвы
+STR_6505 :Должен быть выбран хотя бы один край почвы
+STR_6506 :Большой полуштопор (левый)
+STR_6507 :Большой полуштопор (правый)
+STR_6508 :Средняя полупетля (левая)
+STR_6509 :Средня полпуетля (правая)
+STR_6510 :Поворот Zero-G (левый)
+STR_6511 :Поворот Zero-G (правый)
+STR_6512 :Большой поворот Zero-G (левый)
+STR_6513 :Большой поворот Zero-G (правый)
+STR_6514 :Неверная высота!
+STR_6515 :{BLACK}RollerCoaster Tycoon 1 не установлен - изображения будут заменены.
+STR_6516 :Некоторые выбранные объекты требуют установки RollerCoaster Tycoon 1 для правильного отображения.{NEWLINE}Некоторые изображения будут заменены.
+STR_6517 :Некоторые объекты в этом парке требуют установки RollerCoaster Tycoon 1 для правильного отображения.{NEWLINE}Некоторые изображения будут заменены.
+STR_6518 :{BLACK}Наведите мышь на сценарий, чтобы посмотреть его описание и цели.{NEWLINE}Щелкните, чтобы играть.
+STR_6519 :Экстра
+STR_6520 :Пакеты контента
+STR_6521 :Низкий приоритет
+STR_6522 :Высокий приоритет
+STR_6523 :Уменьшить приоритет выбранного пакета
+STR_6524 :Увеличить приоритет выбранного пакета
+STR_6525 :Перезагрузить весь игровой контент с выбранными пакетами
+STR_6526 :(графика, музыка, звуковые эффекты)
+STR_6527 :Соревнования
+STR_6528 :Неверные параметры трека!
+STR_6529 :Неверные параметры цветовой схемы!
+STR_6530 :Пользовательские дополнения
+STR_6531 :The Time Machine
+STR_6532 :Katy’s Dreamworld
+STR_6533 :{WINDOW_COLOUR_2}Фактор энергетичности: {BLACK}-{COMMA16}%
+STR_6534 :{WINDOW_COLOUR_2}Фактор интенсивности: {BLACK}-{COMMA16}%
+STR_6535 :{WINDOW_COLOUR_2}Фактор тошнотворности: {BLACK}-{COMMA16}%
+STR_6536 :Этот парк был сохранён в более новой версии OpenRCT2. Парк был сохранен в v{INT32}. Ваша версия: v{INT32}.
+STR_6537 :Обычные тропы как очереди
+STR_6538 :Показывает стандартные тропинки в списке очередей при строительстве.
+STR_6539 :Тормоз закрыт
+STR_6540 :{WINDOW_COLOUR_2}Особая благодарность следующим компаниям за то, что позволили нам воспользоваться их дизайнами:
+STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est.
+STR_6542 :Участники
+STR_6543 :Участники…
+STR_6544 :Заём не может быть отрицательным!
+STR_6545 :Использовать формулу RCT1 для займов
+STR_6546 :Использует формулу для вычисления процента по займу из RCT1: фиксированный процент 1.33%.
+STR_6547 :Весь пейзаж
+STR_6548 :Показывать рельсы на перекрёстках
+STR_6549 :Объекты совместимости не могут быть выбраны!
+STR_6550 :Эта сущность включена лишь для обратной совместимости со старыми/повреждёнными объектами. Её нельзя выбрать, но выбор можно снять.
+STR_6551 :Армейски-зелёный
+STR_6552 :Медовой
+STR_6553 :Загар
+STR_6554 :Каштан
+STR_6555 :Розовый корал
+STR_6556 :Лесно-зелёный
+STR_6557 :Шартрез
+STR_6558 :Охотничье-зелёный
+STR_6559 :Морская волна
+STR_6560 :Лайм
+STR_6561 :Сепия
+STR_6562 :Персик
+STR_6563 :Барвинок
+STR_6564 :Виридиан
+STR_6565 :Зелёная морская пена
+STR_6566 :Лиловый
+STR_6567 :Лаванда
+STR_6568 :Оранжевый пастель
+STR_6569 :Глубокая вода
+STR_6570 :Розовый пастель
+STR_6571 :Умбра
+STR_6572 :Бежевый
+STR_6573 :Невидимый
+STR_6574 :Пустота
+STR_6575 :Особые цвета
+STR_6576 :Добавляет особые цвета для аттракционов
+STR_6577 :Скорость блочных тормозов
+STR_6578 :Устанавливает лимит скорости для блочных тормозов. В режиме блок-секций, близлежащие тормоза с более низкой скоростью будут связаны с блочным тормозом.
+STR_6579 :Блочные тормоза будут установлены на скорость по умолчанию при сохранении дизайна.
+STR_6580 :Сброс
+STR_6581 :Вы хотите сбросить все горячие клавиши на этой вкладке?
+STR_6582 :Открыть окно горячих клавиш
+STR_6583 :{WINDOW_COLOUR_2}Обратное направление поездов
+STR_6584 :Выберите, чтобы запускать поезда в обратном направлении.
+STR_6585 :Не могу внести изменения…
+STR_6586 :OpenRCT2
+STR_6587 :Музыка из главного меню OpenRCT2 является работой Allister Brimble,{NEWLINE}под лицензией CC BY-SA 4.0.
+STR_6588 :Благодарим Herman Riddering за права на запись музыки от 35er Voigt.
+STR_6589 :Показывать кнопки окна слева
+STR_6590 :Показывать кнопки окна (например, "закрыть"), с левой стороны вместо правой.
+STR_6591 :Сотрудник чинит аттр., его нельзя уволить.
+STR_6592 :Сотрудник занят инспекцией аттр., его нельзя уволить.
+STR_6593 :Убрать заборы
+STR_6594 :Инспектор плиток: Вкл/выкл. наклон стены
+STR_6595 :{WINDOW_COLOUR_2}Автор: {BLACK}{STRING}
+STR_6596 :{WINDOW_COLOUR_2}Авторы: {BLACK}{STRING}
+STR_6597 :Неверный параметр
+STR_6598 :Значение за допустимыми пределами
+STR_6599 :Призрачный элемент не найден
+STR_6600 :Шарик не найден
+STR_6601 :Сотрудник не найден
+STR_6602 :Аттр. не найден
+STR_6603 :Вход в объект аттр. не найден
+STR_6604 :Игрок не найден
+STR_6605 :Элемент входа не найден
+STR_6606 :Элемент поверхности не найден
+STR_6607 :Элемент плитки не найден
+STR_6608 :Элемент трека не найден
+STR_6609 :Блок трека не найден
+STR_6610 :Элемент тропы не найден
+STR_6611 :Элемент стены не найден
+STR_6612 :Элемент баннера не найден
+STR_6613 :Перезагрузить объект
+STR_6614 :Не могу изменить цену на вход в парк
+STR_6615 :Треку на этой плитке нужна вода
+STR_6616 :Действие недоступно для этого сотрудника
+STR_6617 :Не могу поменять элемент плитки с самим собой
+STR_6618 :Не могу добавить/убрать ограничение на объект…
+STR_6619 :Объект не может быть ограничен!
+STR_6620 :Объект не найден!
+STR_6621 :Ограничить
+STR_6622 :Сделать объект доступным только в редакторе сценариев и в режиме Sandbox.
+STR_6623 :Введите ‘help’ для списка комманд. Введите ‘hide’, чтобы скрыть консоль.
+STR_6624 :Инспектор плиток: Отсортировать элементы
+STR_6625 :Неверный цвет
+STR_6626 :Анмация задом-наперед
+STR_6627 :Скорость трека слишком высока!
+STR_6628 :Можно размещать только на краях троп!
+STR_6629 :Выровнять кнопки панели инструментов по центру
+STR_6630 :Эта настройка выровняет кнопки на игровой панели инструментов по центру, вместо того чтобы распологать их слева/справа
+STR_6631 :Загрузка…
+STR_6632 :Проверка файлов объектов…
+STR_6633 :Проверка файлов сценария…
+STR_6634 :Проверка файлов дизайна треков…
+STR_6635 :Проверка пакетов контента…
+STR_6636 :Проверка заставок…
+STR_6637 :Загружается главное меню…
+STR_6638 :Увеличить интерфейс
+STR_6639 :Модифицирует интерфейс, чтобы его было удобнее использовать на тачскринах
+STR_6640 :Пакеты контента…
+STR_6641 :Окно загрузки/прогресса
+STR_6642 :{STRING} ({COMMA32} из {COMMA32})
+STR_6643 :{STRING} ({COMMA32} из {COMMA32} КБ)
+STR_6644 :Режим тачскрина
+STR_6645 :Увеличивает размер некоторых элементов пользовательского интерфейса{NEWLINE}для упрощения их нажатия.
+STR_6646 :Автор: {STRING}
+STR_6647 :Авторы: {STRING}
+STR_6648 :Загрузка движка плагинов…
+STR_6649 :Загрузка сценария…
+STR_6650 :Загрузка сохр. игры…
+STR_6651 :{STRING} ({COMMA32}%)
+STR_6652 :Окно ошибки
+STR_6653 :Показаны все источники
+STR_6654 :Показано {POP16}{UINT16} источников
+STR_6655 :Только ‘{POP16}{STRINGID}’
+STR_6656 :Убрать все заборы из парка
+STR_6657 :Неовл. землёй
+STR_6658 :Установить землю, которой парк не владеет и не имеет прав на её покупку
+STR_6659 :Гостям все равно на цены
+STR_6660 :Гости будут игнорировать цены аттракционов и магазинов.
+STR_6661 :Все случайно
+STR_6662 :Назначает цвета для каждой машины случайным образом.
+STR_6663 :Читы дат
+STR_6664 :Показать читы дат
+STR_6665 :Климатические читы
+STR_6666 :Показать климатические читы
+STR_6667 :Фауна
+STR_6668 :Читы сотрудников
+STR_6669 :Показать читы сотрудников
+STR_6670 :Поведение гостей
+STR_6671 :Показать "реальные" имена сотрудников
+STR_6672 :Показать "реальные" имена сотрудников вместо их номеров
+STR_6673 :Прозрачно
+STR_6674 :{MONTH}, год {COMMA16}
+STR_6675 :Имена людей
+STR_6676 :Нужно выбрать хотя бы один объект типа "имена людей"
+STR_6677 :Добавлять пляжи вокруг воды
+STR_6678 :Источник heightmap:
+STR_6679 :Плоскость
+STR_6680 :Шум Simplex
+STR_6681 :Файл Heightmap
+STR_6682 :Генератор карт - Генератор
+STR_6683 :Генератор карт - Почва
+STR_6684 :Генератор карт - Воды
+STR_6685 :Генератор карт - Леса
+STR_6686 :Пропорция деревьев к земле:
+STR_6687 :Мин. высота дерева:
+STR_6688 :Макс. высота дерева:
+STR_6689 :{UINT16}%
+STR_6690 :Минимальная высота земли
+STR_6691 :Введите мин. высоту земли между {COMMA16} и {COMMA16}
+STR_6692 :Максимальная высота земли
+STR_6693 :Введите макс. высоту земли между {COMMA16} и {COMMA16}
+STR_6694 :Минимальная высота деревьев
+STR_6695 :Введите мин. высоту деревьев между {COMMA16} и {COMMA16}
+STR_6696 :Максимальная высота деревьев
+STR_6697 :Введите макс. высоту деревьев между {COMMA16} и {COMMA16}
+STR_6698 :Пропорция деревьев к земле
+STR_6699 :Введите пропорцию деревьев к земле между {COMMA16} и {COMMA16}
+STR_6700 :Базовая частота Simplex
+STR_6701 :Введите базовую частоту между {COMMA2DP32} и {COMMA2DP32}
+STR_6702 :Октавы Simplex
+STR_6703 :Введите октавы между {COMMA16} и {COMMA16}
+STR_6704 :{COMMA2DP32}
+STR_6705 :Обзор…
+STR_6706 :{WINDOW_COLOUR_2}Текущий файл изобр.: {BLACK}{STRING}
+STR_6707 :(не выбрано)
+STR_6708 :Сила сглаживания
+STR_6709 :Введите силу сглаживания между {COMMA16} и {COMMA16}
+STR_6710 :Стабильная сортировка
+STR_6711 :Имя файла:
+STR_6712 :Сохранить
+STR_6713 :{COMMA32} {STRINGID}
+STR_6714 :Имя файла
+STR_6715 :Дата изменения
+STR_6716 :Размер
+STR_6717 :Размер {STRINGID}
+STR_6718 :Анимации людей
+STR_6719 :Нужно выбрать хотя бы один объект анимации людей
+STR_6720 :Нужно выбрать хотя бы один объект анимации дворников
+STR_6721 :Нужно выбрать хотя бы один объект анимации механиков
+STR_6722 :Нужно выбрать хотя бы один объект анимации охранников
+STR_6723 :Нужно выбрать хотя бы один объект анимации развлекателей
diff --git a/data/language/sv-SE.txt b/data/language/sv-SE.txt
index cae9f1ba39..d7dab089a3 100644
--- a/data/language/sv-SE.txt
+++ b/data/language/sv-SE.txt
@@ -1161,17 +1161,6 @@ STR_1773 :Bara en fotosektion tillåten per åktur
STR_1774 :Bara en uppskjutskulle tillåten per åktur
STR_1777 :Musik för åkturer
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Pandadräkt
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tigerdräkt
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elefantdräkt
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Romersk dräkt
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilladräkt
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snögubbedräkt
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Riddardräkt
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronautdräkt
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Banditdräkt
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriffdräkt
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Piratdräkt
STR_1790 :Välj uniformfärg för den här sortens personal
STR_1791 :{WINDOW_COLOUR_2}Uniformfärg:
STR_1792 :Svarar på radioanrop om {STRINGID}
diff --git a/data/language/tr-TR.txt b/data/language/tr-TR.txt
index 130adc7edc..c4379c64e0 100644
--- a/data/language/tr-TR.txt
+++ b/data/language/tr-TR.txt
@@ -1151,17 +1151,6 @@ STR_1773 :Alet başı bir tane fotoğraf alanı inşa edilebilir
STR_1774 :Alet başı bir tane asansörlü tırmanma zinciri inşa edilebilir
STR_1777 :{WINDOW_COLOUR_2}Alet müziği
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda kıyafeti
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Kaplan kıyafeti
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Fil kıyafeti
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Romalı kıyafeti
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Goril kıyafeti
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Kardan adam kıyafeti
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Şövalye kıyafeti
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronot kıyafeti
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Eşkıya kıyafeti
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Şerif kıyafeti
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Korsan kıyafeti
STR_1790 :Bu işçinin üniforma{NEWLINE}rengini seçiniz
STR_1791 :{WINDOW_COLOUR_2}Üniforma rengi:
STR_1792 :{STRINGID} aletinin tamirine gidiyor
diff --git a/data/language/uk-UA.txt b/data/language/uk-UA.txt
index f312567fa7..aeccc88a49 100644
--- a/data/language/uk-UA.txt
+++ b/data/language/uk-UA.txt
@@ -1158,17 +1158,6 @@ STR_1773 :Only one on-ride photo section allowed per ride
STR_1774 :Only one cable lift hill allowed per ride
STR_1777 :Музика в атракціонах
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Костюм панди
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Костюм тигра
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Костюм слона
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Римський костюм
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Костюм горили
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Костюм сніговика
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Костюм лицаря
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Костюм астронавта
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Костюм бандита
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Костюм шерифа
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Костюм пірата
STR_1790 :Вибрати колір уніформи для цього типу працівників
STR_1791 :{WINDOW_COLOUR_2}Колір уніформи:
STR_1792 :Відповідає на {STRINGING} виклик про поломку
diff --git a/data/language/vi-VN.txt b/data/language/vi-VN.txt
index 7428862479..45ff9916b0 100644
--- a/data/language/vi-VN.txt
+++ b/data/language/vi-VN.txt
@@ -1154,17 +1154,6 @@ STR_1773 :Only one on-ride photo section allowed per ride
STR_1774 :Only one cable lift hill allowed per ride
STR_1777 :Ride music
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} Panda costume
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} Tiger costume
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} Elephant costume
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} Roman costume
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} Gorilla costume
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} Snowman costume
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} Knight costume
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} Astronaut costume
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} Bandit costume
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} Sheriff costume
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} Pirate costume
STR_1790 :Select uniform colour for this type of staff
STR_1791 :{WINDOW_COLOUR_2}Uniform colour:
STR_1792 :Đang trả lời cuộc gọi vì {STRINGID} bị hỏng
diff --git a/data/language/zh-CN.txt b/data/language/zh-CN.txt
index c41afadb8b..a1d3e1fb13 100644
--- a/data/language/zh-CN.txt
+++ b/data/language/zh-CN.txt
@@ -1160,17 +1160,6 @@ STR_1773 :每个游乐设施只能建造一个照相区域
STR_1774 :每个游乐设施只能建造一个牵引轨道
STR_1777 :设施音乐
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00}熊猫服装
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00}老虎服装
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00}大象服装
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00}罗马服装
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00}大猩猩服装
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00}雪人服装
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00}骑士服装
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00}宇航员服装
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00}土匪服装
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00}警长服装
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00}海盗服装
STR_1790 :选择这种员工的制服颜色
STR_1791 :{WINDOW_COLOUR_2}制服的颜色:
STR_1792 :正在回应{STRINGID}的故障呼叫
diff --git a/data/language/zh-TW.txt b/data/language/zh-TW.txt
index 45f3bc32e3..bb63431abd 100644
--- a/data/language/zh-TW.txt
+++ b/data/language/zh-TW.txt
@@ -1160,17 +1160,6 @@ STR_1773 :每個遊樂設施只可建造一個即時照相區域
STR_1774 :每個遊樂設施只可建造一個纜索坡道
STR_1777 :音樂
STR_1778 :{STRINGID} - -
-STR_1779 :{INLINE_SPRITE}{254}{19}{00}{00} 熊貓服裝
-STR_1780 :{INLINE_SPRITE}{255}{19}{00}{00} 老虎服裝
-STR_1781 :{INLINE_SPRITE}{00}{20}{00}{00} 大象服裝
-STR_1782 :{INLINE_SPRITE}{01}{20}{00}{00} 羅馬服裝
-STR_1783 :{INLINE_SPRITE}{02}{20}{00}{00} 哥斯拉服裝
-STR_1784 :{INLINE_SPRITE}{03}{20}{00}{00} 雪人服裝
-STR_1785 :{INLINE_SPRITE}{04}{20}{00}{00} 騎士服裝
-STR_1786 :{INLINE_SPRITE}{05}{20}{00}{00} 太空人服裝
-STR_1787 :{INLINE_SPRITE}{06}{20}{00}{00} 土匪服裝
-STR_1788 :{INLINE_SPRITE}{07}{20}{00}{00} 警長服裝
-STR_1789 :{INLINE_SPRITE}{08}{20}{00}{00} 海盜服裝
STR_1790 :選擇這種員工的制服顏色
STR_1791 :{WINDOW_COLOUR_2}制服的顏色:
STR_1792 :回應{STRINGID}的故障呼叫中
diff --git a/debian/changelog b/debian/changelog
index d4d794ee09..bc3a0a46bb 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,28 @@
+openrct2 (0.4.18-develop-1) unstable; urgency=medium
+
+ * Improved: [#23200] Add banked sloped turns and many other pieces to the Stand-Up and Classic Stand-Up Roller Coaster.
+ * Improved: [#23260] Add diagonal (block) brakes to LSM Launched Roller Coaster.
+ * Improved: [#23350] Increased the maximum width of the ride graph window.
+ * Improved: [#23404] Folders are now paired with an icon in the load/save window.
+ * Improved: [#23405] Filenames can now be input directly into the file browser (load/save) window.
+ * Improved: [#23431] Opaque water and Corkscrew Roller Coaster boosters now show up if RCT1 isn’t linked.
+ * Improved: [objects#369] Updated Russian translation.
+ * Change: [#23413] The max number of park entrance objects has been raised to 255.
+ * Fix: [#1122] Trains spawned on a cable lift hill will fall down and crash (original bug).
+ * Fix: [#19780] Guest screams loop on long drops.
+ * Fix: [#22742, #22793] In game console does not handle format tokens properly.
+ * Fix: [#23135] Map generator tree placement has noticable patterns.
+ * Fix: [#23286] Currency formatted incorrectly in the in game console.
+ * Fix: [#23348] Console set commands don't print output properly.
+ * Fix: [#23376] Peeps with balloons, hats and umbrellas may leave artifacts on screen.
+ * Fix: [#23486] Object selection minimum requirements can be bypassed with close window hotkey.
+ * Fix: [#23496] Newly spawned vehicles are invisible when spawned while the game is paused.
+ * Fix: [#23509] Map generator window reverts to flatland after selecting a heightmap image.
+ * Fix: [objects#359] Fix water colours in Hover Cars preview image.
+ * Fix: [objects#361] Fix water colours in River Styx boats preview image.
+ * Fix: [objects#362] Fix water colours in Neptune Ride preview image.
+ * Fix: [objects#363] Fix water colours in Harpies Trains preview image.
+
openrct2 (0.4.17-develop-1) unstable; urgency=medium
* Feature: [#23166] Add Galician translation.
diff --git a/distribution/changelog.txt b/distribution/changelog.txt
index 638cd4d137..bf3503ffd9 100644
--- a/distribution/changelog.txt
+++ b/distribution/changelog.txt
@@ -1,19 +1,37 @@
-0.4.18 (in development)
+0.4.19 (in development)
+------------------------------------------------------------------------
+- Feature: [#23328] Introducing peep animation objects, enabling custom entertainer costumes.
+- Improved: [#23328] The costume list in the staff window is now ordered alphabetically.
+- Improved: [#23540] The file browser now optionally shows a file size column.
+- Change: [#23328] All RCT2 entertainer costumes are now available in legacy parks.
+- Fix: [#21794] Lay-down coaster cars reverse on first frames of downwards corkscrew.
+- Fix: [#23508] Simultaneous virtual floors shown for ride and footpath.
+- Fix: [#23581] [Plugin] Food/drink items given to guests have no consumption duration set.
+- Fix: [#23591] “Install new track” button in Track Designs Manager is misaligned.
+
+0.4.18 (2025-01-08)
------------------------------------------------------------------------
- Improved: [#23200] Add banked sloped turns and many other pieces to the Stand-Up and Classic Stand-Up Roller Coaster.
- Improved: [#23260] Add diagonal (block) brakes to LSM Launched Roller Coaster.
- Improved: [#23350] Increased the maximum width of the ride graph window.
- Improved: [#23404] Folders are now paired with an icon in the load/save window.
- Improved: [#23405] Filenames can now be input directly into the file browser (load/save) window.
-- Improved: [#23431] Opaque water and Corkscrew Roller Coaster boosters now show up if RCT1 isn’t linked.
+- Improved: [#23431] Opaque water and Corkscrew Roller Coaster boosters now show up if RCT1 isn’t linked.
+- Improved: [objects#369] Updated Russian translation.
- Change: [#23413] The max number of park entrance objects has been raised to 255.
- Fix: [#1122] Trains spawned on a cable lift hill will fall down and crash (original bug).
+- Fix: [#19780] Guest screams loop on long drops.
- Fix: [#22742, #22793] In game console does not handle format tokens properly.
+- Fix: [#23135] Map generator tree placement has noticable patterns.
- Fix: [#23286] Currency formatted incorrectly in the in game console.
- Fix: [#23348] Console set commands don't print output properly.
- Fix: [#23376] Peeps with balloons, hats and umbrellas may leave artifacts on screen.
-- Fix: [#23486] Object selection minimum requirements can be bypassed with close window hotkey.
- Fix: [#23496] Newly spawned vehicles are invisible when spawned while the game is paused.
+- Fix: [#23509] Map generator window reverts to flatland after selecting a heightmap image.
+- Fix: [objects#359] Fix water colours in Hover Cars preview image.
+- Fix: [objects#361] Fix water colours in River Styx boats preview image.
+- Fix: [objects#362] Fix water colours in Neptune Ride preview image.
+- Fix: [objects#363] Fix water colours in Harpies Trains preview image.
0.4.17 (2024-12-08)
------------------------------------------------------------------------
diff --git a/distribution/linux/openrct2.appdata.xml b/distribution/linux/openrct2.appdata.xml
index 5ab163fcb1..cc482770dd 100644
--- a/distribution/linux/openrct2.appdata.xml
+++ b/distribution/linux/openrct2.appdata.xml
@@ -298,6 +298,9 @@
none
+
+ https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.18
+
https://github.com/OpenRCT2/OpenRCT2/releases/tag/v0.4.17
diff --git a/distribution/macos/Info.plist b/distribution/macos/Info.plist
index decd14dcc3..a6cecad33c 100644
--- a/distribution/macos/Info.plist
+++ b/distribution/macos/Info.plist
@@ -13,7 +13,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 0.4.17
+ 0.4.18
CFBundleSignature
ORCT
LSMinimumSystemVersion
diff --git a/distribution/openrct2.d.ts b/distribution/openrct2.d.ts
index e9cf212c4d..24b36a1244 100644
--- a/distribution/openrct2.d.ts
+++ b/distribution/openrct2.d.ts
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
diff --git a/openrct2.proj b/openrct2.proj
index a25d37c4f0..4ec99e95d6 100644
--- a/openrct2.proj
+++ b/openrct2.proj
@@ -45,14 +45,14 @@
9984c1e317dcfb3aaf8e17f1db2ebb0f771e2373
https://github.com/OpenRCT2/title-sequences/releases/download/v0.4.14/title-sequences.zip
6c04781b959b468e1f65ec2d2f21f5aaa5e5724d
- https://github.com/OpenRCT2/objects/releases/download/v1.4.11/objects.zip
- da04330679de2eff53a94a6505802512bfec6403
+ https://github.com/OpenRCT2/objects/releases/download/v1.5.0/objects.zip
+ 90c26f416ddaeb0c35490b7af89f4c6f9d6351f3
https://github.com/OpenRCT2/OpenSoundEffects/releases/download/v1.0.5/opensound.zip
b1b1f1b241d2cbff63a1889c4dc5a09bdf769bfb
https://github.com/OpenRCT2/OpenMusic/releases/download/v1.6/openmusic.zip
ba170fa6d777b309c15420f4b6eb3fa25082a9d1
- https://github.com/OpenRCT2/replays/releases/download/v0.0.84/replays.zip
- 90B848AB344E29A2CF1E3E48539F06F5845772C3
+ https://github.com/OpenRCT2/replays/releases/download/v0.0.85/replays.zip
+ 2B0939953A41D2CE82809CB7C21FC3883578383F
diff --git a/readme.md b/readme.md
index b5e92e3517..c592acc44f 100644
--- a/readme.md
+++ b/readme.md
@@ -19,7 +19,7 @@
### Download
| Latest release | Latest development build |
|-----------------------------------------------------------------------------------------------------------------------|--------------------------|
-| [](https://openrct2.org/downloads/master/latest) | [](https://openrct2.org/downloads/develop/latest) |
+| [](https://openrct2.org/downloads/master/latest) | [](https://openrct2.org/downloads/develop/latest) |
---
@@ -243,7 +243,7 @@ You can translate the game into other languages by editing the language files in
You can help create new graphics for the game by visiting the [OpenGraphics project](https://github.com/OpenRCT2/OpenGraphics). 3D modellers needed!
## 4.5 Audio
-You can help create the music and sound effects for the game. Check out the OpenMusic repository and drop by our [#open-sound-and-music channel on Discord](https://discord.gg/9y8WbcX) to find out more.
+You can help create the music and sound effects for the game. Check out the [OpenMusic](https://github.com/OpenRCT2/OpenMusic) repository and drop by our [#open-sound-and-music channel on Discord](https://discord.gg/9y8WbcX) to find out more.
## 4.6 Scenarios
We would also like to distribute additional scenarios with the game, when the time comes. For that, we need talented scenario makers! Check out the [OpenScenarios repository](https://github.com/PFCKrutonium/OpenRCT2-OpenScenarios).
diff --git a/resources/OpenRCT2.rc b/resources/OpenRCT2.rc
index dc4f0e62e1..7fdc3bc14d 100644
--- a/resources/OpenRCT2.rc
+++ b/resources/OpenRCT2.rc
@@ -45,7 +45,7 @@ BEGIN
VALUE "CompanyName", "OpenRCT2 Team"
VALUE "FileDescription", "Main executable for OpenRCT2"
VALUE "FileVersion", OPENRCT2_PRODUCT_VERSION
- VALUE "LegalCopyright", "Copyright (c) 2014-2024 OpenRCT2 developers"
+ VALUE "LegalCopyright", "Copyright (c) 2014-2025 OpenRCT2 developers"
VALUE "ProductName", "OpenRCT2"
VALUE "ProductVersion", OPENRCT2_PRODUCT_VERSION
END
diff --git a/resources/g2/icons/peep_animations.png b/resources/g2/icons/peep_animations.png
new file mode 100644
index 0000000000..f1c334ba8d
Binary files /dev/null and b/resources/g2/icons/peep_animations.png differ
diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json
index fe4e95939f..4137a78b68 100644
--- a/resources/g2/sprites.json
+++ b/resources/g2/sprites.json
@@ -327,6 +327,11 @@
{
"path": "icons/folder.png"
},
+ {
+ "path": "icons/peep_animations.png",
+ "x": 2,
+ "y": 1
+ },
{
"path": "loader/loader_hybrid_supports.png",
"y": 10
diff --git a/src/openrct2-android/app/build.gradle b/src/openrct2-android/app/build.gradle
index 7b8cca29de..cc570d7918 100644
--- a/src/openrct2-android/app/build.gradle
+++ b/src/openrct2-android/app/build.gradle
@@ -10,8 +10,8 @@ android {
minSdkVersion 24
targetSdkVersion 28
- versionCode 5
- versionName '0.4.17'
+ versionCode 6
+ versionName '0.4.18'
externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_shared'
diff --git a/src/openrct2-cli/Cli.cpp b/src/openrct2-cli/Cli.cpp
index 8904198ff8..e034d80718 100644
--- a/src/openrct2-cli/Cli.cpp
+++ b/src/openrct2-cli/Cli.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.cpp b/src/openrct2-ui/CursorData.cpp
index bfdee34053..425061a91a 100644
--- a/src/openrct2-ui/CursorData.cpp
+++ b/src/openrct2-ui/CursorData.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 f0a4dc60c8..9d22ffba1e 100644
--- a/src/openrct2-ui/CursorData.h
+++ b/src/openrct2-ui/CursorData.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 39067e3808..ce6a895fd5 100644
--- a/src/openrct2-ui/CursorRepository.cpp
+++ b/src/openrct2-ui/CursorRepository.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e28bb117a4..4540c8c7ea 100644
--- a/src/openrct2-ui/CursorRepository.h
+++ b/src/openrct2-ui/CursorRepository.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 ba97bc285f..3fa1161dd0 100644
--- a/src/openrct2-ui/ProvisionalElements.cpp
+++ b/src/openrct2-ui/ProvisionalElements.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -10,11 +10,14 @@
#include "ProvisionalElements.h"
#include
+#include
#include
#include
#include
#include
#include
+#include
+#include
#include
using namespace OpenRCT2::Ui::Windows;
@@ -27,14 +30,15 @@ namespace OpenRCT2::Ui
FootpathRemoveProvisionalTemporarily();
- if (WindowFindByClass(WindowClass::RideConstruction) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByClass(WindowClass::RideConstruction) != nullptr)
{
RideRemoveProvisionalTrackPiece();
RideEntranceExitRemoveGhost();
}
// This is in non performant so only make network games suffer for it
// non networked games do not need this as its to prevent desyncs.
- if ((NetworkGetMode() != NETWORK_MODE_NONE) && WindowFindByClass(WindowClass::TrackDesignPlace) != nullptr)
+ if ((NetworkGetMode() != NETWORK_MODE_NONE) && windowMgr->FindByClass(WindowClass::TrackDesignPlace) != nullptr)
{
TrackPlaceClearProvisionalTemporarily();
}
@@ -46,14 +50,15 @@ namespace OpenRCT2::Ui
FootpathRestoreProvisional();
- if (WindowFindByClass(WindowClass::RideConstruction) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByClass(WindowClass::RideConstruction) != nullptr)
{
RideRestoreProvisionalTrackPiece();
RideEntranceExitPlaceProvisionalGhost();
}
// This is in non performant so only make network games suffer for it
// non networked games do not need this as its to prevent desyncs.
- if ((NetworkGetMode() != NETWORK_MODE_NONE) && WindowFindByClass(WindowClass::TrackDesignPlace) != nullptr)
+ if ((NetworkGetMode() != NETWORK_MODE_NONE) && windowMgr->FindByClass(WindowClass::TrackDesignPlace) != nullptr)
{
TrackPlaceRestoreProvisional();
}
diff --git a/src/openrct2-ui/ProvisionalElements.h b/src/openrct2-ui/ProvisionalElements.h
index e591f664b5..008b467954 100644
--- a/src/openrct2-ui/ProvisionalElements.h
+++ b/src/openrct2-ui/ProvisionalElements.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 7623981ffc..934256a775 100644
--- a/src/openrct2-ui/SDLException.cpp
+++ b/src/openrct2-ui/SDLException.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 06f01d78cf..d3e6ce6053 100644
--- a/src/openrct2-ui/SDLException.h
+++ b/src/openrct2-ui/SDLException.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 1d17e8abf4..c4f7a1cb9a 100644
--- a/src/openrct2-ui/TextComposition.cpp
+++ b/src/openrct2-ui/TextComposition.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 895e5e38ce..ef4e37db87 100644
--- a/src/openrct2-ui/TextComposition.h
+++ b/src/openrct2-ui/TextComposition.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 02aaa23969..214fbe15f6 100644
--- a/src/openrct2-ui/Ui.cpp
+++ b/src/openrct2-ui/Ui.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 9c3ddfb936..8d962defe5 100644
--- a/src/openrct2-ui/Ui.h
+++ b/src/openrct2-ui/Ui.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 7ba0237ace..2c50ac247a 100644
--- a/src/openrct2-ui/UiContext.Android.cpp
+++ b/src/openrct2-ui/UiContext.Android.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 595311a107..5bae0b072b 100644
--- a/src/openrct2-ui/UiContext.Linux.cpp
+++ b/src/openrct2-ui/UiContext.Linux.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.Win32.cpp b/src/openrct2-ui/UiContext.Win32.cpp
index 333efe95eb..45d2cf881c 100644
--- a/src/openrct2-ui/UiContext.Win32.cpp
+++ b/src/openrct2-ui/UiContext.Win32.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 799ce2cae0..cbe43ffd50 100644
--- a/src/openrct2-ui/UiContext.cpp
+++ b/src/openrct2-ui/UiContext.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -40,7 +40,6 @@
#include
#include
#include
-#include
#include
#include
#include
diff --git a/src/openrct2-ui/UiContext.h b/src/openrct2-ui/UiContext.h
index 530c84717d..d05913b144 100644
--- a/src/openrct2-ui/UiContext.h
+++ b/src/openrct2-ui/UiContext.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 f3c5f42181..d0101d7344 100644
--- a/src/openrct2-ui/UiContext.macOS.mm
+++ b/src/openrct2-ui/UiContext.macOS.mm
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 641d35a73a..8e2c15c7db 100644
--- a/src/openrct2-ui/UiStringIds.h
+++ b/src/openrct2-ui/UiStringIds.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -509,24 +509,8 @@ namespace OpenRCT2
STR_OBJECT_SELECTION_ALL_SOURCES_SHOWN = 6653,
STR_OBJECT_SELECTION_COMPAT_OBJECT_DESCRIPTION = 6550,
STR_OBJECT_SELECTION_FALLBACK_IMAGES_WARNING = 6516,
- STR_OBJECT_SELECTION_FOOTPATHS = 3189,
- STR_OBJECT_SELECTION_FOOTPATH_RAILINGS = 6445,
- STR_OBJECT_SELECTION_FOOTPATH_SURFACES = 6444,
- STR_OBJECT_SELECTION_LARGE_SCENERY = 3186,
- STR_OBJECT_SELECTION_MUSIC = 6273,
STR_OBJECT_SELECTION_ONLY_STRINGID = 6655,
- STR_OBJECT_SELECTION_PATH_EXTRAS = 3190,
- STR_OBJECT_SELECTION_PATH_SIGNS = 3188,
- STR_OBJECT_SELECTION_PEEP_NAMES = 6675,
- STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS = 3184,
- STR_OBJECT_SELECTION_SCENERY_GROUPS = 3191,
STR_OBJECT_SELECTION_SELECTION_SIZE = 3164,
- STR_OBJECT_SELECTION_SMALL_SCENERY = 3185,
- STR_OBJECT_SELECTION_STATIONS = 6272,
- STR_OBJECT_SELECTION_TERRAIN_EDGES = 6271,
- STR_OBJECT_SELECTION_TERRAIN_SURFACES = 6270,
- STR_OBJECT_SELECTION_WALLS_FENCES = 3187,
- STR_OBJECT_SELECTION_WATER = 3193,
STR_OBJECT_SELECTION_SHOWING_N_SOURCES = 6654,
STR_OBJECT_USES_FALLBACK_IMAGES = 6515,
STR_RELOAD_OBJECT_TIP = 6613,
@@ -845,17 +829,22 @@ namespace OpenRCT2
STR_SET_LAND_TO_BE_OWNED_TIP = 3221,
// Window: LoadSave
- STR_DATE = 5374,
+ STR_DATE_COLUMN = 5374,
STR_FILEBROWSER_ACTION_NEW_FILE = 2719,
STR_FILEBROWSER_ACTION_NEW_FOLDER = 5985,
STR_FILEBROWSER_ACTION_UP = 2718,
+ STR_FILEBROWSER_CUSTOMISE_DATE = 6715,
+ STR_FILEBROWSER_CUSTOMISE_FILENAME = 6714,
+ STR_FILEBROWSER_CUSTOMISE_SIZE = 6716,
STR_FILEBROWSER_FILE_NAME_PROMPT = 2710,
+ STR_FILEBROWSER_FILE_SIZE_VALUE = 6713,
STR_FILEBROWSER_FOLDER_NAME_PROMPT = 5986,
STR_FILEBROWSER_OVERWRITE_PROMPT = 2708,
STR_FILEBROWSER_OVERWRITE_TITLE = 2709,
STR_FILEBROWSER_SAVE_BUTTON = 6712,
+ STR_FILEBROWSER_SIZE_COLUMN = 6717,
STR_FILEBROWSER_USE_SYSTEM_WINDOW = 2707,
- STR_FILENAME = 6711,
+ STR_FILENAME_LABEL = 6711,
STR_FILE_DIALOG_TITLE_INSTALL_NEW_TRACK_DESIGN = 1039,
STR_FILE_DIALOG_TITLE_LOAD_GAME = 1036,
STR_FILE_DIALOG_TITLE_LOAD_HEIGHTMAP = 6042,
@@ -867,7 +856,7 @@ namespace OpenRCT2
STR_LANDSCAPE_SAVE_FAILED = 1049,
STR_LOADSAVE_DEFAULT = 5891,
STR_LOADSAVE_DEFAULT_TIP = 5892,
- STR_NAME = 5373,
+ STR_NAME_COLUMN = 5373,
STR_OPENRCT2_HEIGHTMAP_FILE = 6055,
STR_OPENRCT2_LANDSCAPE_FILE = 1045,
STR_OPENRCT2_SAVED_GAME = 1043,
@@ -1069,7 +1058,6 @@ namespace OpenRCT2
STR_OBJECT_ERROR_WINDOW_FILE = 6127,
STR_OBJECT_LOAD_ERROR_TITLE = 6123,
STR_OBJECT_NAME = 6124,
- STR_OBJECT_SELECTION_PARK_ENTRANCE = 3192,
STR_OBJECT_SOURCE = 6131,
STR_OBJECT_TYPE = 6125,
@@ -1115,8 +1103,8 @@ namespace OpenRCT2
STR_DRAWING_ENGINE_TIP = 5876,
STR_EARLY_COMPLETION_TIP = 6227,
STR_EDIT_ASSET_PACKS_BUTTON = 6640,
- STR_EXPORT_EMSCRIPTEN = 6713,
- STR_IMPORT_EMSCRIPTEN = 6714,
+ STR_EXPORT_EMSCRIPTEN = 6727,
+ STR_IMPORT_EMSCRIPTEN = 6728,
STR_EDIT_THEMES_BUTTON = 5153,
STR_EDIT_THEMES_BUTTON_TIP = 5837,
STR_EFFECTS_GROUP = 6256,
@@ -2116,6 +2104,8 @@ namespace OpenRCT2
STR_TILE_INSPECTOR_WALL_SLOPED_LEFT = 5977,
STR_TILE_INSPECTOR_WALL_SLOPED_RIGHT = 5978,
STR_TILE_INSPECTOR_WALL_TYPE = 5979,
+ STR_TILE_INSPECTOR_X_LABEL = 6725,
+ STR_TILE_INSPECTOR_Y_LABEL = 6726,
// Window: TitleExit
STR_EXIT = 1924,
diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp
index dfdf3684dd..7db0f6aede 100644
--- a/src/openrct2-ui/WindowManager.cpp
+++ b/src/openrct2-ui/WindowManager.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -403,7 +403,7 @@ public:
case INTENT_ACTION_REFRESH_RIDE_LIST:
{
- auto window = WindowFindByClass(WindowClass::RideList);
+ auto window = FindByClass(WindowClass::RideList);
if (window != nullptr)
{
WindowRideListRefreshList(window);
@@ -419,7 +419,7 @@ public:
case INTENT_ACTION_RIDE_CONSTRUCTION_FOCUS:
{
auto rideIndex = intent.GetUIntExtra(INTENT_EXTRA_RIDE_ID);
- auto w = WindowFindByClass(WindowClass::RideConstruction);
+ auto w = FindByClass(WindowClass::RideConstruction);
if (w == nullptr || w->number != rideIndex)
{
WindowCloseConstructionWindows();
@@ -519,7 +519,7 @@ public:
{
rct_windownumber bannerIndex = static_cast(intent.GetUIntExtra(INTENT_EXTRA_BANNER_INDEX));
- WindowBase* w = WindowFindByNumber(WindowClass::Banner, bannerIndex);
+ WindowBase* w = FindByNumber(WindowClass::Banner, bannerIndex);
if (w != nullptr)
{
w->Invalidate();
@@ -646,6 +646,126 @@ public:
}
return nullptr;
}
+
+ /**
+ * Finds the first window with the specified window class.
+ * rct2: 0x006EA8A0
+ * @param WindowClass enum
+ * @returns the window or nullptr if no window was found.
+ */
+ WindowBase* FindByClass(WindowClass cls) override
+ {
+ for (auto& w : g_window_list)
+ {
+ if (w->flags & WF_DEAD)
+ continue;
+ if (w->classification == cls)
+ {
+ return w.get();
+ }
+ }
+ return nullptr;
+ }
+
+ /**
+ * Finds the first window with the specified window class and number.
+ * rct2: 0x006EA8A0
+ * @param WindowClass enum
+ * @param window number
+ * @returns the window or nullptr if no window was found.
+ */
+ WindowBase* FindByNumber(WindowClass cls, rct_windownumber number) override
+ {
+ for (auto& w : g_window_list)
+ {
+ if (w->flags & WF_DEAD)
+ continue;
+ if (w->classification == cls && w->number == number)
+ {
+ return w.get();
+ }
+ }
+ return nullptr;
+ }
+
+ // TODO: Use variant for this once the window framework is done.
+ WindowBase* FindByNumber(WindowClass cls, EntityId id) override
+ {
+ return FindByNumber(cls, static_cast(id.ToUnderlying()));
+ }
+
+ /**
+ *
+ * rct2: 0x006EA845
+ */
+ WindowBase* FindFromPoint(const ScreenCoordsXY& screenCoords) override
+ {
+ for (auto it = g_window_list.rbegin(); it != g_window_list.rend(); it++)
+ {
+ auto& w = *it;
+ if (w->flags & WF_DEAD)
+ continue;
+
+ if (screenCoords.x < w->windowPos.x || screenCoords.x >= w->windowPos.x + w->width
+ || screenCoords.y < w->windowPos.y || screenCoords.y >= w->windowPos.y + w->height)
+ continue;
+
+ if (w->flags & WF_NO_BACKGROUND)
+ {
+ auto widgetIndex = FindWidgetFromPoint(*w.get(), screenCoords);
+ if (widgetIndex == -1)
+ continue;
+ }
+
+ return w.get();
+ }
+
+ return nullptr;
+ }
+
+ /**
+ *
+ * rct2: 0x006EA594
+ * x (ax)
+ * y (bx)
+ * returns widget_index if found, -1 otherwise
+ */
+ WidgetIndex FindWidgetFromPoint(WindowBase& w, const ScreenCoordsXY& screenCoords) override
+ {
+ // Invalidate the window
+ w.OnPrepareDraw();
+
+ // Find the widget at point x, y
+ WidgetIndex widget_index = -1;
+ for (int32_t i = 0;; i++)
+ {
+ const auto& widget = w.widgets[i];
+ if (widget.type == WindowWidgetType::Last)
+ {
+ break;
+ }
+
+ if (widget.type != WindowWidgetType::Empty && widget.IsVisible())
+ {
+ if (screenCoords.x >= w.windowPos.x + widget.left && screenCoords.x <= w.windowPos.x + widget.right
+ && screenCoords.y >= w.windowPos.y + widget.top && screenCoords.y <= w.windowPos.y + widget.bottom)
+ {
+ widget_index = i;
+ }
+ }
+ }
+
+ // Return next widget if a dropdown
+ if (widget_index != -1)
+ {
+ const auto& widget = w.widgets[widget_index];
+ if (widget.type == WindowWidgetType::DropdownMenu)
+ widget_index++;
+ }
+
+ // Return the widget index
+ return widget_index;
+ }
};
std::unique_ptr OpenRCT2::Ui::CreateWindowManager()
diff --git a/src/openrct2-ui/WindowManager.h b/src/openrct2-ui/WindowManager.h
index b0b2f4c6ad..7c10dc3dea 100644
--- a/src/openrct2-ui/WindowManager.h
+++ b/src/openrct2-ui/WindowManager.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 12eba42d64..c033a0e700 100644
--- a/src/openrct2-ui/audio/AudioChannel.cpp
+++ b/src/openrct2-ui/audio/AudioChannel.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.cpp b/src/openrct2-ui/audio/AudioContext.cpp
index d436ae672e..17ad6e709f 100644
--- a/src/openrct2-ui/audio/AudioContext.cpp
+++ b/src/openrct2-ui/audio/AudioContext.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 2febf3d346..8cb6e09206 100644
--- a/src/openrct2-ui/audio/AudioContext.h
+++ b/src/openrct2-ui/audio/AudioContext.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 64868fe573..f96faea521 100644
--- a/src/openrct2-ui/audio/AudioFormat.h
+++ b/src/openrct2-ui/audio/AudioFormat.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 6606f10616..a9a99b7665 100644
--- a/src/openrct2-ui/audio/AudioMixer.cpp
+++ b/src/openrct2-ui/audio/AudioMixer.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.h b/src/openrct2-ui/audio/AudioMixer.h
index 92dd2535a0..f89657a094 100644
--- a/src/openrct2-ui/audio/AudioMixer.h
+++ b/src/openrct2-ui/audio/AudioMixer.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/FlacAudioSource.cpp b/src/openrct2-ui/audio/FlacAudioSource.cpp
index 757e9487ad..17a5665659 100644
--- a/src/openrct2-ui/audio/FlacAudioSource.cpp
+++ b/src/openrct2-ui/audio/FlacAudioSource.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/MemoryAudioSource.cpp b/src/openrct2-ui/audio/MemoryAudioSource.cpp
index f6082b4708..696bd4293f 100644
--- a/src/openrct2-ui/audio/MemoryAudioSource.cpp
+++ b/src/openrct2-ui/audio/MemoryAudioSource.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/OggAudioSource.cpp b/src/openrct2-ui/audio/OggAudioSource.cpp
index 803253fc2c..99f07f046f 100644
--- a/src/openrct2-ui/audio/OggAudioSource.cpp
+++ b/src/openrct2-ui/audio/OggAudioSource.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.cpp b/src/openrct2-ui/audio/SDLAudioSource.cpp
index 3a3cc1d0b6..340566d9a5 100644
--- a/src/openrct2-ui/audio/SDLAudioSource.cpp
+++ b/src/openrct2-ui/audio/SDLAudioSource.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 37afb7d377..a5d966827a 100644
--- a/src/openrct2-ui/audio/SDLAudioSource.h
+++ b/src/openrct2-ui/audio/SDLAudioSource.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 8f7bae3ffc..a3ada6322f 100644
--- a/src/openrct2-ui/audio/WavAudioSource.cpp
+++ b/src/openrct2-ui/audio/WavAudioSource.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e3379f355c..6389a0d39f 100644
--- a/src/openrct2-ui/drawing/BitmapReader.cpp
+++ b/src/openrct2-ui/drawing/BitmapReader.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 75ba243ad8..a161f9303d 100644
--- a/src/openrct2-ui/drawing/BitmapReader.h
+++ b/src/openrct2-ui/drawing/BitmapReader.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 918785bbc0..a5fc205d79 100644
--- a/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp
+++ b/src/openrct2-ui/drawing/engines/DrawingEngineFactory.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 ad912b1331..6b0d7f4d8d 100644
--- a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp
+++ b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/SoftwareDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/SoftwareDrawingEngine.cpp
index 3776d8d9ca..385063c942 100644
--- a/src/openrct2-ui/drawing/engines/SoftwareDrawingEngine.cpp
+++ b/src/openrct2-ui/drawing/engines/SoftwareDrawingEngine.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 5fa541f612..4663357757 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 a05aea4219..4dd92dc049 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 0f35d335a8..14b9032439 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 430ed3903c..543abd2df5 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 14f280cf2e..be094f3fbe 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 06ebe29e16..07f2aa8ba5 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 0150b1ad7a..8074d322c5 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 f473806d53..4de36de760 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 bf4dd07668..aedfb14ede 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 6635185b3c..8fa8911a5f 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 31347ad169..3425675330 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 4c0302d555..7b3753d453 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 b912855a5f..80a228904e 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 b1ef7ea3bd..4cebef18f1 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/OpenGLFramebuffer.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp
index 0a4c6751ee..445c0613a1 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/OpenGLFramebuffer.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.h
index 11eac77ef8..d5d6813a71 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp
index f30420086f..74a5db8141 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e03e56a117..167bcb75f5 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e143365714..86ebfbe548 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 7f3c150554..3bc3ae2248 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 53dfab65f0..64a3b55ea7 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.h b/src/openrct2-ui/drawing/engines/opengl/TextureCache.h
index 608418b91a..9e3772a1fc 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.cpp b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp
index a703f57961..57ac757506 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 d43add764e..fdcac55476 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-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 cf72683e55..c76d9ed364 100644
--- a/src/openrct2-ui/input/InputManager.cpp
+++ b/src/openrct2-ui/input/InputManager.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -24,6 +24,7 @@
#include
#include
#include
+#include
using namespace OpenRCT2::Ui;
@@ -209,8 +210,10 @@ void InputManager::Process(const InputEvent& e)
if (e.DeviceKind == InputDeviceKind::Keyboard)
{
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+
// TODO: replace with event
- auto w = WindowFindByClass(WindowClass::Textinput);
+ auto w = windowMgr->FindByClass(WindowClass::Textinput);
if (w != nullptr)
{
if (e.State == InputEventState::Release)
@@ -221,7 +224,7 @@ void InputManager::Process(const InputEvent& e)
}
// TODO: replace with event
- w = WindowFindByClass(WindowClass::LoadsaveOverwritePrompt);
+ w = windowMgr->FindByClass(WindowClass::LoadsaveOverwritePrompt);
if (w != nullptr)
{
if (e.State == InputEventState::Release)
@@ -232,7 +235,7 @@ void InputManager::Process(const InputEvent& e)
}
// TODO: replace with event
- w = WindowFindByClass(WindowClass::Loadsave);
+ w = windowMgr->FindByClass(WindowClass::Loadsave);
if (w != nullptr)
{
if (e.State == InputEventState::Release)
@@ -421,7 +424,8 @@ bool InputManager::HasTextInputFocus() const
if (OpenRCT2::Ui::Windows::IsUsingWidgetTextBox() || gChatOpen)
return true;
- auto w = WindowFindByClass(WindowClass::Textinput);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto w = windowMgr->FindByClass(WindowClass::Textinput);
if (w != nullptr)
return true;
diff --git a/src/openrct2-ui/input/InputManager.h b/src/openrct2-ui/input/InputManager.h
index 4cd8fef1eb..93d23c3e82 100644
--- a/src/openrct2-ui/input/InputManager.h
+++ b/src/openrct2-ui/input/InputManager.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 f4e4235bd4..c7c06bd2e1 100644
--- a/src/openrct2-ui/input/MouseInput.cpp
+++ b/src/openrct2-ui/input/MouseInput.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -30,11 +30,12 @@
#include
#include
#include
-#include
#include
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -244,7 +245,8 @@ static void InputScrollDragContinue(const ScreenCoordsXY& screenCoords, WindowBa
*/
static void InputScrollRight(const ScreenCoordsXY& screenCoords, MouseState state)
{
- WindowBase* w = WindowFindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
if (w == nullptr)
{
ContextShowCursor();
@@ -283,9 +285,11 @@ static void GameHandleInputMouse(const ScreenCoordsXY& screenCoords, MouseState
Widget* widget;
WidgetIndex widgetIndex;
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+
// Get window and widget under cursor position
- w = WindowFindFromPoint(screenCoords);
- widgetIndex = w == nullptr ? -1 : WindowFindWidgetFromPoint(*w, screenCoords);
+ w = windowMgr->FindFromPoint(screenCoords);
+ widgetIndex = w == nullptr ? -1 : windowMgr->FindWidgetFromPoint(*w, screenCoords);
widget = widgetIndex == -1 ? nullptr : &w->widgets[widgetIndex];
switch (_inputState)
@@ -338,7 +342,7 @@ static void GameHandleInputMouse(const ScreenCoordsXY& screenCoords, MouseState
InputStateWidgetPressed(screenCoords, state, widgetIndex, w, widget);
break;
case InputState::PositioningWindow:
- w = WindowFindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
+ w = windowMgr->FindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
if (w == nullptr)
{
_inputState = InputState::Reset;
@@ -371,7 +375,7 @@ static void GameHandleInputMouse(const ScreenCoordsXY& screenCoords, MouseState
InputStateWidgetPressed(screenCoords, state, widgetIndex, w, widget);
break;
case InputState::ViewportLeft:
- w = WindowFindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
+ w = windowMgr->FindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
if (w == nullptr)
{
_inputState = InputState::Reset;
@@ -396,7 +400,7 @@ static void GameHandleInputMouse(const ScreenCoordsXY& screenCoords, MouseState
break;
}
- w = WindowFindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
+ w = windowMgr->FindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
if (w == nullptr)
{
break;
@@ -410,7 +414,8 @@ static void GameHandleInputMouse(const ScreenCoordsXY& screenCoords, MouseState
{
if ((_inputFlags & INPUT_FLAG_TOOL_ACTIVE))
{
- w = WindowFindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
+ w = windowMgr->FindByNumber(
+ gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
if (w != nullptr)
{
w->OnToolUp(gCurrentToolWidget.widget_index, screenCoords);
@@ -446,7 +451,7 @@ static void GameHandleInputMouse(const ScreenCoordsXY& screenCoords, MouseState
}
break;
case InputState::Resizing:
- w = WindowFindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
+ w = windowMgr->FindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
if (w == nullptr)
{
_inputState = InputState::Reset;
@@ -560,7 +565,8 @@ static void InputViewportDragContinue()
if (differentialCoords.x == 0 && differentialCoords.y == 0)
return;
- w = WindowFindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ w = windowMgr->FindByNumber(_dragWidget.window_classification, _dragWidget.window_number);
// #3294: Window can be closed during a drag session, so just finish
// the session if the window no longer exists
@@ -772,7 +778,8 @@ static void InputScrollPartUpdateHThumb(WindowBase& w, WidgetIndex widgetIndex,
const auto& widget = w.widgets[widgetIndex];
auto& scroll = w.scrolls[scroll_id];
- if (WindowFindByNumber(w.classification, w.number) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByNumber(w.classification, w.number) != nullptr)
{
int32_t newLeft;
newLeft = scroll.contentWidth;
@@ -811,7 +818,8 @@ static void InputScrollPartUpdateVThumb(WindowBase& w, WidgetIndex widgetIndex,
const auto& widget = w.widgets[widgetIndex];
auto& scroll = w.scrolls[scroll_id];
- if (WindowFindByNumber(w.classification, w.number) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByNumber(w.classification, w.number) != nullptr)
{
int32_t newTop;
newTop = scroll.contentHeight;
@@ -847,7 +855,8 @@ static void InputScrollPartUpdateVThumb(WindowBase& w, WidgetIndex widgetIndex,
*/
static void InputScrollPartUpdateHLeft(WindowBase& w, WidgetIndex widgetIndex, int32_t scroll_id)
{
- if (WindowFindByNumber(w.classification, w.number) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByNumber(w.classification, w.number) != nullptr)
{
auto& scroll = w.scrolls[scroll_id];
scroll.flags |= HSCROLLBAR_LEFT_PRESSED;
@@ -865,7 +874,9 @@ static void InputScrollPartUpdateHLeft(WindowBase& w, WidgetIndex widgetIndex, i
static void InputScrollPartUpdateHRight(WindowBase& w, WidgetIndex widgetIndex, int32_t scroll_id)
{
const auto& widget = w.widgets[widgetIndex];
- if (WindowFindByNumber(w.classification, w.number) != nullptr)
+
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByNumber(w.classification, w.number) != nullptr)
{
auto& scroll = w.scrolls[scroll_id];
scroll.flags |= HSCROLLBAR_RIGHT_PRESSED;
@@ -890,7 +901,8 @@ static void InputScrollPartUpdateHRight(WindowBase& w, WidgetIndex widgetIndex,
*/
static void InputScrollPartUpdateVTop(WindowBase& w, WidgetIndex widgetIndex, int32_t scroll_id)
{
- if (WindowFindByNumber(w.classification, w.number) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByNumber(w.classification, w.number) != nullptr)
{
auto& scroll = w.scrolls[scroll_id];
scroll.flags |= VSCROLLBAR_UP_PRESSED;
@@ -908,7 +920,9 @@ static void InputScrollPartUpdateVTop(WindowBase& w, WidgetIndex widgetIndex, in
static void InputScrollPartUpdateVBottom(WindowBase& w, WidgetIndex widgetIndex, int32_t scroll_id)
{
const auto& widget = w.widgets[widgetIndex];
- if (WindowFindByNumber(w.classification, w.number) != nullptr)
+
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByNumber(w.classification, w.number) != nullptr)
{
auto& scroll = w.scrolls[scroll_id];
scroll.flags |= VSCROLLBAR_DOWN_PRESSED;
@@ -1004,7 +1018,8 @@ static void InputWidgetOverChangeCheck(WindowClass windowClass, rct_windownumber
*/
static void InputWidgetOverFlatbuttonInvalidate()
{
- WindowBase* w = WindowFindByNumber(gHoverWidget.window_classification, gHoverWidget.window_number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByNumber(gHoverWidget.window_classification, gHoverWidget.window_number);
if (w != nullptr)
{
w->OnPrepareDraw();
@@ -1034,7 +1049,8 @@ static void InputWidgetLeft(const ScreenCoordsXY& screenCoords, WindowBase* w, W
WindowCloseByClass(WindowClass::Tooltip);
// Window might have changed position in the list, therefore find it again
- w = WindowFindByNumber(windowClass, windowNumber);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ w = windowMgr->FindByNumber(windowClass, windowNumber);
if (w == nullptr)
return;
@@ -1065,7 +1081,7 @@ static void InputWidgetLeft(const ScreenCoordsXY& screenCoords, WindowBase* w, W
_dragWidget.window_number = windowNumber;
if (_inputFlags & INPUT_FLAG_TOOL_ACTIVE)
{
- w = WindowFindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
+ w = windowMgr->FindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
if (w != nullptr)
{
InputSetFlag(INPUT_FLAG_4, true);
@@ -1126,17 +1142,17 @@ static void InputWidgetLeft(const ScreenCoordsXY& screenCoords, WindowBase* w, W
*/
void ProcessMouseOver(const ScreenCoordsXY& screenCoords)
{
- WindowBase* window;
-
CursorID cursorId = CursorID::Arrow;
auto ft = Formatter();
ft.Add(STR_NONE);
SetMapTooltip(ft);
- window = WindowFindFromPoint(screenCoords);
+
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindFromPoint(screenCoords);
if (window != nullptr)
{
- WidgetIndex widgetId = WindowFindWidgetFromPoint(*window, screenCoords);
+ WidgetIndex widgetId = windowMgr->FindWidgetFromPoint(*window, screenCoords);
if (widgetId != -1)
{
switch (window->widgets[widgetId].type)
@@ -1209,7 +1225,8 @@ void ProcessMouseTool(const ScreenCoordsXY& screenCoords)
{
if (_inputFlags & INPUT_FLAG_TOOL_ACTIVE)
{
- WindowBase* w = WindowFindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByNumber(gCurrentToolWidget.window_classification, gCurrentToolWidget.window_number);
if (w == nullptr)
ToolCancel();
@@ -1290,7 +1307,8 @@ void InputStateWidgetPressed(
cursor_w_number = gPressedWidget.window_number;
WidgetIndex cursor_widgetIndex = gPressedWidget.widget_index;
- WindowBase* cursor_w = WindowFindByNumber(cursor_w_class, cursor_w_number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* cursor_w = windowMgr->FindByNumber(cursor_w_class, cursor_w_number);
if (cursor_w == nullptr)
{
_inputState = InputState::Reset;
@@ -1411,11 +1429,11 @@ void InputStateWidgetPressed(
if (dropdownCleanup)
{
// Update w as it will be invalid after closing the dropdown window
- w = WindowFindByNumber(wClass, wNumber);
+ w = windowMgr->FindByNumber(wClass, wNumber);
}
else
{
- cursor_w = WindowFindByNumber(cursor_w_class, cursor_w_number);
+ cursor_w = windowMgr->FindByNumber(cursor_w_class, cursor_w_number);
if (_inputFlags & INPUT_FLAG_WIDGET_PRESSED)
{
_inputFlags &= ~INPUT_FLAG_WIDGET_PRESSED;
@@ -1595,7 +1613,8 @@ void SetCursor(CursorID cursor_id)
*/
void InvalidateScroll()
{
- WindowBase* w = WindowFindByNumber(gPressedWidget.window_classification, gPressedWidget.window_number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByNumber(gPressedWidget.window_classification, gPressedWidget.window_number);
if (w != nullptr)
{
// Reset to basic scroll
diff --git a/src/openrct2-ui/input/MouseInput.h b/src/openrct2-ui/input/MouseInput.h
index 9747f262d6..14bfda2f66 100644
--- a/src/openrct2-ui/input/MouseInput.h
+++ b/src/openrct2-ui/input/MouseInput.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 a8e5dad0a6..f81169e644 100644
--- a/src/openrct2-ui/input/ShortcutIds.h
+++ b/src/openrct2-ui/input/ShortcutIds.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 d61e6c4720..21b8906aff 100644
--- a/src/openrct2-ui/input/ShortcutInput.cpp
+++ b/src/openrct2-ui/input/ShortcutInput.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 a24f6853ca..99562b707c 100644
--- a/src/openrct2-ui/input/ShortcutManager.cpp
+++ b/src/openrct2-ui/input/ShortcutManager.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 b2c4d73a9f..52066f4c96 100644
--- a/src/openrct2-ui/input/ShortcutManager.h
+++ b/src/openrct2-ui/input/ShortcutManager.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 557ab55545..136e2dac9a 100644
--- a/src/openrct2-ui/input/Shortcuts.cpp
+++ b/src/openrct2-ui/input/Shortcuts.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -40,6 +40,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -87,8 +89,10 @@ static void ShortcutRotateConstructionObject()
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+
// Rotate scenery
- WindowBase* w = WindowFindByClass(WindowClass::Scenery);
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Scenery);
if (w != nullptr && !WidgetIsDisabled(*w, WC_SCENERY__WIDX_SCENERY_ROTATE_OBJECTS_BUTTON)
&& w->widgets[WC_SCENERY__WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type != WindowWidgetType::Empty)
{
@@ -97,7 +101,7 @@ static void ShortcutRotateConstructionObject()
}
// Rotate construction track piece
- w = WindowFindByClass(WindowClass::RideConstruction);
+ w = windowMgr->FindByClass(WindowClass::RideConstruction);
if (w != nullptr && !WidgetIsDisabled(*w, WC_RIDE_CONSTRUCTION__WIDX_ROTATE)
&& w->widgets[WC_RIDE_CONSTRUCTION__WIDX_ROTATE].type != WindowWidgetType::Empty)
{
@@ -110,7 +114,7 @@ static void ShortcutRotateConstructionObject()
}
// Rotate track design preview
- w = WindowFindByClass(WindowClass::TrackDesignList);
+ w = windowMgr->FindByClass(WindowClass::TrackDesignList);
if (w != nullptr && !WidgetIsDisabled(*w, WC_TRACK_DESIGN_LIST__WIDX_ROTATE)
&& w->widgets[WC_TRACK_DESIGN_LIST__WIDX_ROTATE].type != WindowWidgetType::Empty)
{
@@ -119,7 +123,7 @@ static void ShortcutRotateConstructionObject()
}
// Rotate track design placement
- w = WindowFindByClass(WindowClass::TrackDesignPlace);
+ w = windowMgr->FindByClass(WindowClass::TrackDesignPlace);
if (w != nullptr && !WidgetIsDisabled(*w, WC_TRACK_DESIGN_PLACE__WIDX_ROTATE)
&& w->widgets[WC_TRACK_DESIGN_PLACE__WIDX_ROTATE].type != WindowWidgetType::Empty)
{
@@ -128,7 +132,7 @@ static void ShortcutRotateConstructionObject()
}
// Rotate park entrance
- w = WindowFindByClass(WindowClass::EditorParkEntrance);
+ w = windowMgr->FindByClass(WindowClass::EditorParkEntrance);
if (w != nullptr && !WidgetIsDisabled(*w, WC_EDITOR_PARK_ENTRANCE__WIDX_ROTATE_ENTRANCE_BUTTON)
&& w->widgets[WC_EDITOR_PARK_ENTRANCE__WIDX_ROTATE_ENTRANCE_BUTTON].type != WindowWidgetType::Empty)
{
@@ -137,7 +141,7 @@ static void ShortcutRotateConstructionObject()
}
// Rotate selected element in tile inspector
- w = WindowFindByClass(WindowClass::TileInspector);
+ w = windowMgr->FindByClass(WindowClass::TileInspector);
if (w != nullptr && !WidgetIsDisabled(*w, WC_TILE_INSPECTOR__WIDX_BUTTON_ROTATE)
&& w->widgets[WC_TILE_INSPECTOR__WIDX_BUTTON_ROTATE].type != WindowWidgetType::Empty)
{
@@ -148,9 +152,11 @@ static void ShortcutRotateConstructionObject()
static void ShortcutRemoveTopBottomToolbarToggle()
{
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
{
- if (WindowFindByClass(WindowClass::TitleLogo) != nullptr)
+ if (windowMgr->FindByClass(WindowClass::TitleLogo) != nullptr)
{
WindowCloseByClass(WindowClass::TitleLogo);
WindowCloseByClass(WindowClass::TitleOptions);
@@ -165,7 +171,7 @@ static void ShortcutRemoveTopBottomToolbarToggle()
}
else
{
- if (WindowFindByClass(WindowClass::TopToolbar) != nullptr)
+ if (windowMgr->FindByClass(WindowClass::TopToolbar) != nullptr)
{
WindowCloseByClass(WindowClass::Dropdown);
WindowCloseByClass(WindowClass::TopToolbar);
@@ -366,7 +372,8 @@ static void ShortcutOpenCheatWindow()
return;
// Check if window is already open
- WindowBase* window = WindowFindByClass(WindowClass::Cheats);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Cheats);
if (window != nullptr)
{
WindowClose(*window);
@@ -434,11 +441,12 @@ static void ShortcutOpenSceneryPicker()
|| (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR && GetGameState().EditorStep != EditorStep::LandscapeEditor))
return;
- WindowBase* window_scenery = WindowFindByClass(WindowClass::Scenery);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window_scenery = windowMgr->FindByClass(WindowClass::Scenery);
if (window_scenery == nullptr)
ToggleSceneryWindow();
- window_scenery = WindowFindByClass(WindowClass::Scenery);
+ window_scenery = windowMgr->FindByClass(WindowClass::Scenery);
if (window_scenery != nullptr && !WidgetIsDisabled(*window_scenery, WC_SCENERY__WIDX_SCENERY_EYEDROPPER_BUTTON)
&& !gWindowSceneryEyedropperEnabled)
{
@@ -469,7 +477,8 @@ static void ShortcutScaleDown()
// Tile inspector shortcuts
static void TileInspectorMouseUp(WidgetIndex widgetIndex)
{
- auto w = WindowFindByClass(WindowClass::TileInspector);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto w = windowMgr->FindByClass(WindowClass::TileInspector);
if (w != nullptr && !WidgetIsDisabled(*w, widgetIndex) && w->widgets[widgetIndex].type != WindowWidgetType::Empty)
{
w->OnMouseUp(widgetIndex);
@@ -478,7 +487,8 @@ static void TileInspectorMouseUp(WidgetIndex widgetIndex)
static void TileInspectorMouseDown(WidgetIndex widgetIndex)
{
- auto w = WindowFindByClass(WindowClass::TileInspector);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto w = windowMgr->FindByClass(WindowClass::TileInspector);
if (w != nullptr && !WidgetIsDisabled(*w, widgetIndex) && w->widgets[widgetIndex].type != WindowWidgetType::Empty)
{
w->OnMouseDown(widgetIndex);
@@ -487,7 +497,8 @@ static void TileInspectorMouseDown(WidgetIndex widgetIndex)
static void ShortcutToggleWallSlope()
{
- WindowBase* window = WindowFindByClass(WindowClass::TileInspector);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::TileInspector);
if (window == nullptr)
{
return;
@@ -518,7 +529,8 @@ static void ShortcutToggleWallSlope()
static void ShortcutIncreaseElementHeight()
{
- WindowBase* w = WindowFindByClass(WindowClass::TileInspector);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::TileInspector);
if (w != nullptr)
{
int action = -1;
@@ -557,7 +569,8 @@ static void ShortcutIncreaseElementHeight()
static void ShortcutDecreaseElementHeight()
{
- WindowBase* w = WindowFindByClass(WindowClass::TileInspector);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::TileInspector);
if (w != nullptr)
{
int action = -1;
@@ -620,7 +633,8 @@ static void ShortcutConstructionTurnLeft()
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
- WindowBase* window = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Footpath);
if (window != nullptr)
{
WindowFootpathKeyboardShortcutTurnLeft();
@@ -635,7 +649,9 @@ static void ShortcutConstructionTurnRight()
{
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
- WindowBase* window = WindowFindByClass(WindowClass::Footpath);
+
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Footpath);
if (window != nullptr)
{
WindowFootpathKeyboardShortcutTurnRight();
@@ -651,7 +667,8 @@ static void ShortcutConstructionSlopeUp()
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
- WindowBase* window = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Footpath);
if (window != nullptr)
{
WindowFootpathKeyboardShortcutSlopeUp();
@@ -667,7 +684,8 @@ static void ShortcutConstructionBuildCurrent()
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
- WindowBase* window = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Footpath);
if (window != nullptr)
{
WindowFootpathKeyboardShortcutBuildCurrent();
@@ -683,7 +701,8 @@ static void ShortcutConstructionSlopeDown()
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
- WindowBase* window = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Footpath);
if (window != nullptr)
{
WindowFootpathKeyboardShortcutSlopeDown();
@@ -699,7 +718,8 @@ static void ShortcutConstructionDemolishCurrent()
if (gScreenFlags & SCREEN_FLAGS_TITLE_DEMO)
return;
- WindowBase* window = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindByClass(WindowClass::Footpath);
if (window != nullptr)
{
WindowFootpathKeyboardShortcutDemolishCurrent();
@@ -743,7 +763,8 @@ void ShortcutManager::RegisterDefaultShortcuts()
RegisterShortcut(ShortcutId::kInterfaceCancelConstruction, STR_SHORTCUT_CANCEL_CONSTRUCTION_MODE, "ESCAPE", []() {
if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO))
{
- auto window = WindowFindByClass(WindowClass::Error);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto window = windowMgr->FindByClass(WindowClass::Error);
if (window != nullptr)
{
WindowClose(*window);
@@ -879,7 +900,8 @@ void ShortcutManager::RegisterDefaultShortcuts()
RegisterShortcut(ShortcutId::kDebugTogglePaintDebugWindow, STR_SHORTCUT_DEBUG_PAINT_TOGGLE, []() {
if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO))
{
- auto window = WindowFindByClass(WindowClass::DebugPaint);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto window = windowMgr->FindByClass(WindowClass::DebugPaint);
if (window != nullptr)
{
WindowClose(*window);
diff --git a/src/openrct2-ui/interface/Dropdown.h b/src/openrct2-ui/interface/Dropdown.h
index 334b094d2a..d80f3f7c16 100644
--- a/src/openrct2-ui/interface/Dropdown.h
+++ b/src/openrct2-ui/interface/Dropdown.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 cc9bccd768..bce4f7000d 100644
--- a/src/openrct2-ui/interface/Graph.cpp
+++ b/src/openrct2-ui/interface/Graph.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.h b/src/openrct2-ui/interface/Graph.h
index 8a41ba7817..35c09cda7d 100644
--- a/src/openrct2-ui/interface/Graph.h
+++ b/src/openrct2-ui/interface/Graph.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/InGameConsole.cpp b/src/openrct2-ui/interface/InGameConsole.cpp
index bcfa4a50ed..470bf79a27 100644
--- a/src/openrct2-ui/interface/InGameConsole.cpp
+++ b/src/openrct2-ui/interface/InGameConsole.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/InGameConsole.h b/src/openrct2-ui/interface/InGameConsole.h
index 1a89fd4f05..31497b9a6c 100644
--- a/src/openrct2-ui/interface/InGameConsole.h
+++ b/src/openrct2-ui/interface/InGameConsole.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/LandTool.cpp b/src/openrct2-ui/interface/LandTool.cpp
index aceeedf02d..661168ebbb 100644
--- a/src/openrct2-ui/interface/LandTool.cpp
+++ b/src/openrct2-ui/interface/LandTool.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/LandTool.h b/src/openrct2-ui/interface/LandTool.h
index 552e3cb28c..936667197b 100644
--- a/src/openrct2-ui/interface/LandTool.h
+++ b/src/openrct2-ui/interface/LandTool.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 7850707fe0..702fea5992 100644
--- a/src/openrct2-ui/interface/Objective.cpp
+++ b/src/openrct2-ui/interface/Objective.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 495d36f3ca..f22663d8ce 100644
--- a/src/openrct2-ui/interface/Objective.h
+++ b/src/openrct2-ui/interface/Objective.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 72fc8950c5..28dd7d7328 100644
--- a/src/openrct2-ui/interface/Theme.cpp
+++ b/src/openrct2-ui/interface/Theme.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 45fb6da141..e504e71412 100644
--- a/src/openrct2-ui/interface/Theme.h
+++ b/src/openrct2-ui/interface/Theme.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 ee14b7bff8..fe5029b0fe 100644
--- a/src/openrct2-ui/interface/Viewport.h
+++ b/src/openrct2-ui/interface/Viewport.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 54015cd4b3..d8475d5f79 100644
--- a/src/openrct2-ui/interface/ViewportInteraction.cpp
+++ b/src/openrct2-ui/interface/ViewportInteraction.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -45,6 +45,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -467,8 +469,9 @@ namespace OpenRCT2::Ui
if (!(InputTestFlag(INPUT_FLAG_6)) || !(InputTestFlag(INPUT_FLAG_TOOL_ACTIVE)))
{
- if (WindowFindByClass(WindowClass::RideConstruction) == nullptr
- && WindowFindByClass(WindowClass::Footpath) == nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByClass(WindowClass::RideConstruction) == nullptr
+ && windowMgr->FindByClass(WindowClass::Footpath) == nullptr)
{
info.interactionType = ViewportInteractionItem::None;
return info;
@@ -634,7 +637,8 @@ namespace OpenRCT2::Ui
*/
static void ViewportInteractionRemoveFootpath(const PathElement& pathElement, const CoordsXY& mapCoords)
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
FootpathUpdateProvisional();
@@ -761,7 +765,8 @@ namespace OpenRCT2::Ui
static Peep* ViewportInteractionGetClosestPeep(ScreenCoordsXY screenCoords, int32_t maxDistance)
{
- auto* w = WindowFindFromPoint(screenCoords);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* w = windowMgr->FindFromPoint(screenCoords);
if (w == nullptr)
return nullptr;
@@ -785,7 +790,8 @@ namespace OpenRCT2::Ui
*/
CoordsXY ViewportInteractionGetTileStartAtCursor(const ScreenCoordsXY& screenCoords)
{
- WindowBase* window = WindowFindFromPoint(screenCoords);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindFromPoint(screenCoords);
if (window == nullptr || window->viewport == nullptr)
{
CoordsXY ret{};
diff --git a/src/openrct2-ui/interface/ViewportInteraction.h b/src/openrct2-ui/interface/ViewportInteraction.h
index 755da6706a..c060011a61 100644
--- a/src/openrct2-ui/interface/ViewportInteraction.h
+++ b/src/openrct2-ui/interface/ViewportInteraction.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 679b569c85..3b485c43df 100644
--- a/src/openrct2-ui/interface/ViewportQuery.cpp
+++ b/src/openrct2-ui/interface/ViewportQuery.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -12,7 +12,10 @@
#include "Window.h"
#include
+#include
#include
+#include
+#include
#include
#include
#include
@@ -36,7 +39,8 @@ namespace OpenRCT2::Ui
*/
CoordsXY FootpathGetCoordinatesFromPos(const ScreenCoordsXY& screenCoords, int32_t* direction, TileElement** tileElement)
{
- WindowBase* window = WindowFindFromPoint(screenCoords);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindFromPoint(screenCoords);
if (window == nullptr || window->viewport == nullptr)
{
CoordsXY position{};
@@ -134,7 +138,8 @@ namespace OpenRCT2::Ui
CoordsXY FootpathBridgeGetInfoFromPos(const ScreenCoordsXY& screenCoords, int32_t* direction, TileElement** tileElement)
{
// First check if we point at an entrance or exit. In that case, we would want the path coming from the entrance/exit.
- WindowBase* window = WindowFindFromPoint(screenCoords);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* window = windowMgr->FindFromPoint(screenCoords);
if (window == nullptr || window->viewport == nullptr)
{
CoordsXY ret{};
diff --git a/src/openrct2-ui/interface/ViewportQuery.h b/src/openrct2-ui/interface/ViewportQuery.h
index cba9eb2d61..8559cbb9d8 100644
--- a/src/openrct2-ui/interface/ViewportQuery.h
+++ b/src/openrct2-ui/interface/ViewportQuery.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 7d195a37e8..240b482fd6 100644
--- a/src/openrct2-ui/interface/Widget.cpp
+++ b/src/openrct2-ui/interface/Widget.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.h b/src/openrct2-ui/interface/Widget.h
index 8f1d82ab9e..8a085ffae5 100644
--- a/src/openrct2-ui/interface/Widget.h
+++ b/src/openrct2-ui/interface/Widget.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Window.cpp b/src/openrct2-ui/interface/Window.cpp
index 35ce40407a..51a81ae9f6 100644
--- a/src/openrct2-ui/interface/Window.cpp
+++ b/src/openrct2-ui/interface/Window.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
#include
using namespace OpenRCT2;
@@ -436,7 +437,8 @@ void WindowAllWheelInput()
// Check window cursor is over
if (!(InputTestFlag(INPUT_FLAG_5)))
{
- WindowBase* w = WindowFindFromPoint(cursorState->position);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindFromPoint(cursorState->position);
if (w != nullptr)
{
// Check if main window
@@ -447,7 +449,7 @@ void WindowAllWheelInput()
}
// Check scroll view, cursor is over
- WidgetIndex widgetIndex = WindowFindWidgetFromPoint(*w, cursorState->position);
+ WidgetIndex widgetIndex = windowMgr->FindWidgetFromPoint(*w, cursorState->position);
if (widgetIndex != -1)
{
const auto& widget = w->widgets[widgetIndex];
@@ -867,7 +869,8 @@ namespace OpenRCT2::Ui::Windows
{
if (_usingWidgetTextBox)
{
- WindowBase* w = WindowFindByNumber(_currentTextBox.window.classification, _currentTextBox.window.number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByNumber(_currentTextBox.window.classification, _currentTextBox.window.number);
_currentTextBox.window.classification = WindowClass::Null;
_currentTextBox.window.number = 0;
ContextStopTextInput();
@@ -892,7 +895,8 @@ namespace OpenRCT2::Ui::Windows
if (_usingWidgetTextBox)
{
_textBoxFrameNo = 0;
- WindowBase* w = WindowFindByNumber(_currentTextBox.window.classification, _currentTextBox.window.number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByNumber(_currentTextBox.window.classification, _currentTextBox.window.number);
WidgetInvalidate(*w, _currentTextBox.widget_index);
w->OnTextInput(_currentTextBox.widget_index, _textBoxInput);
}
diff --git a/src/openrct2-ui/interface/Window.h b/src/openrct2-ui/interface/Window.h
index 47124a7409..6b2000da8c 100644
--- a/src/openrct2-ui/interface/Window.h
+++ b/src/openrct2-ui/interface/Window.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/ride/Construction.cpp b/src/openrct2-ui/ride/Construction.cpp
index 35d3417c4a..caf313fa01 100644
--- a/src/openrct2-ui/ride/Construction.cpp
+++ b/src/openrct2-ui/ride/Construction.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/ride/Construction.h b/src/openrct2-ui/ride/Construction.h
index 753189588d..14a732369c 100644
--- a/src/openrct2-ui/ride/Construction.h
+++ b/src/openrct2-ui/ride/Construction.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/ride/VehicleSounds.cpp b/src/openrct2-ui/ride/VehicleSounds.cpp
index 477e7e0a62..6e5ec4a89a 100644
--- a/src/openrct2-ui/ride/VehicleSounds.cpp
+++ b/src/openrct2-ui/ride/VehicleSounds.cpp
@@ -469,7 +469,7 @@ namespace OpenRCT2::Audio
volume = volume / 8;
volume = std::max(volume - 0x1FFF, -10000);
- if (sound.Channel != nullptr && sound.Channel->IsDone())
+ if (sound.Channel != nullptr && sound.Channel->IsDone() && IsLoopingSound(sound.Id))
{
sound.Id = SoundId::Null;
sound.Channel = nullptr;
diff --git a/src/openrct2-ui/scripting/CustomImages.cpp b/src/openrct2-ui/scripting/CustomImages.cpp
index 3e06b01f1c..d66456854f 100644
--- a/src/openrct2-ui/scripting/CustomImages.cpp
+++ b/src/openrct2-ui/scripting/CustomImages.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/CustomImages.h b/src/openrct2-ui/scripting/CustomImages.h
index 1e9ed79cc6..a2cb2a5ca3 100644
--- a/src/openrct2-ui/scripting/CustomImages.h
+++ b/src/openrct2-ui/scripting/CustomImages.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 99839ff38f..1e66098e52 100644
--- a/src/openrct2-ui/scripting/CustomListView.cpp
+++ b/src/openrct2-ui/scripting/CustomListView.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.h b/src/openrct2-ui/scripting/CustomListView.h
index 8eca117a46..b28a7fa13f 100644
--- a/src/openrct2-ui/scripting/CustomListView.h
+++ b/src/openrct2-ui/scripting/CustomListView.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.cpp b/src/openrct2-ui/scripting/CustomMenu.cpp
index ad73c492d5..cb2756ebc1 100644
--- a/src/openrct2-ui/scripting/CustomMenu.cpp
+++ b/src/openrct2-ui/scripting/CustomMenu.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 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,8 @@
#include
#include
#include
+ #include
+ #include
#include
using namespace OpenRCT2;
@@ -266,7 +268,8 @@ namespace OpenRCT2::Scripting
customTool.onUp = dukValue["onUp"];
customTool.onFinish = dukValue["onFinish"];
- auto toolbarWindow = WindowFindByClass(WindowClass::TopToolbar);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto toolbarWindow = windowMgr->FindByClass(WindowClass::TopToolbar);
if (toolbarWindow != nullptr)
{
// Use a widget that does not exist on top toolbar but also make sure it isn't -1 as that
diff --git a/src/openrct2-ui/scripting/CustomMenu.h b/src/openrct2-ui/scripting/CustomMenu.h
index 6ac95b55f2..4263fc2e37 100644
--- a/src/openrct2-ui/scripting/CustomMenu.h
+++ b/src/openrct2-ui/scripting/CustomMenu.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e116e54661..c61a1ba233 100644
--- a/src/openrct2-ui/scripting/CustomWindow.cpp
+++ b/src/openrct2-ui/scripting/CustomWindow.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -1097,7 +1097,8 @@ namespace OpenRCT2::Ui::Windows
static rct_windownumber GetNewWindowNumber()
{
auto result = _nextWindowNumber++;
- while (WindowFindByNumber(WindowClass::Custom, result) != nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ while (windowMgr->FindByNumber(WindowClass::Custom, result) != nullptr)
{
result++;
}
diff --git a/src/openrct2-ui/scripting/CustomWindow.h b/src/openrct2-ui/scripting/CustomWindow.h
index 17fe8de3f7..ce755e7191 100644
--- a/src/openrct2-ui/scripting/CustomWindow.h
+++ b/src/openrct2-ui/scripting/CustomWindow.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 98ba930e22..9759ef396a 100644
--- a/src/openrct2-ui/scripting/ScGraphicsContext.hpp
+++ b/src/openrct2-ui/scripting/ScGraphicsContext.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/ScImageManager.hpp b/src/openrct2-ui/scripting/ScImageManager.hpp
index c6cdf9e75f..2ab3c10909 100644
--- a/src/openrct2-ui/scripting/ScImageManager.hpp
+++ b/src/openrct2-ui/scripting/ScImageManager.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e19920979f..47d89f2419 100644
--- a/src/openrct2-ui/scripting/ScTileSelection.hpp
+++ b/src/openrct2-ui/scripting/ScTileSelection.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/ScTitleSequence.hpp b/src/openrct2-ui/scripting/ScTitleSequence.hpp
index f6cdf9715d..ec250d9691 100644
--- a/src/openrct2-ui/scripting/ScTitleSequence.hpp
+++ b/src/openrct2-ui/scripting/ScTitleSequence.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 140a5ca658..1b9503021e 100644
--- a/src/openrct2-ui/scripting/ScUi.hpp
+++ b/src/openrct2-ui/scripting/ScUi.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 49410bcc9d..0f81cccc01 100644
--- a/src/openrct2-ui/scripting/ScViewport.hpp
+++ b/src/openrct2-ui/scripting/ScViewport.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 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,8 @@
#include
#include
#include
+ #include
+ #include
#include
namespace OpenRCT2::Scripting
@@ -251,7 +253,8 @@ namespace OpenRCT2::Scripting
if (_class == WindowClass::MainWindow)
return WindowGetMain();
- return WindowFindByNumber(_class, _number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ return windowMgr->FindByNumber(_class, _number);
}
Viewport* GetViewport() const
diff --git a/src/openrct2-ui/scripting/ScWidget.hpp b/src/openrct2-ui/scripting/ScWidget.hpp
index 7324a435b1..4f9ec52734 100644
--- a/src/openrct2-ui/scripting/ScWidget.hpp
+++ b/src/openrct2-ui/scripting/ScWidget.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -22,6 +22,8 @@
#include
#include
#include
+ #include
+ #include
namespace OpenRCT2::Scripting
{
@@ -393,7 +395,8 @@ namespace OpenRCT2::Scripting
if (_class == WindowClass::MainWindow)
return WindowGetMain();
- return WindowFindByNumber(_class, _number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ return windowMgr->FindByNumber(_class, _number);
}
Widget* GetWidget() const
diff --git a/src/openrct2-ui/scripting/ScWindow.hpp b/src/openrct2-ui/scripting/ScWindow.hpp
index b07da7d872..fee0966ba1 100644
--- a/src/openrct2-ui/scripting/ScWindow.hpp
+++ b/src/openrct2-ui/scripting/ScWindow.hpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -362,7 +362,8 @@ namespace OpenRCT2::Scripting
private:
WindowBase* GetWindow() const
{
- return WindowFindByNumber(_class, _number);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ return windowMgr->FindByNumber(_class, _number);
}
};
} // namespace OpenRCT2::Scripting
diff --git a/src/openrct2-ui/scripting/UiExtensions.cpp b/src/openrct2-ui/scripting/UiExtensions.cpp
index eb8a963f6c..ff2210ce8e 100644
--- a/src/openrct2-ui/scripting/UiExtensions.cpp
+++ b/src/openrct2-ui/scripting/UiExtensions.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 e7a294b710..fca8c95b93 100644
--- a/src/openrct2-ui/scripting/UiExtensions.h
+++ b/src/openrct2-ui/scripting/UiExtensions.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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 c04507486d..9ffe187727 100644
--- a/src/openrct2-ui/title/TitleSequencePlayer.cpp
+++ b/src/openrct2-ui/title/TitleSequencePlayer.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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.h b/src/openrct2-ui/title/TitleSequencePlayer.h
index 9fd78f70e8..d751a899ab 100644
--- a/src/openrct2-ui/title/TitleSequencePlayer.h
+++ b/src/openrct2-ui/title/TitleSequencePlayer.h
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/About.cpp b/src/openrct2-ui/windows/About.cpp
index 51be677fa2..94996f277c 100644
--- a/src/openrct2-ui/windows/About.cpp
+++ b/src/openrct2-ui/windows/About.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/AssetPacks.cpp b/src/openrct2-ui/windows/AssetPacks.cpp
index 01029985c8..622a80f3f3 100644
--- a/src/openrct2-ui/windows/AssetPacks.cpp
+++ b/src/openrct2-ui/windows/AssetPacks.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Banner.cpp b/src/openrct2-ui/windows/Banner.cpp
index 7a5d104a00..e94402770e 100644
--- a/src/openrct2-ui/windows/Banner.cpp
+++ b/src/openrct2-ui/windows/Banner.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Changelog.cpp b/src/openrct2-ui/windows/Changelog.cpp
index 0ae5909930..7de4e4703e 100644
--- a/src/openrct2-ui/windows/Changelog.cpp
+++ b/src/openrct2-ui/windows/Changelog.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp
index c12d6af564..91773863e4 100644
--- a/src/openrct2-ui/windows/Cheats.cpp
+++ b/src/openrct2-ui/windows/Cheats.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/ClearScenery.cpp b/src/openrct2-ui/windows/ClearScenery.cpp
index 785957fca0..07340aa792 100644
--- a/src/openrct2-ui/windows/ClearScenery.cpp
+++ b/src/openrct2-ui/windows/ClearScenery.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 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,8 @@
#include
#include
#include
+#include
+#include
#include
#include
@@ -341,13 +343,16 @@ namespace OpenRCT2::Ui::Windows
switch (widgetIndex)
{
case WIDX_BACKGROUND:
- if (WindowFindByClass(WindowClass::Error) == nullptr && (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE))
+ {
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByClass(WindowClass::Error) == nullptr && (gMapSelectFlags & MAP_SELECT_FLAG_ENABLE))
{
auto action = GetClearAction();
GameActions::Execute(&action);
gCurrentToolId = Tool::Bulldozer;
}
break;
+ }
}
}
diff --git a/src/openrct2-ui/windows/CustomCurrency.cpp b/src/openrct2-ui/windows/CustomCurrency.cpp
index 5744f37775..8392d986fc 100644
--- a/src/openrct2-ui/windows/CustomCurrency.cpp
+++ b/src/openrct2-ui/windows/CustomCurrency.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/DebugPaint.cpp b/src/openrct2-ui/windows/DebugPaint.cpp
index 92b64dac6a..50bdd1a302 100644
--- a/src/openrct2-ui/windows/DebugPaint.cpp
+++ b/src/openrct2-ui/windows/DebugPaint.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/DemolishRidePrompt.cpp b/src/openrct2-ui/windows/DemolishRidePrompt.cpp
index 406504cbd0..2a5691fe19 100644
--- a/src/openrct2-ui/windows/DemolishRidePrompt.cpp
+++ b/src/openrct2-ui/windows/DemolishRidePrompt.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -15,6 +15,8 @@
#include
#include
#include
+#include
+#include
#include
#include
@@ -105,7 +107,8 @@ namespace OpenRCT2::Ui::Windows
WindowBase* w;
DemolishRidePromptWindow* newWindow;
- w = WindowFindByClass(WindowClass::DemolishRidePrompt);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ w = windowMgr->FindByClass(WindowClass::DemolishRidePrompt);
if (w != nullptr)
{
auto windowPos = w->windowPos;
diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp
index a84039951d..34a87d4819 100644
--- a/src/openrct2-ui/windows/Dropdown.cpp
+++ b/src/openrct2-ui/windows/Dropdown.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/EditorBottomToolbar.cpp b/src/openrct2-ui/windows/EditorBottomToolbar.cpp
index c157a50e8d..3d66604bf8 100644
--- a/src/openrct2-ui/windows/EditorBottomToolbar.cpp
+++ b/src/openrct2-ui/windows/EditorBottomToolbar.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/EditorInventionsList.cpp b/src/openrct2-ui/windows/EditorInventionsList.cpp
index c466fc1fc3..ca76110308 100644
--- a/src/openrct2-ui/windows/EditorInventionsList.cpp
+++ b/src/openrct2-ui/windows/EditorInventionsList.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 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
@@ -25,6 +26,8 @@
#include
#include
#include
+#include
+#include
#include
namespace OpenRCT2::Ui::Windows
@@ -489,7 +492,9 @@ namespace OpenRCT2::Ui::Windows
if (windowPos.x <= screenCoords.x && windowPos.y < screenCoords.y && windowPos.x + width > screenCoords.x
&& windowPos.y + height > screenCoords.y)
{
- WidgetIndex widgetIndex = WindowFindWidgetFromPoint(*this, screenCoords);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WidgetIndex widgetIndex = windowMgr->FindWidgetFromPoint(*this, screenCoords);
+
auto& widget = widgets[widgetIndex];
if (widgetIndex == WIDX_PRE_RESEARCHED_SCROLL || widgetIndex == WIDX_RESEARCH_ORDER_SCROLL)
{
@@ -612,7 +617,9 @@ namespace OpenRCT2::Ui::Windows
CursorID OnCursor(const WidgetIndex widx, const ScreenCoordsXY& screenCoords, const CursorID defaultCursor) override
{
- auto* inventionListWindow = static_cast(WindowFindByClass(WindowClass::EditorInventionList));
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* inventionListWindow = static_cast(
+ windowMgr->FindByClass(WindowClass::EditorInventionList));
if (inventionListWindow != nullptr)
{
auto res = inventionListWindow->GetResearchItemAt(screenCoords);
@@ -629,7 +636,9 @@ namespace OpenRCT2::Ui::Windows
void OnMoved(const ScreenCoordsXY& screenCoords) override
{
- auto* inventionListWindow = static_cast(WindowFindByClass(WindowClass::EditorInventionList));
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* inventionListWindow = static_cast(
+ windowMgr->FindByClass(WindowClass::EditorInventionList));
if (inventionListWindow == nullptr)
{
Close();
@@ -695,7 +704,8 @@ namespace OpenRCT2::Ui::Windows
static const ResearchItem* WindowEditorInventionsListDragGetItem()
{
- auto* wnd = static_cast(WindowFindByClass(WindowClass::EditorInventionListDrag));
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* wnd = static_cast(windowMgr->FindByClass(WindowClass::EditorInventionListDrag));
if (wnd == nullptr)
{
return nullptr;
diff --git a/src/openrct2-ui/windows/EditorObjectSelection.cpp b/src/openrct2-ui/windows/EditorObjectSelection.cpp
index c6f70a5047..4c19602a2f 100644
--- a/src/openrct2-ui/windows/EditorObjectSelection.cpp
+++ b/src/openrct2-ui/windows/EditorObjectSelection.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -31,6 +31,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -38,6 +39,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -176,6 +179,11 @@ namespace OpenRCT2::Ui::Windows
{ STR_OBJECT_SELECTION_WATER, ObjectType::Water, FILTER_NONE, SPR_TAB_WATER, 1, 1 },
};
+ static ObjectSubTab kPeepObjectSubTabs[] = {
+ { STR_OBJECT_SELECTION_PEEP_ANIMATIONS, ObjectType::PeepAnimations, FILTER_NONE, SPR_G2_PEEP_ANIMATIONS, 1, 1 },
+ { STR_OBJECT_SELECTION_PEEP_NAMES, ObjectType::PeepNames, FILTER_NONE, SPR_TAB_GUESTS_0, 1, 1 },
+ };
+
static constexpr ObjectPageDesc ObjectSelectionPages[] = {
{ STR_OBJECT_SELECTION_RIDE_VEHICLES_ATTRACTIONS, ObjectType::Ride, SPR_TAB_RIDE_16, kRideObjectSubTabs },
{ STR_OBJECT_SELECTION_SCENERY_GROUPS, ObjectType::SceneryGroup, SPR_TAB_SCENERY_STATUES, kSceneryObjectSubTabs },
@@ -183,7 +191,7 @@ namespace OpenRCT2::Ui::Windows
{ STR_OBJECT_SELECTION_PARK_ENTRANCE, ObjectType::ParkEntrance, SPR_TAB_PARK, kEntrancesObjectSubTabs },
{ STR_OBJECT_SELECTION_TERRAIN_SURFACES, ObjectType::TerrainSurface, SPR_G2_TAB_LAND, kTerrainObjectSubTabs },
{ STR_OBJECT_SELECTION_MUSIC, ObjectType::Music, SPR_TAB_MUSIC_0, {} },
- { STR_OBJECT_SELECTION_PEEP_NAMES, ObjectType::PeepNames, SPR_TAB_GUESTS_0, {} },
+ { STR_OBJECT_SELECTION_PEEP_NAMES, ObjectType::PeepNames, SPR_TAB_GUESTS_0, kPeepObjectSubTabs },
};
// clang-format on
@@ -226,7 +234,7 @@ namespace OpenRCT2::Ui::Windows
MakeWidget ({ 0, 43}, {WW, 357}, WindowWidgetType::Resize, WindowColour::Secondary ),
MakeWidget ({ 4, 60}, {288, 277}, WindowWidgetType::Scroll, WindowColour::Secondary, SCROLL_VERTICAL ),
MakeWidget ({391, 45}, {114, 114}, WindowWidgetType::FlatBtn, WindowColour::Secondary ),
- MakeWidget ({350, 22}, {122, 14}, WindowWidgetType::Button, WindowColour::Primary, STR_INSTALL_NEW_TRACK_DESIGN, STR_INSTALL_NEW_TRACK_DESIGN_TIP ),
+ MakeWidget ({340, 22}, {122, 14}, WindowWidgetType::Button, WindowColour::Primary, STR_INSTALL_NEW_TRACK_DESIGN, STR_INSTALL_NEW_TRACK_DESIGN_TIP ),
MakeDropdownWidgets({470, 22}, {114, 14}, WindowWidgetType::DropdownMenu, WindowColour::Primary, STR_OBJECT_FILTER, STR_OBJECT_FILTER_TIP ),
MakeWidget ({ 4, 45}, {211, 14}, WindowWidgetType::TextBox, WindowColour::Secondary ),
MakeWidget ({218, 45}, { 70, 14}, WindowWidgetType::Button, WindowColour::Secondary, STR_OBJECT_SEARCH_CLEAR ),
@@ -850,19 +858,20 @@ namespace OpenRCT2::Ui::Windows
widgets[WIDX_LIST].bottom = height - 14;
widgets[WIDX_PREVIEW].left = width - 209;
widgets[WIDX_PREVIEW].right = width - 96;
- ResizeDropdown(WIDX_FILTER_DROPDOWN, { width - kFilterWidth - 10, 22 }, { kFilterWidth, 14 });
- widgets[WIDX_INSTALL_TRACK].left = width - 250;
- widgets[WIDX_INSTALL_TRACK].right = width - 137;
widgets[WIDX_RELOAD_OBJECT].left = width - 9 - 24;
widgets[WIDX_RELOAD_OBJECT].right = width - 9;
+ auto& dropdownWidget = widgets[WIDX_FILTER_DROPDOWN];
+ ResizeDropdown(WIDX_FILTER_DROPDOWN, { width - kFilterWidth - 10, dropdownWidget.top }, { kFilterWidth, 14 });
+ auto& installTrackWidget = widgets[WIDX_INSTALL_TRACK];
+ installTrackWidget.moveToX(dropdownWidget.left - installTrackWidget.width() - 10);
+
// Set pressed widgets
pressed_widgets |= 1uLL << WIDX_PREVIEW;
SetPressedTab();
// Set window title and buttons
auto& titleWidget = widgets[WIDX_TITLE];
- auto& installTrackWidget = widgets[WIDX_INSTALL_TRACK];
if (gScreenFlags & SCREEN_FLAGS_TRACK_MANAGER)
{
titleWidget.text = STR_TRACK_DESIGNS_MANAGER_SELECT_RIDE_TYPE;
@@ -1327,6 +1336,24 @@ namespace OpenRCT2::Ui::Windows
}
}
+ StringId GetAnimationPeepTypeStringId(AnimationPeepType type)
+ {
+ switch (type)
+ {
+ case AnimationPeepType::Handyman:
+ return STR_HANDYMAN_PLURAL;
+ case AnimationPeepType::Mechanic:
+ return STR_MECHANIC_PLURAL;
+ case AnimationPeepType::Security:
+ return STR_SECURITY_GUARD_PLURAL;
+ case AnimationPeepType::Entertainer:
+ return STR_ENTERTAINER_PLURAL;
+ case AnimationPeepType::Guest:
+ default:
+ return STR_GUESTS;
+ }
+ }
+
void DrawDebugData(DrawPixelInfo& dpi)
{
ObjectListItem* listItem = &_listItems[selected_list_item];
@@ -1346,6 +1373,14 @@ namespace OpenRCT2::Ui::Windows
DrawTextBasic(dpi, screenPos, stringId, {}, { COLOUR_WHITE, TextAlignment::RIGHT });
}
+ // Draw peep animation object type
+ if (GetSelectedObjectType() == ObjectType::PeepAnimations)
+ {
+ auto* animObj = reinterpret_cast(_loadedObject.get());
+ auto stringId = GetAnimationPeepTypeStringId(animObj->GetPeepType());
+ DrawTextBasic(dpi, screenPos, stringId, {}, { COLOUR_WHITE, TextAlignment::RIGHT });
+ }
+
screenPos.y += kListRowHeight;
// Draw object source
@@ -1706,8 +1741,6 @@ namespace OpenRCT2::Ui::Windows
bool EditorObjectSelectionWindowCheck()
{
- WindowBase* w;
-
auto [missingObjectType, errorString] = Editor::CheckObjectSelection();
if (missingObjectType == ObjectType::None)
{
@@ -1716,7 +1749,9 @@ namespace OpenRCT2::Ui::Windows
}
ContextShowError(STR_INVALID_SELECTION_OF_OBJECTS, errorString, {});
- w = WindowFindByClass(WindowClass::EditorObjectSelection);
+
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::EditorObjectSelection);
if (w != nullptr)
{
// Click tab with missing object
diff --git a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp
index f6e965ca1f..050ff211fb 100644
--- a/src/openrct2-ui/windows/EditorObjectiveOptions.cpp
+++ b/src/openrct2-ui/windows/EditorObjectiveOptions.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/EditorParkEntrance.cpp b/src/openrct2-ui/windows/EditorParkEntrance.cpp
index 9531fa6ffd..b316daccf9 100644
--- a/src/openrct2-ui/windows/EditorParkEntrance.cpp
+++ b/src/openrct2-ui/windows/EditorParkEntrance.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/EditorScenarioOptions.cpp b/src/openrct2-ui/windows/EditorScenarioOptions.cpp
index d32e28dc58..b999ca04ef 100644
--- a/src/openrct2-ui/windows/EditorScenarioOptions.cpp
+++ b/src/openrct2-ui/windows/EditorScenarioOptions.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Error.cpp b/src/openrct2-ui/windows/Error.cpp
index 29382e2eb6..4bc26497ac 100644
--- a/src/openrct2-ui/windows/Error.cpp
+++ b/src/openrct2-ui/windows/Error.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Finances.cpp b/src/openrct2-ui/windows/Finances.cpp
index 91fec09000..2e4eb431f6 100644
--- a/src/openrct2-ui/windows/Finances.cpp
+++ b/src/openrct2-ui/windows/Finances.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp
index a9266e5983..1161868fd8 100644
--- a/src/openrct2-ui/windows/Footpath.cpp
+++ b/src/openrct2-ui/windows/Footpath.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -36,6 +36,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -1238,7 +1240,8 @@ namespace OpenRCT2::Ui::Windows
Audio::Play3D(OpenRCT2::Audio::SoundId::PlaceItem, result->Position);
}
- auto* self = static_cast(WindowFindByClass(WindowClass::Footpath));
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* self = static_cast(windowMgr->FindByClass(WindowClass::Footpath));
if (self == nullptr)
{
return;
@@ -1638,7 +1641,8 @@ namespace OpenRCT2::Ui::Windows
void WindowFootpathKeyboardShortcutTurnLeft()
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
{
auto* footpathWindow = static_cast(w);
@@ -1651,7 +1655,8 @@ namespace OpenRCT2::Ui::Windows
void WindowFootpathKeyboardShortcutTurnRight()
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
{
auto* footpathWindow = static_cast(w);
@@ -1664,7 +1669,8 @@ namespace OpenRCT2::Ui::Windows
void WindowFootpathKeyboardShortcutSlopeDown()
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
{
auto* footpathWindow = static_cast(w);
@@ -1677,7 +1683,8 @@ namespace OpenRCT2::Ui::Windows
void WindowFootpathKeyboardShortcutSlopeUp()
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
{
auto* footpathWindow = static_cast(w);
@@ -1690,7 +1697,8 @@ namespace OpenRCT2::Ui::Windows
void WindowFootpathKeyboardShortcutDemolishCurrent()
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
{
auto* footpathWindow = static_cast(w);
@@ -1703,7 +1711,8 @@ namespace OpenRCT2::Ui::Windows
void WindowFootpathKeyboardShortcutBuildCurrent()
{
- WindowBase* w = WindowFindByClass(WindowClass::Footpath);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::Footpath);
if (w != nullptr)
{
auto* footpathWindow = static_cast(w);
@@ -1720,7 +1729,8 @@ namespace OpenRCT2::Ui::Windows
*/
void ToggleFootpathWindow()
{
- if (WindowFindByClass(WindowClass::Footpath) == nullptr)
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (windowMgr->FindByClass(WindowClass::Footpath) == nullptr)
{
ContextOpenWindow(WindowClass::Footpath);
}
diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp
index 0f31d5418e..495ad09782 100644
--- a/src/openrct2-ui/windows/GameBottomToolbar.cpp
+++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -25,7 +25,8 @@
#include
#include
#include
-#include
+#include
+#include
#include
#include
#include
@@ -285,7 +286,10 @@ namespace OpenRCT2::Ui::Windows
clipCoords.y += 3;
}
- uint32_t image_id_base = GetPeepAnimation(peep->AnimationGroup).base_image;
+ auto& objManager = GetContext()->GetObjectManager();
+ auto* animObj = objManager.GetLoadedObject(peep->AnimationObjectIndex);
+
+ uint32_t image_id_base = animObj->GetPeepAnimation(peep->AnimationGroup).base_image;
image_id_base += frame_no & 0xFFFFFFFC;
image_id_base++;
diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp
index 85615c8aa0..6630332beb 100644
--- a/src/openrct2-ui/windows/Guest.cpp
+++ b/src/openrct2-ui/windows/Guest.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -30,13 +30,16 @@
#include
#include
#include
-#include
+#include
+#include
#include
#include
#include
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -558,8 +561,10 @@ namespace OpenRCT2::Ui::Windows
return;
}
- int32_t animationFrame = GetPeepAnimation(peep->AnimationGroup).base_image + 1;
+ auto& objManager = GetContext()->GetObjectManager();
+ auto* animObj = objManager.GetLoadedObject(peep->AnimationObjectIndex);
+ int32_t animationFrame = animObj->GetPeepAnimation(peep->AnimationGroup).base_image + 1;
int32_t animationFrameOffset = 0;
if (page == WINDOW_GUEST_OVERVIEW)
@@ -573,27 +578,31 @@ namespace OpenRCT2::Ui::Windows
GfxDrawSprite(clipDpi, spriteId, screenCoords);
auto* guest = peep->As();
- if (guest != nullptr)
+ if (guest == nullptr)
+ return;
+
+ // There are only 6 walking frames available for each item.
+ auto itemFrame = (_guestAnimationFrame / 4) % 6;
+
+ if (guest->AnimationGroup == PeepAnimationGroup::Hat)
{
- // If holding a balloon
- if (animationFrame >= kPeepSpriteBalloonStateWatchRideId
- && animationFrame < kPeepSpriteBalloonStateSittingIdleId + 4)
- {
- GfxDrawSprite(clipDpi, ImageId(animationFrame + 32, guest->BalloonColour), screenCoords);
- }
+ auto itemOffset = kPeepSpriteHatItemStart + 1;
+ auto imageId = ImageId(itemOffset + itemFrame * 4, guest->HatColour);
+ GfxDrawSprite(clipDpi, imageId, screenCoords);
+ }
- // If holding umbrella
- if (animationFrame >= kPeepSpriteUmbrellaStateWalkingId
- && animationFrame < kPeepSpriteUmbrellaStateSittingIdleId + 4)
- {
- GfxDrawSprite(clipDpi, ImageId(animationFrame + 32, guest->UmbrellaColour), screenCoords);
- }
+ if (guest->AnimationGroup == PeepAnimationGroup::Balloon)
+ {
+ auto itemOffset = kPeepSpriteBalloonItemStart + 1;
+ auto imageId = ImageId(itemOffset + itemFrame * 4, guest->BalloonColour);
+ GfxDrawSprite(clipDpi, imageId, screenCoords);
+ }
- // If wearing hat
- if (animationFrame >= kPeepSpriteHatStateWatchRideId && animationFrame < kPeepSpriteHatStateSittingIdleId + 4)
- {
- GfxDrawSprite(clipDpi, ImageId(animationFrame + 32, guest->HatColour), screenCoords);
- }
+ if (guest->AnimationGroup == PeepAnimationGroup::Umbrella)
+ {
+ auto itemOffset = kPeepSpriteUmbrellaItemStart + 1;
+ auto imageId = ImageId(itemOffset + itemFrame * 4, guest->UmbrellaColour);
+ GfxDrawSprite(clipDpi, imageId, screenCoords);
}
}
@@ -643,7 +652,8 @@ namespace OpenRCT2::Ui::Windows
pickupAction.SetCallback([peepnum = number](const GameAction* ga, const GameActions::Result* result) {
if (result->Error != GameActions::Status::Ok)
return;
- WindowBase* wind = WindowFindByNumber(WindowClass::Peep, peepnum);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* wind = windowMgr->FindByNumber(WindowClass::Peep, peepnum);
if (wind != nullptr)
{
ToolSet(*wind, WC_PEEP__WIDX_PICKUP, Tool::Picker);
@@ -869,21 +879,30 @@ namespace OpenRCT2::Ui::Windows
void OnUpdateOverview()
{
- _guestAnimationFrame++;
- _guestAnimationFrame %= 24;
-
- // Update pickup animation, can only happen in this tab.
- picked_peep_frame++;
- picked_peep_frame %= 48;
-
- WidgetInvalidate(*this, WIDX_TAB_1);
- WidgetInvalidate(*this, WIDX_TAB_2);
-
const auto peep = GetGuest();
if (peep == nullptr)
{
return;
}
+
+ auto& objManager = GetContext()->GetObjectManager();
+ auto* animObj = objManager.GetLoadedObject(peep->AnimationObjectIndex);
+
+ // Overview tab animation offset
+ _guestAnimationFrame++;
+ _guestAnimationFrame %= 24;
+
+ // Get pickup animation length
+ const auto& pickAnim = animObj->GetPeepAnimation(peep->AnimationGroup, PeepAnimationType::Hanging);
+ const auto pickAnimLength = pickAnim.frame_offsets.size();
+
+ // Update pickup animation, can only happen in this tab.
+ picked_peep_frame++;
+ picked_peep_frame %= pickAnimLength * 4;
+
+ WidgetInvalidate(*this, WIDX_TAB_1);
+ WidgetInvalidate(*this, WIDX_TAB_2);
+
if (peep->WindowInvalidateFlags & PEEP_INVALIDATE_PEEP_ACTION)
{
peep->WindowInvalidateFlags &= ~PEEP_INVALIDATE_PEEP_ACTION;
@@ -958,7 +977,10 @@ namespace OpenRCT2::Ui::Windows
return;
}
- auto baseImageId = GetPeepAnimation(peep->AnimationGroup, PeepAnimationType::Hanging).base_image;
+ auto& objManager = GetContext()->GetObjectManager();
+ auto* animObj = objManager.GetLoadedObject(peep->AnimationObjectIndex);
+
+ auto baseImageId = animObj->GetPeepAnimation(peep->AnimationGroup, PeepAnimationType::Hanging).base_image;
baseImageId += picked_peep_frame >> 2;
gPickupPeepImage = ImageId(baseImageId, peep->TshirtColour, peep->TrousersColour);
}
diff --git a/src/openrct2-ui/windows/GuestList.cpp b/src/openrct2-ui/windows/GuestList.cpp
index 5eb9cc4274..3fc9fe28dd 100644
--- a/src/openrct2-ui/windows/GuestList.cpp
+++ b/src/openrct2-ui/windows/GuestList.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -21,11 +21,13 @@
#include
#include
#include
-#include
+#include
#include
#include
#include
#include
+#include
+#include
#include
#include
@@ -651,7 +653,8 @@ namespace OpenRCT2::Ui::Windows
{
// Tab 1 image
auto i = (_selectedTab == TabId::Individual ? _tabAnimationIndex & ~3 : 0);
- i += GetPeepAnimation(PeepAnimationGroup::Normal).base_image + 1;
+ auto* animObj = findPeepAnimationsObjectForType(AnimationPeepType::Guest);
+ i += animObj->GetPeepAnimation(PeepAnimationGroup::Normal).base_image + 1;
GfxDrawSprite(
dpi, ImageId(i, COLOUR_GREY, COLOUR_DARK_OLIVE_GREEN),
windowPos + ScreenCoordsXY{ widgets[WIDX_TAB_1].midX(), widgets[WIDX_TAB_1].bottom - 6 });
@@ -992,7 +995,8 @@ namespace OpenRCT2::Ui::Windows
void WindowGuestListRefreshList()
{
- auto* w = WindowFindByClass(WindowClass::GuestList);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* w = windowMgr->FindByClass(WindowClass::GuestList);
if (w != nullptr)
{
static_cast(w)->RefreshList();
diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp
index 453617d46f..982a3f8533 100644
--- a/src/openrct2-ui/windows/InstallTrack.cpp
+++ b/src/openrct2-ui/windows/InstallTrack.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Land.cpp b/src/openrct2-ui/windows/Land.cpp
index b1c3de41f9..c45cb33206 100644
--- a/src/openrct2-ui/windows/Land.cpp
+++ b/src/openrct2-ui/windows/Land.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -28,6 +28,8 @@
#include
#include
#include
+#include
+#include
#include
namespace OpenRCT2::Ui::Windows
@@ -399,15 +401,19 @@ namespace OpenRCT2::Ui::Windows
*/
void LandToolDrag(const ScreenCoordsXY& screenPos)
{
- auto* window = WindowFindFromPoint(screenPos);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ auto* window = windowMgr->FindFromPoint(screenPos);
if (window == nullptr)
return;
- WidgetIndex widget_index = WindowFindWidgetFromPoint(*window, screenPos);
+
+ WidgetIndex widget_index = windowMgr->FindWidgetFromPoint(*window, screenPos);
if (widget_index == -1)
return;
+
const auto& widget = window->widgets[widget_index];
if (widget.type != WindowWidgetType::Viewport)
return;
+
const auto* selectedViewport = window->viewport;
if (selectedViewport == nullptr)
return;
diff --git a/src/openrct2-ui/windows/LandRights.cpp b/src/openrct2-ui/windows/LandRights.cpp
index e509ee5cf1..a7ef2463ba 100644
--- a/src/openrct2-ui/windows/LandRights.cpp
+++ b/src/openrct2-ui/windows/LandRights.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/LoadSave.cpp b/src/openrct2-ui/windows/LoadSave.cpp
index 5fab1fbb31..f096cea754 100644
--- a/src/openrct2-ui/windows/LoadSave.cpp
+++ b/src/openrct2-ui/windows/LoadSave.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 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
@@ -46,11 +47,14 @@ namespace OpenRCT2::Ui::Windows
{
#pragma region Widgets
- static constexpr StringId WINDOW_TITLE = STR_NONE;
- static constexpr int32_t WW = 350;
- static constexpr int32_t WH = 400;
+ static constexpr ScreenSize kWindowSizeInit = { 400, 350 };
+ static constexpr ScreenSize kWindowSizeMin = kWindowSizeInit / 2;
+ static constexpr ScreenSize kWindowSizeMax = kWindowSizeInit * 2;
- static constexpr uint16_t DATE_TIME_GAP = 2;
+ static constexpr int kKibiByte = 1024;
+ static constexpr int kMebiByte = kKibiByte * 1024;
+
+ static constexpr uint16_t kDateTimeGap = 2;
enum
{
@@ -63,28 +67,35 @@ namespace OpenRCT2::Ui::Windows
WIDX_NEW_FOLDER,
WIDX_NEW_FILE,
WIDX_SORT_NAME,
+ WIDX_SORT_SIZE,
WIDX_SORT_DATE,
+ WIDX_SORT_CUSTOMISE,
WIDX_SCROLL,
WIDX_FILENAME_TEXTBOX,
WIDX_SAVE,
WIDX_BROWSE,
};
+ static constexpr int16_t WW = kWindowSizeInit.width;
+ static constexpr int16_t WH = kWindowSizeInit.height;
+
// clang-format off
static Widget window_loadsave_widgets[] =
{
- WINDOW_SHIM(WINDOW_TITLE, WW, WH),
- MakeWidget({ 0, WH - 1}, { WW, 1 }, WindowWidgetType::Resize, WindowColour::Secondary ), // WIDX_RESIZE
- MakeWidget({ 4, 36}, { 84, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_LOADSAVE_DEFAULT, STR_LOADSAVE_DEFAULT_TIP), // WIDX_DEFAULT
- MakeWidget({ 88, 36}, { 84, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_ACTION_UP ), // WIDX_UP
- MakeWidget({ 172, 36}, { 87, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_ACTION_NEW_FOLDER ), // WIDX_NEW_FOLDER
- MakeWidget({ 259, 36}, { 87, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_ACTION_NEW_FILE ), // WIDX_NEW_FILE
- MakeWidget({ 4, 55}, { 170, 14 }, WindowWidgetType::TableHeader, WindowColour::Primary ), // WIDX_SORT_NAME
- MakeWidget({(WW - 5) / 2 + 1, 55}, { 170, 14 }, WindowWidgetType::TableHeader, WindowColour::Primary ), // WIDX_SORT_DATE
- MakeWidget({ 4, 68}, { 342, 303 }, WindowWidgetType::Scroll, WindowColour::Primary, SCROLL_VERTICAL ), // WIDX_SCROLL
- MakeWidget({ 64, WH - 50}, { WW - 133, 14 }, WindowWidgetType::TextBox, WindowColour::Secondary ), // WIDX_FILENAME_TEXTBOX
- MakeWidget({ WW - 65, WH - 50}, { 60, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_FILEBROWSER_SAVE_BUTTON ), // WIDX_SAVE
- MakeWidget({ 4, WH - 24}, { 197, 19 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_USE_SYSTEM_WINDOW ), // WIDX_BROWSE
+ WINDOW_SHIM(STR_NONE, WW, WH),
+ MakeWidget({ 0, 15 }, { WW, WH - 15 }, WindowWidgetType::Resize, WindowColour::Secondary ), // WIDX_RESIZE
+ MakeWidget({ 4, 36 }, { 84, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_LOADSAVE_DEFAULT, STR_LOADSAVE_DEFAULT_TIP), // WIDX_DEFAULT
+ MakeWidget({ 88, 36 }, { 84, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_ACTION_UP ), // WIDX_UP
+ MakeWidget({ 172, 36 }, { 87, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_ACTION_NEW_FOLDER ), // WIDX_NEW_FOLDER
+ MakeWidget({ 259, 36 }, { 87, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_ACTION_NEW_FILE ), // WIDX_NEW_FILE
+ MakeWidget({ 4, 55 }, { 160, 14 }, WindowWidgetType::TableHeader, WindowColour::Primary ), // WIDX_SORT_NAME
+ MakeWidget({ (WW - 5) / 3 + 1, 55 }, { 160, 14 }, WindowWidgetType::TableHeader, WindowColour::Primary ), // WIDX_SORT_SIZE
+ MakeWidget({ (WW - 5) / 3 + 1, 55 }, { 160, 14 }, WindowWidgetType::TableHeader, WindowColour::Primary ), // WIDX_SORT_DATE
+ MakeWidget({ (WW - 19), 55 }, { 14, 14 }, WindowWidgetType::Button, WindowColour::Primary, STR_DROPDOWN_GLYPH ), // WIDX_SORT_CUSTOMISE
+ MakeWidget({ 4, 68 }, { 342, 303 }, WindowWidgetType::Scroll, WindowColour::Primary, SCROLL_VERTICAL ), // WIDX_SCROLL
+ MakeWidget({ 64, WH - 50 }, { WW - 133, 14 }, WindowWidgetType::TextBox, WindowColour::Secondary ), // WIDX_FILENAME_TEXTBOX
+ MakeWidget({ WW - 65, WH - 50 }, { 60, 14 }, WindowWidgetType::Button, WindowColour::Secondary, STR_FILEBROWSER_SAVE_BUTTON ), // WIDX_SAVE
+ MakeWidget({ 4, WH - 24 }, { 197, 19 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_USE_SYSTEM_WINDOW ), // WIDX_BROWSE
kWidgetsEnd,
};
// clang-format on
@@ -106,6 +117,9 @@ namespace OpenRCT2::Ui::Windows
time_t date_modified{ 0 };
std::string date_formatted{};
std::string time_formatted{};
+ uint64_t fileSizeBytes;
+ uint64_t fileSizeFormatted;
+ StringId fileSizeUnit;
FileType type{};
bool loaded{ false };
};
@@ -128,14 +142,18 @@ namespace OpenRCT2::Ui::Windows
switch (Config::Get().general.LoadSaveSort)
{
- case Sort::NameAscending:
+ case FileBrowserSort::NameAscending:
return String::logicalCmp(a.name.c_str(), b.name.c_str()) < 0;
- case Sort::NameDescending:
+ case FileBrowserSort::NameDescending:
return -String::logicalCmp(a.name.c_str(), b.name.c_str()) < 0;
- case Sort::DateDescending:
+ case FileBrowserSort::DateDescending:
return -difftime(a.date_modified, b.date_modified) < 0;
- case Sort::DateAscending:
+ case FileBrowserSort::DateAscending:
return difftime(a.date_modified, b.date_modified) < 0;
+ case FileBrowserSort::SizeDescending:
+ return a.fileSizeBytes - b.fileSizeBytes;
+ case FileBrowserSort::SizeAscending:
+ return b.fileSizeBytes - a.fileSizeBytes;
}
return String::logicalCmp(a.name.c_str(), b.name.c_str()) < 0;
}
@@ -516,8 +534,8 @@ namespace OpenRCT2::Ui::Windows
_listItems.clear();
// Show "new" buttons when saving
- window_loadsave_widgets[WIDX_NEW_FILE].type = includeNewItem ? WindowWidgetType::Button : WindowWidgetType::Empty;
- window_loadsave_widgets[WIDX_NEW_FOLDER].type = includeNewItem ? WindowWidgetType::Button : WindowWidgetType::Empty;
+ widgets[WIDX_NEW_FILE].type = includeNewItem ? WindowWidgetType::Button : WindowWidgetType::Empty;
+ widgets[WIDX_NEW_FOLDER].type = includeNewItem ? WindowWidgetType::Button : WindowWidgetType::Empty;
int32_t drives = Platform::GetDrives();
if (directory.empty() && drives)
@@ -608,6 +626,24 @@ namespace OpenRCT2::Ui::Windows
newListItem.date_formatted = Platform::FormatShortDate(newListItem.date_modified);
newListItem.time_formatted = Platform::FormatTime(newListItem.date_modified);
+ // File size
+ newListItem.fileSizeBytes = Platform::GetFileSize(newListItem.path.c_str());
+ if (newListItem.fileSizeBytes > kMebiByte)
+ {
+ newListItem.fileSizeFormatted = newListItem.fileSizeBytes / kMebiByte;
+ newListItem.fileSizeUnit = STR_SIZE_MEGABYTE;
+ }
+ else if (newListItem.fileSizeBytes > kKibiByte)
+ {
+ newListItem.fileSizeFormatted = newListItem.fileSizeBytes / kKibiByte;
+ newListItem.fileSizeUnit = STR_SIZE_KILOBYTE;
+ }
+ else
+ {
+ newListItem.fileSizeFormatted = newListItem.fileSizeBytes;
+ newListItem.fileSizeUnit = STR_SIZE_BYTE;
+ }
+
// Mark if file is the currently loaded game
newListItem.loaded = newListItem.path.compare(gCurrentLoadedPath) == 0;
@@ -651,7 +687,7 @@ namespace OpenRCT2::Ui::Windows
// Check how this date is represented (e.g. 2000-02-20, or 00/02/20)
std::string date = Platform::FormatShortDate(long_time);
- maxDateWidth = GfxGetStringWidth(date.c_str(), FontStyle::Medium) + DATE_TIME_GAP;
+ maxDateWidth = GfxGetStringWidth(date.c_str(), FontStyle::Medium) + kDateTimeGap;
// Some locales do not use leading zeros for months and days, so let's try October, too.
tm.tm_mon = 10;
@@ -660,12 +696,12 @@ namespace OpenRCT2::Ui::Windows
// Again, check how this date is represented (e.g. 2000-10-20, or 00/10/20)
date = Platform::FormatShortDate(long_time);
- maxDateWidth = std::max(maxDateWidth, GfxGetStringWidth(date.c_str(), FontStyle::Medium) + DATE_TIME_GAP);
+ maxDateWidth = std::max(maxDateWidth, GfxGetStringWidth(date.c_str(), FontStyle::Medium) + kDateTimeGap);
// Time appears to be universally represented with two digits for minutes, so 12:00 or 00:00 should be
// representable.
std::string time = Platform::FormatTime(long_time);
- maxTimeWidth = GfxGetStringWidth(time.c_str(), FontStyle::Medium) + DATE_TIME_GAP;
+ maxTimeWidth = GfxGetStringWidth(time.c_str(), FontStyle::Medium) + kDateTimeGap;
}
void SortList()
@@ -683,7 +719,7 @@ namespace OpenRCT2::Ui::Windows
if (!uiContext->HasFilePicker())
{
disabled_widgets |= (1uLL << WIDX_BROWSE);
- window_loadsave_widgets[WIDX_BROWSE].type = WindowWidgetType::Empty;
+ widgets[WIDX_BROWSE].type = WindowWidgetType::Empty;
}
// TODO: Split LOADSAVETYPE_* into two proper enum classes (one for load/save, the other for the type)
@@ -724,16 +760,18 @@ namespace OpenRCT2::Ui::Windows
// Reset window dimensions
InitScrollWidgets();
ComputeMaxDateWidth();
- min_width = WW;
- min_height = WH / 2;
- max_width = WW * 2;
- max_height = WH * 2;
+
+ min_width = kWindowSizeMin.width;
+ min_height = kWindowSizeMin.height;
+ max_width = kWindowSizeMax.width;
+ max_height = kWindowSizeMax.height;
}
void OnClose() override
{
_listItems.clear();
WindowCloseByClass(WindowClass::LoadsaveOverwritePrompt);
+ Config::Save();
// Unpause the game if not on title scene, nor in network play.
if (!(gScreenFlags & SCREEN_FLAGS_TITLE_DEMO) && NetworkGetMode() == NETWORK_MODE_NONE)
@@ -745,16 +783,11 @@ namespace OpenRCT2::Ui::Windows
void OnResize() override
{
- if (width < min_width)
- {
- Invalidate();
- width = min_width;
- }
- if (height < min_height)
- {
- Invalidate();
- height = min_height;
- }
+ WindowSetResize(*this, kWindowSizeMin.width, kWindowSizeMin.height, kWindowSizeMax.width, kWindowSizeMax.height);
+
+ auto& config = Config::Get().general;
+ config.FileBrowserWidth = width;
+ config.FileBrowserHeight = height;
}
void OnUpdate() override
@@ -770,98 +803,158 @@ namespace OpenRCT2::Ui::Windows
{
ResizeFrameWithPage();
- Widget* date_widget = &window_loadsave_widgets[WIDX_SORT_DATE];
- date_widget->right = width - 5;
- date_widget->left = date_widget->right
- - (maxDateWidth + maxTimeWidth + (4 * DATE_TIME_GAP) + (kScrollBarWidth + 1));
+ Widget& customiseWidget = widgets[WIDX_SORT_CUSTOMISE];
+ customiseWidget.right = width - 5;
+ customiseWidget.left = customiseWidget.right - 14;
- window_loadsave_widgets[WIDX_SORT_NAME].left = 4;
- window_loadsave_widgets[WIDX_SORT_NAME].right = window_loadsave_widgets[WIDX_SORT_DATE].left - 1;
+ auto& config = Config::Get().general;
+ if (config.FileBrowserShowDateColumn)
+ {
+ // Date column on the right
+ Widget& dateWidget = widgets[WIDX_SORT_DATE];
+ dateWidget.type = WindowWidgetType::TableHeader;
+ dateWidget.right = customiseWidget.left - 1;
+ dateWidget.left = dateWidget.right - (maxDateWidth + maxTimeWidth + (4 * kDateTimeGap) + (kScrollBarWidth + 1));
- window_loadsave_widgets[WIDX_SCROLL].right = width - 5;
- window_loadsave_widgets[WIDX_SCROLL].bottom = height - 30;
+ if (config.FileBrowserShowSizeColumn)
+ {
+ // File size column in the middle
+ Widget& sizeWidget = widgets[WIDX_SORT_SIZE];
+ sizeWidget.type = WindowWidgetType::TableHeader;
+ sizeWidget.right = dateWidget.left - 1;
+ sizeWidget.left = sizeWidget.right - 65;
+
+ // Name column is next to size column
+ widgets[WIDX_SORT_NAME].right = sizeWidget.left - 1;
+ }
+ else
+ {
+ // Hide file size header
+ Widget& sizeWidget = widgets[WIDX_SORT_SIZE];
+ sizeWidget.type = WindowWidgetType::Empty;
+
+ // Name column is next to date column
+ widgets[WIDX_SORT_NAME].right = dateWidget.left - 1;
+ }
+ }
+ else if (config.FileBrowserShowSizeColumn)
+ {
+ // Hide date header
+ Widget& dateWidget = widgets[WIDX_SORT_DATE];
+ dateWidget.type = WindowWidgetType::Empty;
+
+ // File size column on the right
+ Widget& sizeWidget = widgets[WIDX_SORT_SIZE];
+ sizeWidget.type = WindowWidgetType::TableHeader;
+ sizeWidget.right = customiseWidget.left - 1;
+ sizeWidget.left = sizeWidget.right - 65;
+
+ // Name column is next to size column
+ widgets[WIDX_SORT_NAME].right = sizeWidget.left - 1;
+ }
+ else
+ {
+ // Name is the only column
+ widgets[WIDX_SORT_NAME].right = customiseWidget.left - 1;
+
+ // Hide other columns
+ widgets[WIDX_SORT_SIZE].type = WindowWidgetType::Empty;
+ widgets[WIDX_SORT_DATE].type = WindowWidgetType::Empty;
+ }
+
+ widgets[WIDX_SCROLL].right = width - 5;
+ widgets[WIDX_SCROLL].bottom = height - 30;
if (_type & LOADSAVETYPE_SAVE)
{
- window_loadsave_widgets[WIDX_SCROLL].bottom -= 18;
+ widgets[WIDX_SCROLL].bottom -= 18;
// Get 'Save' button string width
auto saveLabel = LanguageGetString(STR_FILEBROWSER_SAVE_BUTTON);
auto saveLabelWidth = GfxGetStringWidth(saveLabel, FontStyle::Medium) + 16;
- window_loadsave_widgets[WIDX_SAVE].top = height - 42;
- window_loadsave_widgets[WIDX_SAVE].bottom = height - 30;
- window_loadsave_widgets[WIDX_SAVE].left = width - saveLabelWidth - 5;
- window_loadsave_widgets[WIDX_SAVE].right = width - 5;
+ widgets[WIDX_SAVE].type = WindowWidgetType::Button;
+ widgets[WIDX_SAVE].top = height - 42;
+ widgets[WIDX_SAVE].bottom = height - 30;
+ widgets[WIDX_SAVE].left = width - saveLabelWidth - 5;
+ widgets[WIDX_SAVE].right = width - 5;
// Get 'Filename:' string width
- auto filenameLabel = LanguageGetString(STR_FILENAME);
+ auto filenameLabel = LanguageGetString(STR_FILENAME_LABEL);
auto filenameLabelWidth = GfxGetStringWidth(filenameLabel, FontStyle::Medium);
- window_loadsave_widgets[WIDX_FILENAME_TEXTBOX].top = height - 42;
- window_loadsave_widgets[WIDX_FILENAME_TEXTBOX].bottom = height - 30;
- window_loadsave_widgets[WIDX_FILENAME_TEXTBOX].left = 4 + filenameLabelWidth + 6;
- window_loadsave_widgets[WIDX_FILENAME_TEXTBOX].right = window_loadsave_widgets[WIDX_SAVE].left - 5;
+ widgets[WIDX_FILENAME_TEXTBOX].type = WindowWidgetType::TextBox;
+ widgets[WIDX_FILENAME_TEXTBOX].top = height - 42;
+ widgets[WIDX_FILENAME_TEXTBOX].bottom = height - 30;
+ widgets[WIDX_FILENAME_TEXTBOX].left = 4 + filenameLabelWidth + 6;
+ widgets[WIDX_FILENAME_TEXTBOX].right = widgets[WIDX_SAVE].left - 5;
+ }
+ else
+ {
+ widgets[WIDX_SAVE].type = WindowWidgetType::Empty;
+ widgets[WIDX_FILENAME_TEXTBOX].type = WindowWidgetType::Empty;
}
// 'Use system file browser'
- window_loadsave_widgets[WIDX_BROWSE].top = height - 24;
- window_loadsave_widgets[WIDX_BROWSE].bottom = height - 6;
+ widgets[WIDX_BROWSE].top = height - 24;
+ widgets[WIDX_BROWSE].bottom = height - 6;
}
void OnDraw(DrawPixelInfo& dpi) override
{
DrawWidgets(dpi);
- const auto shortPath = ShortenPath(_directory, width - 8, FontStyle::Medium);
+ {
+ const auto shortPath = ShortenPath(_directory, width - 8, FontStyle::Medium);
- // Format text
- std::string buffer;
- buffer.assign("{BLACK}");
- buffer += shortPath;
+ // Format text
+ std::string buffer;
+ buffer.assign("{BLACK}");
+ buffer += shortPath;
- // Draw path text
- const auto normalisedPath = Platform::StrDecompToPrecomp(buffer.data());
- const auto* normalisedPathC = normalisedPath.c_str();
- auto ft = Formatter();
- ft.Add(normalisedPathC);
- DrawTextEllipsised(dpi, windowPos + ScreenCoordsXY{ 4, 20 }, width - 8, STR_STRING, ft);
+ // Draw path text
+ const auto normalisedPath = Platform::StrDecompToPrecomp(buffer.data());
+ const auto* normalisedPathC = normalisedPath.c_str();
- // Name button text
- StringId id = STR_NONE;
- if (Config::Get().general.LoadSaveSort == Sort::NameAscending)
- id = STR_UP;
- else if (Config::Get().general.LoadSaveSort == Sort::NameDescending)
- id = STR_DOWN;
+ auto ft = Formatter();
+ ft.Add(normalisedPathC);
+ DrawTextEllipsised(dpi, windowPos + ScreenCoordsXY{ 4, 20 }, width - 8, STR_STRING, ft);
+ }
- // Draw name button indicator.
- auto& sort_name_widget = widgets[WIDX_SORT_NAME];
- ft = Formatter();
- ft.Add(id);
- DrawTextBasic(
- dpi, windowPos + ScreenCoordsXY{ sort_name_widget.left + 11, sort_name_widget.top + 1 }, STR_NAME, ft,
- { COLOUR_GREY });
+ const auto drawButtonCaption = [dpi, this](
+ Widget& widget, StringId strId, FileBrowserSort ascSort,
+ FileBrowserSort descSort) {
+ StringId indicatorId = STR_NONE;
+ if (Config::Get().general.LoadSaveSort == ascSort)
+ indicatorId = STR_UP;
+ else if (Config::Get().general.LoadSaveSort == descSort)
+ indicatorId = STR_DOWN;
- // Date button text
- if (Config::Get().general.LoadSaveSort == Sort::DateAscending)
- id = STR_UP;
- else if (Config::Get().general.LoadSaveSort == Sort::DateDescending)
- id = STR_DOWN;
- else
- id = STR_NONE;
+ auto ft = Formatter();
+ ft.Add(indicatorId);
- auto& sort_date_widget = widgets[WIDX_SORT_DATE];
- ft = Formatter();
- ft.Add(id);
- DrawTextBasic(
- dpi, windowPos + ScreenCoordsXY{ sort_date_widget.left + 5, sort_date_widget.top + 1 }, STR_DATE, ft,
- { COLOUR_GREY });
+ auto cdpi = const_cast(dpi);
+ DrawTextBasic(cdpi, windowPos + ScreenCoordsXY{ widget.left + 5, widget.top + 1 }, strId, ft, { COLOUR_GREY });
+ };
+
+ auto& config = Config::Get().general;
+ drawButtonCaption(
+ widgets[WIDX_SORT_NAME], STR_NAME_COLUMN, FileBrowserSort::NameAscending, FileBrowserSort::NameDescending);
+
+ if (config.FileBrowserShowSizeColumn)
+ drawButtonCaption(
+ widgets[WIDX_SORT_SIZE], STR_FILEBROWSER_SIZE_COLUMN, FileBrowserSort::SizeAscending,
+ FileBrowserSort::SizeDescending);
+
+ if (config.FileBrowserShowDateColumn)
+ drawButtonCaption(
+ widgets[WIDX_SORT_DATE], STR_DATE_COLUMN, FileBrowserSort::DateAscending, FileBrowserSort::DateDescending);
// 'Filename:' label
if (_type & LOADSAVETYPE_SAVE)
{
auto& widget = widgets[WIDX_FILENAME_TEXTBOX];
- DrawTextBasic(dpi, windowPos + ScreenCoordsXY{ 5, widget.top + 2 }, STR_FILENAME, ft, { COLOUR_GREY });
+ DrawTextBasic(dpi, windowPos + ScreenCoordsXY{ 5, widget.top + 2 }, STR_FILENAME_LABEL, {}, { COLOUR_GREY });
}
}
@@ -908,13 +1001,27 @@ namespace OpenRCT2::Ui::Windows
break;
case WIDX_SORT_NAME:
- if (Config::Get().general.LoadSaveSort == Sort::NameAscending)
+ if (Config::Get().general.LoadSaveSort == FileBrowserSort::NameAscending)
{
- Config::Get().general.LoadSaveSort = Sort::NameDescending;
+ Config::Get().general.LoadSaveSort = FileBrowserSort::NameDescending;
}
else
{
- Config::Get().general.LoadSaveSort = Sort::NameAscending;
+ Config::Get().general.LoadSaveSort = FileBrowserSort::NameAscending;
+ }
+ Config::Save();
+ SortList();
+ Invalidate();
+ break;
+
+ case WIDX_SORT_SIZE:
+ if (Config::Get().general.LoadSaveSort == FileBrowserSort::SizeDescending)
+ {
+ Config::Get().general.LoadSaveSort = FileBrowserSort::SizeAscending;
+ }
+ else
+ {
+ Config::Get().general.LoadSaveSort = FileBrowserSort::SizeDescending;
}
Config::Save();
SortList();
@@ -922,13 +1029,13 @@ namespace OpenRCT2::Ui::Windows
break;
case WIDX_SORT_DATE:
- if (Config::Get().general.LoadSaveSort == Sort::DateDescending)
+ if (Config::Get().general.LoadSaveSort == FileBrowserSort::DateDescending)
{
- Config::Get().general.LoadSaveSort = Sort::DateAscending;
+ Config::Get().general.LoadSaveSort = FileBrowserSort::DateAscending;
}
else
{
- Config::Get().general.LoadSaveSort = Sort::DateDescending;
+ Config::Get().general.LoadSaveSort = FileBrowserSort::DateDescending;
}
Config::Save();
SortList();
@@ -958,6 +1065,56 @@ namespace OpenRCT2::Ui::Windows
}
}
+ void OnMouseDown(WidgetIndex widgetIndex) override
+ {
+ if (widgetIndex != WIDX_SORT_CUSTOMISE)
+ return;
+
+ gDropdownItems[0].Format = STR_TOGGLE_OPTION;
+ gDropdownItems[1].Format = STR_TOGGLE_OPTION;
+ gDropdownItems[2].Format = STR_TOGGLE_OPTION;
+ gDropdownItems[0].Args = STR_FILEBROWSER_CUSTOMISE_FILENAME;
+ gDropdownItems[1].Args = STR_FILEBROWSER_CUSTOMISE_SIZE;
+ gDropdownItems[2].Args = STR_FILEBROWSER_CUSTOMISE_DATE;
+
+ Widget* widget = &widgets[WIDX_SORT_CUSTOMISE];
+
+ WindowDropdownShowTextCustomWidth(
+ { windowPos.x + widget->left - 70, windowPos.y + widget->top }, widget->height() + 1, colours[1], 0,
+ Dropdown::Flag::StayOpen, 3, 90);
+
+ auto& config = Config::Get().general;
+
+ Dropdown::SetChecked(0, true);
+ Dropdown::SetChecked(1, config.FileBrowserShowSizeColumn);
+ Dropdown::SetChecked(2, config.FileBrowserShowDateColumn);
+ }
+
+ void OnDropdown(WidgetIndex widgetIndex, int32_t selectedIndex) override
+ {
+ if (widgetIndex != WIDX_SORT_CUSTOMISE)
+ return;
+
+ auto& config = Config::Get().general;
+ bool changed = false;
+ if (selectedIndex == 1)
+ {
+ config.FileBrowserShowSizeColumn ^= true;
+ changed = true;
+ }
+ else if (selectedIndex == 2)
+ {
+ config.FileBrowserShowDateColumn ^= true;
+ changed = true;
+ }
+
+ if (changed)
+ {
+ Config::Save();
+ Invalidate();
+ }
+ }
+
void OnTextInput(WidgetIndex widgetIndex, std::string_view text) override
{
if (text.empty())
@@ -1076,8 +1233,13 @@ namespace OpenRCT2::Ui::Windows
GfxFillRect(
dpi, { { dpi.x, dpi.y }, { dpi.x + dpi.width - 1, dpi.y + dpi.height - 1 } },
ColourMapA[colours[1].colour].mid_light);
+
const int32_t listWidth = widgets[WIDX_SCROLL].width();
- const int32_t dateAnchor = widgets[WIDX_SORT_DATE].left + maxDateWidth + DATE_TIME_GAP;
+ const auto sizeColumnLeft = widgets[WIDX_SORT_SIZE].left;
+ const auto dateColumnLeft = widgets[WIDX_SORT_DATE].left;
+ const int32_t dateAnchor = dateColumnLeft + maxDateWidth + kDateTimeGap;
+
+ auto& config = Config::Get().general;
for (int32_t i = 0; i < no_list_items; i++)
{
@@ -1118,18 +1280,30 @@ namespace OpenRCT2::Ui::Windows
DrawTextEllipsised(dpi, { 15, y }, max_file_width, stringId, ft);
// Print formatted modified date, if this is a file
- if (_listItems[i].type == FileType::file)
+ if (_listItems[i].type != FileType::file)
+ continue;
+
+ if (config.FileBrowserShowSizeColumn)
+ {
+ ft = Formatter();
+ ft.Add(STR_FILEBROWSER_FILE_SIZE_VALUE);
+ ft.Add(_listItems[i].fileSizeFormatted);
+ ft.Add(_listItems[i].fileSizeUnit);
+ DrawTextEllipsised(dpi, { sizeColumnLeft + 2, y }, maxDateWidth + maxTimeWidth, stringId, ft);
+ }
+
+ if (config.FileBrowserShowDateColumn)
{
ft = Formatter();
ft.Add(STR_STRING);
ft.Add(_listItems[i].date_formatted.c_str());
DrawTextEllipsised(
- dpi, { dateAnchor - DATE_TIME_GAP, y }, maxDateWidth, stringId, ft, { TextAlignment::RIGHT });
+ dpi, { dateAnchor - kDateTimeGap, y }, maxDateWidth, stringId, ft, { TextAlignment::RIGHT });
ft = Formatter();
ft.Add(STR_STRING);
ft.Add(_listItems[i].time_formatted.c_str());
- DrawTextEllipsised(dpi, { dateAnchor + DATE_TIME_GAP, y }, maxTimeWidth, stringId, ft);
+ DrawTextEllipsised(dpi, { dateAnchor + kDateTimeGap, y }, maxTimeWidth, stringId, ft);
}
}
}
@@ -1145,11 +1319,12 @@ namespace OpenRCT2::Ui::Windows
_type = type;
_defaultPath = defaultPath;
+ auto& config = Config::Get().general;
bool isSave = (type & 0x01) == LOADSAVETYPE_SAVE;
// Bypass the lot?
auto hasFilePicker = OpenRCT2::GetContext()->GetUiContext()->HasFilePicker();
- if (Config::Get().general.UseNativeBrowseDialog && hasFilePicker)
+ if (config.UseNativeBrowseDialog && hasFilePicker)
{
const u8string path = OpenSystemFileBrowser(isSave);
if (!path.empty())
@@ -1164,8 +1339,20 @@ namespace OpenRCT2::Ui::Windows
auto* w = static_cast(WindowBringToFrontByClass(WindowClass::Loadsave));
if (w == nullptr)
{
+ if (config.FileBrowserWidth < kWindowSizeMin.width || config.FileBrowserHeight < kWindowSizeMin.height
+ || config.FileBrowserWidth > kWindowSizeMax.width || config.FileBrowserHeight > kWindowSizeMax.height)
+ {
+ config.FileBrowserWidth = kWindowSizeInit.width;
+ config.FileBrowserHeight = kWindowSizeInit.height;
+ Config::Save();
+ }
+
+ auto width = config.FileBrowserWidth;
+ auto height = config.FileBrowserHeight;
+
w = WindowCreate(
- WindowClass::Loadsave, WW, WH, WF_STICK_TO_FRONT | WF_RESIZABLE | WF_AUTO_POSITION | WF_CENTRE_SCREEN, type);
+ WindowClass::Loadsave, width, height, WF_STICK_TO_FRONT | WF_RESIZABLE | WF_AUTO_POSITION | WF_CENTRE_SCREEN,
+ type);
}
switch (type & 0x0E)
@@ -1234,13 +1421,14 @@ namespace OpenRCT2::Ui::Windows
WIDX_OVERWRITE_CANCEL
};
+ // clang-format off
static Widget window_overwrite_prompt_widgets[] = {
WINDOW_SHIM_WHITE(STR_FILEBROWSER_OVERWRITE_TITLE, OVERWRITE_WW, OVERWRITE_WH),
- { WindowWidgetType::Button, 0, 10, 94, OVERWRITE_WH - 20, OVERWRITE_WH - 9, STR_FILEBROWSER_OVERWRITE_TITLE, STR_NONE },
- { WindowWidgetType::Button, 0, OVERWRITE_WW - 95, OVERWRITE_WW - 11, OVERWRITE_WH - 20, OVERWRITE_WH - 9,
- STR_SAVE_PROMPT_CANCEL, STR_NONE },
+ MakeWidget({ 10, OVERWRITE_WH - 20 }, { 84, 11 }, WindowWidgetType::Button, WindowColour::Primary, STR_FILEBROWSER_OVERWRITE_TITLE),
+ MakeWidget({ OVERWRITE_WW - 95, OVERWRITE_WH - 20 }, { 85, 11 }, WindowWidgetType::Button, WindowColour::Primary, STR_SAVE_PROMPT_CANCEL),
kWidgetsEnd,
};
+ // clang-format on
class OverwritePromptWindow final : public Window
{
diff --git a/src/openrct2-ui/windows/Main.cpp b/src/openrct2-ui/windows/Main.cpp
index 9a95880621..1e12faaf49 100644
--- a/src/openrct2-ui/windows/Main.cpp
+++ b/src/openrct2-ui/windows/Main.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/Map.cpp b/src/openrct2-ui/windows/Map.cpp
index 7cf558b873..4e7302d156 100644
--- a/src/openrct2-ui/windows/Map.cpp
+++ b/src/openrct2-ui/windows/Map.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -31,6 +31,8 @@
#include
#include
#include
+#include
+#include
#include
#include
#include
@@ -275,6 +277,7 @@ namespace OpenRCT2::Ui::Windows
void OnMouseUp(WidgetIndex widgetIndex) override
{
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
switch (widgetIndex)
{
case WIDX_CLOSE:
@@ -282,7 +285,7 @@ namespace OpenRCT2::Ui::Windows
break;
case WIDX_SET_LAND_RIGHTS:
{
- if (!WindowFindByClass(WindowClass::LandRights))
+ if (!windowMgr->FindByClass(WindowClass::LandRights))
ContextOpenWindow(WindowClass::LandRights);
else
WindowCloseByClass(WindowClass::LandRights);
@@ -290,7 +293,7 @@ namespace OpenRCT2::Ui::Windows
}
case WIDX_BUILD_PARK_ENTRANCE:
{
- if (!WindowFindByClass(WindowClass::EditorParkEntrance))
+ if (!windowMgr->FindByClass(WindowClass::EditorParkEntrance))
ContextOpenWindow(WindowClass::EditorParkEntrance);
else
WindowCloseByClass(WindowClass::EditorParkEntrance);
@@ -354,6 +357,8 @@ namespace OpenRCT2::Ui::Windows
void OnUpdate() override
{
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+
// the flickering frequency is reduced by 4, compared to the original
// it was done due to inability to reproduce original frequency
// and decision that the original one looks too fast
@@ -362,12 +367,12 @@ namespace OpenRCT2::Ui::Windows
// Handle guest map flashing
_flashingFlags &= ~MapFlashingFlags::FlashGuests;
- if (WindowFindByClass(WindowClass::GuestList) != nullptr)
+ if (windowMgr->FindByClass(WindowClass::GuestList) != nullptr)
_flashingFlags |= MapFlashingFlags::FlashGuests;
// Handle staff map flashing
_flashingFlags &= ~MapFlashingFlags::FlashStaff;
- if (WindowFindByClass(WindowClass::StaffList) != nullptr)
+ if (windowMgr->FindByClass(WindowClass::StaffList) != nullptr)
_flashingFlags |= MapFlashingFlags::FlashStaff;
if (GetCurrentRotation() != _rotation)
@@ -596,18 +601,20 @@ namespace OpenRCT2::Ui::Windows
void OnPrepareDraw() override
{
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+
// Set the pressed widgets
pressed_widgets = 0;
SetWidgetPressed(WIDX_MAP_SIZE_LINK, _mapWidthAndHeightLinked);
pressed_widgets |= (1uLL << (WIDX_PEOPLE_TAB + selected_tab));
- if (WindowFindByClass(WindowClass::EditorParkEntrance))
+ if (windowMgr->FindByClass(WindowClass::EditorParkEntrance))
pressed_widgets |= (1uLL << WIDX_BUILD_PARK_ENTRANCE);
- if (WindowFindByClass(WindowClass::LandRights))
+ if (windowMgr->FindByClass(WindowClass::LandRights))
pressed_widgets |= (1uLL << WIDX_SET_LAND_RIGHTS);
- if (WindowFindByClass(WindowClass::Mapgen))
+ if (windowMgr->FindByClass(WindowClass::Mapgen))
pressed_widgets |= (1uLL << WIDX_MAP_GENERATOR);
// Set disabled widgets
diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp
index 5f9160fe1d..e8f41533e1 100644
--- a/src/openrct2-ui/windows/MapGen.cpp
+++ b/src/openrct2-ui/windows/MapGen.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -25,7 +25,10 @@
#include
#include
#include
-#include
+#include
+#include
+
+using namespace OpenRCT2::World;
namespace OpenRCT2::Ui::Windows
{
@@ -267,7 +270,7 @@ namespace OpenRCT2::Ui::Windows
private:
ResizeDirection _resizeDirection{ ResizeDirection::Both };
bool _mapWidthAndHeightLinked{ true };
- MapGenSettings _settings{};
+ MapGenerator::Settings _settings{};
bool _randomTerrain = true;
bool _heightmapLoaded = false;
std::string _heightmapFilename{};
@@ -371,17 +374,17 @@ namespace OpenRCT2::Ui::Windows
void GenerateMap()
{
- if (_settings.algorithm == MapGenAlgorithm::heightmapImage && !_heightmapLoaded)
+ if (_settings.algorithm == MapGenerator::Algorithm::heightmapImage && !_heightmapLoaded)
return;
- MapGenSettings mapgenSettings = _settings;
+ MapGenerator::Settings mapgenSettings = _settings;
if (_randomTerrain)
{
mapgenSettings.landTexture = -1;
mapgenSettings.edgeTexture = -1;
}
- MapGenGenerate(&mapgenSettings);
+ MapGenerator::generate(&mapgenSettings);
GfxInvalidateScreen();
}
@@ -391,9 +394,9 @@ namespace OpenRCT2::Ui::Windows
{
SharedMouseUp(widgetIndex);
- if (_settings.algorithm == MapGenAlgorithm::simplexNoise)
+ if (_settings.algorithm == MapGenerator::Algorithm::simplexNoise)
SimplexMouseUp(widgetIndex);
- else if (_settings.algorithm == MapGenAlgorithm::heightmapImage)
+ else if (_settings.algorithm == MapGenerator::Algorithm::heightmapImage)
HeightmapMouseUp(widgetIndex);
switch (widgetIndex)
@@ -414,10 +417,10 @@ namespace OpenRCT2::Ui::Windows
void BaseMouseDown(WidgetIndex widgetIndex, Widget* widget)
{
- if (_settings.algorithm == MapGenAlgorithm::simplexNoise)
+ if (_settings.algorithm == MapGenerator::Algorithm::simplexNoise)
SimplexMouseDown(widgetIndex, widget);
- else if (_settings.algorithm == MapGenAlgorithm::heightmapImage)
+ else if (_settings.algorithm == MapGenerator::Algorithm::heightmapImage)
HeightmapMouseDown(widgetIndex, widget);
switch (widgetIndex)
@@ -481,7 +484,7 @@ namespace OpenRCT2::Ui::Windows
switch (widgetIndex)
{
case WIDX_HEIGHTMAP_SOURCE_DROPDOWN:
- _settings.algorithm = MapGenAlgorithm(dropdownIndex);
+ _settings.algorithm = MapGenerator::Algorithm(dropdownIndex);
Invalidate();
break;
}
@@ -489,9 +492,9 @@ namespace OpenRCT2::Ui::Windows
void BaseTextInput(WidgetIndex widgetIndex, int32_t value)
{
- if (_settings.algorithm == MapGenAlgorithm::simplexNoise)
+ if (_settings.algorithm == MapGenerator::Algorithm::simplexNoise)
SimplexTextInput(widgetIndex, value);
- else if (_settings.algorithm == MapGenAlgorithm::heightmapImage)
+ else if (_settings.algorithm == MapGenerator::Algorithm::heightmapImage)
HeightmapTextInput(widgetIndex, value);
switch (widgetIndex)
@@ -522,7 +525,7 @@ namespace OpenRCT2::Ui::Windows
SetWidgetPressed(WIDX_MAP_SIZE_LINK, _mapWidthAndHeightLinked);
SetWidgetDisabled(WIDX_MAP_SIZE_LINK, _settings.mapSize.x != _settings.mapSize.y);
- bool isHeightMapImage = _settings.algorithm == MapGenAlgorithm::heightmapImage;
+ bool isHeightMapImage = _settings.algorithm == MapGenerator::Algorithm::heightmapImage;
SetWidgetDisabled(WIDX_MAP_SIZE_Y, isHeightMapImage);
SetWidgetDisabled(WIDX_MAP_SIZE_Y_UP, isHeightMapImage);
SetWidgetDisabled(WIDX_MAP_SIZE_Y_DOWN, isHeightMapImage);
@@ -551,19 +554,19 @@ namespace OpenRCT2::Ui::Windows
auto& sourceWidget = widgets[WIDX_HEIGHTMAP_SOURCE];
switch (_settings.algorithm)
{
- case MapGenAlgorithm::blank:
+ case MapGenerator::Algorithm::blank:
sourceWidget.text = STR_HEIGHTMAP_FLATLAND;
ToggleSimplexWidgets(false);
ToggleHeightmapWidgets(false);
break;
- case MapGenAlgorithm::simplexNoise:
+ case MapGenerator::Algorithm::simplexNoise:
sourceWidget.text = STR_HEIGHTMAP_SIMPLEX_NOISE;
ToggleSimplexWidgets(true);
ToggleHeightmapWidgets(false);
break;
- case MapGenAlgorithm::heightmapImage:
+ case MapGenerator::Algorithm::heightmapImage:
sourceWidget.text = STR_HEIGHTMAP_FILE;
ToggleSimplexWidgets(false);
ToggleHeightmapWidgets(true);
@@ -603,10 +606,10 @@ namespace OpenRCT2::Ui::Windows
DrawWidgets(dpi);
DrawTabImages(dpi);
- if (_settings.algorithm == MapGenAlgorithm::simplexNoise)
+ if (_settings.algorithm == MapGenerator::Algorithm::simplexNoise)
SimplexDraw(dpi);
- else if (_settings.algorithm == MapGenAlgorithm::heightmapImage)
+ else if (_settings.algorithm == MapGenerator::Algorithm::heightmapImage)
HeightmapDraw(dpi);
const auto enabledColour = colours[1];
@@ -753,7 +756,7 @@ namespace OpenRCT2::Ui::Windows
SetPressedTab();
- const bool isFlatland = _settings.algorithm == MapGenAlgorithm::blank;
+ const bool isFlatland = _settings.algorithm == MapGenerator::Algorithm::blank;
SetWidgetDisabled(WIDX_TREE_LAND_RATIO, !_settings.trees);
SetWidgetDisabled(WIDX_TREE_LAND_RATIO_UP, !_settings.trees);
@@ -801,7 +804,7 @@ namespace OpenRCT2::Ui::Windows
STR_RIDE_LENGTH_ENTRY, ft, { textColour });
// Maximum tree altitude, label and value
- const bool isFlatland = _settings.algorithm == MapGenAlgorithm::blank;
+ const bool isFlatland = _settings.algorithm == MapGenerator::Algorithm::blank;
const auto maxTreeTextColour = _settings.trees && !isFlatland ? enabledColour : disabledColour;
DrawTextBasic(
@@ -1232,10 +1235,10 @@ namespace OpenRCT2::Ui::Windows
SetWidgetEnabled(WIDX_WALL_TEXTURE, !_randomTerrain);
// Max land height option is irrelevant for flatland
- SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH, _settings.algorithm != MapGenAlgorithm::blank);
+ SetWidgetEnabled(WIDX_HEIGHTMAP_HIGH, _settings.algorithm != MapGenerator::Algorithm::blank);
// Only offer terrain edge smoothing if we don't use flatland terrain
- SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.algorithm != MapGenAlgorithm::blank);
+ SetWidgetEnabled(WIDX_HEIGHTMAP_SMOOTH_TILE_EDGES, _settings.algorithm != MapGenerator::Algorithm::blank);
SetPressedTab();
}
@@ -1395,7 +1398,7 @@ namespace OpenRCT2::Ui::Windows
void OnClose() override
{
- MapGenUnloadHeightmapImage();
+ MapGenerator::UnloadHeightmapImage();
}
void OnMouseUp(WidgetIndex widgetIndex) override
@@ -1454,7 +1457,7 @@ namespace OpenRCT2::Ui::Windows
void OnPrepareDraw() override
{
- bool isHeightMapImage = _settings.algorithm == MapGenAlgorithm::heightmapImage;
+ bool isHeightMapImage = _settings.algorithm == MapGenerator::Algorithm::heightmapImage;
SetWidgetDisabled(WIDX_MAP_GENERATE, isHeightMapImage && !_heightmapLoaded);
switch (page)
@@ -1534,7 +1537,7 @@ namespace OpenRCT2::Ui::Windows
{
if (result == MODAL_RESULT_OK)
{
- if (!MapGenLoadHeightmapImage(path))
+ if (!MapGenerator::LoadHeightmapImage(path))
{
// TODO: Display error popup
return;
@@ -1543,6 +1546,7 @@ namespace OpenRCT2::Ui::Windows
// The window needs to be open while using the map
_heightmapLoaded = true;
_heightmapFilename = fs::u8path(path).filename().string();
+ _settings.algorithm = MapGenerator::Algorithm::heightmapImage;
SetPage(WINDOW_MAPGEN_PAGE_BASE);
}
}
diff --git a/src/openrct2-ui/windows/MapTooltip.cpp b/src/openrct2-ui/windows/MapTooltip.cpp
index de87936311..71ee35120f 100644
--- a/src/openrct2-ui/windows/MapTooltip.cpp
+++ b/src/openrct2-ui/windows/MapTooltip.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 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,8 @@
#include
#include
#include
+#include
+#include
namespace OpenRCT2::Ui::Windows
{
@@ -96,8 +98,9 @@ namespace OpenRCT2::Ui::Windows
std::memcpy(&stringId, _mapTooltipArgs.Data(), sizeof(StringId));
auto& im = GetInputManager();
+ auto* wm = GetContext()->GetUiContext()->GetWindowManager();
if (_cursorHoldDuration < 25 || stringId == STR_NONE || im.IsModifierKeyPressed(ModifierKey::ctrl)
- || im.IsModifierKeyPressed(ModifierKey::shift) || WindowFindByClass(WindowClass::Error) != nullptr)
+ || im.IsModifierKeyPressed(ModifierKey::shift) || wm->FindByClass(WindowClass::Error) != nullptr)
{
WindowCloseByClass(WindowClass::MapTooltip);
}
@@ -114,7 +117,8 @@ namespace OpenRCT2::Ui::Windows
const CursorState* state = ContextGetCursorState();
auto pos = state->position + ScreenCoordsXY{ -width / 2, 15 };
- if (auto w = WindowFindByClass(WindowClass::MapTooltip))
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ if (auto w = windowMgr->FindByClass(WindowClass::MapTooltip))
{
w->Invalidate();
w->windowPos = pos;
diff --git a/src/openrct2-ui/windows/MazeConstruction.cpp b/src/openrct2-ui/windows/MazeConstruction.cpp
index e7bc851276..16ec9830af 100644
--- a/src/openrct2-ui/windows/MazeConstruction.cpp
+++ b/src/openrct2-ui/windows/MazeConstruction.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -25,6 +25,8 @@
#include
#include
#include
+#include
+#include
#include
#include
@@ -442,9 +444,8 @@ namespace OpenRCT2::Ui::Windows
void WindowMazeConstructionUpdatePressedWidgets()
{
- WindowBase* w;
-
- w = WindowFindByClass(WindowClass::RideConstruction);
+ auto* windowMgr = GetContext()->GetUiContext()->GetWindowManager();
+ WindowBase* w = windowMgr->FindByClass(WindowClass::RideConstruction);
if (w == nullptr)
return;
diff --git a/src/openrct2-ui/windows/Multiplayer.cpp b/src/openrct2-ui/windows/Multiplayer.cpp
index 002593272c..07fd363ab3 100644
--- a/src/openrct2-ui/windows/Multiplayer.cpp
+++ b/src/openrct2-ui/windows/Multiplayer.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a 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/NetworkStatus.cpp b/src/openrct2-ui/windows/NetworkStatus.cpp
index 35d68f0142..db730f4a0f 100644
--- a/src/openrct2-ui/windows/NetworkStatus.cpp
+++ b/src/openrct2-ui/windows/NetworkStatus.cpp
@@ -1,5 +1,5 @@
/*****************************************************************************
- * Copyright (c) 2014-2024 OpenRCT2 developers
+ * Copyright (c) 2014-2025 OpenRCT2 developers
*
* For a complete list of all authors, please refer to contributors.md
* Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2
@@ -12,6 +12,8 @@
#include
#include
#include
+#include
+#include