diff --git a/.clang-format b/.clang-format index 6ca231784a..1f105b47b9 100644 --- a/.clang-format +++ b/.clang-format @@ -62,7 +62,7 @@ IncludeCategories: - Regex: '^<' Priority: 2 IndentCaseLabels: true -IndentPPDirectives: AfterHash +IndentPPDirectives: BeforeHash IndentWidth: 4 IndentWrappedFunctionNames: true KeepEmptyLinesAtTheStartOfBlocks: false diff --git a/.clang-tidy b/.clang-tidy index 781e5cde4d..2b7757409e 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -7,7 +7,7 @@ Checks: > readability-uppercase-literal-suffix CheckOptions: - key: cppcoreguidelines-macro-usage.AllowedRegexp - value: 'validate_global_widx|NETWORK_STREAM_VERSION' + value: 'validate_global_widx|NETWORK_STREAM_VERSION|SFL_ASSERT|SFL_CATCH' - key: readability-uppercase-literal-suffix.NewSuffixes value: 'u;L;uL;LL;uLL' WarningsAsErrors: true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2eb94d889d..2036f5b300 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,17 @@ on: - '.github/workflows/localisation.yml' - '.gitignore' - '.vscode/**' + workflow_dispatch: + inputs: + sign: + description: Sign binaries + type: choice + options: + - 'no' + - test-signing + - release-signing + default: test-signing + defaults: run: shell: bash @@ -34,6 +45,11 @@ jobs: build_variables: name: Get version info runs-on: ubuntu-latest + # We want to sign tagged releases with release certificates, but it is only allowed to be ran manually. + # Disable automatic runs for tags and force release signing for tags. + if: | + (startsWith(github.ref, 'refs/tags/v') && github.event_name == 'workflow_dispatch' && github.event.inputs.sign == 'release-signing') || + (!startsWith(github.ref, 'refs/tags/v') && github.event.inputs.sign != 'release-signing') outputs: name: ${{ steps.artifact-name.outputs.name }} describe: ${{ steps.ghd.outputs.describe }} @@ -41,6 +57,8 @@ jobs: distance: ${{ steps.ghd.outputs.distance }} tag: ${{ steps.ghd.outputs.tag }} push: ${{ steps.setenv.outputs.push }} + sign: ${{ steps.sign.outputs.sign }} + certificate: ${{ steps.sign.outputs.certificate }} steps: # We need to fetch entire repo to get the tags and correctly run `describe` - name: Check out code @@ -51,8 +69,8 @@ jobs: - name: Git describe id: ghd run: | - TAG=$(git describe --abbrev=0) - DESCRIBE=$(git describe) + TAG=$(git describe --tags --abbrev=0) + DESCRIBE=$(git describe --tags) SHORT_SHA=$(git rev-parse --short HEAD) DISTANCE=$(git rev-list --count $TAG..HEAD) echo "tag=$TAG" @@ -75,6 +93,22 @@ jobs: run: | echo "name=${{ steps.ghd.outputs.describe }}" echo "name=${{ steps.ghd.outputs.describe }}" >> $GITHUB_OUTPUT + - name: Sign + id: sign + run: | + sign=${{ env.SIGNPATH_API_TOKEN != '' && github.event.inputs.sign != 'no' && (needs.build_variables.outputs.push || startsWith(github.ref, 'refs/tags/v')) }} + # if using workflow_dispatch, use the provided certificate + if [[ "$GITHUB_EVENT_NAME" == "workflow_dispatch" ]]; then + certificate=${{ github.event.inputs.sign }} + else + # Default to no signing + certificate=no + sign=false + fi + echo "sign=$sign" + 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' @@ -139,13 +173,14 @@ jobs: windows: name: Windows runs-on: windows-latest - needs: [check-code-formatting, build_variables] + needs: [check-code-formatting, build_variables, g2dat] strategy: fail-fast: false matrix: platform: [win32, x64, arm64] env: PLATFORM: ${{ matrix.platform }} + DISTANCE_FROM_TAG: ${{ needs.build_variables.outputs.distance }} steps: - name: Setup environment run: | @@ -161,12 +196,50 @@ jobs: uses: ammaraskar/msvc-problem-matcher@master - name: Build OpenRCT2 run: . scripts/setenv && build + - name: Upload unsigned binaries + id: upload-windows-binaries-unsigned + uses: actions/upload-artifact@v4 + with: + name: OpenRCT2-${{ needs.build_variables.outputs.name }}-windows-unsigned-${{ matrix.platform }} + path: | + bin/openrct2.exe + bin/openrct2.com + # Sign the binaries first, so that all other artifacts (portable, installer, symbols) use signed binaries + - name: Sign binaries + id: sign-binaries + env: + SIGNPATH_API_TOKEN: ${{ secrets.SIGNPATH_API_TOKEN }} + if: ${{ needs.build_variables.outputs.sign == 'true' }} + uses: signpath/github-action-submit-signing-request@v1 + with: + api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' + organization-id: 645b821f-6283-45e1-8198-264997072801 + project-slug: OpenRCT2 + signing-policy-slug: ${{ needs.build_variables.outputs.certificate }} + artifact-configuration-slug: 'binaries' + github-artifact-id: ${{ steps.upload-windows-binaries-unsigned.outputs.artifact-id }} + wait-for-completion: true + output-artifact-directory: files-signed + parameters: | + version: "${{ env.OPENRCT2_VERSION }}.${{ needs.build_variables.outputs.distance }}-${{ needs.build_variables.outputs.short-sha }}" + - name: Use signed binaries + if: ${{ needs.build_variables.outputs.sign == 'true' }} + run: | + mv files-signed/openrct2.com bin/openrct2.com + mv files-signed/openrct2.exe bin/openrct2.exe + - name: Download g2.dat on ARM64 + if: matrix.platform == 'arm64' + uses: actions/download-artifact@v4 + with: + name: g2-${{ needs.build_variables.outputs.name }}.dat + path: bin/data/g2.dat - name: Build artifacts run: | . scripts/setenv -q build-portable build-symbols build-installer -i + echo "OPENRCT2_VERSION_EXTRA=$OPENRCT2_VERSION_EXTRA" >> "$GITHUB_ENV" - name: Rename artifacts run: | mv artifacts/openrct2-portable-*.zip artifacts/OpenRCT2-${{ needs.build_variables.outputs.name }}-windows-portable-$PLATFORM.zip @@ -178,11 +251,36 @@ jobs: name: OpenRCT2-${{ needs.build_variables.outputs.name }}-${{ runner.os }}-portable-${{ matrix.platform }} path: artifacts/OpenRCT2-${{ needs.build_variables.outputs.name }}-windows-portable-${{ matrix.platform }}.zip if-no-files-found: error - - name: Upload installer artifact (CI) + - name: Upload unsigned installer artifact (CI) + id: upload-windows-installer-unsigned + uses: actions/upload-artifact@v4 + with: + name: OpenRCT2-${{ needs.build_variables.outputs.name }}-${{ runner.os }}-installer-${{ matrix.platform }}-unsigned + path: artifacts/OpenRCT2-${{ needs.build_variables.outputs.name }}-windows-installer-${{ matrix.platform }}.exe + if-no-files-found: error + - name: Sign installer + id: sign-installer + if: ${{ needs.build_variables.outputs.sign == 'true' }} + uses: signpath/github-action-submit-signing-request@v1 + with: + api-token: '${{ secrets.SIGNPATH_API_TOKEN }}' + organization-id: 645b821f-6283-45e1-8198-264997072801 + project-slug: OpenRCT2 + signing-policy-slug: ${{ needs.build_variables.outputs.certificate }} + artifact-configuration-slug: 'installer' + github-artifact-id: ${{ steps.upload-windows-installer-unsigned.outputs.artifact-id }} + wait-for-completion: true + output-artifact-directory: files-signed + parameters: | + version: "${{ env.OPENRCT2_VERSION }}${{ env.OPENRCT2_VERSION_EXTRA }}" + product: "OpenRCT2 ${{ matrix.platform }} Installer for Windows 7 and later" + - name: Upload signed installer artifact (CI) + id: upload-windows-installer-signed + if: ${{ needs.build_variables.outputs.sign == 'true' }} uses: actions/upload-artifact@v4 with: name: OpenRCT2-${{ needs.build_variables.outputs.name }}-${{ runner.os }}-installer-${{ matrix.platform }} - path: artifacts/OpenRCT2-${{ needs.build_variables.outputs.name }}-windows-installer-${{ matrix.platform }}.exe + path: files-signed/OpenRCT2-${{ needs.build_variables.outputs.name }}-windows-installer-${{ matrix.platform }}.exe if-no-files-found: error - name: Upload symbols artifact (CI) uses: actions/upload-artifact@v4 @@ -245,7 +343,7 @@ jobs: macos-cmake: name: macOS (${{ matrix.arch }}) using CMake runs-on: macos-14 - needs: check-code-formatting + needs: [check-code-formatting, build_variables] strategy: fail-fast: false matrix: @@ -417,8 +515,8 @@ jobs: if-no-files-found: error linux-docker: name: Ubuntu Linux (Docker) - needs: check-code-formatting - if: github.repository == 'OpenRCT2/OpenRCT2' + needs: [check-code-formatting, build_variables] + if: github.repository == 'OpenRCT2/OpenRCT2' && github.ref == 'refs/heads/develop' runs-on: ubuntu-latest steps: - name: Checkout image @@ -443,7 +541,7 @@ jobs: linux-clang: name: Ubuntu Linux (noble, debug, [http, network, flac, vorbis OpenGL] disabled) using clang runs-on: ubuntu-latest - needs: check-code-formatting + needs: [check-code-formatting, build_variables] container: openrct2/openrct2-build:16-noble steps: - name: Checkout @@ -471,7 +569,7 @@ jobs: - name: Install GCC problem matcher uses: ammaraskar/gcc-problem-matcher@master - name: Build OpenRCT2 - run: . scripts/setenv && build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-fprofile-instr-generate -fcoverage-mapping" -DWITH_TESTS=on + run: . scripts/setenv && build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Debug -DENABLE_HEADERS_CHECK=on -DCMAKE_CXX_FLAGS="-fprofile-instr-generate -fcoverage-mapping" -DWITH_TESTS=on - name: Run Tests run: . scripts/setenv -q && LLVM_PROFILE_FILE="openrct2-coverage-%p.profraw" run-tests - name: Test Summary @@ -539,6 +637,10 @@ jobs: uses: actions/download-artifact@v4 with: merge-multiple: true + # Having multiple artifacts named the same might be confusing to the users. Drop the unsigned versions. + - name: Remove unsigned artifacts + run: | + rm -rf *unsigned* - name: Concatenate sha1 files run: | ls -lR @@ -551,11 +653,16 @@ jobs: sed -n '1,/^$/p' distribution/changelog.txt >> release_notes.txt echo "" >> release_notes.txt + echo "Release created in ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> release_notes.txt + echo "" >> release_notes.txt + echo "SHA1 checksums:" >> release_notes.txt echo "\`\`\`" >> release_notes.txt cat OpenRCT2-${{ needs.build_variables.outputs.name }}-sha1sums.txt >> release_notes.txt echo "\`\`\`" >> release_notes.txt echo "" >> release_notes.txt + + cat release_notes.txt # Only upload tagged releases, mark them as draft for manual verification - name: Create tagged release uses: softprops/action-gh-release@v2 @@ -563,7 +670,6 @@ jobs: with: draft: true files: | - OpenRCT2-${{ needs.build_variables.outputs.name }}-sha1sums.txt OpenRCT2-${{ needs.build_variables.outputs.name }}-* body_path: release_notes.txt tag_name: ${{ needs.build_variables.outputs.tag }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 23b59933ef..09cb5d3852 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ # CMAKE project for openrct2 -cmake_minimum_required(VERSION 3.9) +cmake_minimum_required(VERSION 3.10) + if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt") endif() @@ -68,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.10") +set(OBJECTS_VERSION "1.4.11") set(OBJECTS_URL "https://github.com/OpenRCT2/objects/releases/download/v${OBJECTS_VERSION}/objects.zip") -set(OBJECTS_SHA1 "e4953075d8dbe13ef48e8c4e87621cf3503a9d23") +set(OBJECTS_SHA1 "da04330679de2eff53a94a6505802512bfec6403") set(OPENSFX_VERSION "1.0.5") set(OPENSFX_URL "https://github.com/OpenRCT2/OpenSoundEffects/releases/download/v${OPENSFX_VERSION}/opensound.zip") @@ -80,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.83") +set(REPLAYS_VERSION "0.0.84") set(REPLAYS_URL "https://github.com/OpenRCT2/replays/releases/download/v${REPLAYS_VERSION}/replays.zip") -set(REPLAYS_SHA1 "FFC98C36AFEC68DC6A48E863413D4E2364A202B3") +set(REPLAYS_SHA1 "90B848AB344E29A2CF1E3E48539F06F5845772C3") option(FORCE32 "Force 32-bit build. It will add `-m32` to compiler flags.") option(WITH_TESTS "Build tests") @@ -112,9 +113,10 @@ option(DISABLE_TTF "Disable support for TTF provided by freetype2.") option(ENABLE_SCRIPTING "Enable script / plugin support." ON) option(ENABLE_ASAN "Enable the AddressSanitizer.") option(ENABLE_UBSAN "Enable the UndefinedBehaviourSanitizer.") - +option(ENABLE_HEADERS_CHECK "Check if include directives in header files are correct. Only works with clang" OFF) option(DISABLE_GUI "Don't build GUI. (Headless only.)") + if (FORCE32) set(TARGET_M "-m32") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_M}") @@ -434,6 +436,7 @@ if (NOT MACOS_BUNDLE OR (MACOS_BUNDLE AND WITH_TESTS)) add_definitions(-DDOCDIR="${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_DOCDIR}") file(GLOB DOC_FILES "${ROOT_DIR}/distribution/*.txt") list(APPEND DOC_FILES "${ROOT_DIR}/contributors.md" + "${ROOT_DIR}/PRIVACY.md" "${ROOT_DIR}/licence.txt" "${ROOT_DIR}/distribution/scripting.md" "${ROOT_DIR}/distribution/openrct2.d.ts") diff --git a/PRIVACY.md b/PRIVACY.md new file mode 100644 index 0000000000..219dd55df1 --- /dev/null +++ b/PRIVACY.md @@ -0,0 +1,55 @@ +# Privacy Policy + +## Overview +This document describes how this project collects, handles, and processes data. + +## Data Collection +- No personal information is collected without explicit user consent +- For multiplayer functionality, we only collect necessary data: + - Username + - Game session data + - Network connection details + +## Data Storage +- User preferences and settings are stored locally on your device +- No sensitive data is transmitted to external servers +- Game saves and configurations remain on your local system + +## Network Communications +- Multiplayer sessions only transmit game-relevant data +- Server connections are used solely for gameplay functionality +- No tracking or analytics services are implemented + +## Crash Reporting +- Crash dumps may be sent to Backtrace.io for diagnostic purposes +- Each crash report transfer requires explicit user consent +- Crash dumps contain: + - System information + - Machine hostname + - System username + - Technical data about the crash + - In-game screenshot +- This data helps improve software stability +- Users can decline sending crash reports without limiting gameplay functionality +- Only team members have access to crash reports + +## Third-Party Services +If you use optional features: +- Server hosting services may collect connection data +- Plugin systems operate under their own privacy terms + +## User Rights +You have the right to: +- Access your data +- Delete your data +- Opt out of any data collection +- Request information about stored data + +## Changes to Privacy Policy +- Users will be notified of any privacy policy updates +- Changes will be documented in the project's changelog + +## Contact +For privacy concerns or questions, please open an issue in the project repository or contact the team via [Discord](https://discord.gg/ZXZd8D8) + +Last updated: 2024-11-18 diff --git a/data/language/ca-ES.txt b/data/language/ca-ES.txt index a8bbdb9dfd..5e20a13b7c 100644 --- a/data/language/ca-ES.txt +++ b/data/language/ca-ES.txt @@ -99,7 +99,9 @@ STR_0094 :Muntanya russa d’un sol rail STR_0095 :Muntanya russa alpina STR_0096 :Muntanya russa clàssica de fusta STR_0097 :Muntanya russa a peu dret clàssica +STR_0098 :Muntanya russa d’impuls LSM STR_0607 :Una muntanya russa d’estil antic i d’acer molt intensa on els passatgers van com si estiguessin de peu. +STR_0608 :Els cotxes acceleren amb motors síncrons lineals i circulen a gran velocitat per girs i corbes tancades. STR_0512 :Muntanya russa compacta amb una pujada en espiral i caigudes sinuoses suaus. STR_0513 :Muntanya russa amb inversions en la qual els passatgers es mantenen drets. STR_0514 :Els cotxes que pengen per sota dels rails es balancegen cap a fora en les corbes. @@ -1045,10 +1047,10 @@ STR_1653 :«…i aquí estem en {STRINGID}!» STR_1654 :{WINDOW_COLOUR_2}Pensaments recents: STR_1655 :Construeix camí al terra STR_1656 :Construeix camí al pont o al túnel -STR_1657 :{WINDOW_COLOUR_2}Atracció preferida -STR_1658 :{WINDOW_COLOUR_2}intensitat: {BLACK}menys de {COMMA16} -STR_1659 :{WINDOW_COLOUR_2}intensitat: {BLACK}entre {COMMA16} i {COMMA16} -STR_1660 :{WINDOW_COLOUR_2}intensitat: {BLACK}més de {COMMA16} +STR_1657 :{WINDOW_COLOUR_2}Atraccions preferides: +STR_1658 :{WINDOW_COLOUR_2}De {BLACK}menys de {COMMA16} {WINDOW_COLOUR_2}d’intensitat +STR_1659 :{WINDOW_COLOUR_2}D’{BLACK}entre {COMMA16} i {COMMA16} {WINDOW_COLOUR_2}d’intensitat +STR_1660 :{WINDOW_COLOUR_2}De {BLACK}més de {COMMA16} {WINDOW_COLOUR_2}d’intensitat STR_1661 :{WINDOW_COLOUR_2}Tolerància a la nàusea: {BLACK}{STRINGID} STR_1662 :{WINDOW_COLOUR_2}Felicitat: STR_1663 :{WINDOW_COLOUR_2}Nàusea: @@ -1742,7 +1744,7 @@ STR_2382 :Terra STR_2383 :Aigua STR_2384 :{WINDOW_COLOUR_2}El vostre objectiu: STR_2385 :{BLACK}Cap -STR_2386 :{BLACK}Tenir almenys {COMMA32} visitants al parc al final de {MONTHYEAR}, amb una valoració del parc d’almenys 600. +STR_2386 :{BLACK}Tenir almenys {COMMA32} visitants al parc al final de {MONTHYEAR}, amb una valoració del parc almenys de 600. STR_2387 :{BLACK}Aconseguir una valoració del parc d’almenys {POP16}{POP16}{CURRENCY} al final de {PUSH16}{PUSH16}{PUSH16}{PUSH16}{PUSH16}{MONTHYEAR}. STR_2388 :{BLACK}Divertiu-vos! STR_2389 :{BLACK}Construïu el millor {STRINGID} que pugueu! @@ -1913,8 +1915,8 @@ STR_2670 :Bloq Despl STR_2680 :S’han completat totes les recerques. STR_2684 :Arriba un grup gran de visitants. STR_2685 :Paràmetres de soroll del símplex -STR_2686 :Baix: -STR_2687 :Alt: +STR_2686 :Altura del terreny mín.: +STR_2687 :Altura del terreny màx.: STR_2688 :Freqüència base: STR_2689 :Octaves: STR_2690 :Generació del mapa @@ -2150,8 +2152,8 @@ STR_3107 :Tanca STR_3108 :Prova STR_3109 :Obre STR_3110 :{WINDOW_COLOUR_2}Seccions de bloc: {BLACK}{COMMA16} -STR_3111 :Cliqueu el disseny per a construir-lo. -STR_3112 :Cliqueu el disseny per a canviar-ne el nom o per a esborrar-lo. +STR_3111 :Feu clic al disseny per a construir-lo. +STR_3112 :Feu clic al disseny per a canviar-ne el nom o per a esborrar-lo. STR_3113 :Selecciona un altre disseny STR_3114 :Torna a la finestra de selecció de dissenys. STR_3115 :Desa el disseny de via @@ -2171,7 +2173,7 @@ STR_3128 :Desa el disseny de via STR_3129 :Desa el disseny de via i el decorat STR_3130 :Desa STR_3131 :Cancel·la -STR_3132 :{BLACK}Cliqueu elements del decorat per a seleccionar-los i desar-los amb el disseny de via. +STR_3132 :{BLACK}Feu clic als elements del decorat per a seleccionar-los i desar-los amb el disseny de via. STR_3133 :No es pot construir a sobre d’un pendent. STR_3134 :{RED}(El disseny inclou algun decorat no disponible) STR_3135 :{RED}(Disseny de vehicle no disponible - Això pot afectar al rendiment de l’atracció) @@ -2440,7 +2442,7 @@ STR_5149 :Mostra les trampes que es poden fer a la partida. STR_5150 :Activa les eines de depuració STR_5151 :. STR_5152 :, -STR_5153 :Edita temes… +STR_5153 :Edita els temes… STR_5154 :Renderitzat per maquinari STR_5155 :Permet provar atraccions sense acabar STR_5156 :Permet provar la majoria d’atraccions fins i tot si la via no està acabada. No s’aplica als modes de bloc de seccions. @@ -2607,8 +2609,8 @@ STR_5357 :{BLACK}Tolerància a la nàusea: STR_5358 :{BLACK}Orina: STR_5359 :Treu visitants STR_5360 :Elimina tots els visitants del mapa. -STR_5361 :Dóna a tots els visitants: -STR_5362 :{BLACK}Estableix la intensitat preferida dels visitants a: +STR_5361 :Afegeix a l’inventari dels visitants +STR_5362 :{BLACK}Intensitat preferida dels visitants: STR_5363 :Més d’1 STR_5364 :Menys de 15 STR_5365 :{BLACK}Velocitat dels empleats: @@ -2638,7 +2640,7 @@ STR_5457 :Desactiva els límits dels suports STR_5458 :Gira en sentit horari STR_5459 :Gira en sentit antihorari STR_5460 :Gira la vista en sentit antihorari -STR_5461 :Estableix els paràmetres dels visitants +STR_5461 :Estableix els paràmetres de tots els visitants STR_5462 :{CURRENCY} STR_5463 :Objectiu: Divertiu-vos! STR_5464 :General @@ -3170,9 +3172,9 @@ STR_6041 :{BLACK}No s’han contractat mecànics! STR_6042 :Carrega el mapa d’alçades STR_6043 :Selecciona el mapa d’alçades STR_6044 :Suavitza el mapa d’alçades -STR_6045 :Força +STR_6045 :Força: STR_6046 :Normalitza el mapa d’alçades -STR_6047 :Suavitza les caselles +STR_6047 :Suavitza les vores de les caselles STR_6048 :Error del mapa d’alçades STR_6049 :S’ha produït un error mentre es llegia el fitxer PNG. STR_6050 :S’ha produït un error mentre es llegia el bitmap. @@ -3614,7 +3616,7 @@ STR_6537 :Permet fer servir els camins normals per a fer cues STR_6538 :Mostra els camins normals al menú desplegable de les cues de la finestra de construcció corresponent. STR_6539 :Fre tancat STR_6540 :{WINDOW_COLOUR_2}Donem les gràcies a les companyies següents per permetre fer servir les seves imatges: -STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. STR_6542 :Col·laboradors STR_6543 :Col·laboradors… STR_6544 :El préstec no pot ser negatiu! @@ -3736,3 +3738,51 @@ STR_6659 :Els visitants ignoren els preus STR_6660 :Els visitants ignoraran els preus de les atraccions i paradetes. STR_6661 :Aleatoritza’ls tots STR_6662 :Aleatoritza els colors de cada cotxe o vehicle. +STR_6663 :Trampes de dates +STR_6664 :Mostra les trampes de dates +STR_6665 :Trampes de clima/natura +STR_6666 :Mostra les trampes de clima/natura +STR_6667 :Fauna +STR_6668 :Trampes dels encarregats +STR_6669 :Mostra les trampes sobre encarregats +STR_6670 :Comportament dels visitants +STR_6671 :Mostra noms «reals» dels encarregats +STR_6672 :Commuta entre mostra noms «reals» dels encarregats o el seu número. +STR_6673 :Transparència +STR_6674 :{MONTH} de l’any {COMMA16} +STR_6675 :Noms de persones +STR_6676 :Cal escollir com a mínim un objecte de noms de persona. +STR_6677 :Afegeix platges al voltant de les masses d’aigua +STR_6678 :Origen del mapa d’alçades: +STR_6679 :Terreny pla +STR_6680 :Soroll símplex +STR_6681 :Fitxer del mapa d’alçades +STR_6682 :Generador de mapes - Generador +STR_6683 :Generador de mapes - Terreny +STR_6684 :Generador de mapes - Aigua +STR_6685 :Generador de mapes - Boscos +STR_6686 :Proporció arbres/terreny: +STR_6687 :Altura mín. per als arbres: +STR_6688 :Altura màx. per als arbres: +STR_6689 :{UINT16} % +STR_6690 :Altura mínima del terreny +STR_6691 :Escriviu una altura mínima del terreny entre {COMMA16} i {COMMA16} +STR_6692 :Altura màxima del terreny +STR_6693 :Escriviu una altura màxima del terreny entre {COMMA16} i {COMMA16} +STR_6694 :Altura mínima per als arbres +STR_6695 :Escriviu una altura mínima per als arbres entre {COMMA16} i {COMMA16} +STR_6696 :Altura màxima per als arbres +STR_6697 :Escriviu una altura màxima per als arbres entre {COMMA16} i {COMMA16} +STR_6698 :Proporció arbres/terreny +STR_6699 :Escriviu una proporció arbres/terreny entre {COMMA16} i {COMMA16} +STR_6700 :Freqüència base del símplex +STR_6701 :Escriviu una freqüència base del símplex entre {COMMA2DP32} i {COMMA2DP32} +STR_6702 :Octaves del símplex +STR_6703 :Escriviu octaves entre {COMMA16} i {COMMA16} +STR_6704 :{COMMA2DP32} +STR_6705 :Navega… +STR_6706 :{WINDOW_COLOUR_2}Fitxer d’imatge actual: {BLACK}{STRING} +STR_6707 :(cap de seleccionat) +STR_6708 :Força suau +STR_6709 :Escriviu una força suau entre {COMMA16} i {COMMA16} + diff --git a/data/language/da-DK.txt b/data/language/da-DK.txt index 70876baf36..7e6c94baf3 100644 --- a/data/language/da-DK.txt +++ b/data/language/da-DK.txt @@ -98,6 +98,8 @@ STR_0093 :Hybrid Rutschebane STR_0094 :Enkelt skinde rutchebane STR_0095 :Alpin rutchebane STR_0096 :Klassisk træ rutsjebane +STR_0097 :Klassisk Stå-op Rutschebane +STR_0098 :LSM Accelereret Rutschebane STR_0512 :En kompakt rutschebane med en spiral stigning og bløde, snoede fald. STR_0513 :En loopende rutschebane hvor passagerne er i en stående position STR_0514 :Vogne suspenderet under rutschebane sporet, svinger ud til siden i svingene @@ -181,6 +183,8 @@ STR_0603 :En rutsjebane i træ stil, med stål spor, Med stejle fald og hurti STR_0604 :Gæster sider i en enkelt række, på et smalt monorail spor, imens de suser igennem skarpe sving ,snoninger og hurtige vridninger. STR_0605 :Ryttere kælker ned ad en bugtende stålbane og bremser for at kontrollere deres hastighed STR_0606 :En ældre stils trærutsjebane med en hurtig og ujævn tur med masser af luft tid, laterale G'er, og designet til at føles som ‘ude-af-kontrol’ +STR_0607 :En intens, Klassisk stål-stil, loopende rutschebane hvor passagerne er i en stående position +STR_0608 :Rutsjebanetog accelereres ud af stationen af lineære synkronmotorer, for at suse gennem snoede inversioner og sving STR_0767 :Gæst {INT32} STR_0768 :Handymand {INT32} STR_0769 :Mekaniker {INT32} @@ -3247,7 +3251,7 @@ STR_6134 :Ryd sceneri STR_6135 :Klienten sendte en ugyldig anmodning STR_6136 :Serveren sendte en ugyldig anmodning STR_6137 :OpenRCT2, en gratis, open source genskabelse af Roller Coaster Tycoon 2. -STR_6138 :OpenRCT2 er et samarbejde imellem mange forfattere, en komplet liste kan findes under “bidragudere” knappen. Du kan finde flere oplysninger på http://github.com/OpenRCT2/OpenRCT2 +STR_6138 :OpenRCT2 er et samarbejde imellem mange forfattere, en komplet liste kan findes under “bidragydere” knappen. Du kan finde flere oplysninger på http://github.com/OpenRCT2/OpenRCT2 STR_6139 :Alle produkt- og firmanavne tilhører deres respektive indehavere. Brug af dem indebærer ikke nogen tilknytning til eller godkendelse af dem. STR_6140 :Ændringslog… STR_6141 :RCT1 bund værktøjslinje @@ -3607,7 +3611,7 @@ STR_6537 :Tillad almindelige stier som køområde STR_6538 :Viser almindelige gangstier i rullemenuen Køer i sti vinduet. STR_6539 :Bremser lukket STR_6540 :{WINDOW_COLOUR_2}Særlig tak til følgende virksomheder for at tillade deres lighed: -STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. STR_6542 :Bidragydere STR_6543 :Bidragydere… STR_6544 :Lån kan ikke være negativ! @@ -3690,3 +3694,91 @@ STR_6619 :Objekttype kan ikke begrænses! STR_6620 :Objektet blev ikke fundet! STR_6621 :Begræns STR_6622 :Begræns objekt til scenarieeditoren og sandkassetilstanden. +STR_6623 :Skriv 'help' for at få en liste over tilgængelige kommandoer. Skriv 'hide' for at skjule konsollen. +STR_6624 :Fliseinspektør: Sortér elementer +STR_6625 :Ugyldig farve +STR_6626 :Animation er baglæns +STR_6627 :Sporhastighed er for høj! +STR_6628 :Kan kun placeres på stikanter! +STR_6629 :Juster værktøjslinjeknapper vandret centreret +STR_6630 :Denne indstilling justerer værktøjslinjeknapperne vandret i midten af skærmen. Den traditionelle måde at justere dem på er i venstre og højre hjørne. +STR_6631 :Indlæser… +STR_6632 :Kontrollerer objekt filer… +STR_6633 :Kontrollerer scenarie filer… +STR_6634 :Kontrollerer banedesign filer… +STR_6635 :Kontrollerer aktivpakker… +STR_6636 :Kontrollerer titel sekvenser… +STR_6637 :Indlæser titel sekvens… +STR_6638 :Forstørret UI +STR_6639 :Ændrer grænsefladen, så den er mere velegnet til touchskærm +STR_6640 :Rediger aktivpakker… +STR_6641 :Indlæsning/Fremskridt vindue +STR_6642 :{STRING} ({COMMA32} / {COMMA32}) +STR_6643 :{STRING} ({COMMA32} / {COMMA32} KiB) +STR_6644 :Touch-forbedringer +STR_6645 :Gør nogle UI-elementer større, så de er nemmere at klikke eller trykke på. +STR_6646 :Forfatter: {STRING} +STR_6647 :Forfattere: {STRING} +STR_6648 :Indlæser udvidelsesmodul… +STR_6649 :Indlæser scenarie… +STR_6650 :Indlæser gemt spil… +STR_6651 :{STRING} ({COMMA32}%) +STR_6652 :Fejlvindue +STR_6653 :Alle kilder vist +STR_6654 :Viser {POP16}{UINT16} kilder +STR_6655 :Kun ‘{POP16}{STRINGID}’ +STR_6656 :Fjern alle hegn fra parken +STR_6657 :Land Ikke Ejet +STR_6658 :Sæt land til at ikke være ejet af parken, heller ikke muligt at købe land +STR_6659 :Gæster ignorerer priser +STR_6660 :Gæsterne vil ignorere priserne for forlystelser og stande. +STR_6661 :Alt tilfældigt +STR_6662 :Gør farverne tilfældige for hver Randomise colours for every train or vehicle. +STR_6663 :Dato snyd +STR_6664 :Vis dato snyd +STR_6665 :Natur/vejr Snyd +STR_6666 :Vis natur/vejr snyd +STR_6667 :Fauna +STR_6668 :Ansatte snyd +STR_6669 :Vis snyd med ansatte +STR_6670 :Gæste opførsel +STR_6671 :Vis ‘rigtige’ navne på ansatte +STR_6672 :Skift imellem at vise ‘rigtige’ navne på ansatte og ansatte numre +STR_6673 :Gennemsigtig +# Used as part of a sentence (see https://github.com/OpenRCT2/OpenRCT2/issues/22072). +STR_6674 :{MONTH}, År {COMMA16} +STR_6675 :Peep Navne +STR_6676 :Mindst et peep navne objekt skal være valgt +STR_6677 :Tilføj strand omkring vandområder +STR_6678 :Højdekort kilde: +STR_6679 :Fladland +STR_6680 :Simpeleks støj +STR_6681 :Højdekort fil +STR_6682 :Kort Generator - Generator +STR_6683 :Kort Generator - Terræn +STR_6684 :Kort Generator - Vand +STR_6685 :Kort Generator - Skove +STR_6686 :Træ til land rate: +STR_6687 :Min. trægrænse: +STR_6688 :Maks. trægrænse: +STR_6689 :{UINT16}% +STR_6690 :Minimum landskabshøjde +STR_6691 :Angiv min. landskabshøjde imellem {COMMA16} og {COMMA16} +STR_6692 :Maksimum landskabshøjde +STR_6693 :Angiv maks. landskabshøjde imellem {COMMA16} og {COMMA16} +STR_6694 :Minimum trægrænse +STR_6695 :Angiv min. trægrænse imellem {COMMA16} og {COMMA16} +STR_6696 :Maksimum trægrænse +STR_6697 :Angiv maks. trægrænse imellem {COMMA16} og {COMMA16} +STR_6698 :Træ til land rate +STR_6699 :Angiv træ til land rate imellem {COMMA16} og {COMMA16} +STR_6700 :Simpleks Base Frekvens +STR_6701 :Angiv Base Frekvens imellem {COMMA2DP32} og {COMMA2DP32} +STR_6702 :Simpleks oktaver +STR_6703 :Angiv Oktaver imellem {COMMA16} og {COMMA16} +STR_6704 :{COMMA2DP32} +STR_6705 :Gennemse... +STR_6706 :{WINDOW_COLOUR_2}Nuværende billedfil: {BLACK}{STRING} +STR_6707 :(Ingen valgt) +STR_6708 :Udglatnings Styrke +STR_6709 :Angiv udglatnings styrke imellem {COMMA16} og {COMMA16} diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 0e69146f78..ccea05dde4 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -100,6 +100,7 @@ STR_0095 :Alpine Coaster STR_0096 :Classic Wooden Roller Coaster STR_0097 :Classic Stand-up Roller Coaster STR_0098 :LSM Launched Roller Coaster +STR_0099 :Classic Wooden Twister Roller Coaster STR_0512 :A compact roller coaster with a spiral lift hill and smooth, twisting drops. STR_0513 :A looping roller coaster where the riders ride in a standing position STR_0514 :Trains suspended beneath the roller coaster track swing out to the side around corners @@ -185,6 +186,7 @@ STR_0605 :Riders toboggan down a meandering steel track, braking to control t STR_0606 :An older-style wooden roller coaster with a fast and rough ride, with plenty of air-time, some lateral G’s, and designed to feel ‘out-of-control’ STR_0607 :An intense, older-style steel looping roller coaster where the riders ride in a standing position STR_0608 :Roller coaster trains are accelerated by linear synchronous motors, speeding through tight twists and turns +STR_0609 :An older-style wooden roller coaster with a fast and rough ride featuring articulated trains, plenty of air-time and twisting track STR_0767 :Guest {INT32} STR_0768 :Handyman {INT32} STR_0769 :Mechanic {INT32} @@ -3783,3 +3785,4 @@ STR_6706 :{WINDOW_COLOUR_2}Current image file: {BLACK}{STRING} STR_6707 :(none selected) STR_6708 :Smooth Strength STR_6709 :Enter Smooth Strength between {COMMA16} and {COMMA16} +STR_6710 :Stable sort diff --git a/data/language/eo-ZZ.txt b/data/language/eo-ZZ.txt index e7781e3c11..4174d3d7c3 100644 --- a/data/language/eo-ZZ.txt +++ b/data/language/eo-ZZ.txt @@ -99,6 +99,7 @@ STR_0094 :Onda Fervojo kun Unuopa Relo STR_0095 :Alpa Onda Fervojo STR_0096 :Klasika Ligna Onda Fervojo STR_0097 :Klasika Staranta Onda Fervojo +STR_0098 :Onda Fervojo Lanĉita per Linearaj Sinkronaj Motoroj STR_0512 :Onda fervojo kompakta kun helikforma lifto kaj glataj kurboplenaj malleviĝoj. STR_0513 :Onda fervojo kun lopoj, sur kiun la rajdantoj rajdas starante STR_0514 :Trajnoj penditaj sub la trako de la onda fervojo svingiĝas flanken ĉe anguloj @@ -183,6 +184,7 @@ STR_0604 :Rajdantoj rajdas anservice sur mallarĝa monorela trako, dum ili ve STR_0605 :Rajdantoj toboganas malsupren serpentuman ŝtalan trakon, bremsante por regi ilian rapidecon. STR_0606 :Maljuna-stila ligna onda fervojo kun rapida kaj malglata rajdo, kun sufiĉe da ‘en-aeraj periodoj’, kelka flanka graviteco, kaj desegnita sentiĝi ‘nedirektebla’ STR_0607 :Intensa, malnovstila ŝtala onda fervojo kun lopoj, sur kiun la rajdantoj rajdas starante +STR_0608 :Linearaj sinkronaj motoroj plirapidigas la trajnojn de la onda fervojo, kiuj tiam trapasas krutajn inversigojn kaj kurbiĝojn STR_0767 :Gasto {INT32} STR_0768 :Faktoto {INT32} STR_0769 :Mekanikisto {INT32} @@ -3609,7 +3611,7 @@ STR_6537 :Permesi uzante regulajn trotuarojn kiel atendovico STR_6538 :Montras regulajn trotuarojn en la atendovicoj-fallisto de la Trotuaroj-fenestro. STR_6539 :Bremso Fermita STR_6540 :{WINDOW_COLOUR_2}Specialan dankon al la sekvantaj firmaoj por permesi ilian similecon: -STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. STR_6542 :Kontribuantoj STR_6543 :Kontribuantoj… STR_6544 :Prunto ne povas esti negativa! diff --git a/data/language/es-ES.txt b/data/language/es-ES.txt index e9a814ebf3..5774693e4f 100644 --- a/data/language/es-ES.txt +++ b/data/language/es-ES.txt @@ -3747,3 +3747,5 @@ STR_6671 :Mostrar nombres ‘reales’ de empleados STR_6672 :Alternar entre mostrar nombres ‘reales’ y números de empleados STR_6673 :Translúcido STR_6674 :{MONTH}, Año {COMMA16} +STR_6675 :Nombres de Personitas +STR_6676 :Se debe seleccionar al menos un objeto de nombre de personita diff --git a/data/language/gl-ES.txt b/data/language/gl-ES.txt new file mode 100644 index 0000000000..0d021996fb --- /dev/null +++ b/data/language/gl-ES.txt @@ -0,0 +1,3783 @@ +# STR_XXXX part is read and XXXX becomes the string id number. STR_1672 +# Everything after the colon and before the new line will be saved as the string. +# Use # at the beginning of a line to leave a comment. +STR_0000 : +STR_0001 :{STRINGID} {COMMA16} +STR_0002 :Montaña rusa en espiral +STR_0003 :Montaña rusa de pé +STR_0004 :Montaña rusa colgante +STR_0005 :Montaña Rusa invertida +STR_0006 :Montaña Rusa Infantil +STR_0007 :Tren en miniatura +STR_0008 :Monocarril +STR_0009 :Mini montaña rusa suspendida +STR_0010 :Paseo en barco +STR_0011 :Rato de madeira tolo +STR_0012 :Carreira de cegos +STR_0013 :Atracción de coches +STR_0014 :Caída libre potenciada +STR_0015 :Bobsleigh de montaña rusa +STR_0016 :Torre de Observación +STR_0017 :Montaña rusa con rizo +STR_0018 :Barcos deslizantes +STR_0019 :Minitren Montaña Rusa +STR_0020 :Telecadeira +STR_0021 :Montaña rusa de sacarollas +STR_0022 :Labirinto +STR_0023 :Deslizamento en espiral +STR_0024 :autos de choque +STR_0025 :Rexistros de auga +STR_0026 :Río Rápido +STR_0027 :Coches de choque +STR_0028 :Barco pirata +STR_0029 :Barco basculante invertido +STR_0030 :posto de comida +STR_0031 :Posición descoñecida (1D) +STR_0032 :Posto de bebidas +STR_0033 :Posición descoñecida (1F) +STR_0034 :Tenda +STR_0035 :Carrusel +STR_0036 :Posición descoñecida (22) +STR_0037 :Quiosco de información +STR_0038 :Cuartos de baño +STR_0039 :Roda xigante +STR_0040 :Simulador de movemento +STR_0041 :Cine 3D +STR_0042 :Top Spin +STR_0043 :Aneis espaciais +STR_0044 :Montaña Rusa invertida +STR_0045 :Ascensor +STR_0046 :Montaña rusa de caída vertical +STR_0047 :ATM +STR_0048 :Torce +STR_0049 :Casa encantada +STR_0050 :Sala de primeiros auxilios +STR_0051 :Circo +STR_0052 :Tren pantasma +STR_0053 :Montaña Rusa Tornado +STR_0054 :Montaña Rusa de madeira +STR_0055 :Montaña Rusa de fricción lateral +STR_0056 :Rato salvaxe de aceiro +STR_0057 :Montaña rusa multidimensional +STR_0058 :Atracción Descoñecida (38) +STR_0059 :Montaña rusa voadora +STR_0060 :Atracción Descoñecido (3A) +STR_0061 :Danza de Virginia +STR_0062 :Latas de salpicaduras +STR_0063 :Mini helicópteros +STR_0064 :Montaña rusa fixa +STR_0065 :Monocarril suspendido +STR_0066 :Atracción Descoñecida (40) +STR_0067 :Montaña Rusa invertida +STR_0068 :Mt. Tornado medio ruso +STR_0069 :Mini Golf +STR_0070 :Montaña rusa Xiga +STR_0071 :Caída xiratoria +STR_0072 :Platillos voadores +STR_0073 :Casa inclinada +STR_0074 :Bicicletas monorraíl +STR_0075 :Montaña rusa compacta +STR_0076 :Montaña rusa de auga +STR_0077 :Montaña rusa vertical de aire +STR_0078 :Garfo invertido +STR_0079 :Alfombra máxica +STR_0080 :Viaxe submarina +STR_0081 :Balsas fluviais +STR_0082 :Atracción Descoñecida (50) +STR_0083 :Empresa +STR_0084 :Atracción Descoñecida (52) +STR_0085 :Atracción Descoñecida (53) +STR_0086 :Atracción Descoñecida (54) +STR_0087 :Atracción Descoñecida (55) +STR_0088 :Montaña rusa de impulso inverso +STR_0089 :Mini montaña rusa +STR_0090 :Trens mineiros +STR_0091 :Atracción Descoñecida (59) +STR_0092 :Montaña Rusa Lançada por MLI +STR_0093 :Montaña Rusa Híbrida +STR_0094 :Montaña rusa dun só carril +STR_0095 :Montaña Rusa Alpina +STR_0096 :Montaña rusa clásica de madeira +STR_0097 :Montaña rusa clásica de pé +STR_0098 :Montaña Rusa de Lanzamento LSM +STR_0512 :Unha pequena montaña rusa de aceiro cunha subida en espiral e coches con asentos en liña. +STR_0513 :Unha montaña rusa na que os pasaxeiros permanecen de pé. +STR_0514 :Os coches suspendidos baixo os carrís balanceanse lateralmente ao virar en curva. +STR_0515 :Os pilotos sentan nos asentos suspendidos baixo a pista e corren a través de bucles xigantes, xiros e grandes caídas. +STR_0516 :Unha montaña rusa máis suave para as persoas que non teñen o valor de enfrontarse ás grandes montañas rusas. +STR_0517 :Os pasaxeiros viaxan en trens pequenos por unha pequena vía. +STR_0518 :Os pasaxeiros viaxan en trens eléctricos nunha vía de monorraíl. +STR_0519 :Os pasaxeiros colócanse boca abaixo en coches especiais nesta montaña rusa. +STR_0520 :Unha plataforma de peirao onde os pasaxeiros poden conducir barcos na auga. +STR_0521 :Unha montaña rusa rápida con curvas pechadas e desniveis pronunciados. A intensidade é moi alta. +STR_0522 :pequena montaña rusa onde os pasaxeiros viaxan en coches que circulan por un monorraíl. +STR_0523 :Os pasaxeiros viaxan lentamente en vehículos autopropulsados ​​por unha vía. +STR_0524 :Un coche é lanzado sobre un pneumático ata o alto dunha torre de aceiro alta, caendo libremente. +STR_0525 :Os pasaxeiros avanzan por unha pista retorcida guiados unicamente pola curvatura e o inclinamento da pista semicircular. +STR_0526 :Os pasaxeiros viaxan nunha cabina de observación xiratoria que sube por unha torre alta. +STR_0527 :Unha montaña rusa de aceiro capaz de rizos verticais. +STR_0528 :Os pasaxeiros viaxan en lanchas pneumáticas a través de tubos semicirculares ou totalmente pechados. +STR_0529 :O tren da mina circula por unha vía de aceiro que lembra as antigas vías do tren. +STR_0530 :Os asentos colgados dun cable de aceiro viaxan continuamente dun extremo ao outro da ruta. +STR_0531 :unha montaña rusa compacta de aceiro onde os coches circulan en bucles e sacarollas. +STR_0532 :O labirinto está construído a partir de arbustos ou paredes de 6 pés de alto, e os hóspedes deambulan polo labirinto saíndo só cando atopan a saída. +STR_0533 :Edificio de madeira cunha escaleira interior e un tobogán exterior en espiral para usar con alfombras deslizantes +STR_0534 :Os visitantes corren con karts nunha rúa asfaltada. +STR_0535 :Os barcos viaxan por unha canle de auga, salpicando ata que os pasaxeiros quedan empapados. +STR_0536 :Os barcos circulares percorren unha ancha canle de auga, salpicando fervenzas e emocionantes paseos por rápidos espumosos. +STR_0537 :Os visitantes chocan uns contra outros en coches de choque. +STR_0538 :Gran barco pirata balanceado. +STR_0539 :O barco está unido a un brazo cun contrapeso no lado oposto, e balancea en xiros de ata 360º. +STR_0540 :Posto onde os visitantes compran comidas. +STR_0542 :Posto onde os visitantes compran bebidas. +STR_0544 :Posto onde os visitantes compran recordos. +STR_0545 :Carrusel tradicional con cabalos de madeira tallada. +STR_0547 :Un posto onde os visitantes poden obter mapas do parque e mercar paraugas +STR_0548 :Un edificio de aseos +STR_0549 :Roda grande xiratoria con cadeiras abertas +STR_0550 :Os pilotos ven unha película dentro da cápsula do simulador de movemento mentres está retorcida e movida por un brazo hidráulico +STR_0551 :Cine que mostra películas en 3D dentro dun edificio con forma de esfera xeodésica +STR_0552 :Os pasaxeiros viaxan nunha góndola suspendida por grandes brazos xiratorios, xirando cara a adiante e cara atrás de cabeza sobre os talóns +STR_0553 :Aneis pivotantes concéntricos que permiten aos pilotos a rotación libre en todas as direccións +STR_0554 :O coche acelera ao saír da estación mediante motores lineais indutivos, pasando a unha zona da senda vertical e caendo libremente ata regresar á estación. +STR_0555 :Os pasaxeiros soben ou baixan nun ascensor para acceder a diferentes niveis dunha torre vertical. +STR_0556 :Os coches súper anchos descenden completamente verticalmente para a experiencia de caída libre definitiva. +STR_0557 :Un caixeiro automático (máquina de efectivo) para que os visitantes o usen se quedan sen fondos +STR_0558 :Os pasaxeiros viaxan en pares de asentos que xiran ao redor dos extremos de tres longos brazos rotatorios +STR_0559 :Edificio grande tematizado que contén corredores aterradores e salas espantosas +STR_0560 :Un lugar para que os visitantes enfermos vaian para unha recuperación máis rápida +STR_0561 :Espectáculo de animais de circo dentro dunha carpa de gran tamaño +STR_0562 :Os coches autopropulsados ​​percorren unha pista de varios niveis que atravesan paisaxes espantosas e efectos especiais. +STR_0563 :Os pasaxeiros permanecen de pé en vagóns con restricións especiais, pasando por caídas e múltiples inversións. +STR_0564 :Esta montaña rusa de madeira é rápida, áspera, ruidosa e ofrece unha experiencia "descontrolada" con moitas "gotas". +STR_0565 :Unha montaña rusa de madeira con descensos e xiros suaves, onde os coches se manteñen na pista por medio de rodas laterais de fricción e gravidade. +STR_0566 :Os coches individuais xiran nun tramo estreito de vía en zigzag con curvas pronunciadas e descensos. +STR_0567 :Os pasaxeiros, sentados en cadeiras suspendidas a ambos os dous lados da vía, están colgados boca abaixo mentres sofren caídas bruscas e diversas inversións. +STR_0569 :Paseando baixo a pista cun arnés especial, os visitantes experimentan a sensación de voar mentres caen en picado polo aire. +STR_0571 :Os vagóns circulares xiran mentres viaxan pola pista de madeira en zigzag. +STR_0572 :Os barcos de gran capacidade transitan por unha canle ancha, que son impulsados ​​por unha cinta transportadora e despois caen e producen grandes salpicaduras. +STR_0573 :coches con forma de helicópteros corren por unha pista de aceiro controlada polos pedais dos pasaxeiros. +STR_0574 :os pasaxeiros son suxeitos deitados mediante arneses especiais, mentres viaxan por unha vía retorcida con inversións nas costas ou boca abaixo. +STR_0575 :Os trens monorraíl suspendidos transportan persoas polo parque. +STR_0577 :Vagóns que circulan por vías de madeira virando en tramos especiais de marcha atrás. +STR_0578 :Os coches circulan por vías formando aneis e atravesando desniveles e xiros pronunciados. +STR_0579 :Unha partida tranquila de minigolf. +STR_0580 :Unha montaña rusa xigante capaz de baixar suavemente e subir máis de 300 pés. +STR_0581 :Un anel de asentos é arrastrado ata a parte superior dunha torre mentres xira, e despois cae libremente ata deterse suavemente usando freos magnéticos. +STR_0582 :Os visitantes viaxan en vehículos aerodeslizadores que controlan libremente. +STR_0583 :Edificio que contén salas deformadas e corredores inclinados para desorientar as persoas que o percorren +STR_0584 :Bicicletas especiais que circulan nun monorraíl, impulsadas pedaleando. +STR_0585 :Os pasaxeiros sentan en parellas pasando por bucles e inversións. +STR_0586 :Os coches en forma de lancha voadora percorren a ruta da montaña rusa, con curvas pronunciadas e desniveis pronunciados, mergullandose por tramos de auga. +STR_0587 :Despois dun lanzamento emocionante, o coche percorre unha pista vertical ata que se detén e descende verticalmente polo outro lado. +STR_0588 :Coches individuais corren baixo unha pista en zigzag. +STR_0589 :Un gran coche temático de alfombra máxica que se move hacia arriba e abaixo de maneira cíclica nos extremos de 4 brazos +STR_0590 :Os pasaxeiros viaxan nun submarino mergullado que viaxa nunha ruta submarina. +STR_0591 :barcos con forma de balsa viaxan suavemente por un río. +STR_0593 :Roda xiratoria con cápsulas de pasaxeiros suspendidas, que primeiro comeza a xirar e despois é inclinada cara arriba por un brazo de apoio +STR_0598 :Os coches da montaña rusa invertida aceleran saíndo da plataforma e collendo un tramo de vía vertical, despois dan marcha atrás, pasando pola plataforma e subindo por outro tramo de vía vertical. +STR_0599 :Unha montaña rusa compacta con coches individuais e descensos e xiros suaves. +STR_0600 :Trens mineiros autopropulsados ​​percorren unha vía suave e sinuosa. +STR_0602 :Os coches son acelerados por motores lineais de indución. +STR_0603 :Unha montaña rusa de estilo de madeira con vías de aceiro, que permite caídas e inversións pronunciadas. +STR_0604 :Os pasaxeiros viaxan en ringleira por unha estreita vía de monorraíl, mentres corren a través de inversións estreitas e cambios de dirección. +STR_0605 :Os pasaxeiros baixan por unha sinuosa vía de aceiro, freando para controlar a súa velocidade. +STR_0606 :Unha montaña rusa de madeira de estilo antigo cun paseo rápido e áspero, con moitas caídas, algunhas forzas G laterais e deseñada para ofrecer unha experiencia "descontrolada". +STR_0607 :Unha montaña rusa en espiral de aceiro de estilo vintage intenso con xinetes montando de pé. +STR_0608 :Os trens da montaña rusa son acelerados por motores lineais síncronos, percorrendo a gran velocidade curvas pechadas e viraxes pronunciadas +STR_0767 :Visitante {INT32} +STR_0768 :Manitas {INT32} +STR_0769 :Mecánica {INT32} +STR_0770 :Garda {INT32} +STR_0771 :Animador {INT32} +STR_0777 :Parque sen nome +STR_0778 :Sinal +STR_0779 :1 +STR_0780 :2 +STR_0781 :3 +STR_0782 :4 +STR_0783 :5 +STR_0784 :6 +STR_0785 :7 +STR_0786 :8 +STR_0787 :9 +STR_0788 :10 +STR_0789 :11 +STR_0790 :12 +STR_0791 :13 +STR_0792 :14 +STR_0793 :15 +STR_0794 :16 +STR_0795 :17 +STR_0796 :18 +STR_0797 :19 +STR_0798 :20 +STR_0799 :21 +STR_0800 :22 +STR_0801 :23 +STR_0802 :24 +STR_0803 :25 +STR_0804 :26 +STR_0805 :27 +STR_0806 :28 +STR_0807 :29 +STR_0808 :30 +STR_0809 :31 +STR_0810 :xan +STR_0811 :febr +STR_0812 :marz +STR_0813 :abr +STR_0814 :maio +STR_0815 :Xun +STR_0816 :Xul +STR_0817 :Ago +STR_0818 :set +STR_0819 :out +STR_0820 :nov +STR_0821 :Dec +STR_0822 :Non se puido acceder ao ficheiro de datos gráficos +STR_0823 :falta ou non se pode acceder ao ficheiro +STR_0824 :{BLACK}❌ +STR_0825 :Este nome xa se usa +STR_0826 :Definidos demasiados nomes +STR_0827 :Non hai cartos suficientes: é preciso {CURRENCY2DP} +STR_0828 :Pechar xanela +STR_0829 :Título da xanela - Arrastra para movela +STR_0830 :Ampliar vista +STR_0831 :Reducir a vista +STR_0832 :Xira a cámara 90° no sentido das agullas do reloxo +STR_0833 :Pausa o xogo +STR_0834 :Opcións do xogo +STR_0839 :{UINT16} × {UINT16} +STR_0840 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{UINT16} × {UINT16} +STR_0847 : Acerca de ‘OpenRCT2’ +STR_0850 :{WINDOW_COLOUR_2} © 2002 Chris Sawyer, todos os dereitos reservados +STR_0851 :{WINDOW_COLOUR_2}Deseñado e programado por Chris Sawyer +STR_0852 :{WINDOW_COLOUR_2}Gráficos de Simon Foster +STR_0853 :{WINDOW_COLOUR_2}Sons e música de Allister Brimble +STR_0854 :{WINDOW_COLOUR_2}Sons adicionais gravados por David Ellis +STR_0855 :{WINDOW_COLOUR_2}Renderizado por Jacqui Lyons en Marjacq Ltd. +STR_0856 :{WINDOW_COLOUR_2}Grazas: +STR_0857 :{WINDOW_COLOUR_2}Peter James Adcock, Joe Booth e John Wardley +STR_0865 :{STRINGID} +STR_0866 :{POP16}{STRINGID} +STR_0867 :{POP16}{POP16}{STRINGID} +STR_0868 :{POP16}{POP16}{POP16}{STRINGID} +STR_0869 :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0870 :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0872 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0873 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0874 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0875 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_0876 :{BLACK}▼ +STR_0877 :Demasiado baixo! +STR_0878 :Demasiado alto! +STR_0879 :Non se pode baixar o terreo... +STR_0880 :Non se pode elevar o terreo... +STR_0881 :Un obxecto interfire +STR_0882 :Cargar xogo +STR_0883 :Gardar partida +STR_0884 :Cargar paisaxe +STR_0885 :Gardar paisaxe +STR_0887 :Sae do editor de escenarios +STR_0888 :Saia do editor de Camiños +STR_0889 :Saír do administrador. de estradas +STR_0891 :Facer captura de pantalla +STR_0892 :Captura de pantalla gardada como "{STRINGID}" +STR_0893 :Non se puido facer a captura de pantalla! +STR_0894 :Datos de paisaxe cheos! +STR_0895 :Non podes construír unha parte enriba e outra baixo terra +STR_0896 :Construción de {POP16}{POP16}{STRINGID} +STR_0897 :Enderezo +STR_0898 :Curva á esquerda +STR_0899 :Curva á dereita +STR_0900 :Curva á esquerda (pequena) +STR_0901 :Curva á dereita (pequena) +STR_0902 :Curva á esquerda (moi pequena) +STR_0903 :Curva á dereita (moi pequena) +STR_0904 :Curva á esquerda (grande) +STR_0905 :Curva á dereita (grande) +STR_0906 :En liña recta +STR_0907 :Inclinación +STR_0908 :Rotación/Inclinamento +STR_0909 :Rotación do asento +STR_0910 :Volteo para curva á esquerda +STR_0911 :Volteo para curva á esquerda á dereita +STR_0912 :sen volteo +STR_0913 :Destaca a sección anterior +STR_0914 :Destaca a sección posterior +STR_0915 :Sección de construción +STR_0916 :Eliminar a sección resaltada +STR_0917 :Caída vertical +STR_0918 :Descenso pronunciado +STR_0919 :Costa abaixo +STR_0920 :Nivelado +STR_0921 :Costa arriba +STR_0922 :costa arriba +STR_0923 :Subida Vertical +STR_0924 :Hélice abaixo +STR_0925 :Hélice arriba +STR_0926 :Non se pode eliminar isto... +STR_0927 :Non podes construír isto aquí... +STR_0928 :Cadea de ascensor para impulsar os coches por unha pendente. +STR_0929 :curva en "S" (esquerda) +STR_0930 :curva en "S" (dereita) +STR_0931 :rizo vertical (esquerda) +STR_0932 :rizo vertical (dereita) +STR_0933 :Sube ou baixa primeiro o terreo +STR_0934 :A entrada da atracción interfire +STR_0935 :Interfire a saída da atracción +STR_0936 :A entrada do parque interfire +STR_0937 :Opcións de visualización +STR_0938 :Movementos da terra +STR_0939 :Vista subterránea +STR_0940 :Ocultar terreo base +STR_0941 :Ocultar acantilados +STR_0942 :Ver a través das atraccións +STR_0943 :Ver escenarios +STR_0944 :Gardar +STR_0945 :Non gardar +STR_0946 :Cancelar +STR_0947 :Gardar antes de cargar un novo xogo? +STR_0948 :Gardar antes de saír? +STR_0949 :Gardar antes de saír? +STR_0950 :Cargar xogo +STR_0951 :Sae do xogo +STR_0952 :Sae do xogo +STR_0953 :Cargar paisaxe +STR_0955 :Ángulo de rotación do asento nesta sección +STR_0956 :-180° +STR_0957 :-135° +STR_0958 :-90° +STR_0959 :-45° +STR_0960 :0° +STR_0961 :+45° +STR_0962 :+90° +STR_0963 :+135° +STR_0964 :+180° +STR_0965 :+225° +STR_0966 :+270° +STR_0967 :+315° +STR_0968 :+360° +STR_0969 :+405° +STR_0970 :+450° +STR_0971 :+495° +STR_0972 :Cancelar +STR_0973 :Aceptar +STR_0974 :Atraccións +STR_0975 :Tendas e postos de venda +STR_0976 :aseos e quioscos de información +STR_0977 :Nova atracción de transporte +STR_0978 :Novo paseo suave +STR_0979 :Nova montaña rusa +STR_0980 :Nova atracción intensa +STR_0981 :Nova atracción acuática +STR_0982 :Nova tenda ou posto +STR_0983 :Investigación + Desenvolvemento +STR_0984 :{WINDOW_COLOUR_2}▲{BLACK} {CURRENCY2DP} +STR_0985 :{WINDOW_COLOUR_2}▼{BLACK} {CURRENCY2DP} +STR_0986 :{BLACK}{CURRENCY2DP} +STR_0987 :Demasiadas atraccións/xogos +STR_0988 :Non se pode crear unha nova atracción +STR_0989 :{STRINGID} +STR_0990 :Construción +STR_0991 :Plataforma +STR_0992 :Demoler esta atracción por completo +STR_0993 :Demoler atracción +STR_0994 :Demoler +STR_0995 :{WINDOW_COLOUR_1}Estás seguro de demoler "{STRINGID}" por completo? +STR_0996 :Descrición xeral +STR_0997 :Ver selección +STR_0998 :Non se permiten máis estacións nesta atracción +STR_0999 :Require unha plataforma de estación +STR_1000 :A ruta non completa un circuíto +STR_1001 :ruta non apta para este tipo de tren +STR_1002 :Non se pode abrir {STRINGID}... +STR_1003 :Non se pode probar {STRINGID}... +STR_1004 :Non se pode pechar {STRINGID}... +STR_1005 :Non se pode iniciar a construción en {STRINGID}... +STR_1006 :Debe estar pechado antes +STR_1007 :Non se poden crear suficientes vehículos +STR_1008 :Abre, pecha ou proba esta atracción +STR_1009 :Abrir ou pechar todas as atraccións +STR_1010 :Abre ou pecha o parque +STR_1011 :Pechar todo +STR_1012 :Abrir todo +STR_1013 :Pechar o parque +STR_1014 :Parque aberto +STR_1015 :Non podes operar con máis dunha estación neste modo +STR_1016 :Non podes operar con menos de dúas estacións neste modo +STR_1017 :Non se pode cambiar o modo de funcionamento... +STR_1018 :Non se poden facer cambios... +STR_1019 :Non se poden facer cambios... +STR_1020 :Non se poden facer cambios... +STR_1021  :{POP16}{POP16}{POP16}{POP16}{STRINGID} +STR_1022  :{POP16}{POP16}{POP16}{COMMA16} coche por tren +STR_1023  :{POP16}{POP16}{POP16}{COMMA16} coches por tren +STR_1024  :{COMMA16} coche por tren +STR_1025  :{COMMA16} coches por tren +STR_1026 :plataforma demasiado longa! +STR_1027 :Localiza isto na Vista principal. +STR_1028 :Fóra do bordo do mapa! +STR_1029 :Non se pode construír parte dentro e fóra da auga! +STR_1030 :Só se pode construír baixo a auga! +STR_1031 :Non podes construír isto baixo a auga! +STR_1032 :Só se pode construír na auga! +STR_1033 :Só se pode construír enriba do chan! +STR_1034 :Só se pode construír no chan! +STR_1035 :As autoridades locais prohiben os edificios altos! +STR_1036 :Cargar xogo +STR_1037 :Cargar paisaxe +STR_1038 :Converte a partida gardada en escenario +STR_1039 :Instalar un novo deseño de pista +STR_1040 :Gardar partida +STR_1041 :Gardar escenario +STR_1042 :Gardar paisaxe +STR_1043 :OpenRCT2 Xogos gardados +STR_1044 :Arquivo de escenario OpenRCT2 +STR_1045 :Arquivo de paisaxe OpenRCT2 +STR_1046 :Arquivo de deseño de pistas OpenRCT2 +STR_1047 :Produciuse un erro ao gardar o xogo! +STR_1048 :Fallou o gardar o escenario! +STR_1049 :Produciuse un erro ao gardar a paisaxe! +STR_1050 :Produciuse un erro ao cargar...{NEWLINE}O ficheiro contén datos non válidos! +STR_1051 :Soportes invisibles +STR_1052 :Visitantes invisibles +STR_1053 :Atraccións no parque +STR_1054 :Nome a atracción +STR_1055 :Nome a persoa +STR_1056 :Nomear empregado +STR_1057 :Nome da atracción +STR_1058 :Introduce o nome desta atracción: +STR_1059 :Non se puido cambiar o nome da atracción... +STR_1060 :O nome da atracción non é válido +STR_1061 :Modo normal +STR_1062 :Modo de circuíto continuo +STR_1063 :Modo de inicio invertido +STR_1064 :Modo de lanzamento potenciado (estación de paso) +STR_1065 :Modo lanzadeira +STR_1066 :Modo de aluguer de barcos +STR_1067 :Lanzamento superior +STR_1068 :Modo de elevación rotativa +STR_1069 :Modo estación a estación +STR_1070 :Un paseo para a entrada +STR_1071 :traxes ilimitados por entrada +STR_1072 :Modo labirinto +STR_1073 :Modo de carreira +STR_1074 :modo coche de choque +STR_1075 :Modo de balancín +STR_1076 :Modo de posto de venda +STR_1077 :Modo de rotación +STR_1078 :Rotación cara adiante +STR_1079 :Rotación cara atrás +STR_1080 :Película: "Aviadores emocionados" +STR_1081 :Película 3D: "Colas do rato" +STR_1082 :Modo de aneis espaciais +STR_1083 :Modo principiante +STR_1084 :Lanzamento impulsado por MLI +STR_1085 :Película: "Paxeiros emocionados" +STR_1086 :Película 3D: "Storm Chasers" +STR_1087 :Película 3D: "Space Invaders" +STR_1088 :Modo intenso +STR_1089 :Modo frenético +STR_1090 :modo casa encantada +STR_1091 :Modo espectáculo de circo +STR_1092 :Lanzamento abaixo +STR_1093 :modo de casa torta +STR_1094 :Modo de caída libre +STR_1095 :Modo de circuíto continuo con seccións de bloque +STR_1096 :Lanzamento potenciado (sen estación de paso) +STR_1097 :Modo de lanzamento potenciado en seccións +STR_1098 :Movendose ao final de {POP16}{STRINGID} +STR_1099 :Esperando os pasaxeiros en {POP16}{STRINGID} +STR_1100 :Agardando para saír de {POP16}{STRINGID} +STR_1101 :Saíndo de {POP16}{STRINGID} +STR_1102 :Movéndose a {VELOCITY} +STR_1103 :Chegando a {POP16}{STRINGID} +STR_1104 :Descargando pasaxeiros en {POP16}{STRINGID} +STR_1105 :Viaxe en {VELOCITY} +STR_1106 :Choque! +STR_1107 :Accidente! +STR_1108 :Viaxe en {VELOCITY} +STR_1109 :Bandeando +STR_1110 :xirando +STR_1111 :xirando +STR_1112 :Operando +STR_1113 :Reproducindo película +STR_1114 :xirando +STR_1115 :Operando +STR_1116 :Operando +STR_1117 :Facendo un espectáculo de circo +STR_1118 :Operando +STR_1119 :Agardando polo cable de elevación +STR_1120 :Viaxe en {VELOCITY} +STR_1121 :Parando +STR_1122 :Agardando os pasaxeiros +STR_1123 :Agardando para comezar +STR_1124 :Comeza +STR_1125 :Operando +STR_1126 :Parando +STR_1127 :Descargando pasaxeiros +STR_1128 :Detido polo bloqueo de freada +STR_1129 :Todos os coches da mesma cor +STR_1130 :Diferentes cores por {STRINGID} +STR_1131 :Diferentes cores por vagón +STR_1132 :Coche {POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1133 :Coche {POP16}{COMMA16} +STR_1134  :{POP16}{POP16}{POP16}{POP16}{POP16}{STRINGID} {COMMA16} +STR_1135 :{STRINGID} {COMMA16} +STR_1136 :Seleccione a cor principal +STR_1137 :Seleccione a cor adicional 1 +STR_1138 :Seleccione a cor adicional 2 +STR_1139 :Seleccione a cor dos soportes +STR_1140 :Seleccione o esquema de cores dos carros +STR_1141 :Seleccione que vehículo/tren quere modificar +STR_1142  :{MOVE_X}{10}{STRINGID} +STR_1143 :»{MOVE_X}{10}{STRINGID} +STR_1144 :A entrada a esta atracción non se pode construír nin mover... +STR_1145 :Non podes construír/mover a saída desta atracción... +STR_1146 :Aínda non se creou unha entrada +STR_1147 :Aínda non se construíu unha saída +STR_1148 :Un cuarto de carga +STR_1149 :Media carga +STR_1150 :Carga de tres cuartos +STR_1151 :Carga completa +STR_1152 :Calquer carga +STR_1153 :marcas de altura nas atraccións +STR_1154 :marcas de altura no chan +STR_1155 :marcas de altura nos camiños +STR_1156  :{MOVE_X}{10}{STRINGID} +STR_1157 :✓{MOVE_X}{10}{STRINGID} +STR_1158 :Non se pode eliminar isto... +STR_1159 :Crea decoración, xardíns e outros accesorios +STR_1160 :Crea lagos e axusta a auga +STR_1161 :Non se pode colocar isto aquí... +STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} +STR_1163 :{STRINGID}{NEWLINE}(Prema co botón dereito para modificar) +STR_1164 :{STRINGID}{NEWLINE}(Prema co botón dereito para eliminar) +STR_1165 :{STRINGID} - {STRINGID} {COMMA16} +STR_1166 :Non se pode baixar o nivel da auga... +STR_1167 :Non se pode subir o nivel da auga... +STR_1168 :Opcións +STR_1169 :(Ningún) +STR_1170 :{STRING} +STR_1171 :{RED}Pechado +STR_1172 :{YELLOW}{STRINGID} +STR_1173 :Construír rutas +STR_1174 :O sinal de sinal interfire +STR_1175 :Non se pode construír nunha ladeira +STR_1176 :Non podes construír unha ruta aquí... +STR_1177 :Non podes eliminar este camiño de aquí... +STR_1178 :Pendente do terreo inadecuada +STR_1179 :O camiño interfire +STR_1180 :Non podes construír baixo a auga! +STR_1181 :Rutas +STR_1182 :Tipo +STR_1183 :Enderezo +STR_1184 :Inclinación +STR_1185 :Enderezo +STR_1186 :Costa abaixo +STR_1187 :Nivel do chan +STR_1188 :Costa arriba +STR_1189 :Constrúe o camiño seleccionado +STR_1190 :Eliminar a sección de ruta anterior +STR_1191 :{BLACK}{STRINGID} +STR_1192 :{OUTLINE}{RED}{STRINGID} +STR_1193  :{WINDOW_COLOUR_2}{STRINGID} +STR_1194 :pechado +STR_1195 :En proba +STR_1196 :Aberto +STR_1197 :Averiado +STR_1198 :Accidente! +STR_1199 :{COMMA16} persoa na atracción +STR_1200 :{COMMA16} persoas na atracción +STR_1201 :Ningunha persoa na cola +STR_1202 :1 persoa na cola +STR_1203 :{COMMA16} persoas na cola +STR_1204  :{COMMA16} minuto na cola +STR_1205 :{COMMA16} minutos na cola +STR_1206 :{WINDOW_COLOUR_2}Agarda por: +STR_1207 :{WINDOW_COLOUR_2}Saír se chega outro tren á estación +STR_1208 :{WINDOW_COLOUR_2}Saír se chega outro barco á estación +STR_1209 :Selecciona se queres esperar a unha determinada carga de pasaxeiros antes da saída. +STR_1210 :Selecciona se queres saír se outro vehículo chega á mesma estación. +STR_1211 :{WINDOW_COLOUR_2}Tempo de espera mínimo: +STR_1212 :{WINDOW_COLOUR_2}Tempo de espera máximo: +STR_1213 :Seleccione o tempo mínimo de espera antes de saír +STR_1214 :Seleccione o tempo máximo de espera antes de saír +STR_1215 :{WINDOW_COLOUR_2}Sincronizar coas estacións adxacentes +STR_1216 :Seleccione se desexa sincronizar esta estación con outras estacións adxacentes a esta. +STR_1217  :{COMMA16} segundos +STR_1218 :{BLACK}+ +STR_1219 :{BLACK}- +STR_1220 :Só saída +STR_1221 :Non hai entrada +STR_1222 :Sen saída +STR_1223 :Atraccións de transporte +STR_1224 :Atraccións suaves +STR_1225 :Montañas rusas +STR_1226 :Atraccións intensas +STR_1227 :Atraccións acuáticas +STR_1228 :Tendas e postos de venda +STR_1229 :tren +STR_1230 :trens +STR_1231 :Tren +STR_1232 :Trens +STR_1233 :{COMMA16} tren +STR_1234  :{COMMA16} trens +STR_1235 :Tren {COMMA16} +STR_1236 :barco +STR_1237 :barcos +STR_1238 :Barco +STR_1239 :Barcos +STR_1240 :{COMMA16} bote +STR_1241 :{COMMA16} barcos +STR_1242 :Barco {COMMA16} +STR_1243 :ruta +STR_1244 :camiños +STR_1245 :Vía +STR_1246 :Pistas +STR_1247 :{COMMA16} vía +STR_1248 :{COMMA16} formas +STR_1249 :Vía {COMMA16} +STR_1250 :plataforma de acoplamento +STR_1251 :plataformas de acoplamento +STR_1252 :Plataforma de acoplamento +STR_1253 :Plataformas de atraque +STR_1254 :{COMMA16} plataforma de acoplamento +STR_1255 :{COMMA16} plataformas de acoplamento +STR_1256 :Plataforma de acoplamento {COMMA16} +STR_1257 :a estación +STR_1258 :estacións +STR_1259 :Estación +STR_1260 :Tempadas +STR_1261 :{COMMA16} estación +STR_1262  :{COMMA16} estacións +STR_1263 :Estación {COMMA16} +STR_1264 :coche +STR_1265 :coches +STR_1266 :coche +STR_1267 :Coches +STR_1268 :{COMMA16} coche +STR_1269  :{COMMA16} coches +STR_1270 :Coche {COMMA16} +STR_1271 :edificio +STR_1272 :edificios +STR_1273 :Edificio +STR_1274 :Edificios +STR_1275 :{COMMA16} edificio +STR_1276 :{COMMA16} edificios +STR_1277 :Edificio {COMMA16} +STR_1278 :estructura +STR_1279 :estruturas +STR_1280 :Estrutura +STR_1281 :Estruturas +STR_1282 :{COMMA16} estrutura +STR_1283 :{COMMA16} estruturas +STR_1284 :Estrutura {COMMA16} +STR_1285 :barco +STR_1286 :barcos +STR_1287 :Barco +STR_1288 :Barcos +STR_1289 :{COMMA16} barco +STR_1290  :{COMMA16} envíos +STR_1291 :Barco {COMMA16} +STR_1292 :cabina +STR_1293 :camarotes +STR_1294 ​​​​:Cabana +STR_1295 :Cabanas +STR_1296 :{COMMA16} cabina +STR_1297 :{COMMA16} camarotes +STR_1298 :Cabana {COMMA16} +STR_1299 :roda +STR_1300 :rodas +STR_1301 :Roda +STR_1302 :Rodas +STR_1303 :{COMMA16} roda +STR_1304 :{COMMA16} rodas +STR_1305 :Roda {COMMA16} +STR_1306 :ton +STR_1307 :tons +STR_1308 :Ton +STR_1309 :Tons +STR_1310 :{COMMA16} ton +STR_1311  :{COMMA16} tons +STR_1312 :Ton {COMMA16} +STR_1313 :xogador +STR_1314 :xogadores +STR_1315 :Xogador +STR_1316 :Xogadores +STR_1317 :{COMMA16} xogador +STR_1318  :{COMMA16} xogadores +STR_1319 :Xogador {COMMA16} +STR_1320 :curso +STR_1321 :cursos +STR_1322 :Curso +STR_1323 :Cursos +STR_1324 :{COMMA16} curso +STR_1325 :{COMMA16} cursos +STR_1326 :Curso {COMMA16} +STR_1327 : Xira os obxectos 90° +STR_1328 :Requírese un terreo plano +STR_1329 :{WINDOW_COLOUR_2}Velocidade de lanzamento: +STR_1330 :Velocidade máxima ao saír da estación +STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_1332 :{VELOCITY} +STR_1333 :{STRINGID} - {STRINGID}{POP16} +STR_1334 :{STRINGID} - {STRINGID} {COMMA16} +STR_1335 :{STRINGID} - Entrada{POP16}{POP16} +STR_1336 :{STRINGID} - Entrada da estación {POP16}{COMMA16} +STR_1337 :{STRINGID} - Saída{POP16}{POP16} +STR_1338 :{STRINGID} - Saída da estación {POP16}{COMMA16} +STR_1339 :{BLACK}Aínda non hai resultados da proba... +STR_1340 :{WINDOW_COLOUR_2}Velocidade máxima: {BLACK}{VELOCITY} +STR_1341 :{WINDOW_COLOUR_2}Tempo da viaxe: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1342  :{DURATION} +STR_1343 :{DURATION} / +STR_1344 :{WINDOW_COLOUR_2}Lonxitude da viaxe: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1345  :{LENGTH} +STR_1346 :{LENGTH} / +STR_1347 :{WINDOW_COLOUR_2}Velocidade media: {BLACK}{VELOCITY} +STR_1348 :{WINDOW_COLOUR_2}Aceleración máx vertical positiva: {BLACK}{COMMA2DP32}g +STR_1349 :{WINDOW_COLOUR_2}Aceleración máx vertical positiva: {OUTLINE}{RED}{COMMA2DP32}g +STR_1350 :{WINDOW_COLOUR_2}Aceleración máx vertical negativo: {NEGRO}{COMMA2DP32}g +STR_1351 :{WINDOW_COLOUR_2}Aceleración máx vertical negativa: {OUTLINE}{RED}{COMMA2DP32}g +STR_1352 :{WINDOW_COLOUR_2}Aceleración máx lado: {BLACK}{COMMA2DP32}g +STR_1353 :{WINDOW_COLOUR_2}Aceleración máx lado: {OUTLINE}{VERMELLO}{COMMA2DP32}g +STR_1354 :{WINDOW_COLOUR_2}Altura da maior caída: {BLACK}{LENGTH} +STR_1355 :{WINDOW_COLOUR_2}Caídas: {BLACK}{COMMA16} +STR_1356 :{WINDOW_COLOUR_2}Inversións: {BLACK}{COMMA16} +STR_1357 :{WINDOW_COLOUR_2}Buratos: {BLACK}{COMMA16} +STR_1358 :{WINDOW_COLOUR_2}Tempo de "voo" total: {BLACK}{COMMA2DP32}s +STR_1359 :{WINDOW_COLOUR_2}Tempo de espera: {BLACK}{COMMA16} minuto +STR_1360 :{WINDOW_COLOUR_2}Tempo de espera: {BLACK}{COMMA16} minutos +STR_1361 :Non podes cambiar a velocidade... +STR_1362 :Non podes cambiar a velocidade de lanzamento... +STR_1363 :Demasiado alto para soportes! +STR_1364 :Os soportes da sección anterior non se poden ampliar máis! +STR_1365 :xiro en liña (esquerda) +STR_1366 :xiro en liña (dereita) +STR_1367 :rizo medio pequeno +STR_1368 :Medio sacarollas (esquerda) +STR_1369 :Medio sacarollas (dereita) +STR_1370 :Barril (esquerda) +STR_1371 :Barril (dereita) +STR_1372 :Subida motorizada +STR_1373 :rizo medio grande (esquerda) +STR_1374 :rizo medio grande (dereita) +STR_1375 :Transferencia superior +STR_1376 :Baixa transferencia +STR_1377 :Rotación media alt. (dereita) +STR_1378 :Rotación media alt. (esquerda) +STR_1379 :Inversor (esquerda) +STR_1380 :Inversor (dereita) +STR_1381 :subida en curva (esquerda) +STR_1382 :subida en curva (dereita) +STR_1383 :Cuarto de bucle +STR_1384 :{YELLOW}{STRINGID} +STR_1385 :Outro tipo de seccións +STR_1386 :Sección especial... +STR_1387 :Non se pode cambiar o tipo de terreo... +STR_1388 :{OUTLINE}{GREEN}+ {CURRENCY} +STR_1389 :{OUTLINE}{RED}- {CURRENCY} +STR_1390  :{CURRENCY2DP} +STR_1391 :{RED}{CURRENCY2DP} +STR_1392 :Vista da atracción +STR_1393 :Opcións do vehículo +STR_1394 :Opcións de operación +STR_1395 :Opcións de mantemento +STR_1396 :Opcións de esquema de cores +STR_1397 :Opcións de música e sons +STR_1398 :datos de proba e medición +STR_1399 :Gráficos +STR_1400 :Entrada +STR_1401 :Saída +STR_1402 :Construír ou mover a entrada da atracción/xogo +STR_1403 :Construír ou mover a atracción/saída do xogo +STR_1404 :Xirar 90° +STR_1405 :Xirar no espello +STR_1406 :Mostrar ou ocultar a decoración (se está dispoñible) +STR_1407 :{WINDOW_COLOUR_2}Constrúe isto... +STR_1408 :{WINDOW_COLOUR_2}Prezo: {BLACK}{CURRENCY} +STR_1409 :Estación +STR_1410 :Sección vertical +STR_1411 :{STRINGID} no medio +STR_1412 :{WINDOW_COLOUR_3}Non están dispoñibles as estatísticas para este tipo de atracción +STR_1413 :{WINDOW_COLOUR_3}As estatísticas comezarán a gravarse cando {STRINGID} saia de {STRINGID} +STR_1414  :{BLACK}{DURATION} +STR_1415 :{WINDOW_COLOUR_2}Velocidade +STR_1416 :{WINDOW_COLOUR_2}Altitude +STR_1417 :{WINDOW_COLOUR_2}Forzas G Vert. +STR_1418 :{WINDOW_COLOUR_2}Forzas G lat. +STR_1419  :{BLACK}{VELOCITY} +STR_1420  :{BLACK}{LENGTH} +STR_1421 :{BLACK}{COMMA16}g +STR_1422 :Gardando datos de {POP16}{STRINGID} +STR_1423 :cola de espera +STR_1424 :Ruta +STR_1425 :Ruta +STR_1426 :liña de espera +STR_1427 :{WINDOW_COLOUR_2}Clientes: {BLACK}{COMMA32} por hora +STR_1428 :{WINDOW_COLOUR_2}Prezo de entrada: +STR_1429  :{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1430 :Gratis +STR_1431 :Camiñando +STR_1432 :enderezo {STRINGID} +STR_1433 :Agardando en {STRINGID} +STR_1434 :Afogando +STR_1435 :En {STRINGID} +STR_1436 :En {STRINGID} +STR_1437 :En {STRINGID} +STR_1438 :Sentado +STR_1439 :(seleccionar unha nova localización) +STR_1440 :Cortar a herba +STR_1441 :Camiño amplo +STR_1442 :Baleirando o lixo +STR_1443 :Regando os xardíns +STR_1444 :Mirando a {STRINGID} +STR_1445 :Vendo a construción de {STRINGID} +STR_1446 :Observando a decoración +STR_1447 :Saíndo do parque +STR_1448 :Ollando a construción da nova atracción +STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) +STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) +STR_1452 :Nomear visitante +STR_1453 :Introduza o nome deste visitante: +STR_1454 :Non se pode cambiar o nome do visitante... +STR_1455 :Nome non válido para o visitante +STR_1456 :{WINDOW_COLOUR_2}Diñeiro gastado: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Diñeiro no peto: {BLACK}{CURRENCY2DP} +STR_1458 :{WINDOW_COLOUR_2}Hora do estacionamento: {BLACK}{REALTIME} +STR_1459 :Estilo de pista +STR_1460 :pista en forma de "U". +STR_1461 :Pista en forma de "O". +STR_1462 :Demasiado inclinado para a subida +STR_1463 :Visitantes +STR_1464 :Hélice ascendente (pequena) +STR_1465 :Hélice arriba (grande) +STR_1466 :Hélice abaixo (pequena) +STR_1467 :Hélice abaixo (grande) +STR_1468 :Empleados +STR_1469 :A atracción debe comezar e rematar coas estacións. +STR_1470 :A estación non é suficientemente longa. +STR_1471 :{WINDOW_COLOUR_2}Velocidade: +STR_1472 :Velocidade desta atracción +STR_1473 :{WINDOW_COLOUR_2}Nivel de emoción: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Nivel de emoción: {BLACK}Aínda non está dispoñible +STR_1475 :{WINDOW_COLOUR_2}Nivel de intensidade: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Nivel de intensidade: {BLACK}Aínda non dispoñible +STR_1477 :{WINDOW_COLOUR_2}Nivel de intensidade: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Nivel de náuseas: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Nivel de náuseas: {BLACK}Aínda non está dispoñible +STR_1480 :“Non podo pagar por {STRINGID}” +STR_1481 :"Gastei todo o meu diñeiro" +STR_1482 :"Síntome mareado" +STR_1483 :"Síntome moi mareado" +STR_1484 :"Quero probar algo máis arriscado que {STRINGID}" +STR_1485 :“{STRINGID} paréceme demasiado intenso” +STR_1486 :"Aínda non rematei o meu {STRINGID}" +STR_1487 :"Só mirar a {STRINGID} dáme mareo" +STR_1488 :"Non vou pagar tanto por entrar en {STRINGID}" +STR_1489 :"Quero ir a casa" +STR_1490 :“{STRINGID} é barato” +STR_1491 :"Xa teño {STRINGID}" +STR_1492 :"Non podo pagar por {STRINGID}" +STR_1493 :"Non teño fame" +STR_1494 :"Non teño sede" +STR_1495 :"Axuda! Estou afogando!" +STR_1496 :"Estou perdido!" +STR_1497 :“{STRINGID} foi xenial” +STR_1498 :"Eu esperei para sempre en {STRINGID}" +STR_1499 :"Estou canso" +STR_1500 :"Teño fame" +STR_1501 :"Teño sede" +STR_1502 :"Teño que ir ao baño" +STR_1503 :"Non podo atopar {STRINGID}" +STR_1504 :"Non vou pagar tanto por {STRINGID}" +STR_1505 :"Non vou subir a {STRINGID} mentres chove" +STR_1506 :"As papeleiras aquí destacan pola súa ausencia" +STR_1507 :"Non podo atopar a saída" +STR_1508 :"Quero baixar de {STRINGID}" +STR_1509 :"Quero saír de {STRINGID}" +STR_1510 :"Non vou cargar {STRINGID}, non é seguro" +STR_1511 :"Este camiño é noxento" +STR_1512 :"Hai demasiada xente aquí" +STR_1513 :"O vandalismo é terrible" +STR_1514 :"A paisaxe é fermosa!" +STR_1515 :"Este parque está moi limpo e ordenado" +STR_1516 :"As fontes de salto son xeniais" +STR_1517 :"A música é agradable" +STR_1518 :"Este globo {STRINGID} é barato" +STR_1519 :"Este xoguete {STRINGID} é barato" +STR_1520 :“Este mapa de {STRINGID} é barato” +STR_1521 :"Esta foto de {STRINGID} é barata" +STR_1522 :"Este paraugas {STRINGID} é barato" +STR_1523 :"Esta bebida {STRINGID} é barata" +STR_1524 :"Esta hamburguesa {STRINGID} é barata" +STR_1525 :"Estas patacas fritas de {STRINGID} son baratas" +STR_1526 :"Este xeado de {STRINGID} é barato" +STR_1527 :"Este algodón de {STRINGID} é barato" +STR_1528 : +STR_1529 : +STR_1530 : +STR_1531 :"Esta pizza de {STRINGID} é barata" +STR_1532: +STR_1533 :"Esta palomita de {STRINGID} é barata" +STR_1534 :"Este cachorro {STRINGID} é barato" +STR_1535 :"Este tentáculo {STRINGID} é barato" +STR_1536 :"Este sombreiro {STRINGID} é barato" +STR_1537 :"Este {STRINGID} Apple é barato" +STR_1538 :"Esta camiseta de {STRINGID} é barata" +STR_1539 :"Esta rosquilla {STRINGID} é barato" +STR_1540 :"Este café de {STRINGID} é barato" +STR_1541 : +STR_1542 :"Este polo frito de {STRINGID} é barato" +STR_1543 :"Esta limoada de {STRINGID} é barata" +STR_1544 : +STR_1545 : +STR_1546 : +STR_1547 : +STR_1548 : +STR_1549 : +STR_1550 :"Uau!" +STR_1551 :"Teño a estraña sensación de que alguén me está observando" +STR_1552 :"Non vou pagar tanto polo globo {STRINGID}" +STR_1553 :"Non vou pagar tanto polo xoguete de {STRINGID}" +STR_1554 :"Non vou pagar tanto polo mapa {STRINGID}" +STR_1555 :"Non vou pagar tanto pola foto de {STRINGID}" +STR_1556 :"Non vou pagar tanto polo paraugas de {STRINGID}" +STR_1557 :"Non vou pagar tanto pola bebida de {STRINGID}" +STR_1558 :"Non vou pagar tanto pola hamburguesa de {STRINGID}" +STR_1559 :"Non vou pagar tanto por {STRINGID} patacas fritas" +STR_1560 :"Non vou pagar tanto polo xeado de {STRINGID}" +STR_1561 :"Non vou pagar tanto polo algodón {STRINGID}" +STR_1562 : +STR_1563 : +STR_1564 : +STR_1565 :"Non vou pagar tanto pola pizza de {STRINGID}" +STR_1566 : +STR_1567 :"Non vou pagar tanto polas palomitas de millo de {STRINGID}" +STR_1568 :"Non vou pagar tanto polo hot dog de {STRINGID}" +STR_1569 :"Non vou pagar tanto polo tentáculo de {STRINGID}" +STR_1570 :"Non vou pagar tanto polo sombreiro de {STRINGID}" +STR_1571 :"Non vou pagar tanto por unha mazá de caramelo de {STRINGID}" +STR_1572 :"Non vou pagar tanto pola camiseta de {STRINGID}" +STR_1573 :"Non vou pagar tanto pola rosquilla de {STRINGID}" +STR_1574 :"Non vou pagar tanto polo café de {STRINGID}" +STR_1575 : +STR_1576 :"Non vou pagar tanto polo polo frito de {STRINGID}" +STR_1577 :"Non vou pagar tanto pola limoada de {STRINGID}" +STR_1578 : +STR_1579 : +STR_1580 : +STR_1581 : +STR_1582 : +STR_1583 : +STR_1584 :"Esta foto de {STRINGID} é barata" +STR_1585 :"Esta foto de {STRINGID} é barata" +STR_1586 :"Esta foto de {STRINGID} é barata" +STR_1587 :"Esta galleta salgada {STRINGID} é barata" +STR_1588 :"Este chocolate quente de {STRINGID} é barato" +STR_1589 :"Este té {STRINGID} é barato" +STR_1590 :"Este bolo de funil de {STRINGID} é barato" +STR_1591 :"Estes lentes {STRINGID} son baratos" +STR_1592 :"Estes fideos de tenreira de {STRINGID} son baratos" +STR_1593 :"Este arroz frito de {STRINGID} é barato" +STR_1594 :"Esta sopa wonton de {STRINGID} é barata" +STR_1595 :"Esta sopa de albóndegas de {STRINGID} é barata" +STR_1596 :"Este zume {STRINGID} é barato" +STR_1597 :"Este leite de soia de {STRINGID} é barato" +STR_1598 :"Este Sujeonggwa de {STRINGID} é barato" +STR_1599 :"Este sándwich de {STRINGID} é barato" +STR_1600 :"Esta galleta de {STRINGID} é barata" +STR_1601 : +STR_1602 : +STR_1603 : +STR_1604 :"Esta salchicha asada de {STRINGID} é barata" +STR_1605 : +STR_1606 : +STR_1607 : +STR_1608 : +STR_1609 : +STR_1610 : +STR_1611 : +STR_1612 : +STR_1613 : +STR_1614 : +STR_1615 : +STR_1616 :"Non vou pagar tanto pola foto de {STRINGID}" +STR_1617 :"Non vou pagar tanto pola foto de {STRINGID}" +STR_1618 :"Non vou pagar tanto pola foto de {STRINGID}" +STR_1619 :"Non vou pagar tanto pola galleta salgada de {STRINGID}" +STR_1620 :"Non vou pagar tanto polo chocolate quente de {STRINGID}" +STR_1621 :"Non vou pagar tanto polo té de {STRINGID}" +STR_1622 :"Non vou pagar tanto polo bolo de funil de {STRINGID}" +STR_1623 :"Non vou pagar tanto polos {STRINGID} lentes" +STR_1624 :"Non vou pagar tanto polos fideos de {STRINGID}" +STR_1625 :"Non vou pagar tanto polo arroz frito de {STRINGID}" +STR_1626 :"Non vou pagar tanto pola sopa wonton de {STRINGID}" +STR_1627 :"Non vou pagar tanto pola sopa de albóndegas de {STRINGID}" +STR_1628 :"Non vou pagar tanto por zumes de froitas de {STRINGID}" +STR_1629 :"Non vou pagar tanto por {STRINGID} leite de soia" +STR_1630 :"Non vou pagar tanto polo Sujeonggwa de {STRINGID}" +STR_1631 :"Non vou pagar tanto polo bocadillo de {STRINGID}" +STR_1632 :"Non vou pagar tanto pola galleta de {STRINGID}" +STR_1633 : +STR_1634 : +STR_1635 : +STR_1636 :"Non vou pagar tanto pola salchicha asada de {STRINGID}" +STR_1637 : +STR_1638 : +STR_1639 : +STR_1640 : +STR_1641 : +STR_1642 : +STR_1643 : +STR_1644 : +STR_1645 : +STR_1646 : +STR_1647 : +STR_1648 :"Axuda! "Báixame!" +STR_1649 :"Estou sen cartos!" +STR_1650 :"Uau! Están construíndo unha nova atracción!" +STR_1653 :"...E aquí estamos en {STRINGID}!" +STR_1654 :{WINDOW_COLOUR_2}Pensamentos recentes: +STR_1655 :Constrúe unha pista a nivel do chan. +STR_1656 :Construír ponte ou túnel. +STR_1657 :{WINDOW_COLOUR_2}Atracción favorita: +STR_1658 :{WINDOW_COLOUR_2}Intensidade: {BLACK}menos que {COMMA16} +STR_1659 :{WINDOW_COLOUR_2}Intensidade: {BLACK}entre {COMMA16} e {COMMA16} +STR_1660 :{WINDOW_COLOUR_2}Intensidade: {BLACK}máis de {COMMA16} +STR_1661 :{WINDOW_COLOUR_2}Tolerancia ás náuseas: {BLACK}{STRINGID} +STR_1662 :{WINDOW_COLOUR_2}Felicidade: +STR_1663 :{WINDOW_COLOUR_2}Náuseas: +STR_1664 :{WINDOW_COLOUR_2}Potencia: +STR_1665 :{WINDOW_COLOUR_2}Fame: +STR_1666 :{WINDOW_COLOUR_2}Sede: +STR_1667 :{WINDOW_COLOUR_2}Vexiga: +STR_1668 :{WINDOW_COLOUR_2}Satisfacción {BLACK}Descoñecido +STR_1669 :{WINDOW_COLOUR_2}Satisfacción: {BLACK}{COMMA16}% +STR_1670 :{WINDOW_COLOUR_2}Clientes totais: {BLACK}{COMMA32} +STR_1671 :{WINDOW_COLOUR_2}Beneficio total: {BLACK}{CURRENCY2DP} +STR_1672 :Freos +STR_1673 :Peza para activar a rotación +STR_1674 :Velocidade do freo +STR_1675  :{POP16}{VELOCITY} +STR_1676 :Establece o límite de velocidade para os freos +STR_1677 :{WINDOW_COLOUR_2}Popularidade: {BLACK}Descoñecido +STR_1678 :{WINDOW_COLOUR_2}Popularidade: {BLACK}{COMMA16}% +STR_1679 :Hélice arriba (esquerda) +STR_1680 :Hélice arriba (dereita) +STR_1681 :Hélice abaixo (esquerda) +STR_1682 :Hélice abaixo (dereita) +STR_1683 :Tamaño base 2 × 2 +STR_1684 :Tamaño base 4×4 +STR_1685 :Tamaño base 2 × 4 +STR_1686 :Tamaño base 5 × 1 +STR_1687 :Salpicaduras de auga +STR_1688 :Tamaño base 4 × 1 +STR_1689 :Bloque de freado +STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} +STR_1691 :{WINDOW_COLOUR_2} Prezo: {BLACK}{CURRENCY} +STR_1692 :{WINDOW_COLOUR_2} Prezo: {BLACK}desde {CURRENCY} +STR_1693 :Visitantes +STR_1694 :Empleados +STR_1695 :Ingresos e custos +STR_1696 :Información do cliente +STR_1697 :Non se pode poñer na cola +STR_1698 :Só se pode colocar na cola de espera +STR_1699 :Moita xente no xogo. +STR_1700 :Contratar un novo obreiro +STR_1701 :Contrata un novo mecánico +STR_1702 :Contratar un novo garda +STR_1703 :Contratar un novo animador +STR_1704 :Non podes contratar novos empregados... +STR_1705 :Empleado de bombeiros +STR_1706 :Mover esta persoa a outra posición +STR_1707 :Moitos empregados no parque. +STR_1708 :Establecer zona de patrulla para este empregado +STR_1709 :Empleado de bombeiros +STR_1710 :Si +STR_1711 :{WINDOW_COLOUR_1}Estás seguro de disparar a {STRINGID}? +STR_1712  :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Limpar camiños +STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Plantas de rego +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Lixos baleiros +STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Cortar a herba +STR_1716 :Nome do parque non válido +STR_1717 :O parque non se pode renomear... +STR_1718 :Nome do Parque +STR_1719 :Introduce o novo nome do parque: +STR_1720 :Nome do Parque +STR_1721 :Parque pechado +STR_1722 :Parque aberto +STR_1723 :Non podes abrir o parque... +STR_1724 :Non podes pechar o parque... +STR_1725 :Non podes mercar terreos... +STR_1726 :Terreo non á venda! +STR_1727 :Os dereitos de construción non están á venda! +STR_1728 :Non podes comprar aquí os dereitos de construción... +STR_1729 :O terreo non é propiedade do parque! +STR_1730 :{RED}Pechado +STR_1731 :{WHITE}{STRINGID} - - +STR_1732 :Construír +STR_1733 :Modo +STR_1734 :{WINDOW_COLOUR_2}Número de voltas: +STR_1735 :Número de voltas do circuíto +STR_1736 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1738 :Non podes cambiar o número de voltas... +STR_1739 :Carreira gañada polo visitante {INT32} +STR_1740 :Carreira gañada por {STRINGID} +STR_1741 :Aínda non se construíu! +STR_1742 :{WINDOW_COLOUR_2}Máximo de persoas na atracción: +STR_1743 :Número máximo de persoas permitidos nesta atracción ao mesmo tempo +STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1746 :Non podes cambiar isto... +STR_1747 :{WINDOW_COLOUR_2}Límite de tempo: +STR_1748 :límite de tempo da atracción +STR_1749 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{DURATION} +STR_1751 :Non podes cambiar o límite de tempo para esta atracción... +STR_1752 :Mostrar a lista de visitantes no parque +STR_1753 :Mostrar a lista agrupada de visitantes do parque +STR_1754 :{BLACK}{COMMA32} visitantes +STR_1755 :{BLACK}{COMMA32} visitante +STR_1756 :{WINDOW_COLOUR_2}Prezo de entrada: +STR_1757 :{WINDOW_COLOUR_2}Fiabilidade: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1758 :Modo de construción +STR_1759 :Modo de movemento +STR_1760 :Modo de recheo +STR_1761 :Constrúe un labirinto nesta dirección +STR_1762 :Fervenzas +STR_1763 :Rápidos +STR_1764 :rexistro de accesos +STR_1765 :Cámara +STR_1766 :Tocadiscos inverso +STR_1767 :Túnel xiratorio +STR_1768 :Non podes cambiar o número de balanceos... +STR_1769 :{WINDOW_COLOUR_2}Número de balanceos: +STR_1770 :Número de balanceos completos +STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +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} +STR_1793 :Indo a inspeccionar {STRINGID} +STR_1794 :Correxindo {STRINGID} +STR_1795 :Respondendo a chamada +STR_1796 :Avaría e require reparación +STR_1798 :Remuíño +STR_1799  :{POP16}{POP16}{POP16}{POP16}{POP16}{CURRENCY2DP} +STR_1800 :Parada de seguridade +STR_1801 :Retencións atascadas pechadas +STR_1802 :As retencións quedaron abertas +STR_1803 :Portas pechadas +STR_1804 :Portas abertas +STR_1805 :Avaría do vehículo +STR_1806 :Fallo do freo +STR_1807 :Fallo de control +STR_1808 :{WINDOW_COLOUR_2}Último fallo: {BLACK}{STRINGID} +STR_1809 :{WINDOW_COLOUR_2}Fallo actual: {OUTLINE}{RED}{STRINGID} +STR_1810  :{WINDOW_COLOUR_2}Leva: +STR_1811 :Non podes construír isto aquí... +STR_1812 :{BLACK}{STRINGID} +STR_1813 :Obxectos varios +STR_1814 :Accións +STR_1815 :Pensamentos +STR_1816 :Seleccione o tipo de información para mostrar na lista de visitantes +STR_1817 :({COMMA32}) +STR_1818 :{WINDOW_COLOUR_2}Todos os visitantes +STR_1819 :{WINDOW_COLOUR_2}Todos os visitantes (agrupados) +STR_1820  :{WINDOW_COLOUR_2}Visitantes {STRINGID} +STR_1821 :{WINDOW_COLOUR_2}Visitantes pensando {SMALLFONT}{STRINGID} +STR_1822 :{WINDOW_COLOUR_2}Visitantes pensando en {POP16}{STRINGID} +STR_1823 :Mostra os pensamentos dos visitantes sobre esta atracción +STR_1824 :Mostra aos visitantes desta atracción +STR_1825 :Mostra os visitantes que esperan para subir a esta atracción +STR_1826 :Estado +STR_1827 :Popularidade +STR_1828 :Satisfacción +STR_1829 :Beneficio +STR_1830 :Tamaño da cola +STR_1831 :Hora da cola +STR_1832 :Fiabilidade +STR_1833 :fallo de tempo +STR_1834 :Favorito de +STR_1835 :Popularidade: descoñecido +STR_1836 :Popularidade: {COMMA16}% +STR_1837 :Satisfacción: descoñecido +STR_1838 :Satisfacción: {COMMA16}% +STR_1839 :Fiabilidade: {COMMA16}% +STR_1840 :Fallo de tempo: {COMMA16}% +STR_1841 :Beneficio: {CURRENCY2DP} por hora +STR_1842 :Favorito de: {COMMA32} visitante +STR_1843 :Favorito de: {COMMA32} visitantes +STR_1844 :Seleccione o tipo de información para mostrar na lista +STR_1845  :{MONTHYEAR} +STR_1846  :{COMMA32} visitantes +STR_1847  :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA32} visitantes +STR_1848  :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA32} visitantes +STR_1849 :{WINDOW_COLOUR_2}Reproducir música +STR_1850 :Activa a música para esta atracción. +STR_1851 :{WINDOW_COLOUR_2}Custo operativo: {BLACK}{CURRENCY2DP} por hora +STR_1852 :{WINDOW_COLOUR_2}Custo de funcionamento: {BLACK}Descoñecido +STR_1853 :{WINDOW_COLOUR_2}Construción: {BLACK}Este ano +STR_1854 :{WINDOW_COLOUR_2}Construción: {BLACK}O ano pasado +STR_1855 :{WINDOW_COLOUR_2}Construción: {BLACK}{COMMA16} anos +STR_1856 :{WINDOW_COLOUR_2}Beneficio por artigo: {BLACK}{CURRENCY2DP} +STR_1857 :{WINDOW_COLOUR_2}Perdas por artigo: {BLACK}{CURRENCY2DP} +STR_1858 :{WINDOW_COLOUR_2}Custo: {BLACK}{CURRENCY} ao mes +STR_1859 :manitas +STR_1860 :mecánico +STR_1861 :gardas de seguridade +STR_1862 :animadores +STR_1863 :práctico +STR_1864 :mecánico +STR_1865 :garda de seguridade +STR_1866 :animador +STR_1867 :{BLACK}{COMMA32} {STRINGID} +STR_1868 :Non podes cambiar o número de voltas... +STR_1869 :{WINDOW_COLOUR_2}Número de voltas: +STR_1870 :Número de voltas completas +STR_1871 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1873 :{WINDOW_COLOUR_2}Ingresos: {BLACK}{CURRENCY2DP} por hora +STR_1874 :{WINDOW_COLOUR_2}Beneficio: {BLACK}{CURRENCY2DP} por hora +STR_1875 :{BLACK} {SPRITE}{BLACK} {STRINGID} +STR_1876 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{251}{19}{00}{00}Inspeccionar as atraccións +STR_1877 :{WINDOW_COLOUR_2}{INLINE_SPRITE}{252}{19}{00}{00}Reparar atraccións +STR_1878 :{WINDOW_COLOUR_2}Inspección: +STR_1879 :Cada 10 minutos +STR_1880 :Cada 20 minutos +STR_1881 :Cada 30 minutos +STR_1882 :Cada 45 minutos +STR_1883 :Cada hora +STR_1884 :Cada 2 horas +STR_1885 :Xamais +STR_1886 :Inspeccionando {STRINGID} +STR_1887 :{WINDOW_COLOUR_2}Tempo desde a última inspección: {BLACK}{COMMA16} minutos +STR_1888 :{WINDOW_COLOUR_2}Tempo desde a última inspección: {BLACK}máis de 4 horas +STR_1889 :{WINDOW_COLOUR_2}Tempo de espera: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1890 :Selecciona a frecuencia con que un mecánico debe inspeccionar esta atracción +STR_1891 :Aínda non hai {STRINGID} no parque! +STR_1894 :{WINDOW_COLOUR_2}{STRINGID} vendido: {BLACK}{COMMA32} +STR_1895 :Construír unha nova atracción +STR_1896 :{WINDOW_COLOUR_2}Gastos/Ingresos +STR_1897 :{WINDOW_COLOUR_2}Construción da atracción. +STR_1898 :{WINDOW_COLOUR_2}Operación de acoplamento +STR_1899 :{WINDOW_COLOUR_2}Compra de terreos +STR_1900 :{WINDOW_COLOUR_2}Decorado +STR_1901 :{WINDOW_COLOUR_2}Entradas ao parque +STR_1902 :{WINDOW_COLOUR_2}Entradas para atraccións +STR_1903 :{WINDOW_COLOUR_2}Vendas na tenda +STR_1904 :{WINDOW_COLOUR_2}Gastos de almacenamento +STR_1905 :{WINDOW_COLOUR_2}Venda de alimentos/bebidas +STR_1906 :{WINDOW_COLOUR_2}Gastos de comida/bebida +STR_1907 :{WINDOW_COLOUR_2}Salarios do persoal +STR_1908 :{WINDOW_COLOUR_2}Márketing +STR_1909 :{WINDOW_COLOUR_2}Investigación +STR_1910 :{WINDOW_COLOUR_2}Interese de crédito +STR_1911  :{BLACK} a {COMMA16} % ao ano +STR_1912  :{MES} +STR_1913  :{BLACK}+{CURRENCY2DP} +STR_1914  :{BLACK}{CURRENCY2DP} +STR_1915  :{RED}{CURRENCY2DP} +STR_1916 :{WINDOW_COLOUR_2}Préstamo: +STR_1917  :{POP16}{POP16}{POP16}{CURRENCY} +STR_1918 :Non podes pedir máis cartos! +STR_1919 :Non tes diñeiro suficiente! +STR_1920 :Non podes devolver o préstamo! +STR_1921 :Comezar un novo xogo +STR_1922 :Continuar partida gardada +STR_1924 :Sae do xogo +STR_1925 :Non podes colocar a esta persoa aquí... +STR_1927 :{YELLOW}{STRINGID} rompeuse +STR_1928 :{RED}{STRINGID} fallou! +STR_1929 :{RED}{STRINGID} non arranxado{NEWLINE}Comproba onde están os teus mecánicos e considera organizalos mellor +STR_1930 :Activar/Desactivar o seguimento deste visitante (Co seguimento activado, os movementos deste visitante aparecerán na área de mensaxes) +STR_1931  :{STRINGID} está facendo cola en {STRINGID} +STR_1932  :{STRINGID} está en {STRINGID} +STR_1933  :{STRINGID} está en {STRINGID} +STR_1934  :{STRINGID} saíu de {STRINGID} +STR_1935 :{STRINGID} saíu do parque +STR_1936  :{STRINGID} comprou {STRINGID} +STR_1937 :Mostra información sobre o asunto desta mensaxe +STR_1938 :Mostrar a vista do visitante +STR_1939 :Mostrar a vista do empregado +STR_1940 :Mostra felicidade, enerxía, fame, etc. deste visitante +STR_1941 :Mostra en que atraccións visitou este visitante +STR_1942 :Mostrar información financeira sobre este visitante +STR_1943 :Mostra os pensamentos recentes deste visitante +STR_1944 :Mostra os obxectos que leva este visitante +STR_1945 :Mostrar pedidos e opcións para este empregado +STR_1946 :Escolle un traxe para este animador +STR_1947 :Mostra as áreas patrulladas por este tipo de empregados e localiza o empregado máis próximo +STR_1948 :Contrata un novo empregado do tipo seleccionado +STR_1949 :Resumo financeiro +STR_1950 :Gráfica de Finanzas +STR_1951 :Gráfica do valor do parque +STR_1952 :Gráfica de beneficios +STR_1953 :Márketing +STR_1954 :Investimento en Innovación e Desenvolvemento +STR_1955 :{WINDOW_COLOUR_2}Número de circuítos: +STR_1956 :Número de circuítos por atracción +STR_1957  :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_1958  :{COMMA16} +STR_1959 :Non se pode cambiar o número de circuítos... +STR_1960  :{WINDOW_COLOUR_2}Prezo do globo: +STR_1961 :{WINDOW_COLOUR_2}Prezo do xoguete: +STR_1962 :{WINDOW_COLOUR_2}Prezo do mapa: +STR_1963 :{WINDOW_COLOUR_2}Prezo da foto: +STR_1964  :{WINDOW_COLOUR_2}Prezo do paraugas: +STR_1965  :{WINDOW_COLOUR_2}Prezo da bebida: +STR_1966  :{WINDOW_COLOUR_2}Prezo da hamburguesa: +STR_1967 :{WINDOW_COLOUR_2}Prezo das patacas fritas: +STR_1968 :{WINDOW_COLOUR_2}Prezo do xeado: +STR_1969 :{WINDOW_COLOUR_2}Prezo do algodón de azucre: +STR_1970 :{WINDOW_COLOUR_2} +STR_1971 :{WINDOW_COLOUR_2} +STR_1972 :{WINDOW_COLOUR_2} +STR_1973  :{WINDOW_COLOUR_2}Prezo da pizza: +STR_1974 :{WINDOW_COLOUR_2} +STR_1975  :{WINDOW_COLOUR_2}Prezo das palomitas: +STR_1976  :{WINDOW_COLOUR_2}Prezo de hot dogs: +STR_1977  :{WINDOW_COLOUR_2}Prezo de tentáculo: +STR_1978  :{WINDOW_COLOUR_2}Prezo do sombreiro: +STR_1979  :{WINDOW_COLOUR_2}Prezo de Apple: +STR_1980  :{WINDOW_COLOUR_2}Prezo da camiseta: +STR_1981  :{WINDOW_COLOUR_2}Prezo da rosquilla: +STR_1982  :{WINDOW_COLOUR_2}Prezo do café: +STR_1983 :{WINDOW_COLOUR_2} +STR_1984 :{WINDOW_COLOUR_2}Prezo do polo frito: +STR_1985 :{WINDOW_COLOUR_2}Prezo da limonada: +STR_1986 :{WINDOW_COLOUR_2} +STR_1987 :{WINDOW_COLOUR_2} +STR_1988 :Globo +STR_1989 :Xoguete +STR_1990 :Mapa do parque +STR_1991 :Foto na atracción +STR_1992 :Parasol +STR_1993 :Bebida +STR_1994 :Hamburguesa +STR_1995 :Patacas fritas +STR_1996 :Xeado +STR_1997 :Algodón de azucre +STR_1998 :Lata baleira +STR_1999 :Lixo +STR_2000 :Caixa de hamburguesas baleira +STR_2001 :Pizza +STR_2002 :Cupón +STR_2003 :Flocos de millo +STR_2004 :Hot dog +STR_2005 :Tentáculo +STR_2006 :Sombreiro +STR_2007 :Mazá de caramelo +STR_2008 :Camiseta +STR_2009 :Rosquilla +STR_2010 :Café +STR_2011 :Cunca baleira +STR_2012 :Polo Frito +STR_2013 :Limoada +STR_2014 :Caixa baleira +STR_2015 :Botella baleira +STR_2016 :Globos +STR_2017 :Peluches +STR_2018 :Mapas do parque +STR_2019 :Fotos na atracción +STR_2020 :Paraugas +STR_2021 :Bebidas +STR_2022 :Hamburguesas +STR_2023 :Patacas fritas +STR_2024 :Xeados +STR_2025 :algodón de azucre +STR_2026 :Latas baleiras +STR_2027 :Lixo +STR_2028 :Caixas baleiras +STR_2029 :Pizzas +STR_2030 :Cupóns +STR_2031 :Flocos de millo +STR_2032 :Hot dog +STR_2033 :Tentáculos +STR_2034 :Sombreiros +STR_2035 :Mazás doces +STR_2036 :Camisetas +STR_2037 :Rosquillas +STR_2038 :Café +STR_2039 :Cuncas baleiras +STR_2040 :Polos Fritidos +STR_2041 :Limoadas +STR_2042 :Caixas baleiras +STR_2043 :Botellas baleiras +STR_2044 :un globo +STR_2045 :un pequeno xoguete +STR_2046 :un mapa do parque +STR_2047 :unha Foto +STR_2048 :un Parasol +STR_2049 :unha Bebida +STR_2050 :unha hamburguesa +STR_2051 :unhas patacas fritas +STR_2052 :un xeado +STR_2053 :un algodón de azucre +STR_2054 :unha lata baleira +STR_2055 :a Lixo +STR_2056 :unha caixa baleira +STR_2057 :unha pizza +STR_2058 :un cupón +STR_2059 :unhas palomitas +STR_2060 :un hot dog +STR_2061 :un tentáculo +STR_2062 :un Sombreiro +STR_2063 :unha mazá doce +STR_2064 :unha camiseta +STR_2065 :unha rosquilla +STR_2066 :un Café +STR_2067 :unha cunca baleira +STR_2068 :unhas galiñas fritas +STR_2069 :unha limonada +STR_2070 :unha caixa baleira +STR_2071 :unha botella baleira +STR_2072 :Globo “{STRINGID}”. +STR_2073 :xoguete “{STRINGID}”. +STR_2074 :Mapa de {STRINGID} +STR_2075 :Foto na atracción de {STRINGID} +STR_2076 :Paraugas de “{STRINGID}” +STR_2077 :Bebida +STR_2078 :Hamburguesa +STR_2079 :Patacas fritas +STR_2080 :Xeado +STR_2081 :Algodón de azucre +STR_2082 :Lata baleira +STR_2083 :Lixo +STR_2084 :Caixa de hamburguesas baleira +STR_2085 :Pizza +STR_2086 :Cupón para {STRINGID} +STR_2087 :Palomitas +STR_2088 :Hot dog +STR_2089 :Tentáculo +STR_2090 :Sombreiro “{STRINGID}”. +STR_2091 :mazá de caramelo +STR_2092 :Camiseta “{STRINGID}”. +STR_2093 :Rosquilla +STR_2094 :Café +STR_2095 :Cunca baleira +STR_2096 :Polo Frito +STR_2097 :Limoada +STR_2098 :Caixa baleira +STR_2099 :Botella baleira +STR_2103 :{WINDOW_COLOUR_2}Prezo da galleta salgada: +STR_2104 :{WINDOW_COLOUR_2}Prezo do chocolate: +STR_2105 :{WINDOW_COLOUR_2}Prezo do té xeado: +STR_2106 :{WINDOW_COLOUR_2}Prezo pastel: +STR_2107 :{WINDOW_COLOUR_2}Prezo das lentes: +STR_2108 :{WINDOW_COLOUR_2}Prezo dos fideos: +STR_2109 :{WINDOW_COLOUR_2}Prezo do arroz frito: +STR_2110 :{WINDOW_COLOUR_2}Prezo da sopa wonton: +STR_2111 :{WINDOW_COLOUR_2}Prezo das albóndigas: +STR_2112 :{WINDOW_COLOUR_2}Prezo da bebida de froita: +STR_2113 :{WINDOW_COLOUR_2}Prezo do leite de soia: +STR_2114 :{WINDOW_COLOUR_2}Prezo de Sujongkwa: +STR_2115 :{WINDOW_COLOUR_2}Prezo do bocadillo: +STR_2116 :{WINDOW_COLOUR_2}Prezo da galleta: +STR_2117 :{WINDOW_COLOUR_2} +STR_2118 :{WINDOW_COLOUR_2} +STR_2119 :{WINDOW_COLOUR_2} +STR_2120 :{WINDOW_COLOUR_2}Prezo da salchicha: +STR_2121 :{WINDOW_COLOUR_2} +STR_2125 :Galleta salgada +STR_2126 :Chocolate quente +STR_2127 :Té xeado +STR_2128 :Bolo de funil +STR_2129 :Lentes de sol +STR_2130 :Fideos con carne +STR_2131 :Arroz Frito +STR_2132 :Sopa Wonton +STR_2133 :Sopa de albóndigas +STR_2134 :zume de froita +STR_2135 :Leite de soia +STR_2136 :Sujongkwa +STR_2137 :Mini-Bocadillo +STR_2138 :Galleta +STR_2139 :Cunca baleira +STR_2140 :Cartón baleiro de bebidas +STR_2141 :Cunca de zume baleira +STR_2142 :Salchicha á prancha +STR_2143 :Cunca baleira +STR_2147 :galletas salgadas +STR_2148 :Chocolates quentes +STR_2149 :Tés xeados +STR_2150 :Repostería +STR_2151 :Lentes de sol +STR_2152 :Fideos con carne +STR_2153 :arroz frito +STR_2154 :Sopas Wonton +STR_2155 :Sopas de albóndegas +STR_2156 :Bebidas de froitas +STR_2157 :Leite de soia +STR_2158 :Sujongkwa +STR_2159 :Bocadillos +STR_2160 :Galletas +STR_2161 :cuncas baleiras +STR_2162 :Cartóns de bebidas baleiros +STR_2163 :Cuncas de zume baleiras +STR_2164 :Salchichas á prancha +STR_2165 :cuncas baleiras +STR_2169 :unha galleta salgada +STR_2170 :un chocolate quente +STR_2171 :un té xeado +STR_2172 :un Bolo de funil +STR_2173 :uns lentes +STR_2174 :uns fideos de carne +STR_2175 :un arroz frito +STR_2176 :unha sopa wonton +STR_2177 :Sopa de albóndegas +STR_2178 :unha bebida de froita +STR_2179 :un leite de soia +STR_2180 :a Sujongkwa +STR_2181 :un mini bocadillo +STR_2182 :unha galleta +STR_2183 :unha cunca baleira +STR_2184 :unha caixa de bebidas baleira +STR_2185 :un vaso de bebida baleiro +STR_2186 :unha salchicha á prancha +STR_2187 :unha cunca baleira +STR_2191 :Galleta salgada +STR_2192 :Chocolate quente +STR_2193 :Té xeado +STR_2194 :Bolo de funil +STR_2195 :Lentes de sol +STR_2196 :Fideos con carne +STR_2197 :Arroz frito +STR_2198 :Sopa Wonton +STR_2199 :Sopa de albóndegas +STR_2200 :Bebida de froitas +STR_2201 :Leite de soia +STR_2202 :Sujongkwa +STR_2203 :Mini-Bocadillo +STR_2204 :Galleta +STR_2205 :Cunca baleira +STR_2206 :Caixa de bebidas baleira +STR_2207 :Vaso de bebida baleiro +STR_2208 :Salchicha á prancha +STR_2209 :Cunca baleira +STR_2210 :Mostrar a lista de manitas no parque +STR_2211 :Mostrar a lista de mecánicos no parque +STR_2212 :Mostrar a lista de gardas de seguridade no parque +STR_2213 :Mostrar a lista de animadores do parque +STR_2214 :Non é posible construír mentres o xogo está en pausa! +STR_2215 :{STRINGID}{NEWLINE}({STRINGID}) +STR_2216 :{WINDOW_COLOUR_2}{COMMA16}°C +STR_2217  :{WINDOW_COLOUR_2}{COMMA16}°F +STR_2218 :{RED}{STRINGID} en {STRINGID} non volveu a {STRINGID}!{NEWLINE}Comproba se quedou atascado ou parouse. +STR_2219 :{RED}{COMMA16} persoas morreron nun accidente en {STRINGID} +STR_2220 :{WINDOW_COLOUR_2}Valoración do parque: {BLACK}{COMMA16} +STR_2221 :Calificación do parque: {COMMA16} +STR_2222 :{BLACK}{STRINGID} +STR_2223 :{WINDOW_COLOUR_2}Visitantes do parque: {BLACK}{COMMA32} +STR_2224 :{WINDOW_COLOUR_2}Efectivo: {BLACK}{CURRENCY2DP} +STR_2225 :{WINDOW_COLOUR_2}Efectivo: {RED}{CURRENCY2DP} +STR_2226 :{WINDOW_COLOUR_2}Valor do parque: {BLACK}{CURRENCY} +STR_2227 :{WINDOW_COLOUR_2}Valor da empresa: {BLACK}{CURRENCY} +STR_2228 :{WINDOW_COLOUR_2}Beneficios do mes pasado por vendas de comida/bebidas e {NEWLINE} mercadorías: {BLACK}{CURRENCY} +STR_2229 :Costa arriba a vertical +STR_2230 :Sección Vertical +STR_2231 :Freos de caída libre +STR_2232 :Cable de elevación +STR_2233 :Información do parque +STR_2234 :Mensaxes recentes +STR_2235 :{STRINGID} {STRINGID} +STR_2236 :xaneiro +STR_2237 :febreiro +STR_2238 :marzo +STR_2239 :abril +STR_2240 :maio +STR_2241 :xuño +STR_2242 :xullo +STR_2243 :agosto +STR_2244 :setembro +STR_2245 :outubro +STR_2246 :novembro +STR_2247 :decembro +STR_2248 :Non podes eliminar a atracción/tenda +STR_2249 :{BABYBLUE}Nova atracción dispoñible:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}Nova decoración dispoñible:{NEWLINE}{STRINGID} +STR_2251 :Só se pode construír en camiños! +STR_2252 :Só se pode construír a través de camiños! +STR_2253 :Atraccións de transporte +STR_2254 :Paseos suaves +STR_2255 :Montañas rusas +STR_2256 :Atraccións intensas +STR_2257 :Atraccións acuáticas +STR_2258 :Tendas e postos de venda +STR_2259 :Decorado +STR_2260 :Sen investimento +STR_2261 :Investimento mínimo +STR_2262 :Investimento normal +STR_2263 :Investimento Máximo +STR_2264 :Investimento en investigación +STR_2265 :{WINDOW_COLOUR_2}Orzamento: {BLACK}{CURRENCY} ao mes +STR_2266 :Prioridades de investigación +STR_2267 :Actualmente en desenvolvemento +STR_2268 :Último desenvolvemento +STR_2269 :{WINDOW_COLOUR_2}Tipo: {BLACK}{STRINGID} +STR_2270 :{WINDOW_COLOUR_2}Progreso: {BLACK}{STRINGID} +STR_2271 :{WINDOW_COLOUR_2}Data: {BLACK}{STRINGID} +STR_2272 :{WINDOW_COLOUR_2}Atracción:{NEWLINE}{BLACK}{STRINGID} +STR_2273 :{WINDOW_COLOUR_2}Decoración:{NEWLINE}{BLACK}{STRINGID} +STR_2274 :Mostrar detalles deste desenvolvemento +STR_2275 :Opcións de investimento e estado de I+D +STR_2276 :Mostra o estado de I+D +STR_2277 :Descoñecido +STR_2278 :Atracción de transporte +STR_2279 :Atracción suave +STR_2280 :Montaña Rusa +STR_2281 :Atracción intensa +STR_2282 :Atracción acuática +STR_2283 :Tenda/Posto +STR_2284 :Escenario +STR_2285 :Desenvolvemento inicial +STR_2286 :Deseño +STR_2287 :Finalización do deseño +STR_2288 :Descoñecido +STR_2289 :{STRINGID} {STRINGID} +STR_2291 :Selecciona o escenario para un novo xogo +STR_2292 :{WINDOW_COLOUR_2}Atraccións visitadas: +STR_2293 :{BLACK} Nada +STR_2294 :Cambiar o estilo da terra +STR_2295 :Cambiar o estilo do acantilado +STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} exp. na entrada do parque +STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto na atracción {BLACK}{COMMA16} +STR_2298  :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en {BLACK}{COMMA16} atraccións +STR_2299  :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en comida {BLACK}{COMMA16} +STR_2300  :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en {BLACK}{COMMA16} comidas +STR_2301  :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en refresco {BLACK}{COMMA16} +STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en refrescos {BLACK}{COMMA16} +STR_2303  :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en recordo {BLACK}{COMMA16} +STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} gasto en recordos {BLACK}{COMMA16} +STR_2305 :Arquivos de deseño Vía +STR_2306 :Gardar deseño a través +STR_2307 :Seleccione o deseño de {STRINGID} +STR_2308  :{STRINGID} Deseños de pistas +STR_2309 :Instalar o deseño da pista +STR_2310 :Crear un deseño personalizado +STR_2311 :{WINDOW_COLOUR_2}Nivel de emoción: {BLACK}{COMMA2DP32} (aprox.) +STR_2312 :{WINDOW_COLOUR_2}Nivel de intensidade: {BLACK}{COMMA2DP32} (aprox.) +STR_2313 :{WINDOW_COLOUR_2}Nivel de náuseas: {BLACK}{COMMA2DP32} (aprox.) +STR_2314 :{WINDOW_COLOUR_2}Lonxitude da pista: {BLACK}{STRINGID} +STR_2315 :{WINDOW_COLOUR_2}Custo: {BLACK}ao redor de {CURRENCY} +STR_2316 :{WINDOW_COLOUR_2}Espazo necesario: {BLACK}{COMMA16} × {COMMA16} bloques +STR_2321 :{WINDOW_COLOUR_2}Número de atraccións: {BLACK}{COMMA16} +STR_2322 :{WINDOW_COLOUR_2}Empleados: {BLACK}{COMMA32} +STR_2323 :{WINDOW_COLOUR_2}Extensión do parque: {BLACK}{COMMA32}m² +STR_2324 :{WINDOW_COLOUR_2}Extensión do parque: {BLACK}{COMMA32}sq.ft. +STR_2325 :Comprar terreos para ampliar o parque. +STR_2326 :Adquirir dereitos de construción para construír sobre ou debaixo de terreos fóra do parque. +STR_2327 :Opcións +STR_2328 :{WINDOW_COLOUR_2}Moeda: +STR_2329 :{WINDOW_COLOUR_2}Distancia e velocidade: +STR_2330 :{WINDOW_COLOUR_2}Temperatura: +STR_2331 :{WINDOW_COLOUR_2}Marcas de altura: +STR_2332 :Niveis relativos +STR_2333 :Efectos de son +STR_2334 :Libras (£) +STR_2335 :Dólares ($) +STR_2336 :Franco (F) +STR_2337 :Marca alemana (DM) +STR_2338 :Ien (¥) +STR_2339 :Peseta (Pts) +STR_2340 :Lira (L) +STR_2341 :Floríns (ƒ) +STR_2342 :Coroa sueca (kr) +STR_2343 :Euros (€) +STR_2344 :Imperial +STR_2345 :Métrica +STR_2347 :{RED}{STRINGID} afogouse! +STR_2348 :Mostrar estatísticas deste empregado +STR_2349 :{WINDOW_COLOUR_2}Salario: {BLACK}{CURRENCY} ao mes +STR_2350 :{WINDOW_COLOUR_2}Contratado: {BLACK}{MONTHYEAR} +STR_2351 :{WINDOW_COLOUR_2}Herba cortada: {BLACK}{COMMA32} +STR_2352 :{WINDOW_COLOUR_2}Xardíns regados: {BLACK}{COMMA32} +STR_2353 :{WINDOW_COLOUR_2}Camiños despexados: {BLACK}{COMMA32} +STR_2354 :{WINDOW_COLOUR_2}Lixos baleiros: {BLACK}{COMMA32} +STR_2355 :{WINDOW_COLOUR_2}Atraccións corrixidas: {BLACK}{COMMA32} +STR_2356 :{WINDOW_COLOUR_2}Atraer. inspeccionado: {BLACK}{COMMA32} +STR_2358 :Unidos +STR_2359 :Valores reais +STR_2360 :{WINDOW_COLOUR_2}Resolución da pantalla: +STR_2361 :Suavizado do terreo +STR_2362 :Activa ou desactiva a suavización do terreo +STR_2363 :Mostrar cuadrícula do terreo +STR_2364 :activa ou desactiva a cuadrícula do terreo +STR_2365 :O banco négase a prestarche máis cartos! +STR_2366 :Celsius (°C) +STR_2367 :Fahrenheit (°F) +STR_2368 :Ningún +STR_2369 :Baixo +STR_2370 :Medio +STR_2371 :Alto +STR_2372 :Baixo +STR_2373 :Medio +STR_2374 :Alto +STR_2375 :Moi alto +STR_2376 :extremo +STR_2377 :Ultra-Extremo +STR_2378 :Selecciona menos superficie de terreo +STR_2379 :Selecciona máis superficie terrestre +STR_2380 :Seleccione menos extensión de auga +STR_2381 :Selecciona máis extensión de auga +STR_2382 :Terra +STR_2383 :Auga +STR_2384 :{WINDOW_COLOUR_2}O teu obxectivo: +STR_2385 :{BLACK}Ningún +STR_2386 :{BLACK}Ter polo menos {COMMA32} visitantes no teu parque a finais de {MONTHYEAR}, cunha clasificación do parque de polo menos 600 +STR_2387 :{BLACK}Obtén un valor do parque {POP16}{POP16}{CURRENCY} ao final do {PUSH16}{PUSH16}{PUSH16}{PUSH16}{PUSH16}{MONTHYEAR} +STR_2388 :{BLACK}Divírtete! +STR_2389 :{BLACK}Constrúe o mellor {STRINGID} que poidas! +STR_2390 :{BLACK}Ter polo menos 10 tipos diferentes de montañas rusas operando no parque, cada unha cun valor de emoción de polo menos 6,00 +STR_2391 :{BLACK}Ten polo menos {COMMA32} visitantes no teu parque. Non deixes que a clasificación baixe de 700 en ningún momento. +STR_2392 :{BLACK}Consigue ingresos mensuais pola venda de entradas para atraccións de polo menos {POP16}{POP16}{CURRENCY} +STR_2393 :{BLACK}Ter polo menos 10 tipos diferentes de montañas rusas funcionando no parque, cada unha cunha lonxitude mínima de {LENGTH} e un valor de emoción de polo menos 7,00 +STR_2394 :{BLACK}Remata a construción da 5 das montañas rusas sen rematar deste parque, deseñandoas para que teñan un valor emocionante de polo menos {POP16}{POP16}{COMMA2DP32} cada unha. +STR_2395 :{BLACK}Devolve o crédito e obtén un valor do parque de polo menos {POP16}{POP16}{CURRENCY} +STR_2396 :{BLACK}Consigue uns ingresos mensuais con alimentos, bebidas e outros artigos de polo menos {POP16}{POP16}{CURRENCY} +STR_2397 :Ningún +STR_2398 :Número de visitantes nunha data determinada +STR_2399 :valor do parque nunha data determinada +STR_2400 :Divírtete! +STR_2401 :Constrúe a mellor atracción posible +STR_2402 :Constrúe 10 montañas rusas +STR_2403 :Número de visitantes no parque +STR_2404 :Beneficio de atracción mensual +STR_2405 :Constrúe 10 montañas rusas cunha lonxitude +STR_2406 :Rematar a construción de 5 montañas rusas +STR_2407 :Pagar o préstamo e alcanzar o valor do parque +STR_2408 :beneficio mensual de alimentos/Mercadorías +STR_2409 :{WINDOW_COLOUR_2}Campañas de mercadotecnia en curso +STR_2410 :{BLACK}Ningún +STR_2411 :{WINDOW_COLOUR_2}Campañas de mercadotecnia dispoñibles +STR_2412 :Comeza esta campaña de mercadotecnia +STR_2413  :{BLACK}({CURRENCY2DP} por semana) +STR_2414 :(Aínda non seleccionou) +STR_2415 :{WINDOW_COLOUR_2}Atracción: +STR_2416 :{WINDOW_COLOUR_2}Elemento: +STR_2417 :{WINDOW_COLOUR_2}Período de tempo: +STR_2418 :Entrada gratuíta a {STRINGID} +STR_2419 :Entrada gratuíta a {STRINGID} +STR_2420 :50 % de desconto en {STRINGID} +STR_2421 :{STRINGID} gratuíto +STR_2424 :{WINDOW_COLOUR_2}Cupóns para a entrada gratuíta ao parque +STR_2425 :{WINDOW_COLOUR_2}Cupóns para a entrada gratuíta a unha das atraccións +STR_2426 :{WINDOW_COLOUR_2}Cupóns para o 50 % de desconto na entrada ao parque +STR_2427 :{WINDOW_COLOUR_2}Cupóns para comida ou bebida gratis +STR_2428 :{WINDOW_COLOUR_2}Campaña publicitaria do parque +STR_2429 :{WINDOW_COLOUR_2}Campaña publicitaria dunha atracción +STR_2430 :{BLACK}Cupóns para a entrada gratuíta a {STRINGID} +STR_2431 :{BLACK}Cupóns para a entrada gratuíta a {STRINGID} +STR_2432 :{BLACK}Cupóns para o 50 % de desconto na entrada a {STRINGID} +STR_2433 :{BLACK}Cupóns de balde {STRINGID} +STR_2434 :{BLACK}{STRINGID} campaña publicitaria +STR_2435 :{BLACK}{STRINGID} campaña publicitaria +STR_2436 :1 semana +STR_2443 :{WINDOW_COLOUR_2}Custo por semana: {BLACK}{CURRENCY2DP} +STR_2444 :{WINDOW_COLOUR_2}Custo total: {BLACK}{CURRENCY2DP} +STR_2445 :Lanza esta campaña de mercadotecnia +STR_2446 :{YELLOW}A campaña de mercadotecnia para a entrada gratuíta ao parque rematou +STR_2447 :{YELLOW}A campaña de mercadotecnia para introducir {STRINGID} de balde rematou +STR_2448 :{YELLOW}A campaña de cupóns de desconto para entrar no parque rematou +STR_2449 :{YELLOW}A campaña de mercadotecnia gratuíta {STRINGID} rematou +STR_2450 :{YELLOW}A campaña publicitaria do parque rematou +STR_2451 :{YELLOW}{STRINGID} a campaña publicitaria rematou +STR_2452 :{WINDOW_COLOUR_2}Efectivo (restando préstamo): {BLACK}{CURRENCY2DP} +STR_2453 :{WINDOW_COLOUR_2}Efectivo (restando préstamo): {RED}{CURRENCY2DP} +STR_2457 :Mostrar as finanzas +STR_2458 :Mostra o gráfico do efectivo dispoñible (restando o préstamo) ao longo do tempo +STR_2459 :Mostrar o gráfico do valor do parque ao longo do tempo +STR_2460 :Mostrar o gráfico de beneficios ao longo do tempo +STR_2461 :Mostrar campañas de mercadotecnia +STR_2462 :Mostrar vista da entrada do parque +STR_2463 :Mostrar o gráfico de valoración do parque ao longo do tempo +STR_2464 :Mostrar gráfico do número de visitantes ao longo do tempo +STR_2465 :Mostrar información sobre o prezo e as entradas +STR_2466 :Mostrar estatísticas do parque +STR_2467 :Mostrar obxectivos deste parque +STR_2468 :Mostrar os premios gañados recentemente polo parque +STR_2469 :Seleccione o nivel de investigación e desenvolvemento +STR_2470 :Investigar novas atraccións de transporte +STR_2471 :Investigar novas atraccións suaves +STR_2472 :Busca novas montañas rusas +STR_2473 :Investigar novas atraccións intensas +STR_2474 :Investigar novas atraccións acuáticas +STR_2475 :Investigar novas tendas e postos de venda +STR_2476 :Investigar unha nova decoración +STR_2477 :Seleccione o modo de funcionamento desta atracción +STR_2478 :Mostrar a gráfica de velocidade en función do tempo +STR_2479 :Mostrar a gráfica de velocidade en función do tempo +STR_2480 :Mostra a gráfica de aceleración en función do tempo +STR_2481 :Mostrar gráfico da aceleración lateral con respecto ao tempo +STR_2482 :Beneficios: {CURRENCY} por semana. Valor do parque: {CURRENCY} +STR_2483 :{WINDOW_COLOUR_2}Beneficio semanal: {BLACK}+{CURRENCY2DP} +STR_2484 :{WINDOW_COLOUR_2}Beneficio semanal: {RED}{CURRENCY2DP} +STR_2487 :Mostrar os nomes "reais" dos visitantes +STR_2488 :Mostra os nomes "reais" dos visitantes, ou só o seu número de visitantes +STR_2489 :Atallos de teclado... +STR_2490 :Atallos de teclado +STR_2491 :Restablecer teclas +STR_2492 :Cambia todos os atallos de teclado aos valores predeterminados +STR_2493 :Pechar a xanela de arriba +STR_2494 :Pecha todas as xanelas +STR_2495 :Cancelar o modo de compilación +STR_2496 :Pausa o xogo +STR_2497 :Reducir a vista +STR_2498 :Ampliar a vista +STR_2499 :Xira a vista cara á dereita +STR_2500 :Xirar obxectos en construción +STR_2501 :Vista subterránea +STR_2502 :Terra invisible +STR_2503 :Cantís invisibles +STR_2504 :Mira a través das atraccións +STR_2505 :Mira polo escenario +STR_2506 :Alternar soportes invisibles +STR_2507 :Alterar convidados invisibles +STR_2508 :Marcas de altura no chan +STR_2509 :marcas de altura nas atraccións +STR_2510 :marcas de altura nos camiños +STR_2511 :Axustar o terreo +STR_2512 :Axustar a auga +STR_2513 :construír escenario +STR_2514 :Construír ruta +STR_2515 :Construír unha nova atracción +STR_2516 :Mostrar información. das finanzas +STR_2517 :Mostrar información. investigación +STR_2518 :Mostrar a lista de atraccións +STR_2519 :Mostrar información. do parque +STR_2520 :Mostrar a lista de visitantes +STR_2521 :Mostrar a lista de empregados +STR_2522 :Mostrar mensaxes recentes +STR_2523 ​​​​ :Amosar mapa +STR_2524 :captura de pantalla +STR_2533 :tecla RETROCESO +STR_2534 :Tab +STR_2537 :Limpar +STR_2538 :Volver +STR_2543 :Alt/Menú +STR_2544 :Pausa +STR_2545 :Caps +STR_2552 :Escape +STR_2557 :Barra de espazo +STR_2558 :Páx sub +STR_2559 :Páx Bai +STR_2560 :Fin +STR_2561 :Casa +STR_2562 :Esquerda +STR_2563 :Arriba +STR_2564 :Dereita +STR_2565 :Abaixo +STR_2566 :Seleccionar +STR_2567 :Imprimir +STR_2568 :Executar +STR_2569 :Instantánea +STR_2570 :Inserir +STR_2571 :Eliminar +STR_2572 :Axuda +STR_2618 :Menú +STR_2621 :Teclado numérico 0 +STR_2622 :Teclado numérico 1 +STR_2623 :Teclado numérico 2 +STR_2624 :Teclado numérico 3 +STR_2625 :Teclado numérico 4 +STR_2626 :Teclado numérico 5 +STR_2627 :Teclado numérico 6 +STR_2628 :Teclado numérico 7 +STR_2629 :Teclado numérico 8 +STR_2630 :Teclado numérico 9 +STR_2631 :Teclado numérico * +STR_2632 :Teclado numérico + +STR_2634 :Teclado numérico - +STR_2635 :Teclado numérico . +STR_2636 :Teclado numérico / +STR_2669 :Bloqueo num +STR_2670 :Desprácese +STR_2680 :Investigación completa +STR_2684 :Chega un gran grupo de visitantes +STR_2685 :Parámetros de ruído simples +STR_2686 :Baixa: +STR_2687 :Alto: +STR_2688 :Frecuencia base: +STR_2689 :Oitavas: +STR_2690 :Xeración de mapas +STR_2691 :Altura da base: +STR_2692 :Altura da auga: +STR_2693 :Terreo: +STR_2694 :Xerar +STR_2695 :Terreo aleatorio +STR_2696 :Colocar árbores +STR_2700 :Gardado automático: +STR_2701 :Cada minuto +STR_2702 :Cada 5 minutos +STR_2703 :Cada 15 minutos +STR_2704 :Cada 30 minutos +STR_2705 :Cada hora +STR_2706 :Xamais +STR_2707 :Utiliza o explorador de ficheiros do sistema +STR_2708 :{WINDOW_COLOUR_1}Estás certo de sobrescribir {STRINGID}? +STR_2709 :Sobrescribir +STR_2710 :Introduza o nome para este ficheiro: +STR_2718 :(arriba) +STR_2719 :(novo ficheiro) +STR_2720  :{UINT16}seg +STR_2721  :{UINT16}s +STR_2722 :{UINT16}min:{UINT16}seg +STR_2723 :{UINT16}min:{UINT16}s +STR_2724  :{UINT16}min:{UINT16}s +STR_2725  :{UINT16}mins:{UINT16}s +STR_2726  :{UINT16}min +STR_2727  :{UINT16}min +STR_2728 :{UINT16}hora:{UINT16}min +STR_2729 :{UINT16}hora:{UINT16}min +STR_2730 :{UINT16}horas:{UINT16}min +STR_2731 :{UINT16}horas:{UINT16}min +STR_2732  :{COMMA32} pés +STR_2733 :{COMMA32}m +STR_2734  :{COMMA16} mph +STR_2735 :{COMMA16} km/h +STR_2736  :{MONTH}, ano {COMMA16} +STR_2737  :{STRINGID} {MONTH}, ano {COMMA16} +STR_2738 :Menú principal de música: +STR_2739 :Ningún +STR_2740 :RollerCoaster Tycoon 1 +STR_2741 :RollerCoaster Tycoon 2 +STR_2749 :A miña nova etapa +# New strings used in the cheats window previously these were ??? +STR_2750 :Mover todo cara arriba +STR_2751 :Move todo cara abaixo +STR_2752 :Herba limpa +STR_2753 :Herba cortada +STR_2754 :Regar plantas +STR_2755 :Amañar o vandalismo +STR_2756 :Retirar lixo +STR_2763 :??? +STR_2765 :Grupo de visitantes +STR_2766 :Escenario de vitoria +STR_2767 :Desactivar cambio clima +STR_2769 :Parque aberto +STR_2770 :Pechar o parque +STR_2773 :Xanela +STR_2774 :Pantalla completa +STR_2775 :Pantalla completa (sen bordos) +STR_2776 :Lingua: +STR_2777  :{MOVE_X}{10}{STRING} +STR_2778 :»{MOVE_X}{10}{STRING} +STR_2779 :Cámara #{COMMA16} +STR_2780 :Engadir ‘cámara de vixilancia’ +# End of new strings +STR_2781 :{STRINGID}: +STR_2782 :SHIFT + +STR_2783 :CTRL + +STR_2784 :Cambiar o atallo do teclado +STR_2785 :{WINDOW_COLOUR_2}Preme a tecla nova para:{NEWLINE}“{STRINGID}” +STR_2786 :Fai clic na descrición do atallo para cambiala +STR_2787 :{WINDOW_COLOUR_2}Valor do parque: {BLACK}{CURRENCY} +STR_2788 :{WINDOW_COLOUR_2}Parabéns!{NEWLINE}{BLACK}Conseguiches o obxectivo cun valor da empresa de {CURRENCY}! +STR_2789 :{WINDOW_COLOUR_2}Non conseguiches o teu obxectivo! +STR_2790 :Introd. nome na táboa de escenarios +STR_2791 :Introduce o nome +STR_2792 :Introduza o nome na táboa de escenarios: +STR_2793 :(Completado por {STRINGID}) +STR_2794 :{WINDOW_COLOUR_2}Completado por: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} cun valor da empresa de: {BLACK}{CURRENCY} +STR_2795 :Ordenar +STR_2796 :Ordena a lista de atraccións segundo os criterios seleccionados +STR_2797 :Move o mapa co rato ata o bordo da pantalla +STR_2798 :Despraza a vista cando o punteiro do rato estea no bordo da xanela +STR_2799 :Ver ou cambiar os atallos de teclado asignados +STR_2800 :{WINDOW_COLOUR_2}Entradas: {BLACK}{COMMA32} +STR_2801 :{WINDOW_COLOUR_2}Ventaxes da venda de entradas: {BLACK}{CURRENCY2DP} +STR_2802 :Mapa +STR_2803 :Mostra estes visitantes marcados no mapa +STR_2804 :Mostra estes empregados marcados no mapa +STR_2805 :Mostrar mapa do parque +STR_2806 :{RED}Os visitantes quéixanse do mal estado das rutas{NEWLINE}Comproba onde están os traballadores de mantemento e organízaos mellor. +STR_2807 :{RED}Os visitantes quéixanse do lixo no parque{NEWLINE}Comproba onde están os traballadores de mantemento e organízaos mellor. +STR_2808 :{RED}Os visitantes quéixanse do vandalismo no parque{NEWLINE}Comproba onde están os teus gardas e organízaos mellor. +STR_2809 :{RED}Os visitantes teñen fame e non atopan onde mercar comida. +STR_2810 :{RED}Os visitantes teñen sede e non atopan ningún lugar onde mercar bebidas. +STR_2811 :{RED}Os visitantes quéixanse porque non atopan baños no parque. +STR_2812 :{RED}Os visitantes pérdense ou atascanse{NEWLINE}Comproba o deseño da túa ruta para axudar aos visitantes. +STR_2813 :{RED}A entrada ao parque é demasiado cara!{NEWLINE}Reduce o custo da entrada ou mellora o valor do parque. +STR_2814 :{WINDOW_COLOUR_2}Premio ao parque máis sucio do país +STR_2815 :{WINDOW_COLOUR_2}Premio ao parque máis limpo do país +STR_2816 :{WINDOW_COLOUR_2}Premio ao parque coas mellores montañas rusas +STR_2817 :{WINDOW_COLOUR_2}Premio ao parque máis valioso do país +STR_2818 :{WINDOW_COLOUR_2}Premio ao parque máis fermoso do país +STR_2819 :{WINDOW_COLOUR_2}Premio ao parque menos valioso do país +STR_2820 :{WINDOW_COLOUR_2}Premio ao parque máis seguro do país +STR_2821 :{WINDOW_COLOUR_2}Premio ao parque cos mellores empregados +STR_2822 :{WINDOW_COLOUR_2}Premio ao parque coa mellor comida do país +STR_2823 :{WINDOW_COLOUR_2}Premio ao parque coa peor comida do país +STR_2824 :{WINDOW_COLOUR_2}Premio ao parque cos mellores baños do país +STR_2825 :{WINDOW_COLOUR_2}Premio ao parque máis decepcionante do país +STR_2826 :{WINDOW_COLOUR_2}Premio ao parque coas mellores atraccións acuáticas do país +STR_2827 :{WINDOW_COLOUR_2}Premio ao parque coas mellores atraccións de pistas personalizadas do país +STR_2828 :{WINDOW_COLOUR_2}Premio ao parque cos esquemas de cores máis deslumbrantes +STR_2829 :{WINDOW_COLOUR_2}Premio ao parque co deseño máis confuso +STR_2830 :{WINDOW_COLOUR_2}Premio ao parque coas mellores atraccións suaves +STR_2831 :{TOPAZ}O teu parque recibiu o premio "O parque máis sucio do país"! +STR_2832 :{TOPAZ}O teu parque recibiu o premio "O parque máis limpo do país"! +STR_2833 :{TOPAZ}O teu parque recibiu o premio "O parque coas mellores montañas rusas"! +STR_2834 :{TOPAZ}O teu parque recibiu o premio "O parque máis valioso do país"! +STR_2835 :{TOPAZ}O teu parque recibiu o premio "O parque máis fermoso do país"! +STR_2836 :{TOPAZ}O teu parque recibiu o premio "O parque menos valioso do país"! +STR_2837 :{TOPAZ}O teu parque recibiu o premio "O parque máis seguro do país"! +STR_2838 :{TOPAZ}O teu parque recibiu o premio "O parque cos mellores empregados"! +STR_2839 :{TOPAZ}O teu parque recibiu o premio "O parque coa mellor comida do país"! +STR_2840 :{TOPAZ}O teu parque recibiu o premio "O parque coa peor comida do país"! +STR_2841 :{TOPAZ}O teu parque recibiu o premio "O parque cos mellores baños do país"! +STR_2842 :{TOPAZ}O teu parque recibiu o premio "O parque máis decepcionante do país"! +STR_2843 :{TOPAZ}O teu parque recibiu o premio "O parque coas mellores atraccións acuáticas do país"! +STR_2844 :{TOPAZ}O teu parque recibiu o premio "O parque coas mellores atraccións de pistas personalizadas do país"! +STR_2845 :{TOPAZ}O teu parque recibiu o premio "O parque cos esquemas de cores máis abraiantes"! +STR_2846 :{TOPAZ}O teu parque recibiu o premio "O parque co deseño máis confuso"! +STR_2847 :{TOPAZ}O teu parque recibiu o premio "O parque cos mellores atraccións suaves"! +STR_2848 :{WINDOW_COLOUR_2}Non hai premios recentes +STR_2849 :O novo escenario instalouse correctamente +STR_2850 :Instalouse a nova pista correctamente +STR_2851 :Escenario xa instalado +STR_2852 :Ruta xa instalada +STR_2853 :Prohibido polas autoridades locais! +STR_2854 :{RED}Os visitantes non poden atopar a entrada de {STRINGID}!{NEWLINE}Constrúe un camiño cara á entrada +STR_2855 :{RED}{STRINGID} non ten un camiño de saída!{NEWLINE}Constrúe un camiño desde a saída da atracción. +STR_2858 :Non pode iniciar unha campaña publicitaria... +STR_2861 :{WINDOW_COLOUR_2}Baixo licenza de Infogrames Interactive Inc. +STR_2971 :Esquema de cores principal +STR_2972 :Esquema de cores alternativo 1 +STR_2973 :Esquema de cores alternativo 2 +STR_2974 :esquema de cores alternativo 3 +STR_2975 :Selecciona o esquema de cores que queres cambiar ou pinta a atracción con el +STR_2976 :Pinta só unha área da atracción usando o esquema de cores seleccionado +STR_2977 :Nomear persoal +STR_2978 :Introduce un nome para este membro +STR_2979 :Non se pode nomear este membro do persoal... +STR_2980 :Demasiadas bandeiras en xogo +STR_2981 :{RED}Non pases +STR_2982 :Asinar texto +STR_2983 :Introduce texto novo para este sinal: +STR_2984 :Non se pode definir o texto para o sinal... +STR_2985 :Asinar +STR_2986 :Cambiar o texto do sinal +STR_2987 :Establece este sinal como "Non traspasar" +STR_2988 :Demoler este sinal +STR_2989 :Seleccione a cor principal +STR_2990 :Seleccione a cor do texto +STR_2991 :Letreiro +STR_2992 :Sinal de texto +STR_2993 :Escribir novo texto: +STR_2994 :Cambiar o texto do sinal +STR_2995 :Sinal de demolición +STR_2996 :{BLACK}ABC +STR_2997 :{GREY}ABC +STR_2998 :{WHITE}ABC +STR_2999 :{RED}ABC +STR_3000  :{GREEN}ABC +STR_3001 :{YELLOW}ABC +STR_3002 :{TOPAZ}ABC +STR_3003 :{CELADON}ABC +STR_3004 :{BABYBLUE}ABC +STR_3005 :{PALELAVENDER}ABC +STR_3006 :{PALEGOLD}ABC +STR_3007 :{LIGHTPINK}ABC +STR_3008 :{PEARLAQUA}ABC +STR_3009 :{PALESILVER}ABC +STR_3010 :Non se puido cargar o ficheiro... +STR_3011 :O ficheiro contén datos non válidos +STR_3045 :Selecciona o estilo de música para reproducir +STR_3047 :A autoridade local non permite que esta atracción sexa demolida nin modificada +STR_3048 :Campañas de mercadotecnia prohibidas pola autoridade local +STR_3049 :Oco de golf A +STR_3050 :Oco de golf B +STR_3051 :Oco de golf C +STR_3052 :Oco de golf D +STR_3053 :Oco de golf E +STR_3054 :Cargando... +STR_3058 :Muros de ladrillo +STR_3059 :Arbusto +STR_3060 :Bloque de xeo +STR_3061 :Valado de madeira +STR_3062 :Sección de montaña rusa estándar +STR_3063 :Canle de auga (sección mergullada) +STR_3064 :Parque. para novatos +STR_3065 :Parques desafiantes +STR_3066 :Parques expertos +STR_3067 :Parques “Reais”. +STR_3068 :Outros parques +STR_3069 :Sección superior +STR_3070 :Pendente a nivel +STR_3071 :{WINDOW_COLOUR_2}O mesmo prezo en todo o parque +STR_3072 :Seleccione se este prezo se usa en todo o parque +STR_3073 :{RED}ADVERTENCIA: a clasificación do parque caeu por debaixo de 700!{NEWLINE}Se a clasificación non aumenta en 4 semanas, o parque estará pechado. +STR_3074 :{RED}ADVERTENCIA: a valoración do parque baixou de 700!{NEWLINE}Tes 3 semanas para aumentar a valoración. +STR_3075 :{RED}ADVERTENCIA: a valoración do parque baixou de 700!{NEWLINE}Só tes 2 semanas para aumentar a valoración ou o parque pechará. +STR_3076 :{RED}AVISO FINAL: a clasificación do parque baixou por debaixo de 700!{NEWLINE}En 7 días o teu parque estará pechado a menos que subas a clasificación. +STR_3077 :{RED}PECHE: o teu parque foi pechado! +STR_3090 :Seleccione o estilo de entrada, saída e estación +STR_3091 :Non estás autorizado para eliminar esta sección! +STR_3092 :Non estás autorizado para modificar a estación desta atracción! +STR_3093 :{WINDOW_COLOUR_2}Favorito: {BLACK}{STRINGID} +STR_3094 :Ningún +STR_3095 :{WINDOW_COLOUR_2}Velocidade. cadeas de elevación: +STR_3096 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VELOCITY} +STR_3097 :Selecciona a velocidade das cadeas de carga +STR_3099 :Selecciona a cor +STR_3100 :Seleccione a segunda cor +STR_3101 :Seleccione a terceira cor +STR_3102 :Repintar a decoración de cores no parque +STR_3103 :Non podes volver pintar isto... +STR_3104 :Lista de atraccións +STR_3105 :Lista de tendas e postos +STR_3106 :Enumerar quioscos de información e outras instalacións para visitantes +STR_3107 :Pechar +STR_3108 :Proba +STR_3109 :Aberto +STR_3110 :{WINDOW_COLOUR_2}Bloquear seccións: {BLACK}{COMMA16} +STR_3111 :Fai clic neste deseño para crealo +STR_3112 :Fai clic no deseño para renomear ou eliminar +STR_3113 :Seleccione outro deseño +STR_3114 :Volver á xanela de selección de deseño +STR_3115 :Gardar o deseño da pista +STR_3116 :Gardar o deseño da pista (non é posible ata que o paseo sexa probado e xeradas as estatísticas) +STR_3117 :{BLACK}Chamando ao mecánico... +STR_3118 :{BLACK}{STRINGID} vai cara á atracción +STR_3119 :{BLACK}{STRINGID} está arranxando a atracción +STR_3120 :Busca o mecánico gratuíto máis próximo ou o que está a arranxar a atracción +STR_3121 :Non se puido localizar un mecánico gratuíto +STR_3122 :{WINDOW_COLOUR_2}Atracción favorita de: {BLACK}{COMMA32} visitante +STR_3123 :{WINDOW_COLOUR_2}Atracción favorita de: {BLACK}{COMMA32} visitantes +STR_3124 :{STRINGID} defectuoso +STR_3125  :{WINDOW_COLOUR_2}Factor de excitación: {BLACK}+{COMMA16} % +STR_3126  :{WINDOW_COLOUR_2}Factor de intensidade: {BLACK}+{COMMA16} % +STR_3127  :{WINDOW_COLOUR_2}Factor de náuseas: {BLACK}+{COMMA16} % +STR_3128 :Gardar o deseño da pista +STR_3129 :Gardar o deseño da pista con decoración +STR_3130 :Gardar +STR_3131 :Cancelar +STR_3132 :{BLACK}Fai clic nos elementos do escenario para gardar xunto co deseño da pista... +STR_3133 :Non é posible construír isto nunha pendente +STR_3134 :{RED}(Este deseño inclúe unha decoración que non está dispoñible) +STR_3135 :{RED}(Vehículo non dispoñible; o rendemento pode verse afectado) +STR_3136 :Advertencia: este aspecto crearase cun tipo de vehículo alternativo e é posible que non funcione como se esperaba. +STR_3137 :Seleccionar. Escenario próximo +STR_3138 :Restablecer selección. +STR_3139 :O cable de elevación non pode funcionar neste modo +STR_3140 :O cable do ascensor debería comezar despois da estación +STR_3141 :Multicircuíto por atracción. non é posible cun cable de elevación +STR_3142 :{WINDOW_COLOUR_2}Capacidade: {BLACK}{STRINGID} +STR_3143 :Mostrar visitantes no mapa +STR_3144 :Mostrar atraccións e postos no mapa +STR_3160 :Selecciona o número de circuítos por traxecto. +STR_3162 :Non se pode asignar suficiente memoria +STR_3163 :Instalar novos datos: +STR_3164  :{BLACK}{COMMA16} seleccionado (máximo {COMMA16}) +STR_3167 :{WINDOW_COLOUR_2}Inclúe: {BLACK}{COMMA16} obxectos +STR_3169 :Datos para o seguinte obxecto non atopado: +STR_3170 :Non se pode asignar máis espazo para os gráficos +STR_3171 :Moitos obxectos deste tipo xa foron seleccionados +STR_3172 :O seguinte debe seleccionarse o obxecto. primeiro: {STRING} +STR_3173 :Este obxecto está a ser usado +STR_3174 :Este obxecto é requirido por outro obxecto +STR_3175 :Este obxecto é obrigatorio +STR_3176 :Non se pode seleccionar este obxecto +STR_3177 :Non se pode deseleccionar este obxecto +STR_3179 :Debe seleccionar polo menos unha atracción +STR_3180 :Seleccionar. obxecto non válido +STR_3181 :Selección de obxectos - {STRINGID} +STR_3182 :O tipo de entrada ao parque debe ser seleccionado +STR_3183 :O tipo de auga debe ser seleccionado +STR_3184 :Atraccións vehiculos/Atraccións +STR_3185 :Pequeno escenario +STR_3186 :Gran escenario +STR_3187 :Muros/Valados +STR_3188 :Sinais de camiños +STR_3189 :Rutas antigas +STR_3190 :Decoración de sendeiros +STR_3191 :Escenarios +STR_3192 :Entrada do parque +STR_3193 :Auga +STR_3195 :Lista de inventos +STR_3196 :{WINDOW_COLOUR_2}Grupo de investigación: {BLACK}{STRINGID} +STR_3197 :{WINDOW_COLOUR_2}Elementos xa dispoñibles ao comezo do xogo: +STR_3198 :{WINDOW_COLOUR_2}Elementos a investigar durante o xogo: +STR_3199 :mestura aleatoria +STR_3200 :Baralla aleatoriamente a lista de inventos ao comezo do xogo. +STR_3201 :Selección de obxectos +STR_3202 :Editor de paisaxes +STR_3203 :Lista de inventos finalizada +STR_3204 :elección de opcións +STR_3205 :Selección de destino +STR_3206 :Gardar escenario +STR_3207 :Deseñador de montaña rusa +STR_3208 :Deseñador de estradas +STR_3209 :Volver ao paso anterior: +STR_3210 :Avanza ao seguinte paso: +STR_3211 :Tamaño do mapa: +STR_3212  :{POP16}{COMMA16} +STR_3213 :Non podes diminuír máis o tamaño do mapa +STR_3214 :Non podes aumentar máis o tamaño do mapa +STR_3215 :Demasiado preto do bordo do mapa +STR_3216 :Seleccione o terreo propiedade do parque, etc. +STR_3217 :Terreo propio +STR_3218 :Dereitos de constr propios +STR_3219 :Terreo en venda +STR_3220 :Dereitos de constr en venta +STR_3221 :Establece os terreos propiedade do parque. +STR_3222 :Establece os dereitos de construción do parque. +STR_3223 :Establece o terreo que está dispoñible para a compra no parque. +STR_3224 :Establecer os dereitos de construción que están dispoñibles para a compra do parque +STR_3225 :Activa/Desactiva a colocación de grupos de obxectos arredor da posición seleccionada +STR_3226 :Construír a entrada do parque +STR_3227 :Moitas entradas para o parque! +STR_3228 :Establecer a posición inicial das persoas +STR_3229 :O bloque de freada non debe usarse despois da estación +STR_3230 :O bloque de freado non debe usarse despois do outro +STR_3231 :O bloque de freo non debe usarse despois do final da cadea de elevación. +STR_3232 :Opcións - Finanzas +STR_3233 :Opcións - Visitantes +STR_3234 :Opcións - Aparcar +STR_3235 :Opcións de financiamento +STR_3236 :Opcións de visitante +STR_3237 :Opcións de estacionamento +STR_3238 :Sen cartos +STR_3239 :Eliminar as restricións financeiras deste parque +STR_3240 :{WINDOW_COLOUR_2}Efectivo inicial: +STR_3241 :{WINDOW_COLOUR_2}Préstamo inicial: +STR_3242 :{WINDOW_COLOUR_2}Préstamo máximo: +STR_3243 :{WINDOW_COLOUR_2}Interese anual: +STR_3244 :Prohibir campañas de mercadotecnia +STR_3245 :Prohibir anuncios, promocións e outras campañas de mercadotecnia +STR_3246  :{WINDOW_COLOUR_2}{CURRENCY} +STR_3247  :{WINDOW_COLOUR_2}{COMMA16} % +STR_3248 :O diñeiro inicial xa non se pode aumentar! +STR_3249 :Non podes reducir máis o diñeiro inicial! +STR_3250 :O préstamo inicial non se pode aumentar máis! +STR_3251 :O préstamo inicial non se pode reducir máis! +STR_3252 :O préstamo máximo non se pode aumentar máis! +STR_3253 :O préstamo máximo non se pode reducir máis! +STR_3254 :O tipo de interese non se pode aumentar máis! +STR_3255 :O tipo de interese non se pode reducir máis! +STR_3256 :Os visitantes prefiren as atraccións tranquilas +STR_3257 :Os visitantes adoitan preferir atraccións de baixa intensidade +STR_3258 :Os visitantes prefiren atraccións intensas +STR_3259 :Os visitantes adoitan preferir atraccións de alta intensidade +STR_3260 :{WINDOW_COLOUR_2}Efectivo por visitante (media): +STR_3261 :{WINDOW_COLOUR_2}Felicidade inicial do visitante: +STR_3262 :{WINDOW_COLOUR_2}Fame inicial do visitante: +STR_3263 :{WINDOW_COLOUR_2}Sede inicial do visitante: +STR_3264 :Non se pode aumentar máis! +STR_3265 :Non se pode reducir máis! +STR_3266 :Selecciona como gastan os visitantes neste parque +STR_3267 :Prohibir a tala de árbores +STR_3268 :Prohibir a tala de árbores altas +STR_3269 :Prohibir os cambios de terreo +STR_3270 :Prohibe mover a terra +STR_3271 :Prohibir edificios altos +STR_3272 :Prohibe construír demasiado alto +STR_3273 :Dificulta a valoración do parque +STR_3274 :Fai que a valoración do parque medre máis lentamente +STR_3275 :Dificulta a xeración de visitantes +STR_3276 :diminúe a frecuencia coa que aparecen os visitantes +STR_3277 :{WINDOW_COLOUR_2}Custo do terreo: +STR_3278 :{WINDOW_COLOUR_2}Custo dos dereitos de construción: +STR_3279 :Entrada gratuíta / Atraccións de pago +STR_3280 :Pagar para entrar / Atraccións gratuítas +STR_3281 :{WINDOW_COLOUR_2}Prezo de entrada: +STR_3282 :Seleccione o nome do destino e do parque +STR_3283 :Selecciona as atraccións para conservar +STR_3284 :Selección de destino +STR_3285 :Atraccións preservadas +STR_3286 :Seleccione obxectivos para este escenario +STR_3287 :{WINDOW_COLOUR_2}Obxecto: +STR_3288 :Selecciona o tempo +STR_3289 :{WINDOW_COLOUR_2}O tempo: +STR_3290 :Frío e húmido +STR_3291 :Quente +STR_3292 :Quente e seco +STR_3293 :Frío +STR_3294 :Cambiar... +STR_3295 :Cambiar o nome do parque +STR_3296 :Cambiar o nome do escenario +STR_3297 :Cambiar os detalles do parque/escenario +STR_3298 :{WINDOW_COLOUR_2}Nome do parque: {BLACK}{STRINGID} +STR_3299 :{WINDOW_COLOUR_2}Detalles do parque/escenario: +STR_3300 :{WINDOW_COLOUR_2}Nome artístico: {BLACK}{STRINGID} +STR_3301 :{WINDOW_COLOUR_2}Data obxectivo: +STR_3302  :{WINDOW_COLOUR_2}{MONTHYEAR} +STR_3303 :{WINDOW_COLOUR_2}Número de visitantes: +STR_3304 :{WINDOW_COLOUR_2}Valor do parque: +STR_3305 :{WINDOW_COLOUR_2}Ingresos mensuais: +STR_3306 :{WINDOW_COLOUR_2}Beneficio mensual: +STR_3307 :{WINDOW_COLOUR_2}Lonxitude mínima: +STR_3308 :{WINDOW_COLOUR_2}Rango de satisfacción: +STR_3309  :{WINDOW_COLOUR_2}{COMMA32} +STR_3310  :{WINDOW_COLOUR_2}{LENGTH} +STR_3311  :{WINDOW_COLOUR_2}{COMMA2DP32} +STR_3312 :{WINDOW_COLOUR_2}Atraccións/Atraccións con orde de conservación: +STR_3313 :Denominación do escenario +STR_3314 :Introduza o nome do escenario: +STR_3315 :Detalles do parque/escenario +STR_3316 :Escribe a descrición deste escenario: +STR_3317 :Aínda non hai detalles +STR_3318 :Selecciona o grupo ao que pertence o teu escenario +STR_3319 :{WINDOW_COLOUR_2}Grupo de escenarios: +STR_3320 :Non se puido gardar o ficheiro de escenario... +STR_3321 :Os novos obxectos instaláronse correctamente +STR_3322 :{WINDOW_COLOUR_2}Obxectivo: {BLACK}{STRINGID} +STR_3326 :{WINDOW_COLOUR_2}(sen imaxe) +STR_3327 :A posición inicial dos visitantes non foi definida +STR_3328 :Non se pode avanzar á seguinte fase do editor... +STR_3329 :Non se construíu unha entrada ao parque +STR_3330 :O parque debe ter terreo +STR_3331 :A ruta de entrada ao parque no bordo do mapa non está completa nin é demasiado complexa. Debe ter un só carril con o menor número de cruzamentos e curvas posibles. +STR_3332 :A entrada do parque está cara atrás ou non ten un camiño que conduce ao bordo do mapa +STR_3333 :Exporta complementos ao gardar a partida +STR_3334 :Selecciona se os complementos adicionais (datos non distribuídos co xogo principal) usados ​​nun escenario deben exportarse ao gardar o xogo, permitindo que outros xogadores que non teñan eses complementos poidan abrir o xogo. +STR_3335 :Deseñador de estradas: seleccione o tipo de atracción e vehículo +STR_3336 :Xestor de deseño de estradas: escolla o tipo de atracción +STR_3338 :{BLACK}Percorrido personalizado +STR_3339 :{BLACK}{COMMA16} deseño dispoñible ou visita personalizada +STR_3340 :{BLACK}{COMMA16} deseños dispoñibles ou visita personalizada +STR_3341 :Ferramentas de xogo +STR_3342 :Editor de escenarios +STR_3343 :Converte a partida gardada en escenario +STR_3344 :Deseñador de estradas +STR_3345 :Administrador de estradas +STR_3346 :Non se pode gardar o deseño da pista... +STR_3347 :Atracción demasiado longo, contén demasiados elementos ou a paisaxe está demasiado lonxe. +STR_3348 :Renomear +STR_3349 :Eliminar +STR_3350 :Nome Deseño Vía +STR_3351 :Nome do novo deseño da pista: +STR_3352 :Non se pode cambiar o nome do deseño da pista... +STR_3353 :O nome novo contén caracteres non válidos +STR_3354 :Outro ficheiro xa ten este nome ou está protexido contra escritura +STR_3355 :O ficheiro está bloqueado ou protexido contra escritura +STR_3356 :Eliminar ficheiro +STR_3357 :{WINDOW_COLOUR_2}Estás seguro de eliminar permanentemente {STRING}? +STR_3358 :Non se pode eliminar o deseño da pista... +STR_3359 :{BLACK}Non hai deseños de pistas para esta atracción +STR_3360 :Aviso! +STR_3361 :Demasiados esquemas de pistas - Algúns non aparecerán na lista. +STR_3364 :Avanzado +STR_3365 :Permitir a selección de escenarios ademais dos grupos de escenarios. +STR_3366 :{BLACK}= Atracción +STR_3367 :{BLACK}= Posto de comida +STR_3368 :{BLACK}= Bebida +STR_3369 :{BLACK}= Posto de recordos +STR_3370 :{BLACK}= Quiosco de información +STR_3371 :{BLACK}= Primeiros auxilios +STR_3372 :{BLACK}= caixeiro automático +STR_3373 :{BLACK}= Servizos +STR_3374 :Aviso: Seleccionáronse demasiados obxectos +STR_3375 :Non se seleccionaron todos os obxectos deste grupo +STR_3376 :Instalar novo... +STR_3377 :Instalar un novo ficheiro de deseño de pista +STR_3378 :Instalar +STR_3379 :Cancelar +STR_3380 :Non se puido instalar este deseño da pista... +STR_3381 :O ficheiro non é compatible ou contén datos non válidos +STR_3382 :Fallou a copia do ficheiro +STR_3383 :Seleccionar. novo deseño da pista do nome +STR_3384 :Un deseño de pista xa ten este nome - escolle outro nome: +STR_3389 :Non é posible seleccionar o elemento de escenario adicional... +STR_3390 :Seleccionáronse demasiados elementos +STR_3437 :Demoler grandes áreas de decoración +STR_3438 :Non se pode eliminar esta decoración... +STR_3439 :Eliminar decoración +STR_3445 :Establecer área de patrulla +STR_3446 :Cancelar área de patrulla + +# New strings, cleaner +STR_5120 :Finanzas +STR_5121 :Investigación +STR_5122 :Selecciona atraccións por tipo (como en RCT1) +STR_5123 :Renovar as atraccións +STR_5125 :Todo editable +STR_5126 :Música ao chou +STR_5127 :pinta o terreo en lugar de cambiar de elevación mentres arrastras. +STR_5128 :Tamaño da selección +STR_5129 :Escribe un tamaño de selección entre {COMMA16} e {COMMA16} +STR_5130 :Tamaño do mapa +STR_5131 :Escribe un tamaño de mapa entre {COMMA16} e {COMMA16} +STR_5132 :Correxir as atraccións +STR_5133 :Establece unha área máis pequena para os dereitos de construción. +STR_5134 :Establece unha área máis grande para os dereitos de construción. +STR_5135 :Comprar terreos ou dereitos de construción +STR_5136 :Dereitos de terreo +STR_5137 :Desbloquea os límites operativos +STR_5138  :{WINDOW_COLOUR_2}{STRINGID} +STR_5139 :{WHITE}{STRINGID} +STR_5140 :Desactivar fallos de freo +STR_5141 :Desactiva todos os fallos +STR_5142 :Velocidade normal +STR_5143 :Velocidade da luz +STR_5144 :Velocidade rápida +STR_5145 :Velocidade turbo +STR_5146 :Hiper velocidade +STR_5147 :Trucos +STR_5148 :Cambiar a velocidade do xogo +STR_5149 :Opcións de trucos +STR_5150 :Activar ferramentas de depuración +STR_5151 :. +STR_5152 :, +STR_5153 :Editar temas... +STR_5154 :Renderizado de hardware +STR_5155 :Permitir probas de atraccións sen rematar +STR_5156 :Permíteche probar a maioría das atraccións que aínda non estean construídas. Non se aplica aos modos de funcionamento da sección de bloque +STR_5158 :Saír ao menú principal +STR_5159 :Saír de OpenRCT2 +STR_5160  :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, ano {POP16}{COMMA16} +STR_5161 :Formato de data: +STR_5162 :Día/Mes/Ano +STR_5163 :Mes/Día/Ano +STR_5177 :Modo de visualización: +STR_5178 :Mostrar trucos de diñeiro +STR_5179 :Mostrar trucos para visitantes +STR_5180 :Mostrar trucos do parque +STR_5181 :Mostrar trucos de atraccións +STR_5182  :{INT32} +STR_5183 :Altura da base +STR_5184 :Introduce unha altura entre {COMMA16} e {COMMA16} +STR_5185 :Nivel da auga +STR_5186 :Introduza un nivel entre {COMMA16} e {COMMA16} +STR_5187 :Finanzas +STR_5188 :Nova campaña +STR_5189 :Investigación +STR_5190 :Mapa +STR_5191 :Xanela +STR_5192 :Mensaxes recentes +STR_5193 :Terreo +STR_5194 :Auga +STR_5195 :escenario claro +STR_5196 :Dereitos de construción +STR_5197 :Escenario +STR_5198 :Ruta +STR_5199 :Construción de atraccións +STR_5200 :Editor de pistas +STR_5201 :Nova atracción +STR_5202 :Selección do editor de pistas +STR_5203 :Atraccións +STR_5204 :Lista de atraccións +STR_5205 :Visitante +STR_5206 :Lista de visitantes +STR_5207 :Empregado +STR_5208 :Lista de empregados +STR_5209 :Bandeira +STR_5210 :Selección de obxectos +STR_5211 :Lista de inventos +STR_5212 :Opcións de escenario +STR_5213 :Opcións de destino +STR_5214 :Xeración de mapas +STR_5215 :Xestor de deseño de estradas +STR_5216 :Xestor de listas de deseño de estradas +STR_5217 :Trucos +STR_5218 :Temas +STR_5219 :Opcións +STR_5220 :Atallos de teclado +STR_5221 :Cambiar atallos de teclado +STR_5222 :Cargar/Gardar +STR_5223 :Gardar aviso +STR_5224 :Aviso de demolición de Atracción +STR_5225 :Aviso para despedir a un empregado +STR_5226 :Aviso de demolición da estrada +STR_5227 :Aviso de sobrescritura de gardado +STR_5228 :Interface principal +STR_5229 :Parque +STR_5230 :Ferramentas +STR_5231 :Atraccións e visitantes +STR_5232 :Editores +STR_5233 :Varios +STR_5234 :Avisos +STR_5235 :Configuración +STR_5236 :Xanela +STR_5237 :Paleta +STR_5238 :Tema actual: +STR_5239 :Duplicado +STR_5240 :Escribe o nome do tema +STR_5241 :Non podes cambiar este tema +STR_5242 :O nome do tema xa existe +STR_5243 :Texto non válido +STR_5244 :Temas +STR_5245 :Barra de ferramentas superior +STR_5246 :Barra de ferramentas inferior +STR_5247 :Editor de pistas (barra inferior) +STR_5248 :Editor de escenarios (barra inferior) +STR_5249 :Cor dos botóns do menú +STR_5250 :Cor do botón Saír +STR_5251 :Cor do botón de opción +STR_5252 :selección de escenarios de cor +STR_5253 :Información do parque +STR_5256 :Crear un novo tema para facer cambios +STR_5257 :Crear tema baseado no actual +STR_5258 :Eliminar o tema actual +STR_5259 :Renomear o tema actual +STR_5260 :Fai unha captura de pantalla do escenario completo +STR_5261 :Filtro +STR_5262 :Mundos tolos +STR_5263 :Torbellino do Tempo +STR_5264 :Personalizado +STR_5265 :Selecciona que contidos son visibles +STR_5266 :Gráficos +STR_5267 :Idioma e unidades +STR_5268 :Audio +STR_5269 :Interface e controis +STR_5270 :Outras opcións +STR_5272 :Pequena decoración +STR_5273 :Decoración grande +STR_5274 :Rutas +STR_5275 :Busca por obxectos +STR_5276 :Escribe o nome do obxecto para buscar +STR_5277 :Eliminar +STR_5278 :Modo de caixa de area +STR_5279 :Modo de caixa de area apagado +STR_5280 :Permíteche editar o terreo da propiedade e outras opcións restrinxidas ao Editor de escenarios +STR_5281 :Características +STR_5282 :luces de apertura e peche da atracción. igual a RCT1 +STR_5283 :luces abertas/pechadas de estacionamento iguais a RCT1 +STR_5284 :selección da fonte do escenario igual a RCT1 +STR_5287 :A atracción xa está rota +STR_5288 :A atracción está pechada +STR_5289 :Non hai desgloses dispoñibles para esta atracción +STR_5290 :Correxir atracción +STR_5291 :Non pode forzar unha avaría +STR_5292 :Forzar unha avaría +STR_5293 :Pechar atracción/atracción +STR_5294 :Proba a atracción/atracción +STR_5295 :Abrir atracción/atracción +STR_5296 :Pechar o parque +STR_5297 :Parque aberto +STR_5298 :{RED}{STRINGID} +STR_5299 :{LIGHTPINK}{STRINGID} +STR_5300 :Despedir aos empregados rapidamente +STR_5301 :Eliminar a débeda co banco +STR_5302 :Reiniciar o préstamo +STR_5303 :Permite a construción mentres está en pausa +STR_5304 :Seg. Menú principal: +STR_5305 :RollerCoaster Tycoon 1 +STR_5306 :RollerCoaster Tycoon 1 (AA) +STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5308 :RollerCoaster Tycoon 2 +STR_5309 :OpenRCT2 +STR_5310 :Aleatorio +STR_5311 :Ferramentas de depuración +STR_5312 :Mostrar consola +STR_5313 :Mostrar inspección. Reixa +STR_5314 :Inspector de rede +STR_5335 :Entrada +STR_5336 :Saída +STR_5337 :Entrada do parque +STR_5338 :Tipo de elemento: +STR_5339 :Altura da base +STR_5340 :Altura libre +STR_5343 :Coloca os traballadores automaticamente +STR_5344 :Cambios +STR_5345 :Trucos de cartos +STR_5346 :Trucos para visitantes +STR_5347 :Trucos do parque +STR_5348 :Trucos de diversión +STR_5349 :Todas as atraccións +STR_5350 :Máx. +STR_5351 :mín. +STR_5352 :{BLACK}Felicidade: +STR_5353 :{BLACK}Enerxía: +STR_5354 :{BLACK}Fame: +STR_5355 :{BLACK}Sede: +STR_5356 :{BLACK}Náuseas: +STR_5357 :{BLACK}Tolerancia ás náuseas: +STR_5358 :{BLACK}Vexiga: +STR_5359 :Eliminar visitantes +STR_5360 :Eliminar todos os visitantes do mapa +STR_5361 :Dálle a todos os visitantes: +STR_5362 :{BLACK}Todos os visitantes prefiren intensidades: +STR_5363 :Máis de 1 +STR_5364 :Menos de 15 +STR_5365 :{BLACK}Velocidade dos empregados: +STR_5366 :Normal +STR_5367 :Rápido +STR_5368 :Restablecer accidentes +STR_5371 :Selección de obxectos +STR_5372 :Inverte a compensación do clic dereito +STR_5373 :Nome {STRINGID} +STR_5374 :Data {STRINGID} +STR_5375 :▲ +STR_5376 :▼ +STR_5404 :O nome xa existe +STR_5440 :minimiza a pantalla completa ao perder o foco +STR_5442 :Calificación da forza: +STR_5447 :Escriba {STRINGID} +STR_5448 :Atracción / vehículo {STRINGID} +STR_5449 :Reducir a velocidade da atracción +STR_5450 :Aumenta a velocidade da atracción +STR_5451 :Abrir xanela de trucos +STR_5452 :Alternar a visibilidade da ferramenta +STR_5453 :Selecciona outra atracción +STR_5454 :Eliminar límite de FPS +STR_5455 :Activar o modo caixa de area +STR_5456 :Desactivar a comprobación de autorización +STR_5457 :Desactivar os límites de altura +STR_5458 :Xira no sentido das agullas do reloxo +STR_5459 :Xira en sentido antihorario +STR_5460 :Xira a vista cara á esquerda +STR_5461 :Axustar os parámetros do visitante +STR_5462  :{CURRENCY} +STR_5463 :Obxectivo: ¡Divírtete! +STR_5464 :Xerais +STR_5465 :Clima +STR_5466 :Empregados +STR_5467 :ALT + +STR_5468 :Mensaxes recentes +STR_5469 :Mover mapa cara arriba +STR_5470 :Mover o mapa cara á esquerda. +STR_5471 :Desprazar o mapa cara abaixo +STR_5472 :Mover o mapa cara á dereita +STR_5473 :Alterna día e noite +STR_5474 :Mostrar o texto do signo en maiúscula +STR_5475  :{COMMA16} semanas +STR_5476 :Hardware +STR_5477 :Representación do mapa +STR_5478 :Controis +STR_5479 :Barra de ferramentas +STR_5480 :Mostra os seguintes botóns: +STR_5481 :Aparición +STR_5482 :{WINDOW_COLOUR_2}Tempo desde a última inspección: {BLACK}1 minuto +STR_5483 :{BLACK}(Quedan {COMMA16} semanas) +STR_5484 :{BLACK}(Queda {COMMA16} semana) +STR_5485 :{STRING} +STR_5486 :{NEGRO}{COMMA16} +STR_5487 :Mensaxes recentes +STR_5489 :Mostrar só os visitantes co seguimento activado +STR_5490 :Silenciar ao perder o foco +STR_5491 :Lista de inventos +STR_5492 :Opcións de escenario +STR_5493 :Enviar mensaxe +STR_5495 :Lista de xogadores +STR_5496 :Xogador +STR_5497 :Ping +STR_5498 :Lista de servidores +STR_5499 :Nome do xogador: +STR_5500 :Engadir servidor +STR_5501 :Iniciar servidor +STR_5502 :Multixogador +STR_5503 :Introduza o nome do anfitrión ou a IP: +STR_5504 :Mostrar o estado do multixogador +STR_5505 :Non se puido conectar co servidor. +STR_5506 :Os visitantes ignoran a intensidade da atracción. +STR_5510 :Dispositivo de son predeterminado +STR_5511 :(DESCOÑECIDO) +STR_5512 :Gardar o xogo como... +STR_5513 :partida de gardado rápido +STR_5514 :Desactivar o vandalismo +STR_5515 :Evita que os visitantes enfadados cometan actos de vandalismo +STR_5516 :Negro +STR_5517 :Gris +STR_5518 :Branco +STR_5519 :Morado oscuro +STR_5520 :Morado claro +STR_5521 :Morado brillante +STR_5522 :Azul escuro +STR_5523 :Azul claro +STR_5524 :Azul xeado +STR_5525 :Auga escura +STR_5526 :Auga limpa +STR_5527 :verde saturado +STR_5528 :Verde escuro +STR_5529 :Verde musgo +STR_5530 :Verde brillante +STR_5531 :Verde oliva +STR_5532 :Verde oliva escuro +STR_5533 :amarelo brillante +STR_5534 :amarelo +STR_5535 :Amarelo escuro +STR_5536 :Laranxa claro +STR_5537 :Laranxa escuro +STR_5538 :marrón claro +STR_5539 :Café saturado +STR_5540 :marrón escuro +STR_5541 :Rosa salmón +STR_5542 :Vermello Borgoña +STR_5543 :vermello saturado +STR_5544 :Vermello brillante +STR_5545 :Rosa escuro +STR_5546 :Rosa brillante +STR_5547 :Rosa claro +STR_5548 :Mostra os modos de funcionamento +STR_5549 :Ano/Mes/Día +STR_5550  :{POP16}{POP16}Ano {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} +STR_5551 :Ano/Día/Mes +STR_5552  :{POP16}{POP16}Ano {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} +STR_5553 :Pausa o xogo cando se abra Steam +STR_5554 :Activar ferramenta de montaña +STR_5555 :Mostra vehículos doutro tipo de estradas +STR_5556 :Expulsar o reprodutor +STR_5557 :Mantente conectado despois da desincronización (multixogador) +STR_5558 :Esta configuración só terá efecto despois de que reinicias OpenRCT2 +STR_5559 :Inspeccións 10m +STR_5560 :Establece o tempo de inspección en "Cada 10 minutos" en todas as atraccións +STR_5561 :Non se puido cargar o idioma. +STR_5562 :ATENCIÓN! +STR_5563 :Esta configuración é inestable, toma precaucións. +STR_5566 :Contrasinal: +STR_5567 :Mostrar na lista de servidores +STR_5568 :O contrasinal é necesario +STR_5569 :Este servidor require un contrasinal +STR_5570 :Actualizar a lista +STR_5571 :Únete ao xogo +STR_5572 :Engadir a favoritos +STR_5573 :Eliminar dos favoritos +STR_5574 :Nome do servidor: +STR_5575 :Número máximo de xogadores: +STR_5576 :Porto: +STR_5577 :won surcoreano (W) +STR_5578 :Rublo ruso (₽) +STR_5579 :Factor de escala da xanela: +STR_5580 :Coroa checa (Kč) +STR_5581 :Mostrar FPS +STR_5582 :Manteña o punteiro do rato na xanela +STR_5583  :{COMMA1DP16}m/s +STR_5584 :SI +STR_5585 :Desbloquea os límites de operación da atracción, permitindo cousas como colinas de elevación a {VELOCITY} +STR_5586 :Abrir tendas e postos automaticamente +STR_5587 :As tendas e os postos abriranse automaticamente despois da construción. +STR_5588 :Xoga con outros xogadores +STR_5589 :Configuración de notificacións +STR_5590 :Premios do parque +STR_5591 :Completáronse as campañas de mercadotecnia +STR_5592 :Avisos de parque +STR_5593 :Avisos sobre a valoración do parque +STR_5594 :A atracción estropeouse +STR_5595 :A atracción foi destruída +STR_5596 :Avisos de atraccións +STR_5597 :Atracción e decoración desenvolvida +STR_5598 :Avisos de visitantes +STR_5600 :O visitante abandonou o parque +STR_5601 :O visitante fixo cola para unha atracción +STR_5602 :O visitante subiu a unha atracción +STR_5603 :O visitante saíu da atracción +STR_5604 :O visitante comprou algo +STR_5605 :O visitante utilizou unha instalación +STR_5606 :O visitante morreu +STR_5607 :Eliminar forzosamente o elemento seleccionado do mapa. +STR_5608 :BH +STR_5609 :CH +STR_5610 :Eliminar do mapa o elemento seleccionado. Isto obriga á eliminación, polo que non se devolverá o custo deste artigo. Use isto con precaución. +STR_5611 :G +STR_5612 :Bandeira pantasma +STR_5613 :B +STR_5614 :bandeira rota +STR_5615 :L +STR_5616 :Último elemento para a bandeira da casa. +STR_5617 :Mover os elementos seleccionados arriba. +STR_5618 :Mover os elementos seleccionados abaixo. +STR_5619 :RollerCoaster Tycoon +STR_5620 :Atraccións engadidas +STR_5621 :Paisaxes Loopy +STR_5622 :RollerCoaster Tycoon 2 +STR_5623 :Wacky Worlds +STR_5624 :Time Twister +STR_5625 :Parques "Reais". +STR_5626 :Outros parques +STR_5627 :Lista de escenarios de grupo: +STR_5628 :xogo orixinal +STR_5629 :Nivel de dificultade +STR_5630 :activa o desbloqueo progresivo +STR_5631 :DLC de parques orixinais +STR_5632 :Constrúe o teu propio... +STR_5633 :CMD + +STR_5634 :OPCIÓN + +STR_5635 :{WINDOW_COLOUR_2}Diñeiro gastado: {BLACK}{CURRENCY2DP} +STR_5636 :{WINDOW_COLOUR_2}Total de accións: {BLACK}{COMMA16} +STR_5637 :Non podes facelo... +STR_5638 :Permiso denegado +STR_5639 :Mostrar a lista de xogadores +STR_5640 :Xestionar grupos +STR_5641 :Grupo predeterminado: +STR_5642 :Grupo +STR_5643 :Engadir grupo +STR_5644 :Eliminar grupo +STR_5645 :Chat +STR_5646 :Axustar o terreo +STR_5647 :alternar a pausa +STR_5648 :Axustar a auga +STR_5649 :Crear atracción +STR_5650 :Demoler atracción +STR_5651 :Construír atracción +STR_5652 :Editar atracción +STR_5653 :Escenarios +STR_5654 :Rutas +STR_5655 :Xestionar convidados +STR_5656 :Xestionar empregados +STR_5657 :prop. do parque +STR_5658 :Finanzas +STR_5659 :Expulsar o reprodutor +STR_5660 :Editar grupos +STR_5661 :Cambiar grupos +STR_5662 :Ningún +STR_5663 :Paisaxe limpa +STR_5664 :Usa trucos +STR_5665 :Colocación de escenarios múltiples +STR_5666 :Iniciar sesión sen contrasinal +STR_5701 :{WINDOW_COLOUR_2}Última acción: {BLACK}{STRINGID} +STR_5702 :Vai á última acción do xogador. +STR_5703 :Non podes expulsar ao anfitrión. +STR_5704 :Última acción +STR_5705 :Non se pode cambiar a este grupo. +STR_5706 :Non se pode eliminar o grupo, hai xogadores nel. +STR_5707 :Este grupo non se pode modificar. +STR_5708 :Non se pode cambiar o grupo de anfitrión +STR_5709 :Cambiar o nome do grupo +STR_5710 :Nome do grupo +STR_5711 :Introduza o novo nome para este grupo: +STR_5712 :Non podes modificar o permiso que non tes +STR_5713 :Expulsar o reprodutor +STR_5714 :Opcións da xanela +STR_5715 :xogo novo +STR_5716 :Non se permite no modo multixogador +# For identifying client network version in server list window +STR_5717 :Versión do software: {STRING} +STR_5718 :Versión de software: {STRING} +STR_5719 :Soleado +STR_5720 :Parc. Nubrado +STR_5721 :Nubrado +STR_5722 :Choiva lixeira +STR_5723 :Choiva +STR_5724 :Tempestada +STR_5725 :{BLACK}Cambia o tempo a: +STR_5726 :Establece o tempo actual no parque +# tooltip for tab in options window +STR_5734 :Renderizado +STR_5735 :Estado da rede +STR_5736 :Xogador +STR_5737 :Pechado, {COMMA16} persoa na atracción +STR_5738 :Pechado, {COMMA16} persoas na atracción +STR_5739 :{WINDOW_COLOUR_2}Visitantes da atracción: {BLACK}{COMMA16} +STR_5740 :campañas de mercadotecnia infinitas +STR_5741 :As campañas de mercadotecnia nunca rematan. +STR_5742 :Autenticando... +STR_5743 :Conectando... +STR_5744 :Resolvendo… +STR_5745 :Dessincronización detectada +STR_5746 :Fóra de liña +STR_5747 :Fóra de liña: {STRING} +STR_5748 :Expulsado +STR_5749 :Saia do servidor! +STR_5750 :conexión pechada +STR_5751 :Sen datos +STR_5752 :{OUTLINE}{RED}{STRING} desconectouse +STR_5753 :{OUTLINE}{RED}{STRING} desconectouse ({STRING}) +STR_5754 :Nome do xogador incorrecto +STR_5755 :Versión de software incorrecta (versión do servidor {STRING}) +STR_5756 :Contrasinal incorrecto +STR_5757 :Servidor cheo +STR_5758 :{OUTLINE}{GREEN}{STRING} uniuse ao xogo +STR_5759 :Descargando mapa… +STR_5760 :Dólar de Hong Kong (HK$) +STR_5761 :Novo dólar taiwanés (NT$) +STR_5762 :Yuan chinés (CN¥) +STR_5763 :Todos os ficheiros +STR_5764 :Tipo de atracción non válido +STR_5765 :Non se pode editar unha atracción dun tipo non válido +STR_5766 :Florín húngaro (Ft) +STR_5767 :Ingresos +STR_5768 :Clientes totais +STR_5769 :Beneficio total +STR_5770 :Clientes por hora +STR_5771 :Custo de operación +STR_5772 :Idade +STR_5773 :Clientes totais: {COMMA32} +STR_5774 :Beneficio total: {CURRENCY2DP} +STR_5775 :Clientes: {COMMA32} por hora +STR_5776 :Construído: Este ano +STR_5777 :Construción: o ano pasado +STR_5778 :Construído: hai {COMMA16} anos +STR_5779 :Ingresos: {CURRENCY2DP} por hora +STR_5780 :Custo: {CURRENCY2DP} por hora +STR_5781 :Custo: descoñecido +STR_5782 :Agora estás conectado. Preme "{STRING}" para chatear. +STR_5783 :{WINDOW_COLOUR_2}Escenario bloqueado +STR_5784 :{BLACK}Completa os escenarios anteriores para desbloquear este escenario. +STR_5785 :Non podes cambiar o nome do grupo... +STR_5786 :O nome do grupo non é válido +STR_5787 :{COMMA32} xogadores en liña. +STR_5788 :Intervalo Inspección predeterminado: +STR_5789 :Desactivar o efecto de raios +STR_5790 :Cambia ao estilo de prezo como en RCT1{NEWLINE}(Con este truco pódense editar tanto o prezo da entrada ao parque como o prezo dunha atracción). +STR_5791 :Establece a fiabilidade da viaxe ao 100 % e restablece a data de construción a "este ano". +STR_5792 :Amaña todas as atracions rotas. +STR_5793 :Restablece o historial de accidentes dunha atracción, polo que os visitantes non se queixarán se non é seguro. +STR_5794 :Algúns escenarios desactivan a edición de atraccións que xa están no parque. Este truco elimina esta restrición. +STR_5795 :Os visitantes percorrerán calquera atracción independentemente de que a intensidade sexa extremadamente alta. +STR_5796 :Obriga a abrir ou pechar as entradas do parque. +STR_5797 :Desactiva o cambio de clima e mantén o clima seleccionado. +STR_5798 :Permite crear accións en modo de pausa. +STR_5799 :Desactiva as avarías e os accidentes por avaría dos freos. +STR_5800 :Evita que as atraccións se avarien. +STR_5801 :Desactivar o lixo +STR_5802 :Evita que os visitantes boten lixo ou vómitos nos camiños. +STR_5803 :Xira o elemento do mapa seleccionado. +STR_5804 :Silenciar o son +STR_5805 :Se selecciona o teu servidor engadirase á lista de servidores públicos onde calquera pode atopar o teu servidor. +STR_5806 :alternar o modo de pantalla completa +STR_5807 :{WINDOW_COLOUR_2}Número de atraccións/atraccións: {BLACK}{COMMA16} +STR_5808 :{WINDOW_COLOUR_2}Número de tendas e postos de venda: {BLACK}{COMMA16} +STR_5809 :{WINDOW_COLOUR_2}Número de quioscos e outras instalacións: {BLACK}{COMMA16} +STR_5810 :Desactivar o límite de vehículos +STR_5811 :Se está activado, podes ter ata 255 coches por tren e 31 trens por atracción. +STR_5812 :Mostrar a xanela multixogador +STR_5813 :“{STRING}” +STR_5814 :{WINDOW_COLOUR_1}“{STRING}” + +#tooltips +STR_5815 :Mostra a cantidade de FPS no xogo. +STR_5816 :Configura a escala da IU.{NEWLINE}Adoita ser útil cando se xoga en pantallas de alta resolución. +STR_5819 :[Requírese renderización de hardware]{NEWLINE}Pausa o xogo se Steam se superpón durante o xogo. +STR_5820 : Minimiza o xogo se se perde o foco no modo de pantalla completa. +STR_5822 :Activa os ciclos de día e de noite.{NEWLINE}Un ciclo completo leva un mes no xogo. +STR_5823 :Mostra o texto do signo en maiúsculas (como en RCT1) +STR_5824 :Desactiva os raios durante unha treboada. +STR_5825 :Manteña o punteiro do rato na xanela. +STR_5826 :Inverte o desprazamento dereito do rato. +STR_5827 :Establece o esquema de cores (tema) usado para a interface. +STR_5828 :Cambia o formato utilizado para medir distancias, velocidades, etc. +STR_5829 :Cambia o formato utilizado na moeda. Isto é só visual, o tipo de cambio non se calcula. +STR_5830 :Cambia o idioma do xogo. +STR_5831 :Cambia o formato mostrado para a temperatura. +STR_5832 :Mostrar marcas de altura con{NEWLINE}valores relativos{NEWLINE}(+1, +2, +3, etc.){NEWLINE}ou con valores reais{NEWLINE}(1m, 5m, 10m, etc.). +STR_5833 :Cambia o formato de data que se utilizará no xogo. +STR_5834 :Selecciona o dispositivo de son que debería usar OpenRCT2. +STR_5835 :Desactiva o xogo se a xanela perde o foco. +STR_5836 :Selecciona a música utilizada no menú principal.{NEWLINE}Para seleccionar o tema RCT1 é necesario configurar o camiño para RCT1 nas Opcións avanzadas. +STR_5837 :Crea e xestiona os teus temas de interface personalizados. +STR_5838 :Mostra un botón separado para as finanzas na barra de ferramentas superior. +STR_5839 :Mostra un botón separado para investigación e desenvolvemento na barra de ferramentas superior. +STR_5840 :Mostrar un botón separado para trampas na barra de ferramentas superior. +STR_5841 :Mostrar un botón separado para as mensaxes recentes na barra de ferramentas superior. +STR_5842 :Ordena as pestanas de escenarios pola súa dificultade (como en RCT2) ou pola súa orixe (como en RCT1) +STR_5843 :Activar o desbloqueo progresivo de escenarios (como en RCT1) +STR_5844 :Permanece conectado no servidor multixogador aínda que se produza un erro de desincronización. +STR_5845 :Engade un botón para ferramentas de depuración á barra de ferramentas superior. Isto permite que o atallo de teclado abra a consola de desenvolvemento. +STR_5846 :Establece a frecuencia coa que OpenRCT2 garda automaticamente o xogo. +STR_5847 :Selecciona a secuencia de aparcadoiro utilizada no menú principal. As secuencias RCT1/RCT2 requiren importar os escenarios para funcionar. +STR_5849 :Colocar automaticamente novos empregados contratados. +STR_5851 :Establece o tempo de inspección predeterminado para as novas atraccións. +STR_5853 :Activar/Desactivar efectos de son. +STR_5854 :Activar/Desactivar a música da atracción. +STR_5855 :Establece o modo de pantalla completa, con fiestras ou sen bordes. +STR_5856 :Establece a resolución do xogo utilizada no modo de pantalla completa. +STR_5857 :Opcións de xogo +STR_5858 :Utiliza a GPU para a visualización en lugar da CPU. Isto mellora a compatibilidade do software para a captura de capturas de pantalla. Isto pode ralentizar lixeiramente o rendemento do xogo. +STR_5859 :Permite a interpolación de {NEWLINE} FPS (fotogramas por segundo) para un xogo visualmente máis fluido. Se está desactivado, o xogo executarase a un máximo de 40 FPS. +STR_5860 :Cambio debuxado mediante orixinal/descomp. +STR_5861 :Fallou a verificación da chave. +STR_5862 :Bloquear xogadores descoñecidos. +STR_5863 :Só os xogadores con contrasinais coñecidos poden unirse. +STR_5864 :Só están permitidos os xogadores da lista branca. +STR_5865 :gravar o historial de conversas. +STR_5866 :Rexistra todo o historial de conversas nos ficheiros do teu cartafol de usuario. +STR_5867 :{WINDOW_COLOUR_2}Nome do provedor: {BLACK}{STRING} +STR_5868 :{WINDOW_COLOUR_2}Correo electrónico do provedor: {BLACK}{STRING} +STR_5869 :{WINDOW_COLOUR_2}Sitio web do provedor: {BLACK}{STRING} +STR_5870 :Mostrar información do servidor. +STR_5871 :As plantas non se murchan +STR_5872 :Evita que as plantas se marchiten se non se regan. +STR_5873 :Cadea de elevación completa +STR_5874 :Permite colocar unha cadea de elevación en calquera parte do camiño. +STR_5875 :Motor de debuxo: +STR_5876 :O software a usar para debuxar o xogo. +STR_5877 :Software +STR_5878 :Software (a través de hardware) +STR_5879 :OpenGL (experimental) +STR_5880 :Só seleccionado +STR_5881 :Só Non seleccionado +STR_5882 :Moeda personalizada +STR_5883 :Configuración de moeda personalizada +STR_5884 :{WINDOW_COLOUR_2}Taxa de cambio: +STR_5885  :{WINDOW_COLOUR_2}é equivalente a {COMMA32} libras (£) +STR_5886 :{WINDOW_COLOUR_2}Símbolo monetario: +STR_5887 :Prefixo +STR_5888 :Sufixo +STR_5889 :Símbolo de moeda personalizado +STR_5890 :Introduce o símbolo de moeda personalizado +STR_5891 :predeterminado +STR_5892 :Ir ao cartafol predeterminado. +STR_5893 :Taxa de cambio +STR_5894 :Introduza o tipo de cambio +STR_5895 :Gardar o deseño da pista +STR_5896 :Fallou o gardar o deseño da pista! +STR_5898 :{BLACK}Non se puido cargar o deseño da pista:{NEWLINE}O ficheiro parece estar corrupto, danado ou non existe. +STR_5899 :Alternar ventilación. depuración da pintura +STR_5900 :Utiliza o código de debuxo orixinal +STR_5901 :Mostrar alturas dos segmentos +STR_5902 :Mostrar caixas delimitadoras +STR_5903 :Mostrar a xanela de depuración da pintura +STR_5904 :Restablecer data +STR_5905 :Unha ferramenta de xeración de mapas que crea automaticamente unha paisaxe personalizada. +STR_5906 :Acerca a posición do cursor +STR_5907 :Cando está activado, o zoom centrarase no cursor en lugar do centro da pantalla. +STR_5908 :Permitir cambios arbitrarios do tipo de pista +STR_5909 :Permíteche cambiar libremente o tipo de pista dunha atracción. Pode provocar un accidente. +STR_5910 :Solicitar +STR_5911 :Vista a través de sendeiros +STR_5912 :Alternar a vista a través das rutas +STR_5913 :Chat +STR_5914 :Atracción descoñecida +STR_5915 :Xogador +STR_5916 :{COMMA16} xogador +STR_5917  :{COMMA16} xogadores +STR_5918 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} +STR_5919  :{COMMA16} +STR_5920 :Efectos do tempo +STR_5921 :se está activado, as cores escuras e a choiva mostraranse durante unha tormenta +STR_5922  :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}Máx. {STRINGID} +STR_5923 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}Máx. {COMMA16} {STRINGID} por tren +STR_5924 :Detalles da superficie +STR_5925 :Detalles da ruta +STR_5926 :Detalles da estrada +STR_5927 :Detalles do escenario +STR_5928 :Detalles da entrada +STR_5929 :Detalles do muro +STR_5930 :Detalles da etapa grande +STR_5931 :Detalles da bandeira +STR_5932 :Detalles do elemento corrompido +STR_5933 :Propiedades +STR_5934 :Textura do terreo: {BLACK}{STRINGID} +STR_5935 :Bordo do terreo: {BLACK}{STRINGID} +STR_5936 :Propietario do terreo: {BLACK}{STRINGID} +STR_5937 :Sen propiedade e non á venda +STR_5938 :Nivel da auga: {BLACK}{COMMA16} +STR_5939 :Eliminar valados do parque +STR_5940 :Restaurar os valados do parque +STR_5941 :Altura da base: +STR_5942 :Nome da ruta: {BLACK}{STRINGID} +STR_5943 :Adicións: {BLACK}{STRINGID} +STR_5944 :Adicións: {BLACK}Nada +STR_5945 :Bordes conectados: +STR_5946 :Tipo de atracción: {BLACK}{STRINGID} +STR_5947 :ID da atracción: {BLACK}{COMMA16} +STR_5948 :Nome da atracción: {BLACK}{STRINGID} +STR_5949 :Elevador de cadea +STR_5950 :Aplicar cambios a toda a ruta +STR_5951 :ID da peza da pista: {BLACK}{COMMA16} +STR_5952 :Número de secuencia: {BLACK}{COMMA16} +STR_5953 :Ordena os elementos do mapa na casa actual en función da súa altura base. +STR_5954 :Idade do paisaxe: {BLACK}{COMMA16} +STR_5955 :Colocación do cuadrante: {BLACK}{STRINGID} +STR_5956 :Suroeste +STR_5957 :Noroeste +STR_5958 :Noreste +STR_5959 :Sureste +STR_5960 :Colocación do cuadrante: +STR_5961 :Índice de entrada: {BLACK}{COMMA16} +STR_5962 :Detección de colisións: +STR_5963 :Esquinas elevadas: +STR_5964 :Diagonal +STR_5965 :Tipo de entrada: {BLACK}{STRINGID} +STR_5966 :Parte da entrada ao parque: {BLACK}{STRINGID} +STR_5967 :Medio +STR_5968 :á esquerda +STR_5969 :dereita +STR_5970 :Entrada de ID: {BLACK}{COMMA16} +STR_5971 :ID Saída: {BLACK}{COMMA16} +STR_5972 :ID da atracción: {BLACK}{COMMA16} +STR_5973 :Anexo ao seguinte +STR_5974 :Cambia a base e a altura libre para que sexa o mesmo que o seguinte elemento do cadrado actual. Isto fai que sexa máis fácil construír nesta cuadrícula. +STR_5975 :Pendente: +STR_5976 :Avión +STR_5977 :Lado dereito cara arriba +STR_5978 :Lado esquerdo cara arriba +STR_5979 :Tipo de parede: {BLACK}{COMMA16} +STR_5980 :Texto da marca: {BLACK}{STRINGID} +STR_5981 :Non é unha bandeira +STR_5982 :Tipo de escenario grande: {BLACK}{COMMA16} +STR_5983 :ID da peza teatral grande: {BLACK}{COMMA16} +STR_5984 :Camiños bloqueados: +STR_5985 :Cartafol novo +STR_5986 :Escribe o nome do novo cartafol +STR_5987 :Non se puido crear o cartafol +STR_5988 :Non hai máis terreos á venda. +STR_5989 :Non hai máis dereitos de construción á venda. +STR_5990 :Non hai máis terreos nin dereitos de construción á venda. +STR_5991 :Non se pode pegar o elemento... +STR_5992 :Alcanzouse o límite de elementos do mapa +STR_5993 :Copiar o elemento seleccionado +STR_5994 :Pegar o elemento copiado +STR_5995 :Acelerador +STR_5996 :Velocidade do acelerador +STR_5997 :Engadir/Establecer diñeiro +STR_5998 :Engadir diñeiro +STR_5999 :Axustar diñeiro +STR_6000 :Introduce un valor novo +STR_6001 :Efectos de iluminación (experimental) +STR_6002 :As lámpadas e as atraccións acenderanse pola noite.{NEWLINE}Require que o motor de renderizado estea configurado no modo "mediante hardware". +STR_6003 :Vista recortada +STR_6004 :Vista recortada +STR_6005 :Activar a vista recortada +STR_6006 :A vista illada só mostrará elementos iguais ou inferiores á altura do corte vertical e dentro do sector horizontal da área seleccionada +STR_6007 :Altura de corte +STR_6008 :fai clic para alternar entre o valor bruto e o valor en unidades de medida. +STR_6009 :Seleccione a altura de corte +STR_6010 :{COMMA2DP32}m +STR_6011  :{COMMA1DP16} pés +STR_6012  :{COMMA1DP16} +STR_6013 :Os visitantes só pagarán a entrada e os servizos ao parque.{NEWLINE}A entrada ás atraccións é gratuíta. +STR_6014 :Os visitantes só pagarán a entrada a atraccións e servizos.{NEWLINE}Os visitantes non pagan por entrar no parque. +STR_6015 :Inclinado +STR_6016 :Modificar casa (cuadrícula) +STR_6017 :Disminuia a velocidade +STR_6018 :Construción - Curva Esquerda +STR_6019 :Construción - Curva dereita +STR_6020 :Construción - Usar a ruta predeterminada +STR_6021 :Construción - Pendente Descendente +STR_6022 :Construción - Pendente ascendente +STR_6023 :Construción - Activar/desactivar elevador de cadea +STR_6024 :Construír - Pendente á esquerda +STR_6025 :Construción - Pendente á dereita +STR_6026 :Construción - Peza anterior +STR_6027 :Construción - Peza seguinte +STR_6028 :Construción - Construír o actual +STR_6029 :Construción - Demoler o actual +STR_6030 :Selector de escenarios. Fai clic en calquera escenario do mapa para construílo. +STR_6031 :Descrición do servidor: +STR_6032 :Msx. de acollida: +STR_6033 :RCT1 Ruta de instalación: +STR_6034  :{BLACK}{STRING} +STR_6035 :seleccione o cartafol RCT1 +STR_6036 :Eliminar +STR_6037 :Seleccione un cartafol válido cunha instalación RCT1 +STR_6038 :Se tes unha instalación RCT1, configura esta opción no cartafol de instalación para cargar os escenarios, a música, etc. +STR_6039 :Demoler a atracción rapidamente +STR_6040 :Editar opcións do escenario +STR_6041 :{BLACK}Non hai mecánicos contratados! +STR_6042 :Cargar mapa de altura +STR_6043 :Seleccionar mapa de altura +STR_6044 :Mapa de altura suave +STR_6045 :Intensidade +STR_6046 :Normalizar o mapa de altura +STR_6047 :Reixa lisa +STR_6048 :Erro no mapa de altura +STR_6049 :Produciuse un erro ao ler PNG +STR_6050 :Produciuse un erro ao ler o mapa de bits +STR_6052 :O mapa de altura é demasiado grande, recortarase. +STR_6053 :O mapa de altura non se pode normalizar. +STR_6054 :Só se admiten mapas de bits de 24 bits +STR_6055 :Mapa de altura OpenRCT2 +STR_6056 :Acalar +STR_6057 :Mostrar un botón separado para a opción "Acalar" na barra de ferramentas. +STR_6058 :Acalar +STR_6059 :» +STR_6060 :Mostrar as compras dos visitantes con animación +STR_6061 :Mostra un efecto de diñeiro animado{NEWLINE}cando os visitantes fan compras. +STR_6062 :{OUTLINE}{GREEN}+ {CURRENCY2DP} +STR_6063 :{OUTLINE}{RED}- {CURRENCY2DP} +STR_6064 :Adquirir o mapa completo +STR_6065 :Gravar as accións do usuario. +STR_6066 :Rexistra todas as accións do usuario nos ficheiros do teu directorio de usuarios. +STR_6067 :Servidor iniciado. +STR_6068 :Servidor apagado. +STR_6069 :{STRING} expulsou do servidor {STRING}. +STR_6070 :{STRING} estableceu {STRING} no grupo "{STRING}". +STR_6071 :{STRING} creou un novo grupo "{STRING}". +STR_6072 :{STRING} eliminou o grupo "{STRING}". +STR_6073 :{STRING} editou os permisos do grupo "{STRING}". +STR_6074 :{STRING} cambiou o nome do grupo de "{STRING}" a "{STRING}". +STR_6075 :{STRING} cambiou o grupo predeterminado a "{STRING}". +STR_6076  :{STRING} usou/activou o truco ‘{STRING}’. +STR_6077 :Engadir cartos +STR_6078 :{STRING} creou a atracción ‘{STRING}’. +STR_6079 :{STRING} atracción demolida ‘{STRING}’. +STR_6080 :{STRING} cambiou a aparencia da atracción ‘{STRING}’. +STR_6081 :{STRING} cambiou o estado da atracción ‘{STRING}’ a pechado. +STR_6082 :{STRING} cambiou o estado da atracción ‘{STRING}’ a aberta. +STR_6083 :{STRING} cambiou o estado da atracción ‘{STRING}’ a proba. +STR_6084 :{STRING} cambiou as configuracións dos vehículos da atracción ‘{STRING}’. +STR_6085 :{STRING} cambiou a configuración da atracción ‘{STRING}’. +STR_6086 :{STRING} cambiou o nome da atracción ‘{STRING}’ a ‘{STRING}’. +STR_6087  :{STRING} cambiou o custo da atracción ‘{STRING}’ a {STRING} +STR_6088  :{STRING} cambiou o custo secundario da atracción ‘{STRING}’ a {STRING} +STR_6089 :{STRING} cambiou o nome do parque de "{STRING}" a "{STRING}". +STR_6090 :{STRING} abriu o parque. +STR_6091 :{STRING} pechou o parque. +STR_6092 :o prezo do billete de {STRING} cambiou a {STRING} +STR_6093 :{STRING} puxo un novo escenario. +STR_6094 :{STRING} escenario eliminado. +STR_6095 :{STRING} escenario editado. +STR_6096 :{STRING} estableceu o nome do sinal en "{STRING}". +STR_6097 :{STRING} colocou unha peza da pista da atracción ‘{STRING}’. +STR_6098 :{STRING} eliminou unha parte da atracción. +STR_6099 :Conectácheste ao servidor. +STR_6100 :Desconectacheste do servidor. +STR_6101 :As atraccións non diminúen de valor. +STR_6102 :O valor dunha atracción non diminúe co paso do tempo, polo que os visitantes non pensarán que unha atracción é demasiado cara. +STR_6103 :Esta opción está desactivada durante unha partida multixogador. +STR_6105 :Hiper montaña rusa +STR_6107 :Camións Monstro +STR_6109 :Hyper-Twister +STR_6111 :Mini montaña rusa clásica +STR_6113 :Unha montaña rusa alta e non invertible con grandes caídas, coches de alta velocidade e cómodos con só unhas poucas barras para agarrarse +STR_6115 :Camións 4x4 autopropulsados ​​xigantes que poden escalar outeiros impresionantes +STR_6116 :Montaña rusa ancha sobre vías de aceiro que realiza varias inversións +STR_6119 :Unha montaña rusa barata e fácil de construír, pero cunha altura limitada. +STR_6120 :{BABYBLUE}Vehículo novo dispoñible agora para {STRINGID}:{NEWLINE}{STRINGID} +STR_6121 :Estende os dereitos de construción do parque aos bordos do mapa. +STR_6122 :Non hai suficientes montañas rusas neste escenario! +STR_6123 :Produciuse un erro ao cargar obxectos para o Parque +STR_6124 :Nome do obxecto +STR_6125 :Tipo de obxecto +STR_6126 :Tipo descoñecido +STR_6127 :Ficheiro: {STRING} +STR_6128 :Non se pode cargar o ficheiro porque faltan ou están corruptos algúns dos obxectos aos que se fai referencia. Móstrase unha lista destes obxectos: +STR_6129 :Copia +STR_6130 :Copiar todo +STR_6131 :Orixe +STR_6132 :Ignorar o estado da investigación +STR_6133 :Accede a atraccións e escenarios que aínda non foron inventados +STR_6134 :Limpar etapa +STR_6135 :O cliente enviou unha solicitude non válida +STR_6136 :O servidor enviou unha solicitude non válida +STR_6137 :OpenRCT2, xogo de código aberto que recrea e amplía Roller Coaster Tycoon 2. +STR_6138 :OpenRCT2 é obra de moitos autores, pódese atopar unha lista completa a través do botón "Colaboradores". Para obter máis información, visite: http://github.com/OpenRCT2/OpenRCT2 +STR_6139 :Todos os nomes de produtos e empresas son propiedade dos seus respectivos propietarios. O uso deles non implica ningunha afiliación nin aval por eles. +STR_6140 :Rexistro de cambios... +STR_6141 : Barra de ferramentas inferior RCT1 +STR_6142 :{WINDOW_COLOUR_2}Nome da ruta: {BLACK}{STRING} +STR_6143 :{WINDOW_COLOUR_2}Tipo de atracción: {BLACK}{STRINGID} +STR_6144 :Mostrar o redeseño +STR_6145 :Establece o límite de velocidade para os impulsores +STR_6146 :Activar todas as pezas de pista que se poden debuxar +STR_6147 :Activa todas as pezas de pista para as que o tipo de paseo é apto na xanela de construción, independentemente de que o vehículo sexa compatible. +STR_6148 :Conectándose ao servidor principal... +STR_6149 :Non se puido conectar ao servidor mestre +STR_6150 :resposta non válida do servidor mestre (sen número JSON) +STR_6151 :O servidor mestre non devolveu a Lista de servidores +STR_6152 :resposta non válida do servidor mestre (sen matriz JSON) +STR_6153 :Pago por entrada / Pago por atracción +STR_6154 :Por motivos de seguridade, non se recomenda iniciar OpenRCT2 con privilexios elevados. +STR_6155 :Nin KDialog nin Zenity están instalados. Instala un ou configura un desde a liña de comandos. +STR_6156 :O nome está reservado +STR_6157 :Consola +STR_6160 :{WINDOW_COLOUR_2}Vehículos dispoñibles: {BLACK}{STRING} +STR_6161 :Alterar liñas de grade +STR_6162 :Rato xiratorio salvaxe +STR_6163 :os coches con forma de rato realizan xiros pronunciados e descensos curtos, mentres xiran suavemente para desorientar aos pasaxeiros. +STR_6164 :{BRANCO}❌ +STR_6165 :Utiliza a sincronización vertical +STR_6166 :Sincroniza cada fotograma mostrado coa frecuencia de actualización do monitor, evitando a imaxe distorsionada. +STR_6167 :Avanzado +STR_6168 :Secuencia da pantalla de inicio +STR_6169 :Selección de escenario +STR_6170 :Configuración da interface +STR_6171 :Buscar +STR_6172 :Buscar +STR_6173 :Introduza o nome para buscar: +STR_6188 :Vómitos +STR_6189 :Pato +STR_6191 :Superficie +STR_6192 :Muro +STR_6193 :{COMMA16} convidado +STR_6194  :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA16} convidado +STR_6195  :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA16} convidado +STR_6196 :{BLACK}Ano: +STR_6197 :{BLACK}Mes: +STR_6198 :{BLACK}Día: +STR_6199 :Establecer data +STR_6200 :Restablecer data +STR_6201  :{MONTH} +STR_6202 :Estilo de piso virtual: +STR_6203 :Se está activado, renderase un piso virtual mantendo mantendo CTRL ou MAIÚS para facilitar a colocación vertical dos elementos. +STR_6215 :Construción +STR_6216 :Operación +STR_6217 :Dispoñibilidade de atraccións/pistas +STR_6218 :OpenRCT2 Oficial +STR_6219 :Destaque os problemas de busca de rutas +STR_6220 :Facer utilizable +STR_6221 :Isto establecerá a saída ou entrada coñecida da atracción na caixa seleccionada. Só se pode utilizar unha entrada e unha saída por estación. +STR_6222 :Non podes colocar aquí entrada de visitante... +STR_6223 :Debe estar fóra dos límites do parque! +STR_6224 :{STRING} colocouse un punto de entrada de visitante +STR_6225 :Non é compatible co renderizador OpenGL +STR_6226 :Activar a vitoria anticipada. +STR_6227 :fai que o escenario se remate se todos os obxectivos se cumpren antes da data que desencadea a condición de vitoria. +STR_6228 :Opcións de escenario. +STR_6229 :{WINDOW_COLOUR_2}{STRINGID}: {STRINGID} +STR_6230 :{BLACK}{STRINGID}: +STR_6231 :{WINDOW_COLOUR_2}{STRINGID}: {MOVE_X}{185}{STRINGID} +STR_6232 :Conxelado +STR_6233 :Vista illada +STR_6234 :Destaque os problemas de busca de rutas +STR_6235 :Información do servidor +STR_6236 :Xogadores +STR_6237 :Grupos +STR_6238 :Opcións multixogador +STR_6239 :Corte Vertical +STR_6240 :Corte Horizontal +STR_6241 :Seleccionar área +STR_6242 :Borrar selección +STR_6243 :Renova a atracción, {NEWLINE} déixaa como nova! +STR_6244 :Non se pode renovar +STR_6245 :a atracción non necesita renovación +STR_6246 :Renovar +STR_6247 :Renovar a atracción +STR_6248 :{WINDOW_COLOUR_1}Queres renovar {STRINGID} por {CURRENCY}? +STR_6249 :{WINDOW_COLOUR_1}Queres renovar {STRINGID}? +STR_6250 :{WINDOW_COLOUR_1}Estás seguro de que queres demoler {STRINGID} e gañar {CURRENCY}? +STR_6251 :A atracción aínda non está baleira +STR_6255 :URL non válido. +STR_6256 :Efectos ao renderizar +STR_6257 :Translúcido +STR_6258 :Transparente +STR_6259 :Desactivado +STR_6260 :Mostrar caixas bloqueadas +STR_6261 :Mostrar camiños anchos +STR_6262 :Volum principal +STR_6263 :Activa ou desactiva todos os sons +STR_6264 :Utiliza sempre o explorador de ficheiros do sistema +STR_6265 :Cando estea activado, empregarase o explorador de ficheiros do SO en lugar de OpenRCT2. +STR_6266 :Abrir cartafol de contido personalizado +STR_6267 :Inspector de rede aberta +STR_6268 :Adiantar un tick +STR_6269 :ID meteorolóxico non válido +STR_6270 :Superficies terrestres +STR_6271 :Marxes terrestres +STR_6272 :Temporadas +STR_6273 :Música +STR_6274 :Non se poden definir cores... +STR_6275 :{WINDOW_COLOUR_2}Estilo da estación: +STR_6276 :{RED}{STRINGID} ten visitantes atascados, posiblemente debido a un tipo de atracción ou modo de funcionamento non válidos. +STR_6277 :Índice da estación: {BLACK}{STRINGID} +STR_6278 :Número de gardados automáticos +STR_6279 :Número de ficheiros gardados automaticamente a manter +STR_6280 :Chat +STR_6281 :Mostrar un botón de chat separado na barra de ferramentas +STR_6282 :Chat +STR_6283 :Chat non dispoñible ¿Estás conectado a un servidor? +STR_6293 :B +STR_6294 :KiB +STR_6295 :MiB +STR_6296 :GiB +STR_6297 :TiB +STR_6298  :{STRING}/s +STR_6299 :Descargar todo +STR_6300 :Descarga todos os obxectos que faltan se está dispoñible en liña. +STR_6301 :Copia o nome do obxecto seleccionado no portapapeis. +STR_6302 :Copia toda a lista de obxectos que faltan no portapapeis. +STR_6303 :Descargando obxecto ({COMMA16} / {COMMA16}): [{STRING}] +STR_6304 :Abrir o selector de escenarios +STR_6305 :Multithreading +STR_6306 :A opción experimental para usar varios núcleos na representación pode ser inestable. +STR_6307 :Esquema de cores: {BLACK}{STRINGID} +STR_6308 :{TOPAZ}“{STRINGID}{OUTLINE}{TOPAZ}”{NEWLINE}{STRINGID} +STR_6309 :Volver conectar +STR_6310 :{WINDOW_COLOUR_2}Posición: {BLACK}{INT32} {INT32} {INT32} +STR_6311 :{WINDOW_COLOUR_2}Seguinte: {BLACK}{INT32} {INT32} {INT32} +STR_6312 :(superficie) +STR_6313 :(rexeitar {INT32}) +STR_6314 :{WINDOW_COLOUR_2}Destino: {BLACK}{INT32}, {INT32} tolerancia {INT32} +STR_6315 :{WINDOW_COLOUR_2}Destino de busca de ruta: {BLACK}{INT32}, {INT32}, {INT32} dir {INT32} +STR_6316 :{WINDOW_COLOUR_2}Historial de rutas: +STR_6317 :{BLACK}{INT32}, {INT32}, {INT32} dir {INT32} +STR_6318 :Dessincronización detectada.{NEWLINE}Rexistro: {STRING} +STR_6319 :Bloque de freado pechado +STR_6320 :Indestructible +STR_6321 :o agregado está roto +STR_6322 :{WINDOW_COLOUR_2}ID da entidade: {BLACK}{INT32} +STR_6323 :Simulando +STR_6324 :Simular +STR_6325 :Simular atracción +STR_6326 :Non se pode simular {STRINGID}... +STR_6327 :Fondo transparente para capturas de pantalla xigantes +STR_6328 :Con esta opción activada, as capturas de pantalla xigantes terán un fondo transparente en lugar do fondo negro predeterminado. +STR_6329 :{STRING}{STRINGID} +STR_6330 :Descargando [{STRING}] desde {STRING} ({COMMA16} / {COMMA16}) +STR_6331 :Crear parrulos +STR_6332 :Eliminar parrulos +STR_6333 :Aumenta o factor de escala +STR_6334 :Diminuír o factor de escala +STR_6336 :Grid Inspector: Copiar elemento +STR_6337 :Grid Inspector: Pegar elemento +STR_6338 :Grid Inspector: Eliminar elemento +STR_6339 :Grid Inspector: mover elemento cara arriba +STR_6340 :Grid Inspector: Mover elemento cara abaixo +STR_6341 :Grid Inspector: Aumenta a coordenada X +STR_6342 :Grid Inspector: Diminuír a coordenada X +STR_6343 :Grid Inspector: Aumenta a coordenada Y +STR_6344 :Grid Inspector: Diminuír a coordenada Y +STR_6345 :Grid Inspector: aumenta a altura do elemento +STR_6346 :Grid Inspector: Diminuír a altura do elemento +STR_6347 :Non se poden engadir pistas nos pasos a nivel! +STR_6348 :Elimina primeiro o paso a nivel! +STR_6349 :Secuencia de pantalla de inicio aleatoria +STR_6350 :Distribuír +STR_6351 :ferramenta de deseño de escenarios +STR_6352 :Densidade +STR_6353 :Baixa densidade +STR_6354 :Densidade media +STR_6355 :Alta densidade +STR_6356 :Crear parrulos se o parque ten auga +STR_6357 :Elimina todos os parrulos do mapa +STR_6358 :Páxina {UINT16} +STR_6359  :{POP16}{POP16}Páxina {UINT16} +STR_6361 :Efectos da luz nas atraccións (experimental) +STR_6362 :Se está activado, os vehículos das atraccións da pista iluminaranse pola noite. +STR_6363 :Copiar texto no portapapeis +STR_6364 :{RED}{COMMA16} persoa morreu nun accidente a bordo de {STRINGID} +STR_6365 :Mortes na atracción +STR_6366 :Vehículos atascados ou parados +STR_6367 :Cadro de animación: +STR_6368 :Por razóns de compatibilidade, non se recomenda executar OpenRCT2 sobre Wine. OpenRCT2 ten soporte nativo para macOS, Linux, FreeBSD e OpenBSD. +STR_6369 :Permitir construír a alturas non válidas +STR_6370 :Permíteche construír carrís e pezas en calquera rango de altura +STR_6371 :A ruta especificada contén unha instalación de RCT1, pero o ficheiro ‘csg1i.dat’ non existe. Este ficheiro NECESITA copiar do CD RCT Deluxe ou Loopy Landscapes ao cartafol "Datos" da instalación de RollerCoaster Tycoon 1 no seu disco duro. +STR_6372 :A ruta especificada contén unha instalación de RCT1, pero esta versión non é correcta. OpenRCT2 REQUIRE unha versión de RCT Deluxe ou Loopy Landscapes para poder usar os recursos de Roller Coaster Tycoon 1. +STR_6373 :Activar a comprobación de autorización +STR_6374 :G +STR_6375 :Viaxe descoñecida +STR_6376 :{WINDOW_COLOUR_2}Viaxe en vehículo:{NEWLINE}{BLACK}{STRINGID} para {STRINGID} +STR_6377 :{WINDOW_COLOUR_2}Tipo: {BLACK}{STRINGID} para {STRINGID} +STR_6378 :Recepción da lista de obxectos: +STR_6379 :Recibiron datos non válidos +STR_6380 :Actualización dispoñible! +STR_6381 :Únete ao OpenRCT2 Discord! +STR_6382 :Nova versión estable de OpenRCT2 dispoñible: {STRING}! +STR_6383 :Abrir páxina de descarga +STR_6384 :Neve +STR_6385 :Nevadas fortes +STR_6386 :Tempestade de neve +STR_6387 :Non se pode descargar o elemento aquí... +STR_6388 :Non se puido cargar o elemento aquí... +STR_6389 :Autorización non válida +STR_6390 :OpenRCT2 require os ficheiros orixinais do xogo RollerCoaster Tycoon 2 para executarse. Seleccione o directorio onde ten instalado RollerCoaster Tycoon 2. +STR_6391 :Escolle o teu directorio RCT2. +STR_6392 :Non se puido atopar {STRING} neste camiño. +STR_6393 :Selección de destino. +STR_6394 :Obxectivo +STR_6395 :Mantemento +STR_6396 :Desactivar o protector do monitor e o aforro de enerxía. +STR_6397 :Se está activado, o protector de pantalla e outras funcións de aforro de enerxía desactivaranse mentres OpenRCT2 estea aberto. +STR_6398 :O ficheiro contén atraccións incompatibles. Actualiza a unha versión máis recente de OpenRCT2. +STR_6399 :OpenRCT2 require ficheiros do xogo orixinal de RollerCoaster Tycoon 2 para executarse. Establece a variable ‘game_path’ en config.ini no directorio onde instalou RollerCoaster Tycoon 2 e reinicia OpenRCT2. +STR_6400 :Descarguei o instalador sen conexión de GOG, pero non está instalado. +STR_6401 :Xa instalei RollerCoaster Tycoon 2 +STR_6402 :Configuración de datos OpenRCT2 +STR_6403 :Escolle a opción que mellor se aplique a ti. +STR_6404 :Seleccione o instalador de RollerCoaster Tycoon 2 GOG. +STR_6405 :Escolle o instalador de GOG +STR_6406 :instalador de GOG RollerCoaster Tycoon 2 +STR_6407 :Pode tardar uns minutos. +STR_6408 :Instale ‘innoextract’ para extraer o instalador de GOG e despois reinicie OpenRCT2. +STR_6409 :O ficheiro seleccionado non é o instalador fóra de liña de GOG para RollerCoaster Tycoon 2. É posible que descargueses o código de descarga de GOG Galaxy ou seleccionaches o ficheiro incorrecto. +STR_6410 :Achegar ou diminuír +STR_6411 :Mostrar os botóns de zoom na barra de ferramentas +STR_6412 :Introdución do teclado numérico +STR_6413 :Maiúsculas +STR_6414 :Cambio L +STR_6415 :Cambio R +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 :Alegría deixou +STR_6426 :Alegría certo +STR_6427 :Alegría +STR_6428 :Alegría +STR_6429 :Alegría {INT32} +STR_6430 :LMB +STR_6431 :RMB +STR_6432 :Rato {INT32} +STR_6433 :Eliminar +STR_6434 :Elimina todos os edificios deste atallo. +STR_6435 :{WINDOW_COLOUR_2}Vándalos arrestados: {BLACK}{COMMA32} +STR_6436 :Activar/desactivar a invisibilidade +STR_6437 :Visible +STR_6438 :{MOVE_X}{2}👁 +STR_6439 :Grid Inspector: activa/desactiva a invisibilidade +STR_6440 :Auga transparente +STR_6441 :Debe seleccionar polo menos un camiño que non sexa da cola. +STR_6442 :Debe seleccionar polo menos un camiño que sexa unha liña de espera. +STR_6443 :Debe seleccionar polo menos un camiño que teña pasamáns. +STR_6444 :Superficies de camiños. +STR_6445 :pasamáns do camiño. +STR_6446 :{WINDOW_COLOUR_2}Nome da superficie: {BLACK}{STRINGID} +STR_6447 :{WINDOW_COLOUR_2}Nome do pasamáns: {BLACK}{STRINGID} +STR_6448 :Formato de obxecto non compatible +STR_6449 :{WINDOW_COLOUR_2}Camiños: +STR_6450  :{BLACK}“{STRING}” +STR_6451  :{BLACK}“{STRING}” - {STRING} +STR_6452 :{WINDOW_COLOUR_2}Vender: {BLACK}{STRING} +STR_6453 :Copiar a información da versión +STR_6454 :Non se pode cambiar o nome do banner... +STR_6455 :Non se pode cambiar o nome do sinal... +STR_6456 :Captura de pantalla xigante +STR_6457 :Informar dun erro en GitHub +STR_6458 :siga isto na vista principal +STR_6460 :D +STR_6461 :Enderezo +STR_6462 :Emoción +STR_6463 :Emoción: {COMMA2DP32} +STR_6464 :Intensidade +STR_6465 :Forza: {COMMA2DP32} +STR_6466 :Náuseas +STR_6467 :Náuseas: {COMMA2DP32} +STR_6468 :aínda non dispoñible +STR_6469 :Establecer zona de patrulla máis pequena +STR_6470 :Establecer unha zona de patrulla máis grande +STR_6471 :Vexetación transparente +STR_6472 :Vehículos transparentes +STR_6473 :Soportes transparentes +STR_6474 :Visitantes invisibles +STR_6475 :Empleados invisibles +STR_6476 :Vexetación invisible +STR_6477 :Escenario invisible +STR_6478 :Camiños invisibles +STR_6479 :Atraccións invisibles +STR_6480 :Vehículos invisibles +STR_6481 :Opcións de transparencia +STR_6482 :Opcións de transparencia +STR_6483 :Abrir opcións de transparencia +STR_6484 :Alterar vexetación transparente +STR_6485 :Alternar vehículos transparentes +STR_6486 :Alterar visitantes invisibles +STR_6487 :Alterar empregados invisibles +STR_6488 :{RED}Os hóspedes quéixanse das longas filas no teu parque.{NEWLINE}Considera acurtar as liñas problemáticas ou aumentar o rendemento da viaxe. +STR_6489 :{RED}ERRO: Versión do parque incompatible +STR_6490 :{RED}ADVERTENCIA: a versión Park non é totalmente compatible +STR_6491 :Este parque gardouse nunha versión máis recente de OpenRCT2. Este parque gardouse en v{INT32} e require polo menos v{INT32}. Actualmente estás en v{INT32}. +STR_6492 :Este parque gardouse nunha versión antiga de OpenRCT2 e non se pode abrir con esta versión de OpenRCT2. Este parque é a versión v{INT32}. +STR_6493 :Este parque gardouse nunha versión máis recente de OpenRCT2, podendo perderse algúns datos. Este parque gardouse en v{INT32}, actualmente estás en v{INT32}. +STR_6494 :Agrupar por tipo de atracción +STR_6495 :Agrupa as atraccións por tipo en lugar de mostrar cada vehículo por separado. +STR_6496  :{WINDOW_COLOUR_2}{STRINGID} +STR_6497 :Fai clic nunha caixa para mostrar os seus elementos.{NEWLINE}Ctrl + clic nun elemento para seleccionalo directamente. +STR_6498 :Activa para manter o mapa en forma cadrada. +STR_6499 :Tipo de vehículo non compatible co formato de deseño da estrada +STR_6500 :Elementos non compatibles co formato de deseño da estrada +STR_6501 :Cor aleatoria +STR_6502 :Introduza un valor entre {COMMA16} e {COMMA16} +STR_6503 :Debe seleccionar polo menos un obxecto de estación +STR_6504 :Debe seleccionar polo menos unha superficie do terreo +STR_6505 :Debe seleccionar polo menos un bordo do terreo +STR_6506 :Sacacorchos mediano grande (esquerda) +STR_6507 :Sacacorchos grande (dereita) +STR_6508 :rizo medio medio (esquerda) +STR_6509 :rizo medio medio (dereita) +STR_6510 :Xiro de gravidade cero (esquerda) +STR_6511 :Xiro de gravidade cero (dereita) +STR_6512 :gran xiro de gravidade cero (esquerda) +STR_6513 :Gran xiro de gravidade cero (dereita) +STR_6514 :Altura non válida! +STR_6515 :{BLACK}RollerCoaster Tycoon 1 non foi ligado - utilizaranse imaxes alternativas. +STR_6516 :Un ou máis obxectos engadidos requiren ter ligado RollerCoaster Tycoon 1 para a súa visualización correcta. Utilizaranse imaxes alternativas. +STR_6517 :Un ou máis obxectos deste parque requiren ter ligado RollerCoaster Tycoon 1 para a súa visualización correcta. Utilizaranse imaxes alternativas. +STR_6518 :{BLACK}Pasa o rato sobre un escenario para ver a súa descrición e os seus obxectivos. Fai clic para comezar a xogar. +STR_6519 :Extras +STR_6520 :Paquetes de recursos +STR_6521 :Prioridade baixa +STR_6522 :Alta prioridade +STR_6523 :Diminuír a prioridade do paquete de recursos seleccionado. +STR_6524 :Aumenta a prioridade do paquete de recursos seleccionado. +STR_6525 :Volve cargar todos os recursos do xogo cos paquetes de recursos activados. +STR_6526 :(gráficos básicos, música e efectos de son) +STR_6527 :Competicións +STR_6528 :Parámetros de pista non válidos! +STR_6529 :Parámetro de esquema de cores non válido! +STR_6530 :Conxunto de expansión creado polo usuario +STR_6531 :A máquina do tempo +STR_6532 :O mundo de Katy +STR_6533 :{WINDOW_COLOUR_2}Factor de excitación: {BLACK}-{COMMA16}% +STR_6534 :{WINDOW_COLOUR_2}Factor de intensidade: {BLACK}-{COMMA16}% +STR_6535 :{WINDOW_COLOUR_2}Factor de náuseas: {BLACK}-{COMMA16}% +STR_6536 :Este parque gardouse nunha versión máis recente de OpenRCT2. Este parque gardouse en v{INT32}, actualmente estás en v{INT32}. +STR_6537 :Permitir que as rutas normais se utilicen como cola +STR_6538 :Mostra rutas normais no menú despregable da cola da xanela Rutas. +STR_6539 :freo pechado +STR_6540 :{WINDOW_COLOUR_2}Grazas especiais ás seguintes empresas por permitir o uso da súa imaxe: +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. +STR_6542 :Colaboradores +STR_6543 :Colaboradores... +STR_6544 :O préstamo non pode ser negativo! +STR_6545 :Utiliza o cálculo de intereses RCT1 +STR_6546 :Utilice o algoritmo de cálculo de intereses de RollerCoaster Tycoon 1, que utilizou unha porcentaxe fixa de aproximadamente o 1,33%. +STR_6547 :Todos os escenarios +STR_6548 :Mostrar pasamáns nas interseccións +STR_6549 :Non se poden seleccionar obxectos de compatibilidade! +STR_6550 :Inclúese esta entrada para garantir a compatibilidade con obxectos antigos ou danados. Non se pode seleccionar, só deseleccionar. + +STR_6551 :Verde exército +STR_6552 :Melón +STR_6553 :Tan +STR_6554 :granate +STR_6555 :Rosa coral +STR_6556 :Verde bosque +STR_6557 :Chartreuse Green +STR_6558 :Hunter Green +STR_6559 :Verde claro +STR_6560 :Verde lima +STR_6561 :Sepia +STR_6562 :Pexego +STR_6563 :azul lavanda +STR_6564 :Verde esmeralda +STR_6565 :Augamarina +STR_6566 :Violeta +STR_6567 :Lavanda +STR_6568 :Laranxa pastel +STR_6569 :Azul escuro +STR_6570 :Rosa pastel +STR_6571 :Café +STR_6572 :Beixe +STR_6573 :Invisible +STR_6574 :baleiro +STR_6575 :Permitir esquemas de cores especiais +STR_6576 :Engade cores especiais ao menú despregable de cores +STR_6577 :Bloqueo da velocidade do freo +STR_6578 :Establece o límite de velocidade para bloquear os freos. No modo de sección de bloque, os freos adxacentes con velocidade máis lenta están ligados ao freo de bloqueo. +STR_6579 :Os freos de bloqueo estableceranse coa velocidade predeterminada cando se garde como esquema de pista. +STR_6580 :Restablecer +STR_6581 :Estás seguro de que queres restablecer todos os atallos de teclado desta pestana? +STR_6582 :Abrir a xanela de atallos de teclado +STR_6583 :{WINDOW_COLOUR_2}Trens invertidos +STR_6584 :selecciona para que os trens viaxen en sentido inverso +STR_6585 :Non se poden facer cambios... +STR_6586 :OpenRCT2 +STR_6587 :O tema principal de OpenRTC é un traballo de Allister Brimble,{NEWLINE}con licenza CC BY-SA 4.0. +STR_6588 :Grazas a Herman Riddering por permitirnos gravar o 35er Voigt. +STR_6589 :Mostrar os botóns da xanela á esquerda +STR_6590 :Mostrar os botóns da xanela (como pechar a xanela) á esquerda da barra de título en lugar da dereita. +STR_6591 :O empregado está a reparar unha atracción e non pode ser despedido. +STR_6592 :O empregado está inspeccionando unha atracción e non pode ser despedido. +STR_6593 :Eliminar valados do parque +STR_6594 :Grid Inspector: alternar a inclinación da parede +STR_6595 :{WINDOW_COLOUR_2}Autor: {BLACK}{STRING} +STR_6596 :{WINDOW_COLOUR_2}Autores: {BLACK}{STRING} +STR_6597 :parámetro non válido +STR_6598 :Valor fóra do intervalo +STR_6599 :Non se atopou o elemento pantasma +STR_6600 :Non se atopou o globo +STR_6601 :Non se atopou o empregado +STR_6602 :Non se atopou a atracción +STR_6603 :Non se atopou a entrada do obxecto de atracción +STR_6604 :Non se atopou o reprodutor +STR_6605 :Non se atopou o elemento de entrada +STR_6606 :Non se atopou o elemento de superficie +STR_6607 :Non se atopou o elemento da caixa +STR_6608 :Non se atopou o elemento da pista +STR_6609 :Non se atopou o bloque de pistas +STR_6610 :Non se atopou o elemento da ruta +STR_6611 :Non se atopou o elemento da parede +STR_6612 :Non se atopou o elemento do banner +STR_6613 :Volver cargar o obxecto +STR_6614 :Non podes cambiar o prezo do billete do parque +STR_6615 :A estrada desta caixa necesita auga +STR_6616 :Acción non válida para ese tipo de traballador +STR_6617 :Non se pode intercambiar o elemento de slot consigo mesmo +STR_6618 :Non pode poñer nin eliminar restricións ao obxecto... +STR_6619 :Este tipo de obxecto non se pode restrinxir! +STR_6620 :Obxecto non atopado! +STR_6621 :Restrinxir +STR_6622 :Restrinxir o obxecto ao modo Editor de escenarios e Sandbox. +STR_6623 :Escriba "axuda" para ver a lista de comandos dispoñibles. Escribe "ocultar" para ocultar a consola. +STR_6624 :Grid Inspector: Ordenar elementos +STR_6625 :Cor non válida +STR_6626 :A animación está reflectida +STR_6627 :A velocidade da pista é demasiado alta! +STR_6628 :Só se pode colocar nos bordos do camiño! +STR_6629 :Aliña os botóns da barra de ferramentas centrados horizontalmente +STR_6630 :esta configuración aliñará os botóns da barra de ferramentas horizontalmente no centro da pantalla. A forma tradicional de aliñalos está na esquina esquerda e dereita. +STR_6631 :Cargando... +STR_6632 :Comprobando ficheiros de obxectos... +STR_6633 :Comprobando ficheiros de escenarios... +STR_6634 :Comprobando ficheiros de deseño de pistas... +STR_6635 :Comprobando ficheiros de recursos... +STR_6636 :Comprobando secuencias de títulos... +STR_6637 :Cargando a secuencia de títulos... +STR_6638 :Interface estendida +STR_6639 :Modifica a interface para que sexa máis doado de usar coas pantallas táctiles +STR_6640 :Editar paquetes de recursos... +STR_6641 :Xanela de carga/progreso +STR_6642 :{STRING} ({COMMA32}/{COMMA32}) +STR_6643  :{STRING} ({COMMA32}/{COMMA32} KiB) +STR_6644 :Melloras táctiles +STR_6645 :Aumenta o tamaño dalgúns elementos da interface para que sexan máis fáciles de facer clic. +STR_6646 :Autor: {STRING} +STR_6647 :Autores: {STRING} +STR_6648 :Cargando motor de complementos... +STR_6649 :Cargando escenario... +STR_6650 :Cargando partida gardada... +STR_6651  :{STRING} ({COMMA32}%) +STR_6652 :Xanela de Erro +STR_6653 :Todas as fontes mostradas +STR_6654 :Amosando {POP16}{UINT16} fontes +STR_6655 :Só ‘{POP16}{STRINGID}’ +STR_6656 :Elimina todos os valados do parque +STR_6657 :Terra Sen Propietario +STR_6658 :Establecer que a terra non sexa propiedade do parque nin estea dispoñible para a compra +STR_6659 :Os invitados ignoran os prezos +STR_6660 :Os invitados ignorarán o prezo das atraccións e dos postos +STR_6661 :Todo ao chou +STR_6662 :Cores ao chou para cada tren ou vehículo. +STR_6663 :Trucos de data +STR_6664 :Amosar trucos de data +STR_6665 :Trucos de natureza/clima +STR_6666 :Amosar trucos de natureza/clima +STR_6667 :Fauna +STR_6668 :Trucos de empleados +STR_6669 :Amosar trucos de empleados +STR_6670 :Comportamento dos visitantes +STR_6671 :Amosar nomes ‘reais’ de empleados +STR_6672 :Alternar entre amosar nomes ‘reais’ e números de empleados +STR_6673 :Translúcido +STR_6674 :{MONTH}, Ano {COMMA16} +STR_6675 :Nomes dos Visitantes +STR_6676 :Debe escollerse polo menos un obxecto de nomes de visitantes +STR_6677 :Engade praias arredor das masas de auga +STR_6678 :Fonte do mapa de elevación: +STR_6679 :Chaira +STR_6680 :Ruído Simplex +STR_6681 :Arquivo do mapa de elevación +STR_6682 :Xerador de Mapas - Xerador +STR_6683 :Xerador de Mapas - Terreo +STR_6684 :Xerador de Mapas - Auga +STR_6685 :Xerador de Mapas - Fragas +STR_6686 :Relación árbores/terreo +STR_6687 :Altitude mínima das árbores: +STR_6688 :Altitude máxima das árbores: +STR_6689 :{UINT16}% +STR_6690 :Altura mínima do terreo +STR_6691 :Introduce a altura mínima do terreo entre {COMMA16} e {COMMA16} +STR_6692 :Altura máxima do terreo +STR_6693 :Introduce a altura máxima do terreo entre {COMMA16} e {COMMA16} +STR_6694 :Altitude mínima das árbores +STR_6695 :Introduce a altitude mínima das árbores entre {COMMA16} e {COMMA16} +STR_6696 :Altitude máxima das árbores +STR_6697 :Introduce a altitude máxima das árbores entre {COMMA16} e {COMMA16} +STR_6698 :Relación árbores/terreo +STR_6699 :Introduce a relación árbores/terreo entre {COMMA16} e {COMMA16} +STR_6700 :Frecuencia base Simplex +STR_6701 :Introduce a frecuencia base entre {COMMA2DP32} e {COMMA2DP32} +STR_6702 :Octavas Simplex +STR_6703 :Introduce as octavas entre {COMMA16} e {COMMA16} +STR_6704 :{COMMA2DP32} +STR_6705 :Explorar… +STR_6706 :{WINDOW_COLOUR_2}Arquivo de imaxe actual: {BLACK}{STRING} +STR_6707 :(Ningún escollido) +STR_6708 :Intensidade de suavizado +STR_6709 :Introduce a intensidade de suavizado entre {COMMA16} e {COMMA16} diff --git a/data/language/it-IT.txt b/data/language/it-IT.txt index eb8810cfee..f435208bb7 100644 --- a/data/language/it-IT.txt +++ b/data/language/it-IT.txt @@ -99,6 +99,7 @@ STR_0094 :Ottovolante a binario singolo STR_0095 :Ottovolante Alpino STR_0096 :Ottovolante di legno classico STR_0097 :Ottovolante in piedi classico +STR_0098 :Ottovolante a lancio LSM STR_0512 :Un ottovolante compatto con una salita a spirale e cadute fluide e tortuose. STR_0513 :Un ottovolante con giro della morte dove i passeggeri si trovano in una posizione eretta STR_0514 :I treni, sospesi sotto l’ottovolante, durante le curve oscillano lateralmente @@ -183,6 +184,7 @@ STR_0604 :I visitatori viaggiano lungo un sottile tracciato da monorotaia, at STR_0605 :I visitatori scendono lungo una rotaia piena di curve, frenando per controllare la velocità del loro vagone STR_0606 :Un ottovolante di legno vecchio stile con un percorso veloce e turbolento, con molto air-time, G laterali, progettato per farti sentire “fuori controllo” STR_0607 :Un intenso ottovolante d’acciaio vecchio stile, nel quale i passeggeri sono in posizione eretta +STR_0608 :I treni dell’ottovolante sono lanciati da motori sincroni lineari e corrono attraverso curve e avvitamenti stretti STR_0767 :Visitatore {INT32} STR_0768 :Tuttofare {INT32} STR_0769 :Meccanico {INT32} @@ -1913,11 +1915,11 @@ STR_2670 :Scorr STR_2680 :Tutte le ricerche sono completate STR_2684 :Fa arrivare una folla di visitatori STR_2685 :Simplex Noise Parameters -STR_2686 :Basso: -STR_2687 :Alto: -STR_2688 :Frequenza Base: -STR_2689 :Ottavi: -STR_2690 :Generazione Mappa +STR_2686 :Altezza min. terreno: +STR_2687 :Altezza max. terreno: +STR_2688 :Frequenza base: +STR_2689 :Ottave: +STR_2690 :Generazione mappa STR_2691 :Base height: STR_2692 :Livello acqua: STR_2693 :Terreno: @@ -3168,19 +3170,19 @@ STR_6038 :Se RCT1 è installato, selezionarne la cartella per caricarne gli s STR_6039 :Demolizione veloce percorso STR_6040 :Modifica opzioni scenario STR_6041 :{BLACK}Non è stato assunto alcun meccanico! -STR_6042 :Carica heightmap -STR_6043 :Seleziona heightmap -STR_6044 :Ammorbidisci heightmap -STR_6045 :Forza -STR_6046 :Normalizza heightmap -STR_6047 :Ammorbidisci celle -STR_6048 :Errore nella heightmap +STR_6042 :Carica mappa altimetrica +STR_6043 :Seleziona mappa altimetrica +STR_6044 :Ammorbidisci mappa altimetrica +STR_6045 :Forza: +STR_6046 :Normalizza mappa altimetrica +STR_6047 :Ammorbidisci bordi celle +STR_6048 :Errore nella mappa altimetrica STR_6049 :Errore nella lettura del PNG STR_6050 :Errore nella lettura della bitmap -STR_6052 :La heightmap è troppo grande e sarà tagliata -STR_6053 :La heightmap non può essere normalizzata +STR_6052 :La mappa altimetrica è troppo grande e sarà tagliata +STR_6053 :La mappa altimetrica non può essere normalizzata STR_6054 :Sono supportate solo le bitmap a 24 bit -STR_6055 :File di heightmap di OpenRCT2 +STR_6055 :File mappa altimetrica di OpenRCT2 STR_6056 :Muto STR_6057 :Mostra un bottone separato per l’opzione Muto nella barra degli strumenti STR_6058 :Muto @@ -3615,7 +3617,7 @@ STR_6537 :Usa sentieri normali come code STR_6538 :Mostra i percorsi regolari nel menu a cascata della finestra dei Sentieri. STR_6539 :Freno chiuso STR_6540 :{WINDOW_COLOUR_2}Un ringraziamento speciale alle seguenti aziende per aver concesso l'utilizzo della loro immagine: -STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. STR_6542 :Collaboratori STR_6543 :Collaboratori… STR_6544 :I prestiti non posso essere negativi! @@ -3748,3 +3750,41 @@ STR_6669 :Mostra i trucchi sul personale STR_6670 :Comportamento visitatori STR_6671 :Mostra i “veri” nomi del personale STR_6672 :Alterna tra i nomi “veri” del personale e i loro numeri +STR_6673 :Trasparente +STR_6674 :{MONTH}, anno {COMMA16} +STR_6675 :Nomi visitatori +STR_6676 :È necessario selezionare almeno un oggetto nomi visitatori +STR_6677 :Aggiungi spiagge attorno agli specchi d’acqua +STR_6678 :Fonte mappa altimetrica: +STR_6679 :Pianura +STR_6680 :Rumore Simplex +STR_6681 :File mappa altimetrica +STR_6682 :Generatore mappa - Generatore +STR_6683 :Generatore mappa - Terreno +STR_6684 :Generatore mappa - Acqua +STR_6685 :Generatore mappa - Foreste +STR_6686 :Rapporto alberi/terreno: +STR_6687 :Altitudine min. alberi: +STR_6688 :Altitudine max. alberi: +STR_6689 :{UINT16}% +STR_6690 :Altezza terreno minima +STR_6691 :Inserisci un’altezza min. terreno tra {COMMA16} e {COMMA16} +STR_6692 :Altezza terreno massima +STR_6693 :Inserisci un’altezza max. terreno tra {COMMA16} e {COMMA16} +STR_6694 :Altitudine minima alberi +STR_6695 :Inserisci altitudine min. alberi tra {COMMA16} e {COMMA16} +STR_6696 :Altitudine massima alberi +STR_6697 :Inserisci altitudine max. alberi tra {COMMA16} e {COMMA16} +STR_6698 :Rapporto alberi/terreno +STR_6699 :Inserisci un rapporto alberi/terreno tra {COMMA16} e {COMMA16} +STR_6700 :Frequenza di base Simplex +STR_6701 :Inserisci una frequenza di base tra {COMMA2DP32} e {COMMA2DP32} +STR_6702 :Ottave Simplex +STR_6703 :Inserisci ottave tra {COMMA16} e {COMMA16} +STR_6704 :{COMMA2DP32} +STR_6705 :Sfoglia… +STR_6706 :{WINDOW_COLOUR_2}File immagine attuale: {BLACK}{STRING} +STR_6707 :(nessuno selezionato) +STR_6708 :Forza addolcimento +STR_6709 :Inserisci una forza addolcimento tra {COMMA16} e {COMMA16} + diff --git a/data/language/ko-KR.txt b/data/language/ko-KR.txt index 4d2497d80b..00f2dc0d4a 100644 --- a/data/language/ko-KR.txt +++ b/data/language/ko-KR.txt @@ -99,6 +99,7 @@ STR_0094 :모노레일 롤러코스터 STR_0095 :알파인 코스터 STR_0096 :클래식 우든 롤러코스터 STR_0097 :클래식 스탠드 업 롤러코스터 +STR_0098 :LSM 발진 롤러코스터 STR_0512 :나선형 리프트 힐과 부드럽게 꼬인 낙하를 가진 알찬 구성의 롤러코스터입니다. STR_0513 :일어선 자세로 탑승하는 루핑 롤러코스터입니다. STR_0514 :코너를 돌 때 롤러코스터 트랙 아래에 매달린 차량이 좌우로 흔들리는 열차입니다. @@ -183,6 +184,7 @@ STR_0604 :탑승객들은 폭이 좁은 모노레일 트랙 위에 한 줄로 STR_0605 :탑승객들이 구불구불한 철제 트랙을 따라 썰매 모양의 차량을 타고 스스로 속력을 조절하며 내려오는 놀이기구입니다. STR_0606 :빠르고 거친 승차감과 충분한 에어 타임, 약간의 측면 중력이 있으며 '통제되지 않는 느낌'을 느낄 수 있도록 설계된 구식 목재 롤러코스터입니다. STR_0607 :탑승객들이 일어선 자세로 탑승하는, 격렬한 구식 스타일의 철제 루핑 롤러코스터입니다. +STR_0608 :선형 동기 모터로 가속되어 급커브와 커브를 빠르게 도는 롤러코스터 열차입니다. STR_0767 :손님 {INT32} STR_0768 :미화원 {INT32} STR_0769 :정비기술자 {INT32} @@ -3612,7 +3614,7 @@ 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 +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 :대출은 음수일 수 없습니다! diff --git a/data/language/nl-NL.txt b/data/language/nl-NL.txt index e2b379166c..443dd83e64 100644 --- a/data/language/nl-NL.txt +++ b/data/language/nl-NL.txt @@ -96,6 +96,8 @@ STR_0094 :Achtbaan met enkele rail STR_0095 :Rodelachtbaan STR_0096 :Klassieke houten achtbaan STR_0097 :Klassieke staande achtbaan +STR_0098 :LSM-lanceringsachtbaan +STR_0099 :Klassieke houten twisterachtbaan STR_0512 :Een compacte achtbaan met een spiraalvormige kettingheuvel en soepele, kronkelende afdalingen. STR_0513 :Een achtbaan met loopings waar de passagiers in de karretjes staan. STR_0514 :Treinen hangen onder de baan en zwaaien naar buiten in de bochten. @@ -180,6 +182,8 @@ STR_0604 :Passagiers zitten achter elkaar op een smalle baan met één rail, STR_0605 :Passagiers rodelen over een kronkelende stalen baan, waarbij ze zelf kunnen beslissen hoe snel ze gaan. STR_0606 :Een ouder type houten achtbaan met een snelle en ruwe loop, veel airtime, enige zijwaartse G-krachten en het gevoel van controleverlies. STR_0607 :Een intens ouder type achtbaan waarin de passagiers staan. +STR_0608 :Achtbaan worden door lineaire synchroonmotoren gelanceerd en razen door een kronkelende baan die vaak over de kop gaat. +STR_0609 :Een ouder type houten achtbaan met een snelle en ruwe loop, veel airtime en een kronkelende baan, waar de passagiers doorheen razen in een gelede trein. STR_0767 :Bezoeker {INT32} STR_0768 :Klusjesman {INT32} STR_0769 :Monteur {INT32} @@ -3608,7 +3612,7 @@ STR_6537 :Gewone paden als wachtrij bruikbaar maken STR_6538 :Zorgt ervoor dat je wachtrijen kunt bouwen met paden die daar niet voor bedoeld zijn. STR_6539 :Rem is gesloten STR_6540 :{WINDOW_COLOUR_2}Onze dank gaat uit naar de volgende bedrijven voor hun toestemming om voertuigen op hun ontwerpen te baseren: -STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. STR_6542 :Deelnemers STR_6543 :Deelnemers… STR_6544 :Lening kan niet negatief zijn! diff --git a/data/language/pl-PL.txt b/data/language/pl-PL.txt index 0c6df46c26..5f037bbcb9 100644 --- a/data/language/pl-PL.txt +++ b/data/language/pl-PL.txt @@ -3,33 +3,33 @@ # Use # at the beginning of a line to leave a comment. STR_0000 : STR_0001 :{STRINGID} {COMMA16} -STR_0002 :Spiralna kolejka górska -STR_0003 :Stojąca kolejka górska -STR_0004 :Podwieszana kolejka górska -STR_0005 :Odwrócona kolejka górska -STR_0006 :Dziecięca kolejka górska +STR_0002 :Kolejka spiralna +STR_0003 :Kolejka stojąca +STR_0004 :Kolejka podwieszona +STR_0005 :Kolejka odwrotna +STR_0006 :Kolejka dla dzieci STR_0007 :Miniaturowa kolejka -STR_0008 :Kolejka jednotorowa -STR_0009 :Podwieszana mini kolejka +STR_0008 :Jednoszynówka +STR_0009 :Podwieszana minikolejka STR_0010 :Łódki -STR_0011 :Drewniana Zwariowana Mysz -STR_0012 :Tor Przeszkód -STR_0013 :Przejażdżka Autami +STR_0011 :Drewniana szalona mysz +STR_0012 :Bieg z przeszkodami +STR_0013 :Przejażdżka STR_0014 :Wystrzałowa spadajka -STR_0015 :Bobsleje +STR_0015 :Kolejka bobslejowa STR_0016 :Wieża obserwacyjna -STR_0017 :Pętlowa kolejka górska -STR_0018 :Zjeżdżalnia wodna +STR_0017 :Kolejka zapętlona +STR_0018 :Ślizg pontonowy STR_0019 :Kolejka kopalniana STR_0020 :Wyciąg krzesełkowy -STR_0021 :Kolejka górska korkociąg +STR_0021 :Kolejka korkociągowa STR_0022 :Labirynt -STR_0023 :Spiralna zjeżdżalnia +STR_0023 :Spiralny zjazd STR_0024 :Gokarty -STR_0025 :Zjazd na kłodach -STR_0026 :Katarakty rzeczne -STR_0027 :Samochodziki -STR_0028 :Statek piracki +STR_0025 :Jazda flisacka +STR_0026 :Przełomy Dunajca +STR_0027 :Unikajki +STR_0028 :Okręt piracki STR_0029 :Morska huśtawka STR_0030 :Budka z jedzeniem STR_0031 :Nieznane stoisko (1D) @@ -41,87 +41,91 @@ STR_0036 :Nieznane stoisko (22) STR_0037 :Punkt informacyjny STR_0038 :Toalety STR_0039 :Diabelski młyn -STR_0040 :Symulator -STR_0041 :Kino 3D +STR_0040 :Symulator ruchu +STR_0041 :Kino trójwymiarowe STR_0042 :Wirówka STR_0043 :Kosmiczne pierścienie -STR_0044 :Reverse Freefall Coaster +STR_0044 :Odwrócony swobodospad STR_0045 :Winda -STR_0046 :Vertical Drop Roller Coaster +STR_0046 :Pionospadajka STR_0047 :Bankomat STR_0048 :Twist STR_0049 :Nawiedzony dom STR_0050 :Punkt pierwszej pomocy STR_0051 :Cyrk STR_0052 :Pociąg widmo -STR_0053 :Twister Roller Coaster -STR_0054 :Drewniana kolejka górska -STR_0055 :Side-Friction Roller Coaster -STR_0056 :Stalowa Zwariowana Mysz -STR_0057 :Multi-Dimension Roller Coaster +STR_0053 :Zwijka +STR_0054 :Drewniana jazda +STR_0055 :Tarcie boczne +STR_0056 :Stalowa szalona mysz +STR_0057 :Kolejka wielowymiarowa STR_0058 :Nieznana atrakcja (38) -STR_0059 :Latająca kolejka górska +STR_0059 :Kolejka latająca STR_0060 :Nieznana atrakcja (3A) -STR_0061 :Kołowrotek Virginia -STR_0062 :Chlapiące łódki -STR_0063 :Mini helikoptery -STR_0064 :Lay-down Roller Coaster -STR_0065 :Suspended Monorail +STR_0061 :W koło Macieju +STR_0062 :Pluskołódki +STR_0063 :Minihelikoptery +STR_0064 :Kolejka leżąca +STR_0065 :Podwieszona jednoszynówka STR_0066 :Nieznana atrakcja (40) -STR_0067 :Reverser Roller Coaster -STR_0068 :Heartline Twister Coaster -STR_0069 :Mini golf -STR_0070 :Giga Coaster -STR_0071 :Roto-Drop +STR_0067 :Zawracajka +STR_0068 :Zabójcza kolejka +STR_0069 :Minigolf +STR_0070 :Giga jazda +STR_0071 :Obrotospad STR_0072 :Latające spodki STR_0073 :Krzywy dom -STR_0074 :Monorail Cycles -STR_0075 :Compact Inverted Coaster -STR_0076 :Wodna kolejka -STR_0077 :Air Powered Vertical Coaster -STR_0078 :Inverted Hairpin Coaster -STR_0079 :Magiczny Dywan -STR_0080 :Submarine Ride -STR_0081 :Tratwy +STR_0074 :Rowery jednotorowe +STR_0075 :Mała kolejka odwrócona +STR_0076 :Kolejka wodna +STR_0077 :Pneumatyczna kolejka pionowa +STR_0078 :Kolejka serpentynowa +STR_0079 :Latający dywan +STR_0080 :Podwodna podróż +STR_0081 :Tratwy rzeczne STR_0082 :Nieznana atrakcja (50) -STR_0083 :Enterprise +STR_0083 :Krynolina STR_0084 :Nieznana atrakcja (52) STR_0085 :Nieznana atrakcja (53) STR_0086 :Nieznana atrakcja (54) STR_0087 :Nieznana atrakcja (55) -STR_0088 :Inverted Impulse Coaster -STR_0089 :Mini kolejka górska -STR_0090 :Kolejka kopalniana +STR_0088 :Kolejka zwrotna +STR_0089 :Minikolejka +STR_0090 :Przejażdżka kopalniana STR_0091 :Nieznana atrakcja (59) -STR_0092 :LIM Launched Roller Coaster +STR_0092 :Kolejka z napędem indukcyjnym liniowym STR_0093 :Kolejka hybrydowa -STR_0094 :Kolejka jednotorowa +STR_0094 :Kolejka jednoszynowa STR_0095 :Tor saneczkowy -STR_0512 :Kolejka górska ze spiralnym podjazdem i łagodnymi pokręconymi zjazdami -STR_0513 :Kolejka górska z pętlą, klienci jadą w niej na stojąco -STR_0514 :Wagony podczepione są pod tor kolejki górskiej i bujają się na zakrętach -STR_0515 :Stalowa kolejka górska z podczepionymi wagonikami z wieloma złożonymi i pokręconymi elementami -STR_0516 :Łagodna kolejka górska dla ludzi, którzy nie mają jeszcze dość odwagi aby wsiąść na wyższe kolejki +STR_0096 :Klasyczna drewniana jazda +STR_0097 :Klasyczna kolejka stojąca +STR_0098 :Kolejka z napędem synchronicznym liniowym +STR_0099 :Klasyczna drewniana zwijka +STR_0512 :Zwarta przestrzennie kolejka ze spiralnym podjazdem i gładkimi, zakręconymi zjazdami +STR_0513 :Zapętlona kolejka, w której pasażerowie jadą w pozycji stojącej +STR_0514 :Wagoniki podwieszone pod torem kolejki wychylają się swobodnie na zakrętach +STR_0515 :Pasażerowie siedzą w fotelach podwieszonych pod torem, pokonując liczne, złożone i zakręcone elementy +STR_0516 :Łagodna kolejka dla gości, którzy nie są na tyle odważni, by zdecydować się na większe atrakcje STR_0517 :Pasażerowie jeżdżą w miniaturowych pociągach na wąskotorowym torze STR_0518 :Pasażerowie podróżują w elektrycznych pociągach na pojedynczym torze STR_0519 :Pasażerowie jeżdżą w małych autach podwieszonych na pojedynczym torze, bujają się swobodnie na zakrętach -STR_0520 :Przystań gdzie goście mogą popływać samemu w różnych wodnych atrakcjach -STR_0521 :Szybka i pokręcona kolejka górska z ciasnymi zakrętami i stromymi zjazdami. Intensywność na pewno będzie duża. -STR_0522 :Mniejsza kolejka górska, gdzie goście siedzą nad torem nie mając wokół siebie zabezpieczeń +STR_0520 :Przystań, gdzie goście mogą samodzielnie pływać różnymi pojazdami wodnymi +STR_0521 :Wagoniki w kształcie myszy jadące po zygzakowatym drewnianym torze, przechylające się na ostrych zakrętach i zdradliwych zjazdach +STR_0522 :Mniejsza kolejka, gdzie pasażerowie siedzą wysoko nad torem, nie mając wokół siebie zabezpieczeń STR_0523 :Pasażerowie podróżują powoli napędzanymi pojazdami po wyznaczonym torze -STR_0524 :Freefall car jest pneumatycznie sterowaną atrakcją z wysoką stalową wieżą, z której następuje swobodny spadek wagonika +STR_0524 :Wagonik jest wystrzeliwany pneumatycznie na szczyt wysokiej wieży, a potem swobodnie opada STR_0525 :Pasażerowie jadą w dół po pokręconym torze składającym się tylko z zakrętów i zawijasów -STR_0526 :Pasażerowie jadą w obracającym się obserwatorium, które wjeżdża na górę wysokiej wieży -STR_0527 :Łagodny stalowa kolejka górska, gdzie można robić pionowe pętle -STR_0528 :Goście jeżdżą w nadmuchiwanych pontonach w pokręconych półkolistych lub całkowicie zabudowanych korytach -STR_0529 :Kolejka górska ze stalowym torem stylizowana na starą kopalnianą kolejkę -STR_0530 :Pojazdy zwisają na stalowej linie na której poruszają się w jedną, a potem w drugą stronę -STR_0531 :Kompaktowa stalowa kolejka górska, gdzie wagoniki poruszają się po wykręcanych torach i pętlach -STR_0532 :Labirynt zbudowany jest ze ścian lub żywopłotu o wysokości 6 stóp, goście błądzą wewnątrz dopóki nie znajdą wyjścia +STR_0526 :Pasażerowie jadą w obracającej się kabinie obserwacyjnej, która wjeżdża na górę wysokiej wieży +STR_0527 :Szybka kolejka ze stalowymi torami, zdolna do wykonywania pętli +STR_0528 :Pasażerowie podróżują w nadmuchiwanych pontonach po zawiłym półkolistym lub rurowym torze +STR_0529 :Kolejka górska w stylu górniczym, poruszająca się po stalowych szynach stylizowanych na stary tor kolejowy +STR_0530 :Pojazdy są podwieszone na stalowej linie i poruszają się nieprzerwanie z jednego końca trasy na drugi i z powrotem +STR_0531 :Zwarta przestrzennie kolejka ze stalowymi torami, w której wagoniki pokonują korkociągi i pętle +STR_0532 :Goście wędrują po labiryncie zbudowanym z dwumetrowych żywopłotów lub ścian STR_0533 :Drewniany budynek ze schodami w środku oraz zjeżdżalnią na zewnątrz do zjeżdżania na matach STR_0534 :Go karty zasilane benzyną, sterowane indywidualnie przez gości -STR_0535 :Łodzie w kształcie kłód do pływania w kanale wodnym ze zjazdami, gdzie woda tryska na gości -STR_0536 :Okrągłe łódki do pływania szerokim kanałem, chlapanie gości przy deszczownicach i dreszczyk emocji na spienionych fragmentach +STR_0535 :Łódki w kształcie pni płyną wodnym kanałem, spadając z pluskiem ze stromych spadków, aby zamoczyć pasażerów +STR_0536 :Okrągłe łódki pokonujące szeroki kanał wodny, spadające z wodospadów i przepływające przez spienione bystrzyny STR_0537 :Elektryczne samochodziki do zderzania, sterowane indywidualnie przez gości STR_0538 :Wielki bujający statek piracki STR_0539 :Statek podczepiony jest do ramienia z przeciwwagą na drugim końcu, buja się wokół wykonując pełny obrót 360 stopni @@ -136,49 +140,53 @@ STR_0550 :Pasażerowie oglądają film, siedząc w specjalnej kabinie, porusz STR_0551 :Kino 3D z projekcją filmów wewnątrz sferycznego budynku STR_0552 :Pasażerowi jeżdżą w gondoli podczepionej pod wielkie obrotowe ramię, kręcąc się do przodu i w tył STR_0553 :Obrotowe okręgi pozwalające gościom na swobodne kręcenie się we wszystkie możliwe kierunki -STR_0554 :Auto jest rozpędzane na stacji przy pomocy Liniowych Indukcyjnych Silników, potem jedzie prosto na szczyt, skąd swobodnie opada z powrotem na stację -STR_0555 :Goście jeżdżą windą w górę lub dół, aby przemieścić się na inny poziom -STR_0556 :Ekstra szerokie pojazdy zjeżdżają pionowym torem, aby osiągnąć największe odczucia nieważkości +STR_0554 :Wagonik jest wystrzeliwany ze stacji za pomocą silnika liniowego i wjeżdza po pionowym torze, po czym wykonuje pionowy zjazd w dół, z powrotem do stacji +STR_0555 :Pasażerowie jeżdzą w górę lub w dół windą w wieży, aby przejść z jednego poziomu na drugi +STR_0556 :Bardzo szerokie wagoniki zjeżdzają po całkowicie pionowym torze, zapewniając pasażerom jedyne w swoim rodzaju wrażenie swobodnego spadania STR_0557 :Bankomat dla gości którym zabrakło gotówki STR_0558 :Pasażerowie jeżdżą parami w siedzeniach znajdujących się na końcach trzech obracających się ramion STR_0559 :Wielki stylizowany budynek zawierający straszne korytarze i upiorne pokoje STR_0560 :Miejsce dla chorych gości, gdzie mogą szybciej dojść do siebie STR_0561 :Pokaz zwierzą cyrkowych wewnątrz wielkiego namiotu -STR_0562 :Samochody z napędem do jeżdżenia po wielopoziomowych torach przez straszne i upiorne efekty -STR_0563 :Siedząc w wygodnych wagonach z prostym zabezpieczeniem goście cieszą się delikatnymi zjazdami i krętą trasą tak samo, jak wiatrem we włosach -STR_0564 :Jazda na drewnianym torze, kolejka jest szybka, twarda, głośna i daje poczucie braku kontroli nad przejazdem, jednocześnie zapewnia uczucie wiatru we włosach -STR_0565 :Prosta drewniana kolejka górska tylko z łagodnymi wzniesieniami i zakrętami, gdzie pojazdy trzymają się trasy w oparciu o tarcie kół i grawitację -STR_0566 :Indywidualna kolejka górska z pojazdami poruszającymi się zakręonym torem z ostrymi łukami i krótkimi stromymi zjazdami -STR_0567 :Siedząc w wózkach podwieszonych po obu stronach toru, goście podskakują gdy wjeżdżają w strome zjazdy i przemierzają różne inwersje -STR_0569 :Jazda w specjalnych uprzężach pod torem, goście mają wrażenie że latają -STR_0571 :Okrągłe pojazdy kręcą się w kółko podczas jazdy tym krętym drewnianym torem -STR_0572 :Łodzie dużej pojemności płynące szerokim kanałem, wznoszone w górę za pomocą taśmociągu, gdy zjeżdżają stromym zjazdem robią wielki plusk żeby zmoczyć gości -STR_0573 :Zasilane pojazdy w kształcie helikopterów na stalowym torze, sterowane pedałami przez gości -STR_0574 :Goście trzymani są przez specjalne uprzęże w pozycji leżącej, jadąc po krętym torze i inwersjach są na przemian na plecach lub twarzą do ziemi +STR_0562 :Napędzane wagoniki jadą po wielopoziomowym torze wśród przerażających dekoracji i efektów specjalnych +STR_0563 :Pasażerowie jadą w wygodnych wagonikach z zabezpieczeniami obejmującymi w pasie, pokonując wielkie gładkie zjazdy i skomplikowane zakręty, a także liczne „wzloty” nad wzniesieniami +STR_0564 :Szybka, ostra i hałaśliwa kolejka jadąca po drewnianym torze, zapewniająca pasażerom niezapomniane wrażenia i dużo swobodnego spadku +STR_0565 :Prosta drewniana kolejka, pokonująca jedynie łagodne nachylenia i zakręty, podczas których wagoniki są utrzymywane na torze tylko przez boczne kółka i siłę grawitacji +STR_0566 :Pojedyncze wagoniki mkną po torze z ostrymi zakrętami i gwałtownymi spadkami +STR_0567 :Pasażerowie jadą w siedzeniach zawieszonych po obu stronach toru, a podczas pokonywania stromych zjazdów i ostrych nawrotów są obracani do góry nogami +STR_0569 :Pasażerowie zasiadają w wygodnych fotelach zawieszonych pod torem i jadą zawiłą trasą, czując się, jakby potrafili latać +STR_0571 :Okrągłe wagoniki wirują, jadąc po zygzakowatym, drewnianym torze +STR_0572 :Pojemne łodzie płynące szerokim kanałem, wciągane po nachyleniu przez pasy napędowe, zjeżdzające ze wzniesień i w wielkim plusku moczące pasażerów +STR_0573 :Zasilane pojazdy w kształcie helikopterów jadące po stalowym torze, sterowane przez pedałujących pasażerów +STR_0574 :Pasażerowie trzymani są przez specjalne uprzęże w pozycji leżącej, podróżując przez zakręcony tor albo na plecach, albo twarzą ku ziemi STR_0575 :Zasilane pociągi zawieszone na pojedynczej szynie służą jako środek transportu ludzi w parku -STR_0577 :Wózki jeżdżące po drewnianych torach, zawracają na specjalnych platformach -STR_0578 :Pojazdy jeżdżące po torze składającym się z okrągłych hopek, strome zbocza i palpitacje serca -STR_0579 :Spokojna gra w mini golfa -STR_0580 :Wielka stalowa kolejka górska na której mogą być łagodne zjazdy i podjazdy na ponad 300 stóp -STR_0581 :Okrąg z siedzeniami kręcący się powoli, podciągany jest w górę wysokiej wieży, następnie następuje swobodne opadanie zakończone delikatnym hamowaniem magnetycznymi hamulcami na dole wieży -STR_0582 :Sterowane przez gości poduszkowce +STR_0577 :Wózki kopalniane jeżdzące po drewnianych torach, zawracające na specjalnych obrotowych sekcjach +STR_0578 :Wagoniki jadą po torze otoczonym okrągłymi obręczami, pokonując strome zjazdy i zabójcze obroty +STR_0579 :Spokojna gra w miniaturowego golfa +STR_0580 :Wielka stalowa kolejka górska jeżdżąca po łagodnych spadkach i wzniesieniach o wysokości ponad 100 metrów +STR_0581 :Pierścień z zamocowanymi fotelami jest wciągany na szczyt wysokiej wieży, obracając się powoli, po czym spada swobodnie, wyhamowując delikatnie u dołu przy użyciu hamulców magnetycznych +STR_0582 :Poduszkowce sterowane przez pasażerów STR_0583 :Budynek zawierający krzywe ściany i korytarze, aby wywoływać uczucie zaburzenia błędnika STR_0584 :Specjalne rowery na stalowej pojedynczej szynie, napędzane siłą mięśni gości -STR_0585 :Goście siedzą na parze siedzeń podwieszonych pod torem podczas przejażdżki przez pętle i ciasne inwersje -STR_0586 :Łodzie stylizowane na samochody jadąc na torze kolejki pozwalają na ostre zakręty i strome zjazdy, zjeżdżając do spokojnych części z rzeką powodują wielki plusk -STR_0587 :Po szybkim starcie wagonika napędzonego powietrzem, kolejka przyspiesza na pionowym torze, na szczycie skład zmienia kierunek i jedzie pionowo w dół na drugą stronę stacji -STR_0588 :Indywidualne samochody podwieszone na krętym torze z super ostrymi zakrętami i stromymi zjazdami +STR_0585 :Pasażerowie podróżują parami w fotelach podwieszonych pod torem, pokonując pętle i ostre zakręty +STR_0586 :Wagoniki w kształcie łodzi jadą po torze z ostrymi zakrętami i stromymi zjazdami, a także pokonują odcinki spokojnie płynącej rzeki +STR_0587 :Po ekscytującym starcie z wyrzutni pneumatycznej, wagoniki wjeżdzają po pionowym torze, po czym wykonują pionowy zjazd w dół, z powrotem do stacji +STR_0588 :Pojedyncze wagoniki jeżdzą podwieszone pod torem z ostrymi zakrętami i gwałtownymi spadkami STR_0589 :Wielkie pojazdy stylizowane na latające dywany, które poruszają się cyklicznie w górę i w dół na końcach 4 ramion -STR_0590 :Goście jadą zanurzeni w łodzi podwodnej w podwodnym torze -STR_0591 :Łodzie wyglądające jak tratwy płynące leniwie przez tor rzeczny +STR_0590 :Pasażerowie usadowieni w łodzi podwodnej podróżują podwodnym torem +STR_0591 :Tratwy manewrujące zręcznie po wodnym torze STR_0593 :Obrotowe koło z zawieszonymi pasażerami, na początku zaczyna się kręcić, potem jest przechylane przez mocujące ramie -STR_0598 :Odwrócona kolejka górska, której wagoniki są rozpędzane na stacji, aby wjechać pionowym torem na szczyt toru, potem z powrotem przez stację, aby jechać odwrotnie na kolejny szczyt toru -STR_0599 :Kolejka górska z indywidualnymi pojazdami i łagodnymi zakręcanymi zjazdami -STR_0600 :Zasilane kopalniane wagoniki jeżdżące przez łagodne i pokręcone tory -STR_0602 :Kolejka górska, której wagoniki są rozpędzane na stacji liniowymi silnikami indukcyjnymi, aby pokonać zakręcone inwersje -STR_0603 :Drewniana kolejka górska ze stalowymi torami pozwalającymi na strome zjazdy i inwersje -STR_0604 :Goście jadą pojedynczymi wagonikami po wąskim torze, ścigając się po ostrych zakrętach i zmianach kieruków. -STR_0605 :Saneczkarze zjeżdżają po wijącym się stalowym torze, hamując, aby kontrolować prędkość. +STR_0598 :Wagoniki tego typu kolejki są rozpędzane na stacji, aby wjechać na szczyt pionowego toru, po czym zjeżdzają z niego, przejeżdzają z powrotem przez stację i wjeżdzają siłą rozpędu tyłem na drugi pionowy odcinek +STR_0599 :Zwarta przestrzennie kolejka z osobnymi wagonikami pokonującymi gładkie i zakręcone zjazdy +STR_0600 :Napędzane wagoniki kopalniane jadą po gładkim i zakręconym torze +STR_0602 :Wagoniki napędzane liniowymi silnikami indukcyjnymi, mknące przez zakręcone inwersje +STR_0603 :Drewniana kolejka górska ze stalowymi torami pozwalającymi na strome zjazdy i mocne inwersje +STR_0604 :Pasażerowie jadą pojedynczymi wagonikami po wąskim jednoszynowym torze, pokonując ostre zakręty i mocne inwersje +STR_0605 :Pasażerowie zjeżdżają po wijącym się stalowym torze, ręcznie hamując, aby kontrolować prędkość +STR_0606 :Drewniana kolejka górska w starszym stylu, oferująca szybką i intensywną jazdę z licznymi wzniesieniami i przeciążeniami bocznymi, co daje poczucie braku kontroli nad przejazdem +STR_0607 :Intensywna kolejka w starym stylu ze stalowymi torami, w której pasażerowie jadą na stojąco +STR_0608 :Wagoniki napędzane synchronicznymi silnikami liniowymi, mknące przez ciasne zakręty i inwersje +STR_0609 :Drewniana kolejka górska w starszym stylu, oferująca szybką i intensywną jazdę w pojedynczych wagonikach, z licznymi wzniesieniami i ostrymi zakrętami STR_0767 :Gość {INT32} STR_0768 :Dozorca {INT32} STR_0769 :Mechanik {INT32} @@ -275,12 +283,12 @@ STR_0883 :Zapisz grę STR_0884 :Wczytaj krajobraz STR_0885 :Zapisz krajobraz STR_0887 :Wyjdź z edytora scenariuszy -STR_0888 :Wyjdź z Projektanta Kolejek -STR_0889 :Wyjdź z Menadżera Projektów Tras +STR_0888 :Wyjdź z projektanta tras +STR_0889 :Wyjdź z menedżera projektów tras STR_0891 :Zrzut ekranu STR_0892 :Zrzut ekranu zapisany jako „{STRINGID}” STR_0893 :Zrzut ekranu nieudany! -STR_0894 :Obszar danych krajobrazu jest pełny ! +STR_0894 :Obszar danych krajobrazu jest pełny! STR_0895 :Nie można wybudować częściowo nad i pod ziemią STR_0896 :{POP16}{POP16}{STRINGID} Budowanie STR_0897 :Kierunek @@ -294,21 +302,21 @@ STR_0904 :Zakręt w lewo (duży promień) STR_0905 :Zakręt w prawo (duży promień) STR_0906 :Prosto STR_0907 :Nachylenie -STR_0908 :Nachylenie boczne -STR_0909 :Seat Rot. -STR_0910 :Nachylenie lewostronne -STR_0911 :Nachylenie prawostronne +STR_0908 :Przechylenie +STR_0909 :Obr. siedzenia +STR_0910 :Przechylenie w lewo +STR_0911 :Przechylenie w prawo STR_0912 :Prosto STR_0913 :Przejdź do poprzedniego elementu STR_0914 :Przejdź do następnego elementu STR_0915 :Wybuduj wybrany element STR_0916 :Usuń podświetlony element STR_0917 :Pionowo w dół -STR_0918 :Ostre w dół +STR_0918 :Ostro w dół STR_0919 :Zjazd w dół STR_0920 :Poziom STR_0921 :Podjazd w górę -STR_0922 :Ostre w górę +STR_0922 :Ostro w górę STR_0923 :Pionowo w górę STR_0924 :Spirala w dół STR_0925 :Spirala w górę @@ -362,12 +370,12 @@ STR_0973 :OK STR_0974 :Atrakcje STR_0975 :Sklepy STR_0976 :Toalety i punkty informacyjne -STR_0977 :Zbuduj atrakcje transportowe -STR_0978 :Zbuduj łagodne atrakcje -STR_0979 :Zbuduj kolejki górskie -STR_0980 :Zbuduj intensywne atrakcje -STR_0981 :Zbuduj wodne atrakcje -STR_0982 :Zbuduj sklepiki lub stoiska +STR_0977 :Nowe atrakcje transportowe +STR_0978 :Nowe łagodne atrakcje +STR_0979 :Nowe kolejki górskie +STR_0980 :Nowe emocjonujące atrakcje +STR_0981 :Nowe wodne atrakcje +STR_0982 :Nowe sklepiki i kioski STR_0983 :Badania i rozwój STR_0984 :{WINDOW_COLOUR_2}▲{BLACK} {CURRENCY2DP} STR_0985 :{WINDOW_COLOUR_2}▼{BLACK} {CURRENCY2DP} @@ -376,15 +384,15 @@ STR_0987 :Zbyt wiele atrakcji STR_0988 :Nie można stworzyć nowej atrakcji… STR_0989 :{STRINGID} STR_0990 :Tryb budowania -STR_0991 :Platforma ze stacją -STR_0992 :Zniszcz całą atrakcję -STR_0993 :Zniszcz atrakcję -STR_0994 :Zniszcz -STR_0995 :{WINDOW_COLOUR_1}Jesteś pewien, że chcesz zniszczyć {STRINGID}? +STR_0991 :Platforma stacji +STR_0992 :Zburz całą atrakcję +STR_0993 :Zburz atrakcję +STR_0994 :Zburz +STR_0995 :{WINDOW_COLOUR_1}Jesteś pewien, że chcesz zburzyć {STRINGID}? STR_0996 :Widok ogólny STR_0997 :Wybór widoku STR_0998 :Nie można utworzyć więcej stacji dla tej atrakcji -STR_0999 :Wymaga platformy ze stacją +STR_0999 :Wymaga platformy stacji STR_1000 :Tor nie jest obwodem zamkniętym STR_1001 :Tor nieodpowiedni dla tego typu kolejki STR_1002 :Nie można otworzyć {STRINGID}… @@ -394,8 +402,8 @@ STR_1005 :Nie można rozpocząć konstrukcji {STRINGID}… STR_1006 :Atrakcja musi najpierw zostać zamknięta STR_1007 :Nie można utworzyć wystarczająco wagonów STR_1008 :Otwórz, zamknij lub testuj atrakcję -STR_1009 :Otwórz / zamknij wszystkie atrakcje -STR_1010 :Otwórz / zamknij park +STR_1009 :Otwórz/zamknij wszystkie atrakcje +STR_1010 :Otwórz/zamknij park STR_1011 :Zamknij wszystkie STR_1012 :Otwórz wszystkie STR_1013 :Zamknij park @@ -420,7 +428,7 @@ STR_1031 :Nie można wybudować tego pod wodą! STR_1032 :Można wybudować to tylko na wodzie! STR_1033 :Można wybudować to tylko nad ziemią! STR_1034 :Można wybudować to tylko na ziemi! -STR_1035 :Władze lokalne zabraniają budowę ponad koronę drzew! +STR_1035 :Władze lokalne zabraniają budowy ponad koronę drzew! STR_1036 :Wczytaj grę STR_1037 :Wczytaj krajobraz STR_1038 :Przekonwertuj zapis gry do scenariusza @@ -437,13 +445,13 @@ STR_1048 :Zapis scenariusza nieudany! STR_1049 :Zapis krajobrazu nieudany! STR_1050 :Nie udało się wczytać…{NEWLINE}Plik zawiera błędne dane! STR_1051 :Przezroczyste wsporniki -STR_1052 :Przezroczyści ludzie +STR_1052 :Przezroczyści goście STR_1053 :Atrakcje w parku -STR_1054 :Nazwy atrakcji -STR_1055 :Nazwy osób -STR_1056 :Nazwy pracowników +STR_1054 :Nazwij atrakcję +STR_1055 :Nazwij gościa +STR_1056 :Nazwij pracownika STR_1057 :Nazwa atrakcji -STR_1058 :Wprowadź nazwę dla tej atrakcji: +STR_1058 :Podaj nową nazwę atrakcji: STR_1059 :Nie można zmienić nazwy atrakcji… STR_1060 :Nieprawidłowa nazwa atrakcji STR_1061 :Tryb normalny @@ -456,7 +464,7 @@ STR_1067 :Start w górę STR_1068 :Tryb obrotowego podnoszenia STR_1069 :Tryb od stacji do stacji STR_1070 :Pojedynczy przejazd na wstęp -STR_1071 :Nieograniczone przejazdy za wstęp +STR_1071 :Nieograniczone przejazdy na wstęp STR_1072 :Tryb labiryntu STR_1073 :Tryb wyścigowy STR_1074 :Tryb zbijaków @@ -465,14 +473,14 @@ STR_1076 :Tryb stoiska sklepowego STR_1077 :Tryb obrotowy STR_1078 :Obroty do przodu STR_1079 :Obroty do tyłu -STR_1080 :Film: ”Mściwi lotnicy” -STR_1081 :3D film: ”Mysie ogonki” +STR_1080 :Film: „Mściwi lotnicy” +STR_1081 :Film 3D: „Mysie ogonki” STR_1082 :Tryb gwiezdnych pierścieni STR_1083 :Tryb początkującego -STR_1084 :LIM-powered launch -STR_1085 :Film: ”Thrill riders” -STR_1086 :3D film: ”Storm chasers” -STR_1087 :3D film: ”Kosmiczni jeźdźcy” +STR_1084 :Tryb napędu LIM +STR_1085 :Film: „Poszukiwacze mocnych wrażeń” +STR_1086 :Film 3D: „Łowcy burz” +STR_1087 :Film 3D: „Kosmiczni jeźdźcy” STR_1088 :Tryb intensywny STR_1089 :Tryb berserk STR_1090 :Tryb nawiedzonego domu @@ -482,7 +490,7 @@ STR_1093 :Tryb krzywego domu STR_1094 :Tryb wolnego spadku STR_1095 :Sekcyjny tryb pracy ciągłej STR_1096 :Rozpędzany start (bez przejeżdżania przez stację) -STR_1097 :Rozpędzany start zablokowany tryb sekcyjny +STR_1097 :Rozpędzany start w trybie sekcyjnym STR_1098 :Przemieszcza się na koniec {POP16}{STRINGID} STR_1099 :Oczekiwania na pasażerów w {POP16}{STRINGID} STR_1100 :Oczekuje na odjazd {POP16}{STRINGID} @@ -494,7 +502,7 @@ STR_1105 :Jedzie {VELOCITY} STR_1106 :Rozbija się! STR_1107 :Rozbity! STR_1108 :Jedzie {VELOCITY} -STR_1109 :Huśta +STR_1109 :Huśta się STR_1110 :Obraca się STR_1111 :Obraca się STR_1112 :Działa @@ -524,8 +532,8 @@ STR_1135 :{STRINGID} {COMMA16} STR_1136 :Wybierz główny kolor STR_1137 :Wybierz dodatkowy kolor nr 1 STR_1138 :Wybierz dodatkowy kolor nr 2 -STR_1139 :Wybierz schemat koloru wsporników -STR_1140 :Wybierz schemat koloru pojazdów +STR_1139 :Wybierz kolor wsporników +STR_1140 :Wybierz schemat kolorów pojazdów STR_1141 :Wybierz pojazd/pociąg do edycji STR_1142 :{MOVE_X}{10}{STRINGID} STR_1143 :»{MOVE_X}{10}{STRINGID} @@ -544,8 +552,8 @@ STR_1155 :Znaczniki wysokości chodników STR_1156 :{MOVE_X}{10}{STRINGID} STR_1157 :✓{MOVE_X}{10}{STRINGID} STR_1158 :Nie można tego usunąć… -STR_1159 :Buduj scenerię, rośliny i inne akcesoria -STR_1160 :Twórz i zmieniaj obszary wodne +STR_1159 :Rozmieszczaj scenerię, roślinność i inne ozdoby +STR_1160 :Twórz i zmieniaj zbiorniki wodne STR_1161 :Nie można tego tu umieścić… STR_1162 :{OUTLINE}{TOPAZ}{STRINGID} STR_1163 :{STRINGID}{NEWLINE}(Kliknij PPM by zmodyfikować) @@ -556,9 +564,9 @@ STR_1167 :Nie można tu podnieść poziomu wody… STR_1168 :Opcje STR_1169 :(Brak) STR_1170 :{STRING} -STR_1171 :{RED}Zamknięte - - +STR_1171 :{RED}Zamknięte STR_1172 :{YELLOW}{STRINGID} -STR_1173 :Budowa chodników +STR_1173 :Buduj dróżki i kolejki STR_1174 :Baner blokuje STR_1175 :Nie można tego postawić na nierównej ścieżce STR_1176 :Nie można tu zbudować ścieżki… @@ -579,23 +587,23 @@ STR_1190 :Usuń poprzednią sekcję ścieżki STR_1191 :{BLACK}{STRINGID} STR_1192 :{OUTLINE}{RED}{STRINGID} STR_1193 :{WINDOW_COLOUR_2}{STRINGID} -STR_1194 :Zamknięty -STR_1195 :Testowany -STR_1196 :Otwarty +STR_1194 :Zamknięte +STR_1195 :Testowane +STR_1196 :Otwarte STR_1197 :Awaria STR_1198 :Katastrofa! STR_1199 :{COMMA16} osoba korzysta STR_1200 :{COMMA16} osób korzysta -STR_1201 :Kolejka pusta +STR_1201 :Pusta kolejka STR_1202 :1 osoba w kolejce -STR_1203 :{COMMA16} osób w kolejce -STR_1204 :{COMMA16} minuta czekania -STR_1205 :{COMMA16} minut czekania +STR_1203 :{COMMA16} - liczba osób w kolejce +STR_1204 :{COMMA16} min. w kolejce +STR_1205 :{COMMA16} min. w kolejce STR_1206 :{WINDOW_COLOUR_2}Czekaj na: STR_1207 :{WINDOW_COLOUR_2}Wyrusz, gdy inna kolejka trafi na tą samą stację STR_1208 :{WINDOW_COLOUR_2}Wyrusz, gdy inna łódka trafi na tą samą stację STR_1209 :Ustal, czy pojazdy powinny czekać na pasażerów przed wyruszeniem ze stacji -STR_1210 :Ustal, czy pojazdy powinny wyruszać ze stacj gdy tylko inny pojazd dotrze do tej samej stacji +STR_1210 :Ustal, czy pojazdy powinny wyruszać ze stacji gdy tylko inny pojazd dotrze do tej samej stacji STR_1211 :{WINDOW_COLOUR_2}Min. czas oczekiwania: STR_1212 :{WINDOW_COLOUR_2}Maks. czas oczekiwania: STR_1213 :Wybierz minimalny czas oczekiwania na stacji przed wyruszeniem @@ -720,16 +728,16 @@ STR_1331 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{VEL STR_1332 :{VELOCITY} STR_1333 :{STRINGID} - {STRINGID}{POP16} STR_1334 :{STRINGID} - {STRINGID} {COMMA16} -STR_1335 :{STRINGID} - Wjazd{POP16}{POP16} -STR_1336 :{STRINGID} - Wjazd {POP16}{COMMA16} do stacji -STR_1337 :{STRINGID} - Opuszczanie{POP16}{POP16} -STR_1338 :{STRINGID} - Opuszczanie {POP16}{COMMA16} stacji +STR_1335 :{STRINGID} - Wejście{POP16}{POP16} +STR_1336 :{STRINGID} - Wejście na {POP16}{COMMA16} stację +STR_1337 :{STRINGID} - Wyjście{POP16}{POP16} +STR_1338 :{STRINGID} - Wyjście z {POP16}{COMMA16} stacji STR_1339 :{BLACK}Oczekiwanie na rezultaty testu… STR_1340 :{WINDOW_COLOUR_2}Maks. prędkość: {BLACK}{VELOCITY} STR_1341 :{WINDOW_COLOUR_2}Czas przejazdu: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1342 :{DURATION} STR_1343 :{DURATION} / -STR_1344 :{WINDOW_COLOUR_2}Czas przejazdu: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} +STR_1344 :{WINDOW_COLOUR_2}Długość trasy: {BLACK}{STRINGID}{STRINGID}{STRINGID}{STRINGID} STR_1345 :{LENGTH} STR_1346 :{LENGTH} / STR_1347 :{WINDOW_COLOUR_2}Średnia prędkość: {BLACK}{VELOCITY} @@ -744,8 +752,8 @@ STR_1355 :{WINDOW_COLOUR_2}Spadki: {BLACK}{COMMA16} STR_1356 :{WINDOW_COLOUR_2}Inwersja: {BLACK}{COMMA16} STR_1357 :{WINDOW_COLOUR_2}Dołki: {BLACK}{COMMA16} STR_1358 :{WINDOW_COLOUR_2}Całkowity czas „w powietrzu”: {BLACK}{COMMA2DP32}sek. -STR_1359 :{WINDOW_COLOUR_2}Czas w kolejce: {BLACK}{COMMA16} minut -STR_1360 :{WINDOW_COLOUR_2}Czas w kolejce: {BLACK}{COMMA16} minut +STR_1359 :{WINDOW_COLOUR_2}Czas w kolejce: {BLACK}{COMMA16} min. +STR_1360 :{WINDOW_COLOUR_2}Czas w kolejce: {BLACK}{COMMA16} min. STR_1361 :Nie można zmienić prędkości… STR_1362 :Nie można zmienić prędkości startowej… STR_1363 :Za wysoko na wsporniki! @@ -781,16 +789,16 @@ STR_1392 :Podgląd atrakcji STR_1393 :Szczegóły i opcje pojazdów STR_1394 :Opcje operacyjne STR_1395 :Ustawienia konserwacji -STR_1396 :Ustawienia schematu koloru +STR_1396 :Ustawienia schematu kolorów STR_1397 :Ustawienia dźwięku i muzyki STR_1398 :Pomiary i statystyki STR_1399 :Wykresy STR_1400 :Wejście STR_1401 :Wyjście STR_1402 :Wybuduj lub przesuń wejście do atrakcji -STR_1403 :Wybuduj lub przesuń wyjście z atrakcji -STR_1404 :Obrót o° -STR_1405 :Zdjęcie lustrzane +STR_1403 :Wybuduj lub przesuń wyjście z atrakcji +STR_1404 :Obrót o 90° +STR_1405 :Odbicie lustrzane STR_1406 :Włącz/wyłącz scenerię (jeśli dostępne w motywie) STR_1407 :{WINDOW_COLOUR_2}Wybuduj to… STR_1408 :{WINDOW_COLOUR_2}Koszt: {BLACK}{CURRENCY} @@ -817,7 +825,7 @@ STR_1428 :{WINDOW_COLOUR_2}Cena wstępu: STR_1429 :{POP16}{POP16}{POP16}{CURRENCY2DP} STR_1430 :Za darmo STR_1431 :Spaceruje -STR_1432 :Idzie na {STRINGID} +STR_1432 :Idzie w kierunku {STRINGID} STR_1433 :Czeka w kolejce na {STRINGID} STR_1434 :Tonie STR_1435 :Korzysta z atrakcji {STRINGID} @@ -838,158 +846,158 @@ STR_1449 :{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1450 :{INLINE_SPRITE}{09}{20}{00}{00}{SPRITE} {STRINGID}{NEWLINE}({STRINGID}) STR_1451 :{STRINGID}{NEWLINE}({STRINGID}) STR_1452 :Imię gościa -STR_1453 :Nowe imię dla gościa: +STR_1453 :Podaj nowe imię gościa: STR_1454 :Nie można tak nazwać gościa… STR_1455 :Niewłaściwe imię dla gościa -STR_1456 :{WINDOW_COLOUR_2}Wydał: {BLACK}{CURRENCY2DP} -STR_1457 :{WINDOW_COLOUR_2}Pieniędzy w kieszeni: {BLACK}{CURRENCY2DP} +STR_1456 :{WINDOW_COLOUR_2}Wydane pieniądze: {BLACK}{CURRENCY2DP} +STR_1457 :{WINDOW_COLOUR_2}Posiadane pieniądze: {BLACK}{CURRENCY2DP} STR_1458 :{WINDOW_COLOUR_2}Czas w parku: {BLACK}{REALTIME} STR_1459 :Styl trasy STR_1460 :Otwarta trasa typu „U” STR_1461 :Zamknięta trasa typu „O” -STR_1462 :Too steep for lift hill +STR_1462 :Zbyt stromy podjazd na wyciągarkę STR_1463 :Goście STR_1464 :Spirala w górę (mała) STR_1465 :Spirala w górę (duża) STR_1466 :Spirala w dół (mała) STR_1467 :Spirala w dół (duża) -STR_1468 :Obsługa +STR_1468 :Personel STR_1469 :Atrakcja musi się zaczynać i kończyć stacją STR_1470 :Stacja jest za krótka STR_1471 :{WINDOW_COLOUR_2}Prędkość: STR_1472 :Prędkość dla przejazdu -STR_1473 :{WINDOW_COLOUR_2}Ocena emocji: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1474 :{WINDOW_COLOUR_2}Ocena emocji: {BLACK}Jeszcze niedostępna -STR_1475 :{WINDOW_COLOUR_2}Ocena intensywności: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1476 :{WINDOW_COLOUR_2}Ocena intensywności: {BLACK}Jeszcze nie dostępna -STR_1477 :{WINDOW_COLOUR_2}Ocena intensywności: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) -STR_1478 :{WINDOW_COLOUR_2}Ocena mdłości: {BLACK}{COMMA2DP32} ({STRINGID}) -STR_1479 :{WINDOW_COLOUR_2}Ocena mdłości: {BLACK}Jeszcze nie dostępna -STR_1480 :“Nie mogę sobie pozwolić na {STRINGID}” -STR_1481 :“Wydałem wszystkie swoje pieniądze” -STR_1482 :“Niedobrze mi” -STR_1483 :“Zaraz zwymiotuję” -STR_1484 :“Chcę pójść na coś bardziej intensywnego niż {STRINGID}” -STR_1485 :“{STRINGID} wygląda zbyt intensywne dla mnie” -STR_1486 :“Nie skończyłem {STRINGID} jeszcze” -STR_1487 :“Od samego patrzenia na {STRINGID} robi mi się niedobrze” -STR_1488 :“Nie zapłacę tyle za {STRINGID}” -STR_1489 :“Chcę już do domu” -STR_1490 :“{STRINGID} ma naprawdę dobrą cenę” -STR_1491 :“Mam już {STRINGID}” -STR_1492 :“Nie mogę sobie pozwolić na {STRINGID}” -STR_1493 :“Nie jestem głodny” -STR_1494 :“Nie jestem spragniony” -STR_1495 :“Pomocy! Tonę!” -STR_1496 :“Zgubiłem się!” -STR_1497 :“Na atrakcji {STRINGID} było świetnie” -STR_1498 :“Czekam już wieki w kolejce na {STRINGID}” -STR_1499 :“Jestem zmęczony” -STR_1500 :“Jestem głodny” -STR_1501 :“Jestem spragniony” -STR_1502 :“Muszę do toalety” -STR_1503 :“Nie mogę znaleźć {STRINGID}” -STR_1504 :“Nie zapłacę tyle za {STRINGID}” -STR_1505 :“Nie pójdę na {STRINGID} dopóki pada” -STR_1506 :“Ścieżki tutaj są okropne” -STR_1507 :“Nie mogę znaleźć wyjścia z parku” -STR_1508 :“Muszę odpocząć od {STRINGID}” -STR_1509 :“Chcę już wyjść z {STRINGID}” -STR_1510 :“Nie pójdę na {STRINGID} - nie wygląda za bezpiecznie” -STR_1511 :“Ta ścieżka jest obrzydliwa” -STR_1512 :“Tutaj jest zdecydowanie za tłoczno” -STR_1513 :“Wandalizm stanowi tutaj duży problem” -STR_1514 :“Świetna sceneria!” -STR_1515 :“Ten park jest naprawdę czysty” -STR_1516 :“Ta skaczą fontanna jest świetna” -STR_1517 :“Leci tutaj miła muzyka” -STR_1518 :“Ten balon z {STRINGID} był naprawdę opłacalny” -STR_1519 :“Ta przytulanka z {STRINGID} była naprawdę opłacalna” -STR_1520 :“Ta mapa parku z {STRINGID} była naprawdę opłacalna” -STR_1521 :“To zdjęcie z przejazdu na {STRINGID} było naprawdę opłacalne” -STR_1522 :“Ta parasolka z {STRINGID} była naprawdę opłacalna” -STR_1523 :“Ten napój z {STRINGID} był naprawdę opłacalny” -STR_1524 :“Ten burger z {STRINGID} był naprawdę opłacalny” -STR_1525 :“Te frytki z {STRINGID} były naprawdę opłacalne” -STR_1526 :“Te lody z {STRINGID} były naprawdę opłacalne” -STR_1527 :“Ta wata cukrowa {STRINGID} była naprawdę opłacalna” +STR_1473 :{WINDOW_COLOUR_2}Emocje: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1474 :{WINDOW_COLOUR_2}Emocje: {BLACK}Jeszcze nieznane +STR_1475 :{WINDOW_COLOUR_2}Intensywność: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1476 :{WINDOW_COLOUR_2}Intensywność: {BLACK}Jeszcze nieznana +STR_1477 :{WINDOW_COLOUR_2}Intensywność: {OUTLINE}{RED}{COMMA2DP32} ({STRINGID}) +STR_1478 :{WINDOW_COLOUR_2}Mdłości: {BLACK}{COMMA2DP32} ({STRINGID}) +STR_1479 :{WINDOW_COLOUR_2}Mdłości: {BLACK}Jeszcze nieznane +STR_1480 :„Nie mogę sobie pozwolić na {STRINGID}” +STR_1481 :„Wydałem wszystkie swoje pieniądze” +STR_1482 :„Niedobrze mi” +STR_1483 :„Zaraz zwymiotuję” +STR_1484 :„Chcę pójść na coś ciekawszego niż {STRINGID}” +STR_1485 :„{STRINGID} wygląda zbyt intensywne dla mnie” +STR_1486 :„Nie skończyłem jeszcze {STRINGID}” +STR_1487 :„{STRINGID} - od samego patrzenia robi mi się niedobrze” +STR_1488 :„Nie zapłacę tyle za {STRINGID}” +STR_1489 :„Chcę wracać do domu” +STR_1490 :„{STRINGID} ma naprawdę dobrą cenę” +STR_1491 :„Już mam {STRINGID}” +STR_1492 :„Nie mogę sobie pozwolić na {STRINGID}” +STR_1493 :„Nie chce mi się jeść” +STR_1494 :„Nie chce mi się pić” +STR_1495 :„Pomocy! Tonę!” +STR_1496 :„Zgubiłem się!” +STR_1497 :„Na atrakcji {STRINGID} było świetnie” +STR_1498 :„{STRINGID}… Już wieki stoję w kolejce do tej atrakcji” +STR_1499 :„Opadam z sił” +STR_1500 :„Chce mi się jeść” +STR_1501 :„Chce mi się pić” +STR_1502 :„Muszę do łazienki” +STR_1503 :„Nie mogę znaleźć {STRINGID}” +STR_1504 :„Nie zapłacę tyle za {STRINGID}” +STR_1505 :„Nie pójdę na {STRINGID} dopóki pada” +STR_1506 :„Ścieżki tutaj są okropne” +STR_1507 :„Nie mogę znaleźć wyjścia z parku” +STR_1508 :„Muszę odpocząć od {STRINGID}” +STR_1509 :„Chcę już wyjść z {STRINGID}” +STR_1510 :„Nie pójdę na {STRINGID} - nie wygląda za bezpiecznie” +STR_1511 :„Ta ścieżka jest obrzydliwa” +STR_1512 :„Tutaj jest zdecydowanie za tłoczno” +STR_1513 :„Wandalizm stanowi tutaj duży problem” +STR_1514 :„Wspaniały krajobraz!” +STR_1515 :„W tym parku jest naprawdę czysto i porządnie” +STR_1516 :„Ta skacząca fontanna jest świetna” +STR_1517 :„Leci tutaj przyjemna muzyka” +STR_1518 :„Ten balon z {STRINGID} naprawdę się opłaca” +STR_1519 :„Ta przytulanka z {STRINGID} naprawdę się opłaca” +STR_1520 :„Ta mapa parku z {STRINGID} naprawdę się opłaca” +STR_1521 :„To zdjęcie z przejazdu na {STRINGID} naprawdę się opłaca” +STR_1522 :„Ta parasolka z {STRINGID} naprawdę się opłaca” +STR_1523 :„Ten napój z {STRINGID} naprawdę się opłaca” +STR_1524 :„Ten burger z {STRINGID} naprawdę się opłaca” +STR_1525 :„Te frytki z {STRINGID} naprawdę się opłacają” +STR_1526 :„Te lody z {STRINGID} naprawdę się opłacają” +STR_1527 :„Ta wata cukrowa {STRINGID} naprawdę się opłaca” STR_1528 : STR_1529 : STR_1530 : -STR_1531 :“Ta pizza z {STRINGID} była naprawdę opłacalna” +STR_1531 :„Ta pizza z {STRINGID} naprawdę się opłaca” STR_1532 : -STR_1533 :“Ten popcorn z {STRINGID} był naprawdę opłacalny” -STR_1534 :“Ten hotdog z {STRINGID} był naprawdę opłacalny” -STR_1535 :“Ta ośmiorniczka z {STRINGID} była naprawdę opłacalna” -STR_1536 :“Ten kapelusz {STRINGID} był naprawdę opłacalny” -STR_1537 :“To kandyzowane jabłko z {STRINGID} było naprawdę opłacalne” -STR_1538 :“Ten t-shirt z {STRINGID} był naprawdę opłacalny” -STR_1539 :“Ten pączek z {STRINGID} był naprawdę opłacalny” -STR_1540 :“Ta kawa z {STRINGID} była naprawdę opłacalna” +STR_1533 :„Ten popcorn z {STRINGID} naprawdę się opłaca” +STR_1534 :„Ten hotdog z {STRINGID} naprawdę się opłaca” +STR_1535 :„Ta macka z {STRINGID} naprawdę się opłaca” +STR_1536 :„Ten kapelusz {STRINGID} naprawdę się opłaca” +STR_1537 :„To jabłko w polewie z {STRINGID} naprawdę się opłaca” +STR_1538 :„Ta koszulka z {STRINGID} naprawdę się opłaca” +STR_1539 :„Ten pączek z {STRINGID} naprawdę się opłaca” +STR_1540 :„Ta kawa z {STRINGID} naprawdę się opłaca” STR_1541 : -STR_1542 :“Ten smażony kurczak z {STRINGID} był naprawdę opłacalny” -STR_1543 :“Ta lemoniada z {STRINGID} była naprawdę opłacalna” +STR_1542 :„Ten kurczak z {STRINGID} naprawdę się opłaca” +STR_1543 :„Ta lemoniada z {STRINGID} naprawdę się opłaca” STR_1544 : STR_1545 : STR_1546 : STR_1547 : STR_1548 : STR_1549 : -STR_1550 :“Świetnie!” -STR_1551 :“Mam dziwne uczucie jakby mnie ktoś podglądał” -STR_1552 :“Nie zapłacę tyle za balona z {STRINGID}” -STR_1553 :“Nie zapłacę tyle za przytulankę z {STRINGID}” -STR_1554 :“Nie zapłacę tyle za mapę parku z {STRINGID}” -STR_1555 :“Nie zapłacę tyle za zdjęcie z przejażdżki z {STRINGID}” -STR_1556 :“Nie zapłacę tyle za parasol z {STRINGID}” -STR_1557 :“Nie zapłacę tyle za napój z {STRINGID}” -STR_1558 :“Nie zapłacę tyle za burgera z {STRINGID}” -STR_1559 :“Nie zapłacę tyle za frytki z {STRINGID}” -STR_1560 :“Nie zapłacę tyle za lody z {STRINGID}” -STR_1561 :“Nie zapłacę tyle za watę cukrową z {STRINGID}” +STR_1550 :„Świetnie!” +STR_1551 :„Mam dziwne uczucie jakby mnie ktoś podglądał” +STR_1552 :„Nie zapłacę tyle za balona z {STRINGID}” +STR_1553 :„Nie zapłacę tyle za przytulankę z {STRINGID}” +STR_1554 :„Nie zapłacę tyle za mapę parku z {STRINGID}” +STR_1555 :„Nie zapłacę tyle za zdjęcie z przejażdżki z {STRINGID}” +STR_1556 :„Nie zapłacę tyle za parasol z {STRINGID}” +STR_1557 :„Nie zapłacę tyle za napój z {STRINGID}” +STR_1558 :„Nie zapłacę tyle za burgera z {STRINGID}” +STR_1559 :„Nie zapłacę tyle za frytki z {STRINGID}” +STR_1560 :„Nie zapłacę tyle za lody z {STRINGID}” +STR_1561 :„Nie zapłacę tyle za watę cukrową z {STRINGID}” STR_1562 : STR_1563 : STR_1564 : -STR_1565 :“Nie zapłacę tyle za pizzę z {STRINGID}” +STR_1565 :„Nie zapłacę tyle za pizzę z {STRINGID}” STR_1566 : -STR_1567 :“Nie zapłacę tyle za popcorn z {STRINGID}” -STR_1568 :“Nie zapłacę tyle za hotdoga z {STRINGID}” -STR_1569 :“Nie zapłacę tyle za ośmiorniczkę z {STRINGID}” -STR_1570 :“Nie zapłacę tyle za kapelusz z {STRINGID}” -STR_1571 :“Nie zapłacę tyle za kandyzowane jabłko z {STRINGID}” -STR_1572 :“Nie zapłacę tyle za koszulkę z {STRINGID}” -STR_1573 :“Nie zapłacę tyle za pączka z {STRINGID}” -STR_1574 :“Nie zapłacę tyle za kawę z {STRINGID}” +STR_1567 :„Nie zapłacę tyle za popcorn z {STRINGID}” +STR_1568 :„Nie zapłacę tyle za hotdoga z {STRINGID}” +STR_1569 :„Nie zapłacę tyle za ośmiorniczkę z {STRINGID}” +STR_1570 :„Nie zapłacę tyle za kapelusz z {STRINGID}” +STR_1571 :„Nie zapłacę tyle za kandyzowane jabłko z {STRINGID}” +STR_1572 :„Nie zapłacę tyle za koszulkę z {STRINGID}” +STR_1573 :„Nie zapłacę tyle za pączka z {STRINGID}” +STR_1574 :„Nie zapłacę tyle za kawę z {STRINGID}” STR_1575 : -STR_1576 :“Nie zapłacę tyle za kurczaka z {STRINGID}” -STR_1577 :“Nie zapłacę tyle za lemoniadę z {STRINGID}” +STR_1576 :„Nie zapłacę tyle za kurczaka z {STRINGID}” +STR_1577 :„Nie zapłacę tyle za lemoniadę z {STRINGID}” STR_1578 : STR_1579 : STR_1580 : STR_1581 : STR_1582 : STR_1583 : -STR_1584 :“To zdjęcie z przejażdżki na {STRINGID} było naprawdę opłacalne” -STR_1585 :“To zdjęcie z przejażdżki na {STRINGID} było naprawdę opłacalne” -STR_1586 :“To zdjęcie z przejażdżki na {STRINGID} było naprawdę opłacalne” -STR_1587 :“Ten precel z {STRINGID} był naprawdę opłacalny” -STR_1588 :“Ta gorąca czekolada z {STRINGID} była naprawdę opłacalna” -STR_1589 :“Ta mrożona herbata z {STRINGID} była naprawdę opłacalna” -STR_1590 :“Ten precel z {STRINGID} był naprawdę opłacalny” -STR_1591 :“Te okulary przeciwsłoneczne z {STRINGID} były naprawdę opłacalne” -STR_1592 :“Ten makaron z wołowiną z {STRINGID} był naprawdę opłacalny” -STR_1593 :“Ten smażony makaron z {STRINGID} był naprawdę opłacalny” -STR_1594 :“Ta zupa wonton z {STRINGID} była naprawdę opłacalna” -STR_1595 :“Ta zupa z klopsikami z {STRINGID} była naprawdę opłacalna” -STR_1596 :“Ten sok owocowy z {STRINGID} był naprawdę opłacalny” -STR_1597 :“Te mleko sojowe z {STRINGID} było naprawdę opłacalne” -STR_1598 :“Ta sujongkwa z {STRINGID} była naprawdę opłacalna” -STR_1599 :“Ta kanapka z {STRINGID} była naprawdę opłacalna” -STR_1600 :“To ciasteczko z {STRINGID} było naprawdę opłacalne” +STR_1584 :„To zdjęcie z przejażdżki na {STRINGID} naprawdę się opłaca” +STR_1585 :„To zdjęcie z przejażdżki na {STRINGID} naprawdę się opłaca” +STR_1586 :„To zdjęcie z przejażdżki na {STRINGID} naprawdę się opłaca” +STR_1587 :„Ten precel z {STRINGID} naprawdę się opłaca” +STR_1588 :„Ta gorąca czekolada z {STRINGID} naprawdę się opłaca” +STR_1589 :„Ta mrożona herbata z {STRINGID} naprawdę się opłaca” +STR_1590 :„Te faworki z {STRINGID} naprawdę się opłacają” +STR_1591 :„Te okulary przeciwsłoneczne z {STRINGID} naprawdę się opłacają” +STR_1592 :„Ten makaron z wołowiną z {STRINGID} naprawdę się opłaca” +STR_1593 :„Ten smażony makaron z {STRINGID} naprawdę się opłaca” +STR_1594 :„Ta zupa wonton z {STRINGID}naprawdę się opłaca” +STR_1595 :„Ta zupa z klopsikami z {STRINGID} naprawdę się opłaca” +STR_1596 :„Ten sok owocowy z {STRINGID} naprawdę się opłaca” +STR_1597 :„To mleko sojowe z {STRINGID} naprawdę się opłaca” +STR_1598 :„Ta sujongkwa z {STRINGID} naprawdę się opłaca” +STR_1599 :„Ta kanapka z {STRINGID} naprawdę się opłaca” +STR_1600 :„To ciasteczko z {STRINGID} naprawdę się opłaca” STR_1601 : STR_1602 : STR_1603 : -STR_1604 :“Ta grillowana kiełbasa z {STRINGID} była naprawdę opłacalna” +STR_1604 :„Ta pieczona kiełbaska z {STRINGID} naprawdę się opłaca” STR_1605 : STR_1606 : STR_1607 : @@ -1001,27 +1009,27 @@ STR_1612 : STR_1613 : STR_1614 : STR_1615 : -STR_1616 :“Nie zapłacę tyle za zdjęcie z przejażdżki na {STRINGID}” -STR_1617 :“Nie zapłacę tyle za zdjęcie z przejażdżki na {STRINGID}” -STR_1618 :“Nie zapłacę tyle za zdjęcie z przejażdżki na {STRINGID}” -STR_1619 :“Nie zapłacę tyle za precla z {STRINGID}” -STR_1620 :“Nie zapłacę tyle za gorącą czekoladę z {STRINGID}” -STR_1621 :“Nie zapłacę tyle za mrożoną herbatę z {STRINGID}” -STR_1622 :“Nie zapłacę tyle za chrusta z {STRINGID}” -STR_1623 :“Nie zapłacę tyle za okulary przeciwsłoneczne z {STRINGID}” -STR_1624 :“Nie zapłacę tyle za makaron z wołowiną z {STRINGID}” -STR_1625 :“Nie zapłacę tyle za smażony makaron ryżowy z {STRINGID}” -STR_1626 :“Nie zapłacę tyle za zupę wonton z {STRINGID}” -STR_1627 :“Nie zapłacę tyle za zupę z klopsikami z {STRINGID}” -STR_1628 :“Nie zapłacę tyle za sok owocowy z {STRINGID}” -STR_1629 :“Nie zapłacę tyle za mleko sojowe z {STRINGID}” -STR_1630 :“Nie zapłacę tyle za sujongkwa z {STRINGID}” -STR_1631 :“Nie zapłacę tyle za kanapkę z {STRINGID}” -STR_1632 :“Nie zapłacę tyle za ciasteczko z {STRINGID}” +STR_1616 :„Nie zapłacę tyle za zdjęcie z przejażdżki na {STRINGID}” +STR_1617 :„Nie zapłacę tyle za zdjęcie z przejażdżki na {STRINGID}” +STR_1618 :„Nie zapłacę tyle za zdjęcie z przejażdżki na {STRINGID}” +STR_1619 :„Nie zapłacę tyle za precla z {STRINGID}” +STR_1620 :„Nie zapłacę tyle za gorącą czekoladę z {STRINGID}” +STR_1621 :„Nie zapłacę tyle za mrożoną herbatę z {STRINGID}” +STR_1622 :„Nie zapłacę tyle za faworki z {STRINGID}” +STR_1623 :„Nie zapłacę tyle za okulary przeciwsłoneczne z {STRINGID}” +STR_1624 :„Nie zapłacę tyle za makaron z wołowiną z {STRINGID}” +STR_1625 :„Nie zapłacę tyle za smażony makaron ryżowy z {STRINGID}” +STR_1626 :„Nie zapłacę tyle za zupę wonton z {STRINGID}” +STR_1627 :„Nie zapłacę tyle za zupę z klopsikami z {STRINGID}” +STR_1628 :„Nie zapłacę tyle za sok owocowy z {STRINGID}” +STR_1629 :„Nie zapłacę tyle za mleko sojowe z {STRINGID}” +STR_1630 :„Nie zapłacę tyle za sujongkwa z {STRINGID}” +STR_1631 :„Nie zapłacę tyle za kanapkę z {STRINGID}” +STR_1632 :„Nie zapłacę tyle za ciasteczko z {STRINGID}” STR_1633 : STR_1634 : STR_1635 : -STR_1636 :“Nie zapłacę tyle za grillowaną kiełbasę z {RINGID}” +STR_1636 :„Nie zapłacę tyle za pieczoną kiełbaskę z {RINGID}” STR_1637 : STR_1638 : STR_1639 : @@ -1033,10 +1041,10 @@ STR_1644 : STR_1645 : STR_1646 : STR_1647 : -STR_1648 :“Pomocy! Puść mnie!” -STR_1649 :“Kończą mi się pieniądze!” -STR_1650 :“Świetnie! Budują nową atrakcję!” -STR_1653 :“…i teraz jesteśmy na {STRINGID}!” +STR_1648 :„Pomocy! Puść mnie!” +STR_1649 :„Kończą mi się pieniądze!” +STR_1650 :„Świetnie! Budują nową atrakcję!” +STR_1653 :„…i teraz jesteśmy na {STRINGID}!” STR_1654 :{WINDOW_COLOUR_2}Ostatnie myśli: STR_1655 :Buduj ścieżki na ziemi STR_1656 :Buduj ścieżki w powietrzu lub pod ziemią @@ -1053,10 +1061,10 @@ STR_1666 :{WINDOW_COLOUR_2}Pragnienie: STR_1667 :{WINDOW_COLOUR_2}Pęcherz: STR_1668 :{WINDOW_COLOUR_2}Zadowolenie {BLACK}Nieznane STR_1669 :{WINDOW_COLOUR_2}Zadowolenie: {BLACK}{COMMA16}% -STR_1670 :{WINDOW_COLOUR_2}Wszystkich klientów: {BLACK}{COMMA32} +STR_1670 :{WINDOW_COLOUR_2}Łączna liczba klientów: {BLACK}{COMMA32} STR_1671 :{WINDOW_COLOUR_2}Całkowity zysk: {BLACK}{CURRENCY2DP} STR_1672 :Hamulce -STR_1673 :Spinning Control Toggle Track +STR_1673 :Tor opcji blokowania obrotów STR_1674 :Prędkość hamowania STR_1675 :{POP16}{VELOCITY} STR_1676 :Ustaw limit prędkości hamowania @@ -1070,7 +1078,7 @@ STR_1683 :Wymiary bazowe 2 × 2 STR_1684 :Wymiary bazowe 4 × 4 STR_1685 :Wymiary bazowe 2 × 4 STR_1686 :Wymiary bazowe 5 × 1 -STR_1687 :Wzburzenie wody +STR_1687 :Przejazd przez wodę STR_1688 :Wymiary bazowe 4 × 1 STR_1689 :Hamulce blokowe STR_1690 :{WINDOW_COLOUR_2}{STRINGID}{NEWLINE}{BLACK}{STRINGID} @@ -1088,21 +1096,21 @@ STR_1701 :Zatrudnij mechanika STR_1702 :Zatrudnij ochroniarza STR_1703 :Zatrudnij komika STR_1704 :Nie można zatrudnić nowych pracowników… -STR_1705 :Zwolnij tego pracownika +STR_1705 :Zwolnij pracownika STR_1706 :Przenieś tę osobę do nowej lokalizacji STR_1707 :Za dużo pracowników w grze STR_1708 :Wyznacz teren patrolowania dla pracownika STR_1709 :Zwolnij pracownika STR_1710 :Tak -STR_1711 :{WINDOW_COLOUR_1}Czy jesteś pewny że chcesz zwolnić {STRINGID}? +STR_1711 :{WINDOW_COLOUR_1}Jesteś pewien, że chcesz zwolnić {STRINGID}? STR_1712 :{INLINE_SPRITE}{247}{19}{00}{00}{WINDOW_COLOUR_2}Zamiatanie ścieżek STR_1713 :{INLINE_SPRITE}{248}{19}{00}{00}{WINDOW_COLOUR_2}Podlewanie kwiatów -STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Opróżnianie kubłów +STR_1714 :{INLINE_SPRITE}{249}{19}{00}{00}{WINDOW_COLOUR_2}Opróżnianie koszy STR_1715 :{INLINE_SPRITE}{250}{19}{00}{00}{WINDOW_COLOUR_2}Koszenie trawnika STR_1716 :Niewłaściwa nazwa dla parku! STR_1717 :Nie można zmienić nazwy parku… STR_1718 :Nazwa parku -STR_1719 :Podaj nową nazwę parku +STR_1719 :Podaj nową nazwę parku: STR_1720 :Nazwij park STR_1721 :Park zamknięty STR_1722 :Park otwarty @@ -1113,7 +1121,7 @@ STR_1726 :Teren nie jest na sprzedaż! STR_1727 :Prawa do budowy nie są na sprzedaż! STR_1728 :Nie można tu kupić praw do budowy… STR_1729 :Teren nie należy do parku! -STR_1730 :{RED}Zamknięte - - +STR_1730 :{RED}Zamknięte STR_1731 :{WHITE}{STRINGID} - - STR_1732 :Buduj STR_1733 :Tryb @@ -1125,7 +1133,7 @@ STR_1739 :Wyścig wygrany przez gościa {INT32} STR_1740 :Wyścig wygrał {STRINGID} STR_1741 :Jeszcze nie zbudowane! STR_1742 :{WINDOW_COLOUR_2}Maks. ludzi na przejazd: -STR_1743 :Maksymalna ilość osób biorąca jednoczesny udział w wyścigu +STR_1743 :Maksymalna liczba osób, które mogą jednocześnie korzystać z tej atrakcji STR_1744 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_1746 :Nie można tego zmienić… STR_1747 :{WINDOW_COLOUR_2}Limit czasu: @@ -1143,12 +1151,12 @@ STR_1759 :Tryb przenoszenia STR_1760 :Tryb wypełnienia STR_1761 :Buduj labirynt w tym kierunku STR_1762 :Wodospady -STR_1763 :Katarakty rzeczne +STR_1763 :Przełomy Dunajca STR_1764 :Pniowe odbijaki STR_1765 :Sekcja fotograficzna STR_1766 :Odwrotna obrotnica STR_1767 :Wirujący tunel -STR_1768 :Nie można zmienić ilości huśtań… +STR_1768 :Nie można zmienić liczby huśtań… STR_1769 :{WINDOW_COLOUR_2}Liczba huśtań: STR_1770 :Liczba pełnych huśtań STR_1771 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} @@ -1169,7 +1177,7 @@ 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ć atrakcję {STRINGID} +STR_1792 :Zmierza naprawić {STRINGID} STR_1793 :W drodze na inspekcję {STRINGID} STR_1794 :Naprawia {STRINGID} STR_1795 :Odbiera wezwanie telefoniczne @@ -1186,7 +1194,7 @@ STR_1806 :Awaria hamulców STR_1807 :Awaria systemu sterowania STR_1808 :{WINDOW_COLOUR_2}Poprzednia awaria: {BLACK}{STRINGID} STR_1809 :{WINDOW_COLOUR_2}Aktualna awaria: {OUTLINE}{RED}{STRINGID} -STR_1810 :{WINDOW_COLOUR_2}Nosi: +STR_1810 :{WINDOW_COLOUR_2}Niesie: STR_1811 :Nie można tego tutaj wybudować… STR_1812 :{BLACK}{STRINGID} STR_1813 :Różne obiekty @@ -1207,10 +1215,10 @@ STR_1827 :Popularność STR_1828 :Satysfakcja STR_1829 :Zysk STR_1830 :Długość kolejki -STR_1831 :Czas w kolejce +STR_1831 :Czas oczekiwania STR_1832 :Niezawodność STR_1833 :Przestoje -STR_1834 :Ulubieniec gości +STR_1834 :Ulubiona atrakcja STR_1835 :Popularność: Nieznana STR_1836 :Popularność: {COMMA16}% STR_1837 :Satysfakcja: Nieznana @@ -1218,14 +1226,14 @@ STR_1838 :Satysfakcja: {COMMA16}% STR_1839 :Niezawodność: {COMMA16}% STR_1840 :Przestoje w pracy: {COMMA16}% STR_1841 :Zysk: {CURRENCY} na godzinę -STR_1842 :Ulubiony dla: {COMMA32} gościa -STR_1843 :Ulubiony dla: {COMMA32} gości +STR_1842 :Ulubiona atrakcja {COMMA32} gościa +STR_1843 :Ulubiona atrakcja {COMMA32} gości STR_1844 :Wybierz rodzaj informacji do pokazania STR_1845 :{MONTHYEAR} STR_1846 :{COMMA32} gości STR_1847 :{INLINE_SPRITE}{11}{20}{00}{00}{COMMA32} gości STR_1848 :{INLINE_SPRITE}{10}{20}{00}{00}{COMMA32} gości -STR_1849 :{WINDOW_COLOUR_2}Odtwarzaj muzykę +STR_1849 :{WINDOW_COLOUR_2}Włącz muzykę STR_1850 :Wybierz, czy na tej atrakcji ma grać muzyka STR_1851 :{WINDOW_COLOUR_2}Koszty utrzymania: {BLACK}{CURRENCY2DP} na godzinę STR_1852 :{WINDOW_COLOUR_2}Koszty utrzymania: {BLACK}Nieznane @@ -1261,14 +1269,14 @@ STR_1882 :Co 45 minut STR_1883 :Co godzinę STR_1884 :Co dwie godziny STR_1885 :Nigdy -STR_1886 :Inspekcja {STRINGID} +STR_1886 :Dokonuje inspekcji {STRINGID} STR_1887 :{WINDOW_COLOUR_2}Termin ostatniej inspekcji: {BLACK}{COMMA16} minut temu STR_1888 :{WINDOW_COLOUR_2}Termin ostatniej inspekcji: {BLACK} więcej niż 4 godziny temu -STR_1889 :{WINDOW_COLOUR_2}Czas przestoju: {MOVE_X}{255}{BLACK}{COMMA16}% +STR_1889 :{WINDOW_COLOUR_2}Przestoje: {MOVE_X}{255}{BLACK}{COMMA16}% STR_1890 :Określ jak często mechanik ma przeglądać tę atrakcję STR_1891 :Nie ma jeszcze {STRINGID} w parku! -STR_1894 :{WINDOW_COLOUR_2}{STRINGID} sprzedane: {BLACK}{COMMA32} -STR_1895 :Wybuduj nową przejażdżkę/atrakcję +STR_1894 :{WINDOW_COLOUR_2}Sprzedane {STRINGID}: {BLACK}{COMMA32} +STR_1895 :Zbuduj nową atrakcję STR_1896 :{WINDOW_COLOUR_2}Przychody/wydatki STR_1897 :{WINDOW_COLOUR_2}Budowa atrakcji STR_1898 :{WINDOW_COLOUR_2}Utrzymanie atrakcji @@ -1300,7 +1308,7 @@ STR_1924 :Wyjdź STR_1925 :Nie można postawić tutaj osoby… STR_1927 :{YELLOW}{STRINGID} zepsuł(a) się STR_1928 :{RED}{STRINGID} miał(a) wypadek! -STR_1929 :{RED}Atrakcja {STRINGID} wciąż nie został(a) naprawiony(a).{NEWLINE}Sprawdź gdzie znajdują się twoi mechanicy i rozważ lepszą organizację ich pracy +STR_1929 :{RED}Wciąż nie naprawiono {STRINGID}.{NEWLINE}Sprawdź gdzie znajdują się twoi mechanicy i rozważ lepszą organizację ich pracy STR_1930 :Wł/wył. informacje o tym gościu (jeśli śledzenie jest włączone działania gościa będą wyświetlane w oknie wiadomości) STR_1931 :{STRINGID} stanął w kolejce do atrakcji {STRINGID} STR_1932 :{STRINGID} jest na atrakcji {STRINGID} @@ -1334,13 +1342,13 @@ STR_1959 :Nie mogę zmienić liczby okrążeń… STR_1960 :{WINDOW_COLOUR_2}Cena balonu: STR_1961 :{WINDOW_COLOUR_2}Cena przytulanki: STR_1962 :{WINDOW_COLOUR_2}Cena planu parku: -STR_1963 :{WINDOW_COLOUR_2}Cena zdjęcia z przejażdżki: +STR_1963 :{WINDOW_COLOUR_2}Cena zdjęcia: STR_1964 :{WINDOW_COLOUR_2}Cena parasola: STR_1965 :{WINDOW_COLOUR_2}Cena napoju: STR_1966 :{WINDOW_COLOUR_2}Cena hamburgera: STR_1967 :{WINDOW_COLOUR_2}Cena frytek: STR_1968 :{WINDOW_COLOUR_2}Cena lodów: -STR_1969 :{WINDOW_COLOUR_2}Cena waty cukrowej: +STR_1969 :{WINDOW_COLOUR_2}Cena waty: STR_1970 :{WINDOW_COLOUR_2} STR_1971 :{WINDOW_COLOUR_2} STR_1972 :{WINDOW_COLOUR_2} @@ -1348,10 +1356,10 @@ STR_1973 :{WINDOW_COLOUR_2}Cena pizzy: STR_1974 :{WINDOW_COLOUR_2} STR_1975 :{WINDOW_COLOUR_2}Cena popcornu: STR_1976 :{WINDOW_COLOUR_2}Cena hot-doga: -STR_1977 :{WINDOW_COLOUR_2}Cena ośmiorniczki: +STR_1977 :{WINDOW_COLOUR_2}Cena macki: STR_1978 :{WINDOW_COLOUR_2}Cena kapelusza: -STR_1979 :{WINDOW_COLOUR_2}Cena jabłka kand.: -STR_1980 :{WINDOW_COLOUR_2}Cena podkoszulki: +STR_1979 :{WINDOW_COLOUR_2}Cena jabłka: +STR_1980 :{WINDOW_COLOUR_2}Cena koszulki: STR_1981 :{WINDOW_COLOUR_2}Cena pączka: STR_1982 :{WINDOW_COLOUR_2}Cena kawy: STR_1983 :{WINDOW_COLOUR_2} @@ -1359,213 +1367,213 @@ STR_1984 :{WINDOW_COLOUR_2}Cena kurczaka: STR_1985 :{WINDOW_COLOUR_2}Cena lemoniady: STR_1986 :{WINDOW_COLOUR_2} STR_1987 :{WINDOW_COLOUR_2} -STR_1988 :Balon -STR_1989 :Przytulanka -STR_1990 :Plan parku -STR_1991 :Zdjęcie z przejażdżki -STR_1992 :Parasol -STR_1993 :Napój -STR_1994 :Hamburger -STR_1995 :Frytki -STR_1996 :Lody -STR_1997 :Wata cukrowa -STR_1998 :Pusta puszka -STR_1999 :Śmieci -STR_2000 :Puste pudełko po hamburgerze -STR_2001 :Pizza -STR_2002 :Kupon -STR_2003 :Popcorn -STR_2004 :Hot Dog -STR_2005 :Ośmiorniczka -STR_2006 :Kapelusz -STR_2007 :Jabłko kandyzowane -STR_2008 :Koszulka -STR_2009 :Pączek -STR_2010 :Kawa -STR_2011 :Pusty kubek -STR_2012 :Kurczak -STR_2013 :Lemoniada -STR_2014 :Puste pudełko -STR_2015 :Pusta butelka -STR_2016 :Balony -STR_2017 :Przytulanki -STR_2018 :Plany parku -STR_2019 :Zdjęcia z przejażdżki -STR_2020 :Parasole -STR_2021 :Napoje -STR_2022 :Hamburgery -STR_2023 :Frytki -STR_2024 :Lody -STR_2025 :Wata cukrowa -STR_2026 :Puste puszki -STR_2027 :Śmiecie -STR_2028 :Puste pudełka po hamburgerach -STR_2029 :Pizze -STR_2030 :Kupony -STR_2031 :Popcorn -STR_2032 :Hot dogi -STR_2033 :Ośmiorniczki -STR_2034 :Kapelusze -STR_2035 :Jabłka kandyzowane -STR_2036 :Koszulki -STR_2037 :Pączki -STR_2038 :Kawy -STR_2039 :Puste kubki -STR_2040 :Kurczak -STR_2041 :Lemoniada +STR_1988 :balona +STR_1989 :przytulanki +STR_1990 :planu parku +STR_1991 :zdjęcia z przejażdżki +STR_1992 :parasola +STR_1993 :napoju +STR_1994 :hamburgera +STR_1995 :frytek +STR_1996 :lodów +STR_1997 :waty cukrowej +STR_1998 :pustej puszki +STR_1999 :śmieci +STR_2000 :pustego pudełka po burgerze +STR_2001 :pizzy +STR_2002 :kuponu +STR_2003 :popcornu +STR_2004 :hot doga +STR_2005 :macki +STR_2006 :kapelusza +STR_2007 :jabłka w polewie +STR_2008 :koszulki +STR_2009 :pączka +STR_2010 :kawy +STR_2011 :pustego kubka +STR_2012 :kurczaka +STR_2013 :lemoniady +STR_2014 :pustego pudełka +STR_2015 :pustej butelki +STR_2016 :balony +STR_2017 :przytulanki +STR_2018 :plany parku +STR_2019 :zdjęcia z przejażdzek +STR_2020 :parasole +STR_2021 :napoje +STR_2022 :hamburgery +STR_2023 :frytki +STR_2024 :lody +STR_2025 :waty cukrowe +STR_2026 :puste puszki +STR_2027 :śmieci +STR_2028 :puste pudełka po burgerach +STR_2029 :pizze +STR_2030 :kupony +STR_2031 :popcorny +STR_2032 :hot dogi +STR_2033 :macki +STR_2034 :kapelusze +STR_2035 :jabłka w polewie +STR_2036 :koszulki +STR_2037 :pączki +STR_2038 :kawy +STR_2039 :puste kubki +STR_2040 :kurczaki +STR_2041 :lemoniady STR_2042 :Puste pudełka STR_2043 :Puste butelki -STR_2044 :balon -STR_2045 :przytulanka +STR_2044 :balona +STR_2045 :przytulankę STR_2046 :plan parku STR_2047 :zdjęcie z przejażdżki STR_2048 :parasol STR_2049 :napój STR_2050 :hamburgera -STR_2051 :trochę frytek +STR_2051 :frytki STR_2052 :lody -STR_2053 :trochę waty cukrowej +STR_2053 :watę cukrową STR_2054 :pustą puszkę STR_2055 :trochę śmieci STR_2056 :puste pudełko po hamburgerze -STR_2057 :pizza +STR_2057 :pizzę STR_2058 :kupon -STR_2059 :trochę popcornu -STR_2060 :Hot Dog -STR_2061 :Macka -STR_2062 :Kapelusz -STR_2063 :jabłko kandyzowane -STR_2064 :koszulka -STR_2065 :Pączek -STR_2066 :Kawa +STR_2059 :popcorn +STR_2060 :hot doga +STR_2061 :mackę +STR_2062 :kapelusz +STR_2063 :jabłko w polewie +STR_2064 :koszulkę +STR_2065 :pączka +STR_2066 :kawę STR_2067 :pusty kubek -STR_2068 :Kurczak -STR_2069 :trochę lemoniady +STR_2068 :kurczaka +STR_2069 :lemoniadę STR_2070 :puste pudełko STR_2071 :pustą butelkę -STR_2072 :“{STRINGID}” Balon -STR_2073 :“{STRINGID}” Przytulanka -STR_2074 :Plan {STRINGID} -STR_2075 :Zdjęcie z przejażdżki {STRINGID} -STR_2076 :“{STRINGID}” Parasol -STR_2077 :Napój -STR_2078 :Hamburger -STR_2079 :Frytki -STR_2080 :Lody -STR_2081 :Wata cukrowa -STR_2082 :Pusta puszka -STR_2083 :Śmieci -STR_2084 :Puste pudełko po hamburgerze -STR_2085 :Pizza -STR_2086 :Kupon na {STRINGID} -STR_2087 :Popcorn -STR_2088 :Hot Dog -STR_2089 :Ośmiorniczka -STR_2090 :“{STRINGID}” Kapelusz -STR_2091 :jabłko kandyzowane -STR_2092 :“{STRINGID}” Koszulka -STR_2093 :Pączek -STR_2094 :Kawa -STR_2095 :Pusty kubek -STR_2096 :Kurczak -STR_2097 :Lemoniada -STR_2098 :Puste pudełko -STR_2099 :Pusta butelka +STR_2072 :balona {STRINGID} +STR_2073 :przytulankę {STRINGID} +STR_2074 :plan {STRINGID} +STR_2075 :zdjęcie z przejażdżki na {STRINGID} +STR_2076 :parasol {STRINGID} +STR_2077 :napój +STR_2078 :hamburgera +STR_2079 :frytki +STR_2080 :lody +STR_2081 :watę cukrową +STR_2082 :pustą puszkę +STR_2083 :śmieci +STR_2084 :puste pudełko po hamburgerze +STR_2085 :pizzę +STR_2086 :kupon na {STRINGID} +STR_2087 :popcorn +STR_2088 :hot doga +STR_2089 :mackę +STR_2090 :kapelusz {STRINGID} +STR_2091 :jabłko w polewie +STR_2092 :koszulkę {STRINGID} +STR_2093 :pączka +STR_2094 :kawę +STR_2095 :pusty kubek +STR_2096 :kurczaka +STR_2097 :lemoniadę +STR_2098 :puste pudełko +STR_2099 :pustą butelkę STR_2103 :{WINDOW_COLOUR_2}Cena precla: -STR_2104 :{WINDOW_COLOUR_2}Cena gorącej czekolady: -STR_2105 :{WINDOW_COLOUR_2}Cena mrożonej herbaty: -STR_2106 :{WINDOW_COLOUR_2}Cena makaronika: +STR_2104 :{WINDOW_COLOUR_2}Cena czekolady: +STR_2105 :{WINDOW_COLOUR_2}Cena herbaty: +STR_2106 :{WINDOW_COLOUR_2}Cena faworków: STR_2107 :{WINDOW_COLOUR_2}Cena okularów: -STR_2108 :{WINDOW_COLOUR_2}Cena makaronu z wołowiną: -STR_2109 :{WINDOW_COLOUR_2}Cena smażonej ryby: -STR_2110 :{WINDOW_COLOUR_2}Cena zupy wonton: -STR_2111 :{WINDOW_COLOUR_2}Cena zupy klopsikowej: -STR_2112 :{WINDOW_COLOUR_2}Cena soku owocowego: -STR_2113 :{WINDOW_COLOUR_2}Cena mleka sojowego: +STR_2108 :{WINDOW_COLOUR_2}Cena makaronu: +STR_2109 :{WINDOW_COLOUR_2}Cena ryby: +STR_2110 :{WINDOW_COLOUR_2}Cena zupy: +STR_2111 :{WINDOW_COLOUR_2}Cena zupy: +STR_2112 :{WINDOW_COLOUR_2}Cena soku: +STR_2113 :{WINDOW_COLOUR_2}Cena mleka: STR_2114 :{WINDOW_COLOUR_2}Cena sujongkwa: STR_2115 :{WINDOW_COLOUR_2}Cena kanapki: STR_2116 :{WINDOW_COLOUR_2}Cena ciasteczka: STR_2117 :{WINDOW_COLOUR_2} STR_2118 :{WINDOW_COLOUR_2} STR_2119 :{WINDOW_COLOUR_2} -STR_2120 :{WINDOW_COLOUR_2}Cena grillowanych kiełbasek: +STR_2120 :{WINDOW_COLOUR_2}Cena kiełbaski: STR_2121 :{WINDOW_COLOUR_2} -STR_2125 :Precel -STR_2126 :Gorąca czekolada -STR_2127 :Mrożona herbata -STR_2128 :Makaronik -STR_2129 :Okulary przeciwsłoneczne -STR_2130 :Makaron z wołowiną -STR_2131 :Smażony makaron ryżowy -STR_2132 :Zupa wonton -STR_2133 :Zupa klopsikowa -STR_2134 :Sok owocowy -STR_2135 :Mleko sojowe -STR_2136 :Sujongkwa -STR_2137 :Kanapka -STR_2138 :Ciasteczko -STR_2139 :Pusta miska -STR_2140 :Pusty karton -STR_2141 :Pusty kubek po soku -STR_2142 :Grillowana kiełbaska -STR_2143 :Pusta miska -STR_2147 :Precle -STR_2148 :Gorące czekolady -STR_2149 :Mrożone herbaty -STR_2150 :Makaroniki -STR_2151 :Okulary przeciwsłoneczne -STR_2152 :Makaron z wołowiną -STR_2153 :Smażony makaron ryżowy -STR_2154 :Zupy wonton -STR_2155 :Klopsiki -STR_2156 :Soki owocowe -STR_2157 :Mleko sojowe -STR_2158 :Sujongkwa -STR_2159 :Kanapki -STR_2160 :Ciasteczka -STR_2161 :Puste miski -STR_2162 :Puste kartony -STR_2163 :Puste kubki po soku -STR_2164 :Pieczone kiełbaski -STR_2165 :Puste miski +STR_2125 :precla +STR_2126 :gorącej czekolady +STR_2127 :mrożonej herbaty +STR_2128 :faworków +STR_2129 :okularów przeciwsłonecznych +STR_2130 :makaronu z wołowiną +STR_2131 :smażonego makaronu ryżowego +STR_2132 :zupy wonton +STR_2133 :zupy klopsikowej +STR_2134 :soku owocowego +STR_2135 :mleka sojowego +STR_2136 :sujongkwy +STR_2137 :kanapki +STR_2138 :ciasteczka +STR_2139 :pustej miski +STR_2140 :pustego kartonu +STR_2141 :pustego kubka po soku +STR_2142 :pieczonej kiełbaski +STR_2143 :pustej miski +STR_2147 :precle +STR_2148 :gorące czekolady +STR_2149 :mrożone herbaty +STR_2150 :faworki +STR_2151 :okulary przeciwsłoneczne +STR_2152 :makarony z wołowiną +STR_2153 :smażone makarony ryżowe +STR_2154 :zupy wonton +STR_2155 :klopsiki +STR_2156 :soki owocowe +STR_2157 :mleka sojowe +STR_2158 :sujongkwy +STR_2159 :kanapki +STR_2160 :ciasteczka +STR_2161 :puste miski +STR_2162 :puste kartony +STR_2163 :puste kubki po soku +STR_2164 :pieczone kiełbaski +STR_2165 :puste miski STR_2169 :precla -STR_2170 :gorącą czekoladą -STR_2171 :herbat +STR_2170 :gorącą czekoladę +STR_2171 :herbatę STR_2172 :marakonik STR_2173 :okulary -STR_2174 :trochę makaronu z wołowiną -STR_2175 :trochę smażonego makaronu ryżowego -STR_2176 :trochę zupy wonton -STR_2177 :trochę zupy klopsikowej +STR_2174 :makaron z wołowiną +STR_2175 :smażony makaron ryżowy +STR_2176 :zupę wonton +STR_2177 :zupę klopsikową STR_2178 :sok owocowy -STR_2179 :trochę mleka sojowego -STR_2180 :trochę Sujongkwa -STR_2181 :kanapka +STR_2179 :mleko sojowe +STR_2180 :sujongkwę +STR_2181 :kanapkę STR_2182 :ciasteczko -STR_2183 :Pusta miseczka -STR_2184 :Pusty kartonik po napoju -STR_2185 :Pusty kubeczek po soku -STR_2186 :Grillowana kiełbasa -STR_2187 :pusta miseczka -STR_2191 :Precel -STR_2192 :Gorąca czekolada -STR_2193 :Mrożona herbata -STR_2194 :Chrusty -STR_2195 :Okulary przeciwsłoneczne -STR_2196 :Makaron z wołowiną -STR_2197 :Smażony makaron ryżowy -STR_2198 :Zupa Wonton -STR_2199 :Zupa z klopsikami -STR_2200 :Sok owocowy -STR_2201 :Mleko sojowe -STR_2202 :Sujongkwa -STR_2203 :Kanapka -STR_2204 :Ciasteczko -STR_2205 :Pusta miseczka -STR_2206 :Pusty kartonik po napoju -STR_2207 :Pusty kubeczek po soku -STR_2208 :Grillowana kiełbasa -STR_2209 :Pusta miseczka +STR_2183 :pusta miskę +STR_2184 :pusty karton po napoju +STR_2185 :pusty kubek po soku +STR_2186 :pieczoną kiełbaskę +STR_2187 :pustą miskę +STR_2191 :precla +STR_2192 :gorącą czekoladę +STR_2193 :mrożoną herbatę +STR_2194 :faworki +STR_2195 :okulary przeciwsłoneczne +STR_2196 :makaron z wołowiną +STR_2197 :smażony makaron ryżowy +STR_2198 :zupę wonton +STR_2199 :zupę z klopsikami +STR_2200 :sok owocowy +STR_2201 :mleko sojowe +STR_2202 :sujongkwę +STR_2203 :kanapkę +STR_2204 :ciasteczko +STR_2205 :pustą miskę +STR_2206 :pusty karton po napoju +STR_2207 :pusty kubek po soku +STR_2208 :pieczoną kiełbaskę +STR_2209 :pusta miska STR_2210 :Pokaż listę wszystkich dozorców w parku STR_2211 :Pokaż listę wszystkich mechaników w parku STR_2212 :Pokaż listę wszystkich strażników w parku @@ -1576,10 +1584,10 @@ STR_2216 :{WINDOW_COLOUR_2}{COMMA16}°C STR_2217 :{WINDOW_COLOUR_2}{COMMA16}°F STR_2218 :{RED}{STRINGID} na {STRINGID} jeszcze nie powrócił do {STRINGID}!{NEWLINE}Sprawdź czy gdzieś nie utknął. STR_2219 :{RED}{COMMA16} ludzi zginęło w wypadku na atrakcji {STRINGID} -STR_2220 :{WINDOW_COLOUR_2}Ocena parku: {BLACK}{COMMA16} -STR_2221 :Ocena Parku: {COMMA16} +STR_2220 :{WINDOW_COLOUR_2}Atrakcyjność parku: {BLACK}{COMMA16} +STR_2221 :Atrakcyjność Parku: {COMMA16} STR_2222 :{BLACK}{STRINGID} -STR_2223 :{WINDOW_COLOUR_2}Gości w parku: {BLACK}{COMMA32} +STR_2223 :{WINDOW_COLOUR_2}Liczba gości w parku: {BLACK}{COMMA32} STR_2224 :{WINDOW_COLOUR_2}Gotówka: {BLACK}{CURRENCY2DP} STR_2225 :{WINDOW_COLOUR_2}Gotówka: {RED}{CURRENCY2DP} STR_2226 :{WINDOW_COLOUR_2}Wartość parku: {BLACK}{CURRENCY} @@ -1590,7 +1598,7 @@ STR_2230 :Pionowa trasa STR_2231 :Hamowanie podczas opadania STR_2232 :Wyciągarka linowa STR_2233 :Informacje o parku -STR_2234 :Najnowsze wiadomości +STR_2234 :Ostatnie wiadomości STR_2235 :{STRINGID} {STRINGID} STR_2236 :Styczeń STR_2237 :Luty @@ -1605,25 +1613,25 @@ STR_2245 :Październik STR_2246 :Listopad STR_2247 :Grudzień STR_2248 :Nie można zburzyć atrakcji… -STR_2249 :{BABYBLUE}Nowa atrakcja dostępna:{NEWLINE}{STRINGID} -STR_2250 :{BABYBLUE}Nowa sceneria dostępna:{NEWLINE}{STRINGID} +STR_2249 :{BABYBLUE}Dostępna nowa atrakcja:{NEWLINE}{STRINGID} +STR_2250 :{BABYBLUE}Dostępna nowa sceneria:{NEWLINE}{STRINGID} STR_2251 :Można budować tylko na chodnikach! STR_2252 :Można budować tylko w poprzek chodników! STR_2253 :Transport STR_2254 :Łagodne atrakcje STR_2255 :Kolejki górskie -STR_2256 :Intensywne atrakcje +STR_2256 :Emocjonujące atrakcje STR_2257 :Wodne atrakcje STR_2258 :Sklepiki i kioski STR_2259 :Scenerie i dekoracje -STR_2260 :Bez budżetu -STR_2261 :Minimalny -STR_2262 :Normalny -STR_2263 :Maksymalny -STR_2264 :Budżet na badania +STR_2260 :Brak funduszy +STR_2261 :Minimalne fundusze +STR_2262 :Normalne fundusze +STR_2263 :Maksymalne fundusze +STR_2264 :Fundusze na badania STR_2265 :{WINDOW_COLOUR_2}Koszt: {BLACK}{CURRENCY} na miesiąc STR_2266 :Priorytety badawcze -STR_2267 :Obecnie badany +STR_2267 :Obecnie badane STR_2268 :Ostatnie odkrycie STR_2269 :{WINDOW_COLOUR_2}Typ: {BLACK}{STRINGID} STR_2270 :{WINDOW_COLOUR_2}Stan prac: {BLACK}{STRINGID} @@ -1637,7 +1645,7 @@ STR_2277 :Nieznany STR_2278 :Transport STR_2279 :Łagodne atrakcje STR_2280 :Kolejki górskie -STR_2281 :Intensywne atrakcje +STR_2281 :Emocjonujące atrakcje STR_2282 :Wodne atrakcje STR_2283 :Sklepiki i kioski STR_2284 :Scenerie i dekoracje @@ -1651,24 +1659,24 @@ STR_2292 :{WINDOW_COLOUR_2}Odwiedzone atrakcje: STR_2293 :{BLACK} Brak STR_2294 :Zmień podstawowy styl gruntu STR_2295 :Zmień poziome krawędzie gruntu -STR_2296 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na wejście do parku -STR_2297 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} atrakcję -STR_2298 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} atrakcji -STR_2299 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} posiłek -STR_2300 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} posiłków -STR_2301 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} napój -STR_2302 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} napojów -STR_2303 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} pamiatkę -STR_2304 :{BLACK}{CURRENCY2DP}{WINDOW_COLOUR_2} wydane na {BLACK}{COMMA16} pamiątek +STR_2296 :{BLACK}Zapłacił {CURRENCY2DP}{WINDOW_COLOUR_2} za wejście do parku +STR_2297 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} atrakcję +STR_2298 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} atrakcji +STR_2299 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} posiłek +STR_2300 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} posiłki +STR_2301 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} napój +STR_2302 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} napoje +STR_2303 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} pamiatkę +STR_2304 :{BLACK}Wydał {CURRENCY2DP}{WINDOW_COLOUR_2} na {BLACK}{COMMA16} pamiątki STR_2305 :Plik z projektami tras STR_2306 :Zapisz projekt trasy -STR_2307 :Wybierz projekt {STRINGID} -STR_2308 :{STRINGID} projekty tras +STR_2307 :Wybierz projekt atrakcji {STRINGID} +STR_2308 :Projekty tras atrakcji {STRINGID} STR_2309 :Zainstaluj nowy projekt trasy STR_2310 :Stwórz własny projekt STR_2311 :{WINDOW_COLOUR_2}Emocje: {BLACK}{COMMA2DP32} (około) STR_2312 :{WINDOW_COLOUR_2}Intensywność: {BLACK}{COMMA2DP32} (około) -STR_2313 :{WINDOW_COLOUR_2}Ocena mdłości: {BLACK}{COMMA2DP32} (około) +STR_2313 :{WINDOW_COLOUR_2}Mdłości: {BLACK}{COMMA2DP32} (około) STR_2314 :{WINDOW_COLOUR_2}Długość trasy: {BLACK}{STRINGID} STR_2315 :{WINDOW_COLOUR_2}Koszt: {BLACK}około {CURRENCY} STR_2316 :{WINDOW_COLOUR_2}Zajmowany teren: {BLACK}{COMMA16} × {COMMA16} pól @@ -1824,7 +1832,7 @@ STR_2482 :Zysk: {CURRENCY} na tydzień, Wartość parku: {CURRENCY} STR_2483 :{WINDOW_COLOUR_2}Tygodniowy zysk: {BLACK}+{CURRENCY2DP} STR_2484 :{WINDOW_COLOUR_2}Tygodniowy zysk: {RED}{CURRENCY2DP} STR_2487 :Pokazuj „prawdziwe” imiona gości -STR_2488 :Przełącza między pokazywaniem imion gości a numerami +STR_2488 :Przełącz między pokazywaniem imion gości a numerami STR_2489 :Skróty klawiszowe… STR_2490 :Przypisanie klawiszy STR_2491 :Zresetuj klawisze @@ -1843,7 +1851,7 @@ STR_2503 :Usuń grunt pionowy STR_2504 :Przezroczyste atrakcje STR_2505 :Przezroczysta sceneria STR_2506 :Niewidzialne sporniki -STR_2507 :Niewidzialni ludzie +STR_2507 :Niewidzialni goście STR_2508 :Znaczniki wysokości na gruncie STR_2509 :Znaczniki wysokości na torach STR_2510 :Znaczniki wysokości na dróżkach @@ -1905,9 +1913,9 @@ STR_2669 :NumLock STR_2670 :Scroll STR_2680 :Wszystkie badania zakończone STR_2684 :Przybywające duże grupy gości -STR_2685 :Parametr hałasu Simplex -STR_2686 :Najniższy: -STR_2687 :Najwyższy: +STR_2685 :Parametry szumu Simplex +STR_2686 :Min. poziom terenu: +STR_2687 :Maks. poziom terenu: STR_2688 :Bazowa częstotliwość: STR_2689 :Oktawy STR_2690 :Generator mapy @@ -1917,7 +1925,7 @@ STR_2693 :Teren: STR_2694 :Generuj STR_2695 :Losowy teren STR_2696 :Umieść drzewa -STR_2700 :Częstotliwość autozapisu: +STR_2700 :Autozapis: STR_2701 :Co minutę STR_2702 :Co 5 minut STR_2703 :Co 15 minut @@ -1927,8 +1935,8 @@ STR_2706 :Nigdy STR_2707 :Otwórz nowe okno STR_2708 :{WINDOW_COLOUR_1}Jesteś pewien, że chcesz nadpisać {STRINGID}? STR_2709 :Nadpisz -STR_2710 :Wpisz nazwę pliku -STR_2718 :Up +STR_2710 :Wprowadź nazwę pliku: +STR_2718 :W górę STR_2719 :Nowy plik STR_2720 :{UINT16}sek STR_2721 :{UINT16}sek @@ -1964,7 +1972,7 @@ STR_2756 :Usuń śmieci STR_2763 :??? STR_2765 :Przypływ gości STR_2766 :Wygraj scenariusz -STR_2767 :Zablokuj zmiany pogody +STR_2767 :Wyłącz zmiany pogody STR_2769 :Otwórz park STR_2770 :Zamknij park STR_2773 :Okno @@ -1980,7 +1988,7 @@ STR_2781 :{STRINGID}: STR_2782 :SHIFT + STR_2783 :CTRL + STR_2784 :Zmień skrót klawiszowy -STR_2785 :{WINDOW_COLOUR_2}Wciśnij nowy klawisz skrótu dla:{NEWLINE}“{STRINGID}” +STR_2785 :{WINDOW_COLOUR_2}Wciśnij nowy klawisz skrótu dla:{NEWLINE}„{STRINGID}” STR_2786 :Kliknij opis skrótu, aby wybrać nowy klawisz STR_2787 :{WINDOW_COLOUR_2}Wartość parku: {BLACK}{CURRENCY} STR_2788 :{WINDOW_COLOUR_2}Gratulacje!{NEWLINE}{BLACK}Cel osiągnięty! Wartość twojej spółki wynosi {CURRENCY}! @@ -1992,8 +2000,8 @@ STR_2793 :(Ukończone przez {STRINGID}) STR_2794 :{WINDOW_COLOUR_2}Ukończony przez: {BLACK}{STRINGID}{NEWLINE}{WINDOW_COLOUR_2} z wartością spółki wynoszącą: {BLACK}{CURRENCY} STR_2795 :Sortuj STR_2796 :Sortuj listę atrakcji według wyświetlonych informacji -STR_2797 :Przesuń widok gdy kursor blisko krawędzi -STR_2798 :Włącza przesuwanie widoku, gdy kursor zbliży się do krawędzi ekranu +STR_2797 :Przesuwaj widok, gdy kursor jest na krawędzi okna +STR_2798 :Włącza przesuwanie widoku, gdy kursor myszy jest na krawędzi okna STR_2799 :Przejrzyj lub zmień funkcje przypisane do klawiszy sterujących STR_2800 :{WINDOW_COLOUR_2}Całkowita liczba gości: {BLACK}{COMMA32} STR_2801 :{WINDOW_COLOUR_2}Wpływy z opłat za wstęp: {BLACK}{CURRENCY2DP} @@ -2007,31 +2015,31 @@ STR_2808 :{RED}Goście skarzą się na wandalizm w twoim parku{NEWLINE}Sprawd STR_2809 :{RED}Goście są głodni i nie mogą znaleźć miejsca gdzie mogliby kupić coś do jedzenia STR_2810 :{RED}Goście są spragnieni i nie mogą znaleźć miejsca gdzie mogliby kupić jakieś napoje STR_2811 :{RED}Goście się skarżą, że w twoim parku bardzo ciężko jest znaleźć toaletę -STR_2812 :{RED}Goście gubią się lub zatrzymują w jednym miejscu{NEWLINE}Sprawdź czy nie należy zmienić rozplanowania ścieżek, aby ludzie poruszali się po parku z większą łatwością +STR_2812 :{RED}Goście gubią się lub zatrzymują w jednym miejscu{NEWLINE}Sprawdź czy nie należy zmienić rozplanowania ścieżek, aby goście poruszali się po parku z większą łatwością STR_2813 :{RED}Opłata za wstęp do twojego parku jest zbyt wysoka!{NEWLINE}Zmniejsz ją lub podnieś wartość parku, aby przyciągnąć większą liczbę gości STR_2814 :{WINDOW_COLOUR_2}Nagroda dla najbardziej zaśmieconego parku STR_2815 :{WINDOW_COLOUR_2}Nagroda dla najczystszego parku -STR_2816 :{WINDOW_COLOUR_2}Nagroda za najlepsze kolejki górskie -STR_2817 :{WINDOW_COLOUR_2}Nagroda dla parku o najwyższej wartości +STR_2816 :{WINDOW_COLOUR_2}Nagroda dla parku z najlepszymi kolejkami górskimi +STR_2817 :{WINDOW_COLOUR_2}Nagroda dla parku o najlepszej wartości STR_2818 :{WINDOW_COLOUR_2}Nagroda dla najpiękniejszego parku -STR_2819 :{WINDOW_COLOUR_2}Nagroda dla parku o najniższej wartości +STR_2819 :{WINDOW_COLOUR_2}Nagroda dla parku o najgorszej wartości STR_2820 :{WINDOW_COLOUR_2}Nagroda dla najbezpieczniejszego parku STR_2821 :{WINDOW_COLOUR_2}Nagroda za najlepszy personel STR_2822 :{WINDOW_COLOUR_2}Nagroda za najlepsze jedzenie STR_2823 :{WINDOW_COLOUR_2}Nagroda za najgorsze jedzenie STR_2824 :{WINDOW_COLOUR_2}Nagroda za najlepsze toalety -STR_2825 :{WINDOW_COLOUR_2}Nagroda za najbardziej rozczarowującego parku +STR_2825 :{WINDOW_COLOUR_2}Nagroda za najbardziej rozczarowujący park STR_2826 :{WINDOW_COLOUR_2}Nagroda za najlepsze atrakcje wodne -STR_2827 :{WINDOW_COLOUR_2}Nagroda za najlepsze atrakcje współczesnego parku +STR_2827 :{WINDOW_COLOUR_2}Nagroda za najlepsze atrakcje własnego projektu STR_2828 :{WINDOW_COLOUR_2}Nagroda za najbardziej oszałamiającą kolorystykę atrakcji -STR_2829 :{WINDOW_COLOUR_2}Nagroda za najbardziej niezrozumiałego planu parku +STR_2829 :{WINDOW_COLOUR_2}Nagroda za najbardziej niezrozumiały plan parku STR_2830 :{WINDOW_COLOUR_2}Nagroda za najlepsze łagodne atrakcje STR_2831 :{TOPAZ}Twój park został ogłoszony najbardziej zaśmieconym parkiem w kraju! STR_2832 :{TOPAZ}Twój park został ogłoszony najczystszym parkiem w kraju! STR_2833 :{TOPAZ}Twój park dostał nagrodę za najlepsze kolejki górskie! -STR_2834 :{TOPAZ}Twój park dostał nagrodę za najwyższą wartość w kraju! +STR_2834 :{TOPAZ}Twój park dostał nagrodę za najlepszą wartość w kraju! STR_2835 :{TOPAZ}Twój park został ogłoszony najpiękniejszym parkiem w kraju! -STR_2836 :{TOPAZ}Twój park otrzymał nagrodę za najniższą wartość w kraju! +STR_2836 :{TOPAZ}Twój park otrzymał nagrodę za najgorszą wartość w kraju! STR_2837 :{TOPAZ}Twój park otrzymał nagrodę za najwyższe bezpieczeństwo w kraju! STR_2838 :{TOPAZ}Twój park otrzymał nagrodę za najlepszy personel! STR_2839 :{TOPAZ}Twój park otrzymał nagrodę za najlepsze jedzenie w kraju! @@ -2050,22 +2058,22 @@ STR_2851 :Ten scenariusz jest już zainstalowany STR_2852 :Ten projekt trasy jest już zainstalowany STR_2853 :Zabronione przez władze lokalne! STR_2854 :{RED}Goście nie mogą dotrzeć do wejścia do atrakcji {STRINGID}!{NEWLINE}Zbuduj ścieżkę prowadzącą do wejścia -STR_2855 :Przy wyjściu z atrakcji {RED}{STRINGID} nie ma żadnej dróżki!{NEWLINE}Zbuduj ścieżkę prowadzącą do wyjścia +STR_2855 :{RED}Przy wyjściu z atrakcji {STRINGID} nie ma żadnej dróżki!{NEWLINE}Zbuduj ścieżkę od wyjścia atrakcji STR_2858 :Nie można rozpocząć kampanii reklamowej… STR_2861 :{WINDOW_COLOUR_2}Licencja przyznana Infogrames Interactive Inc. -STR_2971 :Podstawowy schemat koloru +STR_2971 :Podstawowy schemat kolorów STR_2972 :Alternatywny schemat kolorów nr 1 STR_2973 :Alternatywny schemat kolorów nr 2 STR_2974 :Alternatywny schemat kolorów nr 3 STR_2975 :Wybierz schemat kolorów malowania atrakcji -STR_2976 :Pomaluj elementy atrakcji korzystając z indywidualnego schematu koloru +STR_2976 :Pomaluj elementy atrakcji korzystając z indywidualnego schematu kolorów STR_2977 :Nazwa pracownika -STR_2978 :Wprowadź nazwę tego pracownika: +STR_2978 :Podaj nowe imię pracownika: STR_2979 :Nie można zmienić nazwy pracownika… STR_2980 :Za dużo banerów w grze -STR_2981 :{RED}Brak wejścia - - +STR_2981 :{RED}Brak wejścia STR_2982 :Tekst baneru -STR_2983 :Wprowadź nową treść baneru: +STR_2983 :Podaj nową treść baneru: STR_2984 :Nie można wprowadzić nowej treści baneru… STR_2985 :Baner STR_2986 :Zmień treść baneru @@ -2075,7 +2083,7 @@ STR_2989 :Wybierz główny kolor STR_2990 :Wybierz kolor treści STR_2991 :Znak STR_2992 :Treść znaku -STR_2993 :Wprowadź nową nazwę znaku: +STR_2993 :Podaj nową treść znaku: STR_2994 :Zmień treść znaku STR_2995 :Usuń ten znak STR_2996 :{BLACK}ABC @@ -2112,7 +2120,7 @@ STR_3063 :Kanał wodny (tor zanurzony) STR_3064 :Poziom początkujący STR_3065 :Poziom zaawansowany STR_3066 :Poziom eksperta -STR_3067 :“Prawdziwe” parki +STR_3067 :„Prawdziwe” parki STR_3068 :Inne parki STR_3069 :Część górna STR_3070 :Spadek do poziomu @@ -2137,7 +2145,7 @@ STR_3101 :Wybierz trzeci kolor STR_3102 :Ustaw ponownie kolor scenerii na terenie STR_3103 :Nie można tego przemalować… STR_3104 :Lista przejażdżek -STR_3105 :Lista sklepów i stoisk +STR_3105 :Lista sklepów i kiosków STR_3106 :Lista kiosków informacyjnych i innych obiektów STR_3107 :Zamknij STR_3108 :Testuj @@ -2159,9 +2167,9 @@ STR_3123 :{WINDOW_COLOUR_2}Ulubiona atrakcja: {BLACK}{COMMA32} gości STR_3124 :Zepsute: {STRINGID} STR_3125 :{WINDOW_COLOUR_2}Emocje: {BLACK}+{COMMA16}% STR_3126 :{WINDOW_COLOUR_2}Intensywność: {BLACK}+{COMMA16}% -STR_3127 :{WINDOW_COLOUR_2}Tolerancja mdłości: {BLACK}+{COMMA16}% -STR_3128 :Zapisz Projekt Trasy -STR_3129 :Zapisz Projekt Trasy ze Scenerią +STR_3127 :{WINDOW_COLOUR_2}Mdłości: {BLACK}+{COMMA16}% +STR_3128 :Zapisz projekt trasy +STR_3129 :Zapisz projekt trasy ze scenerią STR_3130 :Zapisz STR_3131 :Anuluj STR_3132 :{BLACK}Wybierz elementy scenerii które chcesz zapisać z projektem trasy… @@ -2169,34 +2177,34 @@ STR_3133 :Nie można tego zbudować na zboczu STR_3134 :{RED}(Projekt zawiera niedostępne elementy scenerii) STR_3135 :{RED}(Projekt wagoników niedostępny - może mieć to wpływ na atrakcyjność przejażdki) STR_3136 :Uwaga: Ten projekt trasy będzie wybudowany z alternatywnymi wagonami, dlatego może nie działać zgodnie z oczekiwaniami -STR_3137 :Wybierz najbliższą scenerie +STR_3137 :Wybierz najbliższą scenerię STR_3138 :Zresetuj wybór STR_3139 :Wyciągarka nie może działać w tym trybie STR_3140 :Wyciągarka musi znajdować się na początku trasy STR_3141 :Wielokrotne pętle nie są dostępne w parze z wyciągarką STR_3142 :{WINDOW_COLOUR_2}Pojemność: {BLACK}{STRINGID} STR_3143 :Pokaż ludzi -STR_3144 :Pokaż przejażdżki i stoiska -STR_3160 :Wybierz liczbę obrotów na przejażdzkę +STR_3144 :Pokaż atrakcje i stoiska +STR_3160 :Wybierz liczbę obrotów na przejażdżkę STR_3162 :Nie można zaalokować odpowiedniej ilości pamięci STR_3163 :Instalowanie nowych danych: -STR_3164 :{BLACK}{COMMA16} wybrano (maksymalnie {COMMA16}) +STR_3164 :{BLACK}Wybrano {COMMA16} (maksymalnie {COMMA16}) STR_3167 :{WINDOW_COLOUR_2}Zawiera: {BLACK}{COMMA16} obiektów STR_3169 :Nie znaleziono danych dla obiektu: STR_3170 :Brak odpowiedniej ilości pamięci na grafikę STR_3171 :Wybrano za dużo elementów danego typu STR_3172 :Następujący obiekt musi zostać wybrany najpierw: {STRING} STR_3173 :Ten obiekt jest aktualnie w użyciu -STR_3174 :Ten obiekt jest wymagany przez inny użyty +STR_3174 :Ten obiekt jest wymagany przez inny obiekt STR_3175 :Ten obiekt jest zawsze wymagany STR_3176 :Nie można wybrać tego obiektu STR_3177 :Nie można odznaczyć tego obiektu STR_3179 :Przynajmniej jedna atrakcja musi zostać wybrana -STR_3180 :Nieprawidłowy wybór obiektu -STR_3181 :Wybór obiektu - {STRINGID} +STR_3180 :Nieprawidłowy wybór obiektów +STR_3181 :Wybór obiektów - {STRINGID} STR_3182 :Wejście do parku musi zostać wybrane STR_3183 :Rodzaj wody musi zostać wybrany -STR_3184 :Atrakcje przejazdowe/pojazdy +STR_3184 :Atrakcje/pojazdy STR_3185 :Drobna scenografia STR_3186 :Duża scenografia STR_3187 :Ściany/Ogrodzenia @@ -2211,9 +2219,9 @@ STR_3196 :{WINDOW_COLOUR_2}Grupa badawcza: {BLACK}{STRINGID} STR_3197 :{WINDOW_COLOUR_2}Rzeczy wynalezione na początku gry: STR_3198 :{WINDOW_COLOUR_2}Rzeczy do wynalezienia podczas gry: STR_3199 :Losowe sortowanie -STR_3200 :Losowe sortowanie rzeczy do wynalezenia w grze -STR_3201 :Wybór obiektu -STR_3202 :Edytor krajobrazu +STR_3200 :Losowe sortowanie rzeczy do wynalezienia w grze +STR_3201 :Wybór obiektów +STR_3202 :Edycja krajobrazu STR_3203 :Konfiguracja listy wynalazków STR_3204 :Wybór opcji STR_3205 :Wybór celu @@ -2236,17 +2244,17 @@ STR_3221 :Przekaż własność terenu parkowi STR_3222 :Przekaż pozwolenie na budowę parkowi STR_3223 :Ustaw teren jako dostępny do nabycia STR_3224 :Ustaw pozwolenie na budowę jako możliwe do nabycia -STR_3225 :Włącz / Wyłącz budowę losowego klastra obiektów wokół wybranej pozycji +STR_3225 :Włącz/Wyłącz budowę losowego klastra obiektów wokół wybranej pozycji STR_3226 :Zbuduj wejście do parku STR_3227 :Za dużo wejść do parku! STR_3228 :Ustaw początkowe rozmieszczenie ludzi -STR_3229 :Hamulce tarczowe nie mogą znajdować się bezpośrednio za stacją -STR_3230 :Hamulce tarczowe nie mogą znajdować się bezpośrednio za sobą -STR_3231 :Hamulce tarczowe nie mogą znajdować się bezpośrednio za szczytem wzniesienia z wyciągarki +STR_3229 :Hamulce blokowe nie mogą znajdować się bezpośrednio za stacją +STR_3230 :Hamulce blokowe nie mogą znajdować się bezpośrednio jeden po drugim +STR_3231 :Hamulce blokowe nie mogą znajdować się bezpośrednio za szczytem wzniesienia z wyciągarki STR_3232 :Opcje - Finanse STR_3233 :Opcje - Goście STR_3234 :Opcje - Park -STR_3235 :Wyświetl opcje finansowe +STR_3235 :Pokaż opcje finansowe STR_3236 :Wyświetl opcje gości STR_3237 :Wyświetl opcje parku STR_3238 :Bez pieniędzy @@ -2285,15 +2293,15 @@ STR_3270 :Zabroń jakichkolwiek zmian krajobrazu STR_3271 :Zakaz wysokich konstrukcji STR_3272 :Zabroń wysokich konstrukcji STR_3273 :Ocena parku trudna do zwiększenia i utrzymania -STR_3274 :Ocena parku staje się prawdziwym wyzwaniem -STR_3275 :Utrudniona ocena parku +STR_3274 :Zwiększenie i utrzymanie oceny parku staje się prawdziwym wyzwaniem +STR_3275 :Goście są trudniejsi do przyciągnięcia STR_3276 :Trudniej jest przyciągnąć gości do parku STR_3277 :{WINDOW_COLOUR_2}Koszt zakupu ziemi: STR_3278 :{WINDOW_COLOUR_2}Koszt zakupu planów budowy: -STR_3279 :Darmowe wejście do parku / atrakcje płatne -STR_3280 :Płatne wejście do parku / darmowe atrakcje +STR_3279 :Darmowe wejście i płatne atrakcje +STR_3280 :Płatne wejście i darmowe atrakcje STR_3281 :{WINDOW_COLOUR_2}Cena za wejście: -STR_3282 :|Wybierz cel i nazwę parku +STR_3282 :Wybierz cel i nazwę parku STR_3283 :Wybierz atrakcje, które mają zostać zachowane STR_3284 :Wybór celu STR_3285 :Zachowane atrakcje @@ -2323,14 +2331,14 @@ STR_3308 :{WINDOW_COLOUR_2}Wskaźnik emocji: STR_3309 :{WINDOW_COLOUR_2}{COMMA32} STR_3310 :{WINDOW_COLOUR_2}{LENGTH} STR_3311 :{WINDOW_COLOUR_2}{COMMA2DP32} -STR_3312 :{WINDOW_COLOUR_2}Przejażdżki/atrakcje według następującej kolejności: +STR_3312 :{WINDOW_COLOUR_2}Atrakcje objęte ochroną konserwatorską: STR_3313 :Nazwa scenariusza STR_3314 :Wprowadź nazwę dla scenariusza: STR_3315 :Szczegóły parku/scenariusza STR_3316 :Wprowadź opis tego scenariusza: STR_3317 :Brak szczegółów STR_3318 :Wybierz w jakich grupach występuje ten scenariusz -STR_3319 :{WINDOW_COLOUR_2}Grupa scenariuszy: +STR_3319 :{WINDOW_COLOUR_2}Gr. scenariuszy: STR_3320 :Nie można zapisać pliku scenariusza… STR_3321 :Nowe elementy zainstalowane pomyślnie STR_3322 :{WINDOW_COLOUR_2}Cel: {BLACK}{STRINGID} @@ -2339,26 +2347,26 @@ STR_3327 :Nieustawiona pozycja początkowa dla ludzi STR_3328 :Nie można przejść do dalszego etapu edytora… STR_3329 :Nie wybudowano jeszcze wejścia do parku STR_3330 :Park musi posiadać jakiś teren na własność -STR_3331 :Ścieżka od wejścia do parku do krawędzi mapy jest albo niekompletna, albo zbyt skomplikowana - Trasa musi być jednej szerokości z jak najmniejszą liczbą skrzyżowań i zakrętów +STR_3331 :Ścieżka od wejścia do parku do krawędzi mapy jest albo niekompletna, albo zbyt skomplikowana. Trasa musi być jednej szerokości z jak najmniejszą liczbą skrzyżowań i zakrętów. STR_3332 :Wejście do parku jest nieprawidłowe lub nie ma ścieżki prowadzącej do krawędzi mapy STR_3333 :Eksportuj elementy dodatkowe do zapisów gier STR_3334 :Wybierz, czy chcesz zapisać wymagane wtyczki (te, które nie są dołączone do produktu głównego) w zapisanych plikach gry lub scenariuszu, co pozwoli na ich załadowanie przez kogoś, kto nie posiada dodatkowych plików -STR_3335 :Projektant Tras - Wybierz rodzaj trasy i pojazdu -STR_3336 :Menadżer Projektanta Tras - Wybierz rodzaj przejazdu +STR_3335 :Projektant tras - Wybierz rodzaj trasy i pojazdu +STR_3336 :Menedżer projektów tras - Wybierz rodzaj atrakcji STR_3338 :{BLACK}Własny projekt STR_3339 :{BLACK}{COMMA16} projekt dostępny, możliwość stworzenia własnego STR_3340 :{BLACK}{COMMA16} projekty dostępne, możliwość stworzenia własnego STR_3341 :Narzędzia STR_3342 :Edytor scenariuszy STR_3343 :Przekonwertuj zapisaną grę do scenariusza -STR_3344 :Projektant kolejek -STR_3345 :Menadżer projektów tras +STR_3344 :Projektant tras +STR_3345 :Menedżer projektów tras STR_3346 :Nie można zapisać projektu trasy… STR_3347 :Kolejka jest za duża, zawiera za dużo elementów, lub sceneria jest za bardzo rozległa STR_3348 :Zmień nazwę STR_3349 :Usuń STR_3350 :Nazwa projektu trasy -STR_3351 :Podaj nową nazwę dla projektu trasy: +STR_3351 :Podaj nową nazwę projektu trasy: STR_3352 :Nie można zmienić nazwy projektu trasy… STR_3353 :Nowa nazwa zawiera nieprawidłowe znaki STR_3354 :Istnieje plik o takiej nazwie, lub jest on chroniony przed zapisem @@ -2370,7 +2378,7 @@ STR_3359 :{BLACK}Brak projektów trasy tego typu STR_3360 :Ostrzeżenie! STR_3361 :Za dużo projektów tras tego typu - Część nie będzie wyświetlona. STR_3364 :Zaawansowane -STR_3365 :Zezwól na wybór indwyidualnych elementów scenerii jako dodatek do grup +STR_3365 :Zezwól na wybór indywidualnych elementów scenerii jako dodatek do grup STR_3366 :{BLACK}= Atrakcja STR_3367 :{BLACK}= Budka z jedzeniem STR_3368 :{BLACK}= Budka z napojami @@ -2381,8 +2389,8 @@ STR_3372 :{BLACK}= Bankomat STR_3373 :{BLACK}= Toaleta STR_3374 :Uwaga: Zaznaczono zbyt wiele obiektów! STR_3375 :Nie wszystkie elementy w tej grupie scenerii mogą zostać wybrane -STR_3376 :Zainstaluj nowy wygląd tras… -STR_3377 :Zainstaluj nowy wygląd tras z pliku +STR_3376 :Zainstaluj nowy projekt trasy… +STR_3377 :Zainstaluj nowy projekt trasy z pliku STR_3378 :Zainstaluj STR_3379 :Anuluj STR_3380 :Brak możliwości zainstalowania projektu tej trasy… @@ -2392,7 +2400,7 @@ STR_3383 :Wybierz nową nazwę dla projektu trasy STR_3384 :Istnieje już trasa o takiej nazwie - Proszę wybrać nową nazwę: STR_3389 :Nie można wybrać dodatkowych przedmiotów scenerii… STR_3390 :Zaznaczono zbyt wiele rzeczy -STR_3437 :Usuwanie scenerii z terenu +STR_3437 :Usuń scenerię z dużego obszaru STR_3438 :Nie można stąd usunąć całej scenerii… STR_3439 :Usuń scenerię STR_3445 :Ustaw obszar do patrolowania @@ -2405,12 +2413,12 @@ STR_5122 :Wybierz atrakcje po typie (jak w RCT1) STR_5123 :Odnów atrakcje STR_5125 :Wszystko zniszczalne STR_5126 :Losowa muzyka tytułowa -STR_5127 :Podczas przenoszenia, zmieniaj krajobraz zamiast zmieniać wysokość +STR_5127 :Podczas przeciągania, zmieniaj krajobraz zamiast zmieniać wysokość STR_5128 :Rozmiar zaznaczenia -STR_5129 :Wybierz wielkość zaznaczenia pomiędzy {COMMA16} a {COMMA16} +STR_5129 :Wprowadź rozmiar zaznaczenia pomiędzy {COMMA16} a {COMMA16}: STR_5130 :Rozmiar mapy -STR_5131 :Wprowadź wielkość mapy pomiędzy {COMMA16} a {COMMA16} -STR_5132 :Napraw wszystkie atrakcje +STR_5131 :Wprowadź rozmiar mapy pomiędzy {COMMA16} a {COMMA16}: +STR_5132 :Napraw atrakcje STR_5133 :Ustaw mniejszy obszar praw do ziemi STR_5134 :Ustaw większy obszar praw do ziemi STR_5135 :Zakup ziemi i praw do budowy @@ -2434,7 +2442,7 @@ STR_5152 :, STR_5153 :Edytuj motywy… STR_5154 :Grafika sprzętowa STR_5155 :Zezwalaj na testowanie nieskończonych tras -STR_5156 :Pozwala przetestować większość typów przejażdżek, nawet jeśli tor nie jest ukończony, nie ma zastosowania do sekcji blokowych +STR_5156 :Pozwala przetestować większość typów przejażdżek, nawet jeśli tor nie jest ukończony, nie dotyczy trybów z podziałem na sekcje blokowe STR_5158 :Wyjdź do menu STR_5159 :Wyłącz OpenRCT2 STR_5160 :{POP16}{MONTH} {PUSH16}{PUSH16}{STRINGID}, Rok {POP16}{COMMA16} @@ -2448,9 +2456,9 @@ STR_5180 :Kody związane z parkiem STR_5181 :Kody związane z atrakcjami STR_5182 :{INT32} STR_5183 :Wysokość bazowa -STR_5184 :Wprowadź bazową wysokość pomiędzy {COMMA16} a {COMMA16} +STR_5184 :Wprowadź bazową wysokość pomiędzy {COMMA16} a {COMMA16}: STR_5185 :Poziom wody -STR_5186 :Wprowadź poziom wody pomiędzy {COMMA16} a {COMMA16} +STR_5186 :Wprowadź poziom wody pomiędzy {COMMA16} a {COMMA16}: STR_5187 :Finanse STR_5188 :Nowa kampania STR_5189 :Badania @@ -2459,7 +2467,7 @@ STR_5191 :Widok STR_5192 :Ostatnie wiadomości STR_5193 :Ziemia STR_5194 :Woda -STR_5195 :Wyczyść scenerie +STR_5195 :Wyczyść scenerię STR_5196 :Prawa ziemskie STR_5197 :Sceneria STR_5198 :Chodnik @@ -2474,7 +2482,7 @@ STR_5206 :Lista gości STR_5207 :Personel STR_5208 :Lista pracowników STR_5209 :Baner -STR_5210 :Wybór obiektu +STR_5210 :Wybór obiektów STR_5211 :Lista wynalazków STR_5212 :Opcje scenariusza STR_5213 :Opcje celów @@ -2488,7 +2496,7 @@ STR_5220 :Skróty klawiszowe STR_5221 :Zmień skróty klawiszowe STR_5222 :Wczytaj/Zapisz STR_5223 :Ostrzeżenie o zapisie -STR_5224 :Ostrzeżenie o zniszczeniu atrakcji +STR_5224 :Ostrzeżenie o wyburzeniu atrakcji STR_5225 :Ostrzeżenie o straży pożarnej STR_5226 :Ostrzeżenie o usunięciu trasy STR_5227 :Ostrzeżenie o nadpisaniu gry @@ -2504,7 +2512,7 @@ STR_5236 :Okno: STR_5237 :Paleta: STR_5238 :Obecny motyw: STR_5239 :Duplikuj -STR_5240 :Wprowadź nazwę dla motywu +STR_5240 :Wprowadź nazwę dla motywu: STR_5241 :Nie można zmienić tego motywu STR_5242 :Już istnieje taka nazwa motywu STR_5243 :Użyto nieprawidłowego znaku @@ -2518,7 +2526,7 @@ STR_5250 :Tytuł przycisku wyjścia STR_5251 :Tytuł przycisku opcji STR_5252 :Tytuł wyboru scenariusza STR_5253 :Informacje o parku -STR_5256 :Stwórz nowy motyw aby wprowadzić zmiany do +STR_5256 :Stwórz nowy motyw aby wprowadzić zmiany STR_5257 :Stwórz nowy motyw na podstawie bieżącego STR_5258 :Usuń bieżący motyw STR_5259 :Zmień nazwę bieżącego motywu @@ -2537,15 +2545,15 @@ STR_5272 :Mała sceneria STR_5273 :Duża sceneria STR_5274 :Ścieżka STR_5275 :Szukaj obiektu -STR_5276 :Podaj nazwę obiektu który chcesz znaleźć +STR_5276 :Wprowadź nazwę obiektu, który chcesz znaleźć: STR_5277 :Wyczyść STR_5278 :Tryb piaskownicy STR_5279 :Tryb piaskownicy wyłączony STR_5280 :Zezwól na edycję ustawień własności ziemi z poziomu okna mapy. Normalnie ta opcja jest dostępna w edytorze scenariuszy. STR_5281 :Funkcje -STR_5282 :RCT1 Włącz/Wyłącz światła atrakcji -STR_5283 :RCT1 Włącz/Wyłącz światła parku -STR_5284 :RCT1 Wybór czcionki scenariusza +STR_5282 :Światła otwarcia/zamknięcia atrakcji z RCT1 +STR_5283 :Światła otwarcia/zamknięcia parku z RCT1 +STR_5284 :Czcionka wyboru scenariusza z RCT1 STR_5287 :Atrakcja jest zepsuta STR_5288 :Atrakcja jest zamknięta STR_5289 :Brak uszkodzeń dla tej atrakcji @@ -2565,15 +2573,15 @@ STR_5302 :Usuń pożyczkę STR_5303 :Zezwól na budowę podczas pauzy STR_5304 :Sekwencja tytułowa: STR_5305 :RollerCoaster Tycoon 1 -STR_5306 :RollerCoaster Tycoon 1 (AA) -STR_5307 :RollerCoaster Tycoon 1 (AA + LL) +STR_5306 :RollerCoaster Tycoon 1 (DA) +STR_5307 :RollerCoaster Tycoon 1 (DA + ZK) STR_5308 :RollerCoaster Tycoon 2 STR_5309 :OpenRCT2 STR_5310 :Losowy STR_5311 :Narzędzia debugowania STR_5312 :Pokaż konsolę -STR_5313 :Pokaż inspektora kafelek -STR_5314 :Inspektor kafelek +STR_5313 :Pokaż inspektor kafelków +STR_5314 :Inspektor kafelków STR_5335 :Wejście na atrakcję STR_5336 :Wyjście z atrakcji STR_5337 :Wejście do parku @@ -2586,7 +2594,7 @@ STR_5345 :Kody finansowe STR_5346 :Kody związane z gośćmi STR_5347 :Kody związane z parkiem STR_5348 :Kody związane z atrakcjami -STR_5349 :Wszystkie przejażdżki +STR_5349 :Wszystkie atrakcje STR_5350 :Maks. STR_5351 :Min. STR_5352 :{BLACK}Szczęście: @@ -2598,16 +2606,16 @@ STR_5357 :{BLACK}Tolerancja mdłości: STR_5358 :{BLACK}Pęcherz: STR_5359 :Usuń gości STR_5360 :Usuwa wszystkich gości z mapy -STR_5361 :Daj wszystkim gościom: -STR_5362 :{BLACK}Ustaw preferowaną intensywność przejażdżek dla wszystkich gości na: +STR_5361 :Dodaj do ekwipunków gości +STR_5362 :{BLACK}Preferowana intensywność atrakcji: STR_5363 :Więcej niż 1 STR_5364 :Mniej niż 15 STR_5365 :{BLACK}Szybkość personelu: STR_5366 :Normalnie STR_5367 :Szybko -STR_5368 :Zresetuj status wypadku -STR_5371 :Wybór obiektu -STR_5372 :Odwrócone przesuwanie prawym przyciskiem myszy +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_5375 :▲ @@ -2623,13 +2631,13 @@ STR_5451 :Otwórz okno kodów STR_5452 :Przełącz widoczność pasków narzędzi STR_5453 :Wybierz inną atrakcję STR_5454 :Odblokuj FPS -STR_5455 :Uruchom tryb piaskownicy -STR_5456 :Wyłącz kontrolę odjazdu -STR_5457 :Wyłącz limity wsparcia +STR_5455 :Włącz tryb piaskownicy +STR_5456 :Wyłącz sprawdzanie kolizji +STR_5457 :Wyłącz limity wsporników STR_5458 :Obróć zgodnie ze wskazówką zegara STR_5459 :Obróć odwrotnie względem wskazówki zegara STR_5460 :Widok odwrotny względem wskazówki zegara -STR_5461 :Zmień parametry gości +STR_5461 :Ustaw parametry dla wszystkich gości STR_5462 :{CURRENCY} STR_5463 :Cel: Baw się dobrze! STR_5464 :Główne @@ -2642,7 +2650,7 @@ STR_5470 :Przesuń mapę w lewo STR_5471 :Przesuń mapę w dół STR_5472 :Przesuń mapę w prawo STR_5473 :Cykl dnia i nocy -STR_5474 :Wyświetlaj tekst na bannerach wielkimi literami +STR_5474 :Wyświetlaj tekst na banerach wielkimi literami STR_5475 :{COMMA16} tygodni STR_5476 :Sprzęt STR_5477 :Wyświetlanie mapy @@ -2655,7 +2663,7 @@ STR_5483 :{BLACK}(pozostało {COMMA16} tygodni) STR_5484 :{BLACK}(pozostał {COMMA16} tydzień) STR_5485 :{STRING} STR_5486 :{BLACK}{COMMA16} -STR_5487 :Pokaż ostatnie wiadomości +STR_5487 :Ostatnie wiadomości STR_5489 :Pokaż tylko śledzonych gości STR_5490 :Wyłącz dźwięk gdy okno gry jest nieaktywne STR_5491 :Lista odkryć @@ -2669,9 +2677,9 @@ STR_5499 :Nazwa gracza: STR_5500 :Dodaj serwer STR_5501 :Uruchom serwer STR_5502 :Multiplayer -STR_5503 :Wprowadź IP lub hostname: +STR_5503 :Wprowadź IP lub nazwę hosta: STR_5504 :Pokaż status gry wieloosobowej -STR_5505 :Nie można połączyć z serwerem. +STR_5505 :Nie można połączyć się z serwerem. STR_5506 :Goście ignorują intensywność STR_5510 :Domyślne urządzenie audio STR_5511 :(UNKNOWN) @@ -2711,19 +2719,19 @@ STR_5544 :Jasny czerwony STR_5545 :Ciemny różowy STR_5546 :Jasny różowy STR_5547 :Różowy -STR_5548 :Pokaż wszystkie tryby +STR_5548 :Pokaż wszystkie tryby pracy STR_5549 :rok/miesiąc/dzień STR_5550 :{POP16}{POP16}Rok {COMMA16}, {PUSH16}{PUSH16}{MONTH} {PUSH16}{PUSH16}{STRINGID} STR_5551 :rok/dzień/miesiąc STR_5552 :{POP16}{POP16}Rok {COMMA16}, {PUSH16}{PUSH16}{PUSH16}{STRINGID} {MONTH} -STR_5553 :Wstrzymaj grę gdy nakładka Steam jest otwarta +STR_5553 :Wstrzymaj grę, gdy nakładka Steam jest otwarta STR_5554 :Uruchom narzędzie tworzenia gór -STR_5555 :Pokaż pojazdy również dla innych typów atrakcji +STR_5555 :Pokaż pojazdy z innych typów torów STR_5556 :Wyrzuć gracza STR_5557 :Nie rozłączaj po desynchronizacji (tryb wieloosobowy) STR_5558 :Wymagany restart dla tej zmiany STR_5559 :10 min. inspekcje -STR_5560 :Ustaw częstotliwość inspekcji na „Co 10 minut” na wszystkich atrakcjach +STR_5560 :Ustawia częstotliwość inspekcji na „Co 10 minut” na wszystkich atrakcjach STR_5561 :Nie udało się załadować języka STR_5562 :UWAGA! STR_5563 :Ta funkcja jest obecnie niestabilna, zachowaj szczególną ostrożność. @@ -2743,12 +2751,12 @@ STR_5578 :Rosyjski rubel (₽) STR_5579 :Współczynnik skali okna: STR_5580 :Korona czeska (Kč) STR_5581 :Pokaż licznik FPS -STR_5582 :Nie pozwól na wyjście kursora poza okno +STR_5582 :Nie pozwalaj na wyjście kursora poza okno STR_5583 :{COMMA1DP16}m/s STR_5584 :SI -STR_5585 :Odblokuj limity w atrakcjach, wpływa to np. na {VELOCITY} wyciągarki -STR_5586 :Automatycznie otwieraj sklepy i stoiska -STR_5587 :Gdy aktywne, sklepy i stoiska będą automatycznie otwierane po zbudowaniu +STR_5585 :Odblokowuje limity w atrakcjach, pozwalając na rzeczy takie jak wyciągarki o prędkości {VELOCITY} +STR_5586 :Automatycznie otwieraj sklepy i kioski +STR_5587 :Gdy aktywne, sklepy i kioski będą automatycznie otwierane po zbudowaniu STR_5588 :Przejdź do rozgrywki wieloosobowej STR_5589 :Ustawienia powiadomień STR_5590 :Nagrody parku @@ -2765,12 +2773,12 @@ STR_5601 :Gość stoi w kolejce do atrakcji STR_5602 :Gość korzysta z atrakcji STR_5603 :Gość opuścił atrakcję STR_5604 :Gość kupił nowy przedmiot -STR_5605 :Gość użył udogodnienie +STR_5605 :Gość skorzystał z udogodnienia STR_5606 :Gość zmarł -STR_5607 :Wymuszono usunięcie wybranego elementu mapy. +STR_5607 :Wymuś usunięcie wybranego elementu mapy. STR_5608 :BH STR_5609 :CH -STR_5610 :Usuń aktualnie zaznaczony element. Wymusi to jego usunięcie, więc nie dostaniesz za to pieniędzy. Używaj z głową. +STR_5610 :Usuń aktualnie zaznaczony element. Wymusi to jego usunięcie, bez wydatków lub zysków gotówkowych. Używaj ostrożnie. STR_5611 :G STR_5612 :Flaga duch STR_5613 :B @@ -2780,15 +2788,15 @@ STR_5616 :Ostatni fragment flagi STR_5617 :Przesuń element wyżej. STR_5618 :Przesuń element niżej. STR_5619 :RollerCoaster Tycoon -STR_5620 :Added Attractions +STR_5620 :Dodatkowe Atrakcje STR_5621 :Zwariowane Krajobrazy STR_5622 :RollerCoaster Tycoon 2 -STR_5623 :Zakręcone światy -STR_5624 :Zakręcone czasy -STR_5625 :“Prawdziwe” parki +STR_5623 :Zakręcone Światy +STR_5624 :Zakręcone Czasy +STR_5625 :„Prawdziwe” parki STR_5626 :Inne parki STR_5627 :Grupuj scenariusze według: -STR_5628 :Gra Źródłowa +STR_5628 :Gra źródłowa STR_5629 :Poziom trudności STR_5630 :Włącz odblokowywanie scenariuszy STR_5631 :Oryginalne parki z dodatku @@ -2858,15 +2866,15 @@ STR_5726 :Ustawia aktualną pogodę w parku STR_5734 :Renderowanie STR_5735 :Status sieci STR_5736 :Gracz -STR_5737 :Zamknięte, {COMMA16} człowiek nadal korzysta z przejażdżki -STR_5738 :Zamknięte, {COMMA16} ludzi nadal korzysta z przejażdżki +STR_5737 :Zamknięte, {COMMA16} gość nadal korzysta z atrakcji +STR_5738 :Zamknięte, {COMMA16} gości nadal korzysta z atrakcji STR_5739 :{WINDOW_COLOUR_2}Gości na atrakcji: {BLACK}{COMMA16} STR_5740 :Stałe kampanie reklamowe STR_5741 :Nigdy niekończące się kampanie reklamowe STR_5742 :Uwierzytelnianie… STR_5743 :Łączenie… STR_5744 :Szukanie adresu serwera… -STR_5745 :Wykryto desynchronizacje z serwerem +STR_5745 :Wykryto desynchronizację z serwerem STR_5746 :Rozłączono STR_5747 :Rozłączono: {STRING} STR_5748 :Wyrzucono @@ -2880,7 +2888,7 @@ STR_5755 :Niewłaściwa wersja gry STR_5756 :Błędne hasło STR_5757 :Serwer osiągnął maksymalną liczbę graczy STR_5758 :{OUTLINE}{GREEN}{STRING} dołączył do gry -STR_5759 :Pobieranie mapy … +STR_5759 :Pobieranie mapy… STR_5760 :Dolar hongkoński (HK$) STR_5761 :Dolar tajwański (NT$) STR_5762 :Juan chiński (CN¥) @@ -2889,98 +2897,98 @@ STR_5764 :Nieprawidłowy typ atrakcji STR_5765 :Nie można edytować atrakcji o nieprawidłowym typie STR_5766 :Węgierski Forint (Ft) STR_5767 :Przychód -STR_5768 :Wszystkich klientów +STR_5768 :Wszyscy klienci STR_5769 :Całkowity zysk -STR_5770 :Klientów na godzinę -STR_5771 :Koszty eksploatacji +STR_5770 :Klienci na godzinę +STR_5771 :Koszt eksploatacji STR_5772 :Wiek -STR_5773 :Wszystkich klientów: {COMMA32} +STR_5773 :Wszyscy klienci: {COMMA32} STR_5774 :Całkowity zysk: {CURRENCY2DP} STR_5775 :Klienci: {COMMA32} na godzinę -STR_5776 :Wybudowano: w tym roku -STR_5777 :Wybudowano: w zeszłym roku -STR_5778 :Wybudowano: {COMMA16} lat temu +STR_5776 :Zbudowano: w tym roku +STR_5777 :Zbudowano: w zeszłym roku +STR_5778 :Zbudowano: {COMMA16} lat temu STR_5779 :Przychód: {CURRENCY2DP} na godzinę -STR_5780 :Koszty eksploatacji: {CURRENCY2DP} na godzinę -STR_5781 :Koszty eksploatacji: nieznane -STR_5782 :Połączono. Naciśnij „{STRING}” aby pisać na chacie. +STR_5780 :Koszt: {CURRENCY2DP} na godzinę +STR_5781 :Koszt: nieznany +STR_5782 :Połączono. Naciśnij „{STRING}” aby pisać na czacie. STR_5783 :{WINDOW_COLOUR_2}Scenariusz zablokowany STR_5784 :{BLACK}Aby odblokować ten scenariusz ukończ poprzedni. STR_5785 :Nie można zmienić nazwy grupy… STR_5786 :Nieprawidłowa nazwa grupy STR_5787 :{COMMA32} graczy online STR_5788 :Domyślny okres inspekcji: -STR_5789 :Wyłącz efekty świetlne +STR_5789 :Wyłącz efekt błyskawic STR_5790 :Mieszany styl płatności RCT1{NEWLINE}(np. jednoczesna odpłatność za wejście i atrakcję) -STR_5791 :Ustaw niezawodność wszystkich atrakcji na 100%{NEWLINE}i zresetuj datę budowy na „w tym roku” +STR_5791 :Ustawia niezawodność wszystkich atrakcji na 100%{NEWLINE}i resetuje datę budowy na „w tym roku” STR_5792 :Naprawia wszystkie uszkodzone atrakcje -STR_5793 :Usuwa historię katastrof,{NEWLINE}dzięki czemu goście nie będą narzekać że jest niebezpieczne -STR_5794 :Niektóre scenariusze blokują edycję{NEWLINE}istniejących juz w parku atrakcji.{NEWLINE}Ta opcja obchodzi te restrykcje -STR_5795 :Goście korzystają ze wszystkich atrakcji w parku{NEWLINE}nawet jeśli ich intensywność jest ekstremalna +STR_5793 :Usuwa historię katastrof,{NEWLINE}dzięki czemu goście nie będą narzekać, że atrakcja jest niebezpieczna +STR_5794 :Niektóre scenariusze blokują edycję{NEWLINE}istniejących już w parku atrakcji.{NEWLINE}Ta opcja obchodzi tę restrykcję +STR_5795 :Goście korzystają ze wszystkich atrakcji{NEWLINE}w parku, nawet jeśli ich intensywność jest ekstremalna STR_5796 :Wymusza zamknięcie/otwarcie parku -STR_5797 :Wyłącza zmienność pogody{NEWLINE}i ustawia wybrany jej rodzaj +STR_5797 :Wyłącza zmienność pogody{NEWLINE}i ustawia wybraną pogodę STR_5798 :Pozwala budować atrakcje w trakcie pauzy STR_5799 :Wyłącza awarie i katastrofy związane z uszkodzeniem hamulców STR_5800 :Zapobiega awariom atrakcji STR_5801 :Wyłącz śmiecenie -STR_5802 :Uniemożliwij śmiecenie i wymiotowanie przez gości +STR_5802 :Powstrzymuje gości od śmiecenia i wymiotowania STR_5803 :Obróć wybrany element mapy STR_5804 :Wycisz dźwięk STR_5805 :Jeśli zaznaczone, Twój serwer zostanie dodany{NEWLINE}do listy publicznych serwerów, co umożliwi{NEWLINE}wyszukanie go przez wszystkich STR_5806 :Przełącz tryb okna STR_5807 :{WINDOW_COLOUR_2}Liczba atrakcji: {BLACK}{COMMA16} -STR_5808 :{WINDOW_COLOUR_2}Liczba sklepów i stoisk: {BLACK}{COMMA16} +STR_5808 :{WINDOW_COLOUR_2}Liczba sklepów i kiosków: {BLACK}{COMMA16} STR_5809 :{WINDOW_COLOUR_2}Liczba kiosków informacyjnych i innych obiektów: {BLACK}{COMMA16} STR_5810 :Wyłącz limit pojazdów -STR_5811 :Jeśli zaznaczone, możesz mieć do{NEWLINE}255 wagoników na pociąg i 31{NEWLINE}pociągów na atrakcję +STR_5811 :Umożliwia ustawienie do 255 wagoników na pociąg i 31 pociągów na atrakcję STR_5812 :Pokaż okienko gry sieciowej -STR_5813 :“{STRING}” -STR_5814 :{WINDOW_COLOUR_1}“{STRING}” +STR_5813 :„{STRING}” +STR_5814 :{WINDOW_COLOUR_1}„{STRING}” #Wskazówki STR_5815 :Pokaż licznik FPS w grze STR_5816 :Ustawia stosunek skalowania grafiki.{NEWLINE}Przydatne szczególnie przy grze{NEWLINE}w wysokiej rozdzielczości -STR_5819 :[Wymaga sterownika sprzętowego]{NEWLINE}Zatrzymaj grę jeśli nakładka Steam{NEWLINE} jest otwarta -STR_5820 :Zmniejsz okienko gry w przypadku{NEWLINE}utraty ostrości w trybie pełnoekranowym -STR_5822 :Cykl dnia i nocy.{NEWLINE}Pełny cykl zajmuje miesiąc wewnątrz gry. -STR_5823 :Wyświetlaj banery z dużych liter (zaszłość RCT1) +STR_5819 :[Wymaga silnika sprzętowego]{NEWLINE}Zatrzymuje grę, jeśli nakładka Steam jest otwarta +STR_5820 :Zmniejsza okno gry w przypadku{NEWLINE}utraty ostrości w trybie pełnoekranowym +STR_5822 :Cykl dnia i nocy.{NEWLINE}Pełny cykl trwa jeden miesiąc w grze. +STR_5823 :Wyświetlaj banery z dużych liter (zachowanie RCT1) STR_5824 :Wyłącz efekty świetlne{NEWLINE}w trakcie burz -STR_5825 :Zatrzymuj kursor myszki wewnątrz okna -STR_5826 :Odwróć przeciąganie prawym przyciskiem myszki -STR_5827 :Ustawia kolor interfejsu GUI -STR_5828 :Zmień użyty format jednostki użyty do czasu, prędkość itp. -STR_5829 :Zmień rodzaj użytej waluty. Jedynie w celach wizualnych, nie ma zastosowania żaden przelicznik +STR_5825 :Zatrzymuje kursor myszki wewnątrz okna +STR_5826 :Odwraca kierunek przeciągania widoku prawym przyciskiem myszy +STR_5827 :Ustawia kolor interfejsu graficznego +STR_5828 :Zmień format jednostek używanych do pomiaru dystansu, prędkości itp. +STR_5829 :Zmień rodzaj używanej waluty. Jedynie w celach wizualnych, nie ma wdrożonego dokładnego kursu wymiany. STR_5830 :Zmień używany język -STR_5831 :Zmień użyty format{NEWLINE}wyświetlanej temperatury -STR_5832 :Pokaż wysokość jako ogólną jednostkę w miejscu formatu jednostki ustawionej w zakładce „Odległość i Prędkość” +STR_5831 :Zmień używany format{NEWLINE}wyświetlanej temperatury +STR_5832 :Pokaż wysokość jako ogólną jednostkę w miejscu formatu jednostki ustawionej w zakładce „Odległość i prędkość” STR_5833 :Zmień używany format daty STR_5834 :Wybierz urządzenie dźwiękowe dla OpenRCT2 STR_5835 :Wycisz grę przy utracie ostrości okna -STR_5836 :Wybierz muzykę do ekranu tytułowego.{NEWLINE}Wybranie motywu z RCT1 wymaga skopiowania „data/css17.dat” z katalogu gry RCT1 do „data/css50.dat” w twoim katalogu RCT2, lub ustawienia ścieżki do RCT1 w zakładce pozostałych ustawień -STR_5837 :Stwórz i zarządzaj własnymi motywami UI -STR_5838 :Pokaż osobny przycisk dla okienka Finansów w pasku narzędzi -STR_5839 :Pokaż osobny przycisk dla okienka Badań i Rozwoju w pasku narzędzi +STR_5836 :Wybierz muzykę ekranu tytułowego.{NEWLINE}Wybranie motywu z RCT1 wymaga podania ścieżki do RCT1 w zakładce ustawień zaawansowanych. +STR_5837 :Stwórz i zarządzaj własnymi motywami interfejsu użytkownika +STR_5838 :Pokaż osobny przycisk dla okienka finansów w pasku narzędzi +STR_5839 :Pokaż osobny przycisk dla okienka badań i rozwoju w pasku narzędzi STR_5840 :Pokaż osobny przycisk dla okienka kodów w pasku narzędzi STR_5841 :Pokaż osobny przycisk dla okienka komunikatów w pasku narzędzi -STR_5842 :Posortuj scenariusze w zakładkach według trudności (zaszłość RCT2) lub ich źródła (zaszłość RCT1) -STR_5843 :Włącz odblokowywanie scenariuszy (zaszłość RCT1) +STR_5842 :Posortuj scenariusze w zakładkach według trudności (zachowanie RCT2) lub ich źródła (zachowanie RCT1) +STR_5843 :Włącz odblokowywanie scenariuszy (zachowanie RCT1) STR_5844 :Pozostań podłączony do gry wieloosobowej{NEWLINE}nawet w przypadku desynchronizacji i błędów połączenia -STR_5845 :Dodaje przełącznik trybu debugowania{NEWLINE}do paska narzędzi.{NEWLINE}Włącza skrót klawiaturowy do konsoli developerskiej +STR_5845 :Dodaje przełącznik trybu debugowania{NEWLINE}do paska narzędzi.{NEWLINE}Włącza skrót klawiaturowy do konsoli deweloperskiej STR_5846 :Ustaw częstotliwość zapisu gry OpenRCT2 -STR_5847 :Wybierz sekwencje parków na ekran tytułowy.{NEWLINE}Sekwencje tytułowe z RCT1/2 wymagają zaimportowanych odpowiednich scenariuszy +STR_5847 :Wybierz sekwencję parków używaną na ekranie tytułowym.{NEWLINE}Sekwencje tytułowe z RCT1/2 wymagają zaimportowanych odpowiednich scenariuszy STR_5849 :Automatycznie rozlokuj{NEWLINE}nowo zatrudniony personel STR_5851 :Ustaw domyślną częstotliwość inspekcji{NEWLINE}na nowych atrakcjach -STR_5853 :Przełącznik włączania/wyłączania efektów dźwiękowych -STR_5854 :Przełącznik włączania/wyłączania dźwięków na atrakcjach -STR_5855 :Ustaw normalny pełny ekran, bezramkowy pełny ekran{NEWLINE}klub tryb okienkowy +STR_5853 :Włącz/Wyłącz efekty dźwiękowe +STR_5854 :Włącz/Wyłącz muzykę na atrakcjach +STR_5855 :Ustaw normalny pełny ekran, bezramkowy pełny ekran lub tryb okienkowy STR_5856 :Ustaw rozdzielczość ekranu w trybie pełnoekranowym STR_5857 :Ustawienia gry -STR_5858 :Użyć do wyświetlania GPU zamiast CPU. Pomoże to w poprawie kompatybilności z oprogramowaniem do przechwytywania ekranu. Jednak może wpłynąć negatywnie na wydajność. -STR_5859 :Włącz zmienną ilość klatek dla {NEWLINE}płynniejszej gry. Gdy wyłączone,{NEWLINE}gra będzie używała stałych 40 FPS. -STR_5860 :Przełącznik original/decompiled rysowania trasy +STR_5858 :Użyj do wyświetlania GPU zamiast CPU. Pomoże to w poprawie kompatybilności z oprogramowaniem do przechwytywania ekranu, jednak może wpłynąć negatywnie na wydajność. +STR_5859 :Włącz zmienną liczbę klatek dla {NEWLINE}płynniejszej gry. Gdy wyłączone,{NEWLINE}gra będzie używała stałych 40 FPS. +STR_5860 :Przełącz między oryginalnym/zdekompilowanym rysowaniem trasy STR_5861 :Błąd weryfikacji klucza STR_5862 :Blokuj nieznanych graczy. -STR_5863 :Pozwól na połączenie graczy znających klucz. +STR_5863 :Zezwól na połączenie graczy znających klucz. STR_5864 :Dostęp do serwera mają tylko gracze z białej listy. STR_5865 :Logowanie historii czatu STR_5866 :Zapisuj treść czatów do plików w katalogu domowym. @@ -2988,56 +2996,56 @@ STR_5867 :{WINDOW_COLOUR_2}Nazwa hostującego: {BLACK}{STRING} STR_5868 :{WINDOW_COLOUR_2}E-mail hostującego: {BLACK}{STRING} STR_5869 :{WINDOW_COLOUR_2}Strona hostującego: {BLACK}{STRING} STR_5870 :Pokaż informacje o serwerze -STR_5871 :Wyłącz starzenie się kwiatów +STR_5871 :Wyłącz usychanie kwiatów STR_5872 :Kwiaty się nie starzeją, nie usychają, nie trzeba ich wymieniać -STR_5873 :Zezwól na wyciągarkę na wszystkich typach torów -STR_5874 :Zezwól aby przy każdym typie torów można było użyć wyciągarkę +STR_5873 :Wyciągarka dozwolona na każdym torze +STR_5874 :Umożliwia przekształcenie dowolnego typu toru w wyciągarkę STR_5875 :Silnik graficzny: -STR_5876 :Silnik używany do generowania grafiki. +STR_5876 :Silnik używany do generowania grafiki STR_5877 :Programowy STR_5878 :Programowy (karta graficzna) -STR_5879 :OpenGL (eksperymentalnie) +STR_5879 :OpenGL (eksperymentalne) STR_5880 :Tylko zaznaczone STR_5881 :Tylko niezaznaczone STR_5882 :Własna waluta STR_5883 :Konfiguracja własnej waluty -STR_5884 :{WINDOW_COLOUR_2}Kurs wymiany: +STR_5884 :{WINDOW_COLOUR_2}Kurs wymiany: STR_5885 :{WINDOW_COLOUR_2}w stosunku do {COMMA32} GBP (£) STR_5886 :{WINDOW_COLOUR_2}Symbol waluty: -STR_5887 :Prefix -STR_5888 :Suffix +STR_5887 :Prefiks +STR_5888 :Sufiks STR_5889 :Własny symbol waluty -STR_5890 :Wprowadź własny symbol waluty +STR_5890 :Wprowadź własny symbol waluty: STR_5891 :Domyślny STR_5892 :Idź do domyślnego katalogu STR_5893 :Kurs wymiany -STR_5894 :Wprowadź kurs wymiany -STR_5895 :Zapis trasę +STR_5894 :Wprowadź kurs wymiany: +STR_5895 :Zapisz trasę STR_5896 :Nieudany zapis trasy! STR_5898 :{BLACK}Nie można załadować trasy, plik może być {newline}uszkodzony lub niedostępny! -STR_5899 :Przełącznik okna rysowania debugowania +STR_5899 :Włącz/Wyłącz okno debugowania rysowania STR_5900 :Użyj oryginalnego kodu rysowania STR_5901 :Wyświetlaj wysokość segmentów STR_5902 :Pokaż ścianki ograniczające STR_5903 :Pokaż okno debugowania rysowania STR_5904 :Resetuj datę -STR_5905 :Generator mapy automatycznie stworzy własny teren -STR_5906 :Powiększ pozycję kursora -STR_5907 :Jeśli włączone, powiększanie skoncentruje się wokół kursowa, w przeciwieństwie do wyśrodkowania ekranu. -STR_5908 :Pozwól zmienić na dowolny typ pojazdu -STR_5909 :Pozwala dowolnie zmienić ty pojazdu. Może powodować wypadki. +STR_5905 :Narzędzie do generowania map, które automatycznie tworzy krajobraz +STR_5906 :Przybliżaj do pozycji kursora +STR_5907 :Jeśli włączone, przybliżanie będzie koncentrować się wokół kursora, a nie na środku ekranu +STR_5908 :Pozwól na dowolne zmiany typu pojazdu +STR_5909 :Pozwala dowolnie zmienić typ pojazdu. Może powodować wypadki STR_5910 :Zastosuj -STR_5911 :Przezroczyste ścieżki widokowe -STR_5912 :Przełącznik ścieżek widokowych +STR_5911 :Przezroczyste ścieżki +STR_5912 :Przełącznik przezroczystych ścieżek STR_5913 :Czat STR_5914 :Nieznana atrakcja STR_5915 :Gracz STR_5916 :{COMMA16} gracz -STR_5917 :{COMMA16} gracze +STR_5917 :{COMMA16} graczy STR_5918 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{COMMA16} STR_5919 :{COMMA16} -STR_5920 :Efekty graficzne wody -STR_5921 :Jeśli włączony, deszcz i błyski będą widoczne w trakcie gry. +STR_5920 :Efekty graficzne pogody +STR_5921 :Jeśli włączone, deszcz i błyski będą widoczne podczas burzy. STR_5922 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}Maks. {STRINGID} STR_5923 :{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}{POP16}Maks. {COMMA16} {STRINGID} na pociąg STR_5924 :Szczegóły powierzchni @@ -3047,7 +3055,7 @@ STR_5927 :Szczegóły scenerii STR_5928 :Szczegóły wejścia STR_5929 :Szczegóły ściany STR_5930 :Szczegóły dużej scenerii -STR_5931 :Szczegóły banneru +STR_5931 :Szczegóły baneru STR_5932 :Szczegóły uszkodzonych elementów STR_5933 :Właściwości STR_5934 :Tekstura terenu: {BLACK}{STRINGID} @@ -3070,7 +3078,7 @@ STR_5950 :Zastosuj zmiany dla całego elementu trasy STR_5951 :ID elementu trasy: {BLACK}{COMMA16} STR_5952 :Numer sekwencji: {BLACK}{COMMA16} STR_5953 :Posortuj elementy mapy na podstawie ich wysokości. -STR_5954 :Wiek scenografii: {BLACK}{COMMA16} +STR_5954 :Wiek scenerii: {BLACK}{COMMA16} STR_5955 :Umiejscowienie ćwiartki: {BLACK}{STRINGID} STR_5956 :Południowy-zachód STR_5957 :Północny-zachód @@ -3078,7 +3086,7 @@ STR_5958 :Północny-wschód STR_5959 :Południowy-wschód STR_5960 :Umiejscowienie ćwiartki: STR_5961 :Indeks wejścia: {BLACK}{COMMA16} -STR_5962 :Wykrycie kolizji: +STR_5962 :Wykrywanie kolizji: STR_5963 :Podniesione narożniki: STR_5964 :Przekątna STR_5965 :Typ wejścia: {BLACK}{STRINGID} @@ -3090,7 +3098,7 @@ STR_5970 :ID Wejścia: {BLACK}{COMMA16} STR_5971 :ID wyjścia: {BLACK}{COMMA16} STR_5972 :ID Tras: {BLACK}{COMMA16} STR_5973 :Zaczep z następnym -STR_5974 :Zmienia wysokość podstawy i prześwitu tak, aby znajdowały się one na tym samym poziomie co następny element na bieżącej platformie. Ułatwia to budowę na tej samej platformie. +STR_5974 :Zmienia wysokość podstawy i prześwitu tak, aby znajdowały się one na tym samym poziomie co następny element na bieżącym kafelku. Ułatwia to budowę na tym kafelku. STR_5975 :Nachylenie: STR_5976 :Płaszczyzna STR_5977 :Prawą stroną do góry @@ -3102,7 +3110,7 @@ STR_5982 :Rodzaj dużej scenerii: {BLACK}{COMMA16} STR_5983 :ID elementu dużej scenerii: {BLACK}{COMMA16} STR_5984 :Zablokowane ścieżki: STR_5985 :Nowy katalog -STR_5986 :Wprowadź nazwę nowego katalogu. +STR_5986 :Wprowadź nazwę nowego katalogu: STR_5987 :Nie można utworzyć katalogu STR_5988 :Nie ma więcej terenu na sprzedaż STR_5989 :Nie ma więcej praw do zabudowy na sprzedaż @@ -3111,28 +3119,28 @@ STR_5991 :Nie można wkleić elementu… STR_5992 :Limit elementów mapy został osiągnięty STR_5993 :Skopiuj wybrany element STR_5994 :Wklej wybrany element -STR_5995 :Przyśpieszenie -STR_5996 :Przyśpieszenie czasu +STR_5995 :Przyspieszenie +STR_5996 :Prędkość przyspieszenia STR_5997 :Dodaj/ustaw pieniądze STR_5998 :Dodaj pieniądze STR_5999 :Ustaw pieniądze -STR_6000 :Wprowadź nową wartość -STR_6001 :Włącz elementy świetlne (eksperymentalne) +STR_6000 :Wprowadź nową wartość: +STR_6001 :Włącz efekty świetlne (eksperymentalne) STR_6002 :Lampy i atrakcje będą świeciły w nocy.{NEWLINE}Wymaga włączenia silnika sprzętowego. STR_6003 :Widok przekroju STR_6004 :Widok przekroju STR_6005 :Włącz widok przekroju -STR_6006 :Widok przekroju na podgląd elementów znajdujących się pod innym elementem. -STR_6007 :Wysokość cięcia -STR_6008 :Kliknij aby przełączyć surowe<->wartości jednostek pomiarowych -STR_6009 :Wy +STR_6006 :Widok przekroju wyświetla jedynie elementy mapy na lub poniżej wysokości przycięcia (przycięcie pionowe) oraz w wybranym obszarze (przycięcie poziome). +STR_6007 :Wysokość +STR_6008 :Kliknij aby przełączyć surowe wartości<->wartości jednostek pomiarowych +STR_6009 :Wybierz wysokość cięcia STR_6010 :{COMMA2DP32}m STR_6011 :{COMMA1DP16}ft STR_6012 :{COMMA1DP16} -STR_6013 :Goście będą płacić jedynie na wstęp do parku i usługi.{NEWLINE}Atrakcje są darmowe. +STR_6013 :Goście będą płacić jedynie za wstęp do parku i usługi.{NEWLINE}Atrakcje są darmowe. STR_6014 :Goście będą płacić za bilety wstępu na atrakcje i usługi.{NEWLINE}Nie będą płacić za wstęp do parku. STR_6015 :Nachylony -STR_6016 :Edytuj kafel +STR_6016 :Edytuj kafelek STR_6017 :Proszę zwolnić STR_6018 :Konstrukcja - Obróć w lewo STR_6019 :Konstrukcja - Obróć w prawo @@ -3140,13 +3148,13 @@ STR_6020 :Konstrukcja - Użyj domyślnej trasy STR_6021 :Konstrukcja - Nachylenie w dół STR_6022 :Konstrukcja - Nachylenie w górę STR_6023 :Konstrukcja - Przełącznik wyciągarki -STR_6024 :Konstrukcja - Nachylenie w lewo -STR_6025 :Konstrukcja - Nachylenie w prawo +STR_6024 :Konstrukcja - Przechylenie w lewo +STR_6025 :Konstrukcja - Przechylenie w prawo STR_6026 :Konstrukcja - Poprzedni element STR_6027 :Konstrukcja - Następny element STR_6028 :Konstrukcja - Wybuduj bieżący -STR_6029 :Konstrukcja - Zniszcz bieżący -STR_6030 :Przechwytywacz scenerii. Wybierz dowolny element scenerii na mapie aby wybrać taki sam dla konstrukcji. +STR_6029 :Konstrukcja - Usuń bieżący +STR_6030 :Przechwytywacz scenerii. Wybierz dowolny element scenerii na mapie aby wybrać taki sam do konstrukcji. STR_6031 :Opis serwera: STR_6032 :Wiadomość powitalna: STR_6033 :Ścieżka do katalogu RCT1: @@ -3154,16 +3162,16 @@ STR_6034 :{BLACK}{STRING} STR_6035 :Proszę wybrać katalog z RCT1 STR_6036 :Wyczyść STR_6037 :Proszę wybrać prawidłowy katalog RCT1 -STR_6038 :Jeżeli masz zainstalowane RCT1, ustaw tę opcję na ścieżkę do owej gry, aby załadować scenariusze, muzykę, etc. z pierwszej części -STR_6039 :Szybkie niszczenie atrakcji -STR_6040 :Edytuj Opcje Scenariusza +STR_6038 :Jeżeli masz zainstalowane RCT1, ustaw tę opcję na ścieżkę do owej gry, aby załadować scenariusze, muzykę itp. +STR_6039 :Szybkie burzenie atrakcji +STR_6040 :Edytuj opcje scenariusza STR_6041 :{BLACK}Nie masz zatrudnionych mechaników! STR_6042 :Załaduj mapę wysokości STR_6043 :Wybierz mapę wysokości -STR_6044 :Gładka wysokość mapy -STR_6045 :Ostra -STR_6046 :Normalizuj mapę wysokością -STR_6047 :Gładkie warstwa +STR_6044 :Wygładź mapę wysokości +STR_6045 :Siła: +STR_6046 :Normalizuj mapę wysokości +STR_6047 :Wygładź krawędzie kafelków STR_6048 :Błąd mapy wysokościowej STR_6049 :Błąd odczytu PNG STR_6050 :Błąd odczytu bitmapy @@ -3194,7 +3202,7 @@ STR_6075 :{STRING} zmienił domyślna grupę graczy na „{STRING}”. STR_6076 :{STRING} pokaż/schowaj kody „{STRING}”. STR_6077 :Dodaj pieniądze STR_6078 :{STRING} stworzył atrakcję „{STRING}”. -STR_6079 :{STRING} zniszczył atrakcję „{STRING}”. +STR_6079 :{STRING} zburzył atrakcję „{STRING}”. STR_6080 :{STRING} zmienił wygląd atrakcji „{STRING}”. STR_6081 :{STRING} zmienił status atrakcji „{STRING}” na zamkniętą. STR_6082 :{STRING} zmienił status atrakcji „{STRING}” na otwartą. @@ -3211,25 +3219,25 @@ STR_6092 :{STRING} zmienił cenę wstępu do parku na {STRING} STR_6093 :{STRING} umieścił nową dekorację. STR_6094 :{STRING} usunął dekorację. STR_6095 :{STRING} edytował dekorację. -STR_6096 :{STRING} ustawił nazwę znaku na „{STRING”. +STR_6096 :{STRING} ustawił nazwę znaku na „{STRING}”. STR_6097 :{STRING} dodał odcinek trasy „{STRING}”. STR_6098 :{STRING} usunął odcinek trasy. STR_6099 :Połączyłeś się z serwerem. STR_6100 :Rozłączyłeś się z serwerem. -STR_6101 :Wartość atrakcji nie spada wraz z upływem czasu. -STR_6102 :Wartość atrakcji nie będzie spadała z czasem, dlatego klienci stwierdzą po pewnym czasie, że jest za droga. +STR_6101 :Wartość atrakcji nie spada +STR_6102 :Wartość atrakcji nie będzie spadała z czasem, więc goście nie będą nagle twierdzić, że atrakcja jest za droga. STR_6103 :Opcja ta nie jest dostępna w grze wieloosobowej. -STR_6105 :Hypercoaster -STR_6107 :Monster Trucks -STR_6109 :Hyper-Twister -STR_6111 :Klasyczna mini kolejka górska -STR_6113 :Wysoka kolejka górska bez inwersji z wielkimi zjazdami, wysokimi prędkościami i wygodnymi wagonikami, które zabezpieczone są tylko pasem na biodrach -STR_6115 :Zasilane wielkie auta z napędem 4x4, które są w stanie wjechać na strome zbocza -STR_6116 :Szerokie wagony kolejki górskiej delikatnie ślizgają się na stalowym torze przez przeróżne inwersje -STR_6119 :Tani i łatwy do zbudowania roller coaster, jednak z limitem wysokości +STR_6105 :Hiper jazda +STR_6107 :Potworne pikapy +STR_6109 :Hiperzwijka +STR_6111 :Klasyczna kolejka dla dzieci +STR_6113 :Wysoka, nieobrotowa kolejka górska z wielkimi zjazdami, wysokimi prędkościami i wygodnymi wagonikami, wyposażonymi w zabezpieczenia obejmujące pasażerów jedynie w pasie +STR_6115 :Samochody na olbrzymich kołach z napędem 4x4, które mogą wjeżdzać na strome zbocza +STR_6116 :Szerokie wagoniki suną po gładkim stalowym torze, pokonując przeróżne inwersje +STR_6119 :Tania i łatwa do zbudowania kolejka, jednak z limitem wysokości STR_6120 :{BABYBLUE}Nowy pojazd dostępny dla {STRINGID}:{NEWLINE}{STRINGID} STR_6121 :Rozszerz prawa do terenu aż do krawędzi mapy -STR_6122 :Nie ma dostępnych więcej roaller coaster w tym scenariuszu! +STR_6122 :W tym scenariuszu jest za mało kolejek górskich! STR_6123 :Błąd przy ładowaniu elementów parku STR_6124 :Nazwa elementu STR_6125 :Typ elementu @@ -3240,12 +3248,12 @@ STR_6129 :Skopiuj wybrany przedmiot do schowka STR_6130 :Skopiuj listę do schowka STR_6131 :Ścieżka elementu STR_6132 :Ignoruj wyniki badań -STR_6133 :Dostęp do kolejek i scenerii, które nie zostały jeszcze wynalezione +STR_6133 :Umożliwia dostęp do atrakcji i scenerii, które nie zostały jeszcze wynalezione STR_6134 :Wyczyść scenerię STR_6135 :Klient wysłał nieprawidłowe żądanie STR_6136 :Serwer wysłał nieprawidłowe żądanie -STR_6137 :OpenRCT2, darmowy i open source klon gry Roller Coaster Tycoon 2. -STR_6138 :OpenRCT2 to wynik pracy wielu autorów, pełną listę można znaleźć w “contributors.md”. Po więcej informacji odwiedź: http://github.com/OpenRCT2/OpenRCT2 +STR_6137 :OpenRCT2, darmowe i open-source’owe odtworzenie oraz rozszerzenie gry Roller Coaster Tycoon 2. +STR_6138 :OpenRCT2 to wynik pracy wielu autorów, pełną listę można znaleźć wybierając opcję „Współautorzy”. Po więcej informacji odwiedź: http://github.com/OpenRCT2/OpenRCT2 STR_6139 :Wszystkie nazwy produktów i firm należą do ich właścicieli. Użycie ich nie oznacza powiązania z nimi ani ich poparcia. STR_6140 :Lista zmian… STR_6141 :Dolny pasek narzędziowy z RCT1 @@ -3254,31 +3262,31 @@ STR_6143 :{WINDOW_COLOUR_2}Typ przejażdżki: {BLACK}{STRINGID} STR_6144 :Pokaż odrysowane kafelki STR_6145 :Ustaw limit prędkości dla generatorów prędkości STR_6146 :Włącz wszystkie dostępne części toru -STR_6147 :Włącza wszystkie części które są dostępne dla tego typu przejażdżki, oprócz tych niedostępnych dla danego pojazdu. +STR_6147 :Włącza wszystkie części, które są dostępne dla tego typu przejażdżki, oprócz tych niedostępnych dla danego pojazdu. STR_6148 :Łączenie z serwerem głównym… STR_6149 :Nieudane połączenie z serwerem głównym STR_6150 :Błędna odpowiedź z głównego serwera (brak numeru JSON) STR_6151 :Główny serwer nie zwrócił listy serwerów STR_6152 :Błędna odpowiedź z głównego serwera (brak tablicy JSON) -STR_6153 :Opłata za wejście do parku / Opłata za atrakcje +STR_6153 :Płatne wejście i płatne atrakcje STR_6154 :Z uwagi na bezpieczeństwo, nie zaleca się uruchamiania OpenRCT2 z podwyższonymi uprawnieniami. -STR_6155 :KDialog ani Zenity nie jest zainstalowane. Zainstaluj, lub skonfiguruj z poziomu konsoli. +STR_6155 :Ani KDialog, ani Zenity nie jest zainstalowane. Zainstaluj jedno z nich, lub skonfiguruj z poziomu konsoli. STR_6156 :Nazwa jest zastrzeżona STR_6157 :Konsola STR_6160 :{WINDOW_COLOUR_2}Dostępne pojazdy: {BLACK}{STRING} STR_6161 :Przełącz widok siatki -STR_6162 :Spinning Wild Mouse -STR_6163 :Pojazdy wyglądające jak myszki, szybko jeżdżą po ciasnych zakrętach i krótkich zjazdach, dodatkowo łagodnie się kręcą przez co dezorientują gości +STR_6162 :Wirująca szalona mysz +STR_6163 :Wagoniki w kształcie myszy pokonujące ostre zakręty i krótkie zjazdy, wirujące łagodnie w celu zdezorientowania pasażerów STR_6164 :{WHITE}❌ STR_6165 :Synchronizacja pionowa -STR_6166 :Synchronizuje każdą wyświetlaną klatkę z częstotliwością odświeżania monitora, zapobiegając rozrywaniu ekranu. +STR_6166 :Synchronizuje każdą wyświetlaną klatkę z częstotliwością odświeżania monitora, zapobiegając rozrywaniu ekranu STR_6167 :Zaawansowane STR_6168 :Sekwencja tytułowa STR_6169 :Wybór scenariusza -STR_6170 :Zmiany w interfejsie +STR_6170 :Dostosowanie interfejsu STR_6171 :Szukaj STR_6172 :Szukaj -STR_6173 :Wpisz nazwę której szukasz: +STR_6173 :Podaj imię, którego szukasz: STR_6188 :Wymiociny STR_6189 :Kaczka STR_6191 :Powierzchnia @@ -3293,13 +3301,13 @@ STR_6199 :Ustaw datę STR_6200 :Resetuj datę STR_6201 :{MONTH} STR_6202 :Styl wirtualnego podłoża: -STR_6203 :Gdy włączone, wirtualne podłoże będzie prezentowane przy wciśniętym Ctrl lub Shift, aby łatwiej było ustawić w pionowe elementy. +STR_6203 :Gdy włączone, wirtualne podłoże będzie prezentowane przy wciśniętym Ctrl lub Shift, aby ułatwić stawianie elementów w pionie. STR_6215 :Konstrukcja STR_6216 :Operacja -STR_6217 :Dostępność atrakcji / ścieżki -STR_6218 :Officjane OpenRCT2 +STR_6217 :Dostępność atrakcji/torów +STR_6218 :Oficjalne OpenRCT2 STR_6219 :Podświetl problemy na ścieżkach -STR_6220 :Przłącz na dostępne +STR_6220 :Przełącz na dostępne STR_6221 :Spowoduje to ustawienie znanego wejścia lub wyjścia z przejazdu na aktualnie wybrany kafelek. Na jednej stacji można wykorzystać tylko jedno miejsce wejścia i wyjścia. STR_6222 :Nie można tutaj postawić wejścia dla gości… STR_6223 :Musi być poza granicami parku! @@ -3330,7 +3338,7 @@ STR_6247 :Odnowienie przejażdżki/atrakcji STR_6248 :{WINDOW_COLOUR_1}Czy chcesz odnowić {STRINGID} za {CURRENCY}? STR_6249 :{WINDOW_COLOUR_1}Czy chcesz odnowić {STRINGID}? STR_6250 :{WINDOW_COLOUR_1}Czy na pewno chcesz zburzyć {STRINGID} i dostać za to {CURRENCY}? -STR_6251 :Przejażdżka nie jest pusta jeszcze +STR_6251 :Atrakcja nie jest jeszcze pusta STR_6255 :Adres URL jest nieprawidłowy STR_6256 :Efekty renderowania STR_6257 :Świecące @@ -3343,23 +3351,23 @@ STR_6263 :Włącz/wyłącz wszystkie dźwięki STR_6264 :Zawsze używaj przeglądarki systemowej STR_6265 :Po włączeniu tej opcji, przeglądarka plików Twojego systemu operacyjnego będzie używana zamiast przeglądarki OpenRCT2. STR_6266 :Otwórz folder ze spersonalizowaną zawartością -STR_6267 :Otwórz inspektor kafelek +STR_6267 :Otwórz inspektor kafelków STR_6268 :Tick do przodu STR_6269 :Nieprawidłowy indentyfikator klimatu -STR_6270 :Powierzchnie otoczenia -STR_6271 :Krawędzie otoczenia +STR_6270 :Powierzchnie terenu +STR_6271 :Krawędzie terenu STR_6272 :Stacje STR_6273 :Muzyka -STR_6274 :Nie można ustawić schematu koloru… +STR_6274 :Nie można ustawić schematu kolorów… STR_6275 :{WINDOW_COLOUR_2}Styl stacji: STR_6276 :Na {RED}{STRINGID} utykają goście, prawdopodobnie z powodu nieprawidłowego typu atrakcji albo trybu operowania. STR_6277 :Numer stacji: {BLACK}{STRINGID} -STR_6278 :Liczba autozapisów -STR_6279 :Liczba autozapisów powinna zostać zachowana +STR_6278 :Liczba autozapisów: +STR_6279 :Liczba autozapisów, które powinny zostać zachowane STR_6280 :Czat STR_6281 :Pokaż osobny przycisk dla czatu w pasku narzędzi STR_6282 :Czat -STR_6283 :Czat nie jest odstępny. Sprawdź połączenie z serwerem +STR_6283 :Czat nie jest dostępny. Sprawdź połączenie z serwerem STR_6293 :B STR_6294 :KiB STR_6295 :MiB @@ -3367,83 +3375,83 @@ STR_6296 :GiB STR_6297 :TiB STR_6298 :{STRING}/sek STR_6299 :Pobierz wszystkie -STR_6300 :Pobierz wszystkie braujące obiekty jeśli są dostępne online. +STR_6300 :Pobierz wszystkie brakujące obiekty jeśli są dostępne online. STR_6301 :Skopiuj nazwę wybranego obiektu do schowka. -STR_6302 :Skopiuj całą listęp brakujących obiektów do schowka. +STR_6302 :Skopiuj całą listę brakujących obiektów do schowka. STR_6303 :Pobieranie obiektu ({COMMA16} / {COMMA16}): [{STRING}] STR_6304 :Otwórz przeglądarkę scenerii STR_6305 :Wielowątkowość STR_6306 :Eksperymentalna opcja używania wielowątkowości do renderowania, może być niestabilna. STR_6307 :Paleta kolorów: {BLACK}{STRINGID} -STR_6308 :{TOPAZ}“{STRINGID}{OUTLINE}{TOPAZ}”{NEWLINE}{STRINGID} +STR_6308 :{TOPAZ}„{STRINGID}{OUTLINE}{TOPAZ}”{NEWLINE}{STRINGID} STR_6309 :Połącz ponownie STR_6310 :{WINDOW_COLOUR_2}Pozycja: {BLACK}{INT32} {INT32} {INT32} STR_6311 :{WINDOW_COLOUR_2}Następna: {BLACK}{INT32} {INT32} {INT32} STR_6312 :(powierzchnia) -STR_6313 :(nechylenie {INT32}) +STR_6313 :(nachylenie {INT32}) STR_6314 :{WINDOW_COLOUR_2}Cel: {BLACK}{INT32}, {INT32} tolerancja {INT32} -STR_6315 :{WINDOW_COLOUR_2}Cel wykrywania ścieżki: {BLACK}{INT32}, {INT32}, {INT32} dir {INT32} -STR_6316 :{WINDOW_COLOUR_2}Historia wykrywania ścieżki: -STR_6317 :{BLACK}{INT32}, {INT32}, {INT32} folder {INT32} +STR_6315 :{WINDOW_COLOUR_2}Cel szukania drogi: {BLACK}{INT32}, {INT32}, {INT32} kier. {INT32} +STR_6316 :{WINDOW_COLOUR_2}Historia szukania drogi: +STR_6317 :{BLACK}{INT32}, {INT32}, {INT32} kier. {INT32} STR_6318 :Desynchronizacja sieci.{NEWLINE}Plik z logami: {STRING} STR_6319 :Hamulec blokowy zamknięty STR_6320 :Niezniszczalne STR_6321 :Dodatek jest uszkodzony -STR_6322 :{WINDOW_COLOUR_2}Identyfikator sprite’a: {BLACK}{INT32} +STR_6322 :{WINDOW_COLOUR_2}Identyfikator: {BLACK}{INT32} STR_6323 :Symulowanie STR_6324 :Symuluj STR_6325 :Symuluj atrakcję STR_6326 :Nie można symulować {STRINGID}… -STR_6327 :Przezroczyste tło dla ogromnych zrzutów z ekranu -STR_6328 :Ogromy zrzut z ekranu będzie miał przezroczyste tło zamiast domyślnego czarnego. +STR_6327 :Przezroczyste tło dla ogromnych zrzutów ekranu +STR_6328 :Ogromny zrzut ekranu będzie miał przezroczyste tło zamiast domyślnego czarnego. STR_6329 :{STRING}{STRINGID} STR_6330 :Pobieranie [{STRING}] z {STRING} ({COMMA16} / {COMMA16}) STR_6331 :Stwórz kaczki STR_6332 :Usuń kaczki STR_6333 :Zwiększ współczynnik skali STR_6334 :Zmniejsz współczynnik skali -STR_6336 :Inspector kafelek: Skopiuj element -STR_6337 :Inspector kafelek: Wklej element -STR_6338 :Inspector kafelek: Usuń element -STR_6339 :Inspector kafelek: Przenieś element do góry -STR_6340 :Inspector kafelek: Przenieś element w dół -STR_6341 :Inspector kafelek: Zwiększ współrzędną X -STR_6342 :Inspector kafelek: Zmniejsz współrzędną X -STR_6343 :Inspector kafelek: Zwiększ współrzędną Y -STR_6344 :Inspector kafelek: Zmniejsz współrzędną Y -STR_6345 :Inspector kafelek: Zwiększ wysokość elementu -STR_6346 :Inspector kafelek: Zmniejsz wysokość elementu +STR_6336 :Inspektor kafelków: Skopiuj element +STR_6337 :Inspektor kafelków: Wklej element +STR_6338 :Inspektor kafelków: Usuń element +STR_6339 :Inspektor kafelków: Przenieś element do góry +STR_6340 :Inspektor kafelków: Przenieś element w dół +STR_6341 :Inspektor kafelków: Zwiększ współrzędną X +STR_6342 :Inspektor kafelków: Zmniejsz współrzędną X +STR_6343 :Inspektor kafelków: Zwiększ współrzędną Y +STR_6344 :Inspektor kafelków: Zmniejsz współrzędną Y +STR_6345 :Inspektor kafelków: Zwiększ wysokość elementu +STR_6346 :Inspektor kafelków: Zmniejsz wysokość elementu STR_6347 :Dodatkowe ścieżki nie mogą być na przejeździe kolejowym! -STR_6348 :Najpierw uzuń przejazd kolejowy! -STR_6349 :Losowa sekwecja tytułów -STR_6350 :Rozpraszane +STR_6348 :Najpierw usuń przejazd kolejowy! +STR_6349 :Losowa sekwencja tytułowa +STR_6350 :Rozpraszanie STR_6351 :Narzędzie rozpraszania scenerii STR_6352 :Gęstość STR_6353 :Niska gęstość STR_6354 :Średnia gęstość -STR_6355 :Wyskoka gęstość +STR_6355 :Wysoka gęstość STR_6356 :Przyzywa kaczki jeśli park zawiera wodę -STR_6357 :Usuwa wszystkie kaczki z mapu +STR_6357 :Usuwa wszystkie kaczki z mapy STR_6358 :Strona {UINT16} STR_6359 :{POP16}{POP16}Strona {UINT16} -STR_6361 :Włącz efekty świetlne atrakcji (eksperymentalne) -STR_6362 :Jeśłi włączone, pojazdy będą oświetlone w nocy. +STR_6361 :Włącz oświetlenie pojazdów +STR_6362 :Jeśli włączone, pojazdy będą oświetlone w nocy. STR_6363 :Tekst skopiowany do schowka STR_6364 :{RED}{COMMA16} osoba zmarła w wypadku na {STRINGID} STR_6365 :Ofiary atrakcji STR_6366 :Zablokowane pojazdy STR_6367 :Klatka animacji: -STR_6368 :Z powodów kompatybilności nie zaleca się uruchamiania OpenRCT2 na Wine. OpenRCT2 działa poprawnie na macOS, Linux, FreeBSD i OpenBSD. -STR_6369 :Zezwól na budowanie torów na dowolnych wysokościach +STR_6368 :Z powodów kompatybilności nie zaleca się uruchamiania OpenRCT2 za pomocą Wine. OpenRCT2 działa poprawnie na macOS, Linux, FreeBSD i OpenBSD. +STR_6369 :Tory na dowolnych wysokościach STR_6370 :Zezwala na ustawianie fragmentów torów na dowolnych interwałach wysokościowych -STR_6371 :Wskazana ścieżka zawiera instalację RollerCoaster Tycoon 1, ale brakuje pliku “csg1i.dat”. Ten plik musi zostać skopiowany z płyty Loopy Landscapes lub RCT Deluxe do folderu “Data” w RollerCoaster Tycoon 1 zainstalowanym na dysku twardym. -STR_6372 :Wskazana ścieżka zawiera instalację RollerCoaster Tycoon 1, ale ta wersja jest nieodpowiednia. OpenRCT2 wymaga instalacji Loopy Landscapes lub RCT Deluxe w celku korzystania z zasobów RollerCoaster Tycoon 1. +STR_6371 :Wskazana ścieżka zawiera instalację RollerCoaster Tycoon 1, ale brakuje pliku „csg1i.dat”. Ten plik musi zostać skopiowany z płyty Zwariowane Krajobrazy lub RCT Deluxe do folderu „Data” w RollerCoaster Tycoon 1 zainstalowanym na dysku twardym. +STR_6372 :Wskazana ścieżka zawiera instalację RollerCoaster Tycoon 1, ale ta wersja jest nieodpowiednia. OpenRCT2 wymaga instalacji Zwariowane Krajobrazy lub RCT Deluxe w celu korzystania z zasobów RollerCoaster Tycoon 1. STR_6373 :Pokaż/schowaj sprawdzenia prześwitu STR_6374 :P STR_6375 :Nieznana atrakcja STR_6376 :{WINDOW_COLOUR_2}Pojazd:{NEWLINE}{BLACK}{STRINGID} dla {STRINGID} STR_6377 :{WINDOW_COLOUR_2}Typ: {BLACK}{STRINGID} dla {STRINGID} -STR_6378 :Odebrano listę obiektów: +STR_6378 :Odbieranie listy obiektów… STR_6379 :Odebrano nieprawidłowe dane STR_6380 :Dostępna aktualizacja! STR_6381 :Dołącz do Discorda OpenRCT2! @@ -3455,26 +3463,26 @@ STR_6386 :Śnieżyca STR_6387 :Nie można tutaj obniżyć elementu… STR_6388 :Nie można tutaj podwyższyć elementu… STR_6389 :Nieprawidłowy prześwit -STR_6390 :Do działania OpenRCT2 wymaga plików z orginalnego RollerCoaster Tycoon 2. Wybierz katalog gdzie został zainstalowany RollerCoaster Tycoon 2. +STR_6390 :OpenRCT2 wymaga do działania plików z oryginalnego RollerCoaster Tycoon 2 lub RollerCoaster Tycoon Classic. Wybierz katalog gdzie został zainstalowany RollerCoaster Tycoon 2 lub RollerCoaster Tycoon Classic. STR_6391 :Wybierz katalog z RCT2 STR_6392 :Nie można znaleźć {STRING} w tej ścieżce STR_6393 :Wybór celu STR_6394 :Cel STR_6395 :Utrzymanie STR_6396 :Wyłącz oszczędzanie energii monitora -STR_6397 :Jeśli zaznaczone, wygaszacz ekranu i inne funkcje oszczędzania ekranu zostaną wyłączone gdy OpenRCT2 jest uruchomione. -STR_6398 :Plik zawiera niewspierane typy kolejek. Zaktualizuj do nowszej wersji OpenRCT2.. -STR_6399 :OpenRCT2 wmymaga do działania plików z orginalnego Roller Coaster Tycoon 2. Ustaw wartość “game_path” w config.ini na folder w którym zostało zainstalowane RollerCoaster Tycoon 2, następnie zrestartuj OpenRCT2. +STR_6397 :Jeśli zaznaczone, wygaszacz ekranu i inne funkcje oszczędzania ekranu zostaną wyłączone gdy OpenRCT2 jest uruchomione +STR_6398 :Plik zawiera niewspierane typy kolejek. Zaktualizuj do nowszej wersji OpenRCT2. +STR_6399 :OpenRCT2 wymaga do działania plików z oryginalnego RollerCoaster Tycoon 2 lub RollerCoaster Tycoon Classic. Ustaw wartość „game_path” w config.ini na folder w którym zostało zainstalowane RollerCoaster Tycoon 2 lub RollerCoaster Tycoon Classic, następnie zrestartuj OpenRCT2. STR_6400 :Mam pobrany GOG offline installer dla RollerCoaster Tycoon 2, ale nie jest zainstalowany -STR_6401 :Mam już RollerCoaster Tycoon 2 zainstalowany +STR_6401 :Mam już zainstalowany RollerCoaster Tycoon 2 lub RollerCoaster Tycoon Classic STR_6402 :Ustawienia danych OpenRCT2 STR_6403 :Wybierz co najbardziej pasuje STR_6404 :Wybierz instalator GOG RollerCoaster Tycoon 2. -STR_6405 :Wybirz instalator GOG +STR_6405 :Wybierz instalator GOG STR_6406 :Instalator GOG RollerCoaster Tycoon 2 STR_6407 :To może potrwać kilka minut. -STR_6408 :Wskaż proszę “innoextract” w celu wypakowania instalatora GOG, następnie zrestartuj OpenRCT2. -STR_6409 :Wskazany plik nie jest offlinowym intalatorem GOG dla RollerCoaster Tycoon 2. Możliwe, że pobrany został GOG Galaxy downloader, albo wskazany błędny plik. +STR_6408 :Wskaż proszę „innoextract” w celu wypakowania instalatora GOG, następnie zrestartuj OpenRCT2. +STR_6409 :Wskazany plik nie jest offlinowym intalatorem GOG dla RollerCoaster Tycoon 2. Możliwe, że pobrany został GOG Galaxy downloader, albo wskazano błędny plik. STR_6410 :Przybliż/oddal STR_6411 :Pokaż przyciski do przybliżania i oddalania w pasku narzędzi STR_6412 :NumPad Enter @@ -3506,7 +3514,7 @@ STR_6437 :Widzialny STR_6438 :{MOVE_X}{2}👁 STR_6439 :Inspector kafelek: Przełącz niewidzialność STR_6440 :Przezroczysta woda -STR_6441 :Przynajmniej jedna powierzchnia ścieżki musi zostać wybrana. +STR_6441 :Przynajmniej jedna powierzchnia chodnika musi zostać wybrana. STR_6442 :Przynajmniej jedna powierzchnia kolejki musi zostać wybrana. STR_6443 :Przynajmniej jedna balustrada musi zostać wybrana. STR_6444 :Powierzchnie ścieżek @@ -3515,19 +3523,19 @@ STR_6446 :{WINDOW_COLOUR_2}Nazwa powierzchni: {BLACK}{STRINGID} STR_6447 :{WINDOW_COLOUR_2}Nazwa balustrady: {BLACK}{STRINGID} STR_6448 :Niewspierany format obiektu STR_6449 :{WINDOW_COLOUR_2}Ścieżki dźwiękowe: -STR_6450 :{BLACK}“{STRING}” -STR_6451 :{BLACK}“{STRING}” - {STRING} +STR_6450 :{BLACK}„{STRING}” +STR_6451 :{BLACK}„{STRING}” - {STRING} STR_6452 :{WINDOW_COLOUR_2}Sprzedaje: {BLACK}{STRING} STR_6453 :Skopiuj informacje o wersji STR_6454 :Nie można zmienić nazwy baneru… STR_6455 :Nie można zmienić nazwy znaku… -STR_6456 :Ogromny zrzut z ekranu +STR_6456 :Ogromny zrzut ekranu STR_6457 :Zgłoś błąd na GitHubie STR_6458 :Śledź na ekranie głównym STR_6460 :K STR_6461 :Kierunek -STR_6462 :Ekscytacja -STR_6463 :Ekscytacja: {COMMA2DP32} +STR_6462 :Emocje +STR_6463 :Emocje: {COMMA2DP32} STR_6464 :Intensywność STR_6465 :Intensywność: {COMMA2DP32} STR_6466 :Mdłości @@ -3537,7 +3545,7 @@ STR_6469 :Zmniejsz obszar patrolu STR_6470 :Zwiększ obszar patrolu STR_6471 :Przezroczysta rośliność STR_6472 :Przezroczyste pojazdy -STR_6473 :Przezroczyste podpory +STR_6473 :Przezroczyste wsporniki STR_6474 :Ukryj gości STR_6475 :Ukryj pracowników STR_6476 :Niewidzialne rośliny @@ -3552,29 +3560,225 @@ STR_6484 :Przełącznik przezroczystości roślin STR_6485 :Przełącznik przezroczystości pojazdów STR_6486 :Przełącznik przezroczystości gości STR_6487 :Przełącznik przezroczystości pracowników -STR_6488 :{RED}Goście skarżą się na dłogość kolejek w Twoim parku.{NEWLINE}Rozważ skrócenie problematycznych kolejek lub zwiększenie przepustowości przejażdżek. +STR_6488 :{RED}Goście skarżą się na długość kolejek w Twoim parku.{NEWLINE}Rozważ skrócenie problematycznych kolejek lub zwiększenie przepustowości atrakcji. STR_6489 :Błąd: Niekompatybilna wersja parku STR_6490 :Ostrzeżenie: Częściowo kompatybilna wersja parku -STR_6491 :Ten park został zapisany w późniejszej wersji OpenRCT2. Park jest v{INT32} i wymaga co najmniej v{INT32}. -STR_6492 :Ten park został zapisany w starej wersji OpenRCT2 i nie można go otworzyć za pomocą tej wersji programu OpenRCT2. Park ma jest w v{INT32}. -STR_6493 :Ten park został zapisany w późniejszej wersji OpenRCT2, niektóre dane mogą zostać utracone. Park jest w v{INT32} i wymaga co najmniej v{INT32}. +STR_6491 :Ten park został zapisany w późniejszej wersji OpenRCT2. Park jest w v{INT32} i wymaga co najmniej v{INT32}. Obecnie używasz v{INT32}. +STR_6492 :Ten park został zapisany w starej wersji OpenRCT2 i nie można go otworzyć za pomocą tej wersji programu OpenRCT2. Park jest w v{INT32}. +STR_6493 :Ten park został zapisany w późniejszej wersji OpenRCT2, niektóre dane mogą zostać utracone. Park jest w v{INT32} i wymaga co najmniej v{INT32}. Obecnie używasz v{INT32}. STR_6494 :Grupuj po typie atrakcji STR_6495 :Grupuj po typie atrakcji zamiast wyświetlić każdą osobno. STR_6496 :{WINDOW_COLOUR_2}{STRINGID} -STR_6497 :Kliknij na kafelkę, żeby zobaczyć jej elementy.{NEWLINE}Ctrl + kliknięcie na element kafelki, żeby pokazać od razu. +STR_6497 :Kliknij na kafelek, żeby zobaczyć jego elementy.{NEWLINE}Ctrl + kliknięcie na element kafelka, żeby pokazać od razu. STR_6498 :Włącz w celu zachowania kwadratowej mapy. STR_6499 :Typ pojazdu nie jest obsługiwany przez format projektu toru STR_6500 :Elementy toru nieobsługiwane przez format projektu toru STR_6501 :Losowy kolor +STR_6502 :Wprowadź wartość pomiędzy {COMMA16} a {COMMA16}: +STR_6503 :Musi być wybrany przynajmniej jeden obiekt stacji +STR_6504 :Należy wybrać co najmniej jeden element powierzchni terenu +STR_6505 :Należy wybrać co najmniej jeden element krawędzi terenu STR_6506 :Duży pół korkociąg (lewy) STR_6507 :Duży pół korkociąg (prawy) STR_6508 :Średnia półpętla (lewa) STR_6509 :Średnia półpętla (prawa) STR_6510 :Beczółka Zero G (lewa) STR_6511 :Beczółka Zero G (prawa) -STR_6512 :Duża Beczółka Zero G (lewa) -STR_6513 :Duża Beczółka Zero G (prawa) -STR_6502 :Wprowadź wartość pomiędzy {COMMA16} a {COMMA16} -STR_6503 :Musi być wybrany przynajmniej jeden obiekt stacji -STR_6504 :Należy wybrać co najmniej jeden element powierzchni terenu -STR_6505 :Należy wybrać co najmniej jeden element krawędzi terenu +STR_6512 :Duża beczółka Zero G (lewa) +STR_6513 :Duża beczółka Zero G (prawa) +STR_6514 :Nieprawidłowa wysokość! +STR_6515 :{BLACK}Rollercoaster Tycoon 1 niezaładowany - zostaną użyte grafiki zapasowe. +STR_6516 :Jeden lub więcej obiektów wymaga załadowania Rollercoaster Tycoon 1, aby mogły być poprawnie wyświetlane. Zostaną użyte grafiki zapasowe. +STR_6517 :Jeden lub więcej obiektów w tym parku wymaga załadowania Rollercoaster Tycoon 1, aby mogły być poprawnie wyświetlane. Zostaną użyte grafiki zapasowe. +STR_6518 :{BLACK}Najedź na scenariusz aby wyświetlić jego opis oraz cel. Kliknij scenariusz aby rozpocząć rozgrywkę. +STR_6519 :Dodatkowe +STR_6520 :Paczki zasobów +STR_6521 :Niski priorytet +STR_6522 :Wysoki priorytet +STR_6523 :Zmniejsz priorytet wybranej paczki zasobów. +STR_6524 :Zwiększ priorytet wybranej paczki zasobów. +STR_6525 :Przeładuj wszystkie zasoby w grze z włączonymi paczkami zasobów. +STR_6526 :(podstawowa grafika, muzyka i efekty dźwiękowe) +STR_6527 :Zawody +STR_6528 :Nieprawidłowe parametry toru! +STR_6529 :Nieprawidłowy parametr schematu kolorów! +STR_6530 :User Created Expansion Set +STR_6531 :Wehikuł czasu +STR_6532 :Kraina Marzeń Katy +STR_6533 :{WINDOW_COLOUR_2}Emocje: {BLACK}-{COMMA16}% +STR_6534 :{WINDOW_COLOUR_2}Intensywność: {BLACK}-{COMMA16}% +STR_6535 :{WINDOW_COLOUR_2}Mdłości: {BLACK}-{COMMA16}% +STR_6536 :Ten park został zapisany w późniejszej wersji OpenRCT2. Park został zapisany w v{INT32}, a obecnie używasz v{INT32}. +STR_6537 :Zezwól na zwykłe chodniki jako kolejki +STR_6538 :Pokazuje zwykłe chodniki na liście kolejek do atrakcji w menu chodników. +STR_6539 :Hamulec zamknięty +STR_6540 :{WINDOW_COLOUR_2}Podziękowania dla następujących firm za zgodę na wykorzystanie ich wizerunku: +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. +STR_6542 :Współautorzy +STR_6543 :Współautorzy… +STR_6544 :Kwota pożyczki nie może być ujemna! +STR_6545 :Użyj obliczania odsetek z RCT1 +STR_6546 :Użyj algorytmu obliczania odsetek z RollerCoaster Tycoon 1, który stosował oprocentowanie stałe wynoszące około 1,33% +STR_6547 :Wszystkie obiekty +STR_6548 :Pokaż balustrady na skrzyżowaniu +STR_6549 :Obiekty zapewniające kompatybilność wsteczną nie mogą być wybrane! +STR_6550 :Ten wpis jest dołączony dla zapewnienia wstecznej kompatybilności ze starymi lub uszkodzonymi obiektami. Nie może być wybrany, tylko odznaczony +STR_6551 :Zielony wojskowy +STR_6552 :Spadziowy +STR_6553 :Jasnobrązowy +STR_6554 :Ciemnobordowy +STR_6555 :Koralowy róż +STR_6556 :Leśny zielony +STR_6557 :Żółtozielony +STR_6558 :Zielony myśliwy +STR_6559 :Seledynowy +STR_6560 :Zielony limonkowy +STR_6561 :Sepia +STR_6562 :Brzoskwiniowy +STR_6563 :Barwinkowy +STR_6564 :Zieleń chromowa +STR_6565 :Zieleń morska +STR_6566 :Fioletowy +STR_6567 :Lawendowy +STR_6568 :Pastelowy pomarańcz +STR_6569 :Głęboka woda +STR_6570 :Pastelowy róż +STR_6571 :Umbra +STR_6572 :Beżowy +STR_6573 :Niewidzialny +STR_6574 :Pustka +STR_6575 :Zezwól na specjalne schematy kolorów +STR_6576 :Dodaje specjalne kolory do rozwijanej listy kolorów +STR_6577 :Prędkość hamowania blokowego +STR_6578 :Ustawia limit prędkości dla hamulców blokowych. W trybie sekcyjnym, sąsiednie hamulce o niższej prędkości są powiązane z hamulcem blokowym. +STR_6579 :Hamulce blokowe zostaną ustawione na domyślną prędkość po zapisaniu jako projekt trasy. +STR_6580 :Zresetuj +STR_6581 :Jesteś pewien, że chcesz zresetować wszystkie skróty klawiszowe na tej zakładce? +STR_6582 :Otwórz okno skrótów klawiszowych +STR_6583 :{WINDOW_COLOUR_2}Odwrócone wagony +STR_6584 :Wybierz, aby ustawić wagony w kierunku przeciwnym do kierunku jazdy +STR_6585 :Nie można wprowadzić zmian… +STR_6586 :OpenRCT2 +STR_6587 :Motyw tytułowy OpenRCT2 jest dziełem Allistera Brimble’a,{NEWLINE}udostępnionym na licencji Creative Commons Uznanie autorstwa Na tych samych warunkach 4.0. +STR_6588 :Dziękujemy Hermanowi Ridderingowi za umożliwienie nam nagrania 35er Voigt. +STR_6589 :Umieść przyciski okna po lewej stronie +STR_6590 :Umieszcza przyciski okna (np. zamknięcie okna) po lewej stronie paska tytułowego zamiast po prawej. +STR_6591 :Pracownik obecnie naprawia atrakcję i nie może zostać zwolniony. +STR_6592 :Pracownik obecnie dokonuje inspekcji atrakcji i nie może zostać zwolniony. +STR_6593 :Usuń ogrodzenia +STR_6594 :Inspektor kafelków: Przełącz nachylenie ściany +STR_6595 :{WINDOW_COLOUR_2}Autor: {BLACK}{STRING} +STR_6596 :{WINDOW_COLOUR_2}Autorzy: {BLACK}{STRING} +STR_6597 :Nieprawidłowy parametr +STR_6598 :Wartość poza zakresem +STR_6599 :Element duch nieznaleziony +STR_6600 :Balon nieznaleziony +STR_6601 :Pracownik nieznaleziony +STR_6602 :Atrakcja nieznaleziona +STR_6603 :Wpis obiektu atrakcji nieznaleziony +STR_6604 :Gracz nieznaleziony +STR_6605 :Element wejścia nieznaleziony +STR_6606 :Element powierzchni terenu nieznaleziony +STR_6607 :Element kafelka nieznaleziony +STR_6608 :Element toru nieznaleziony +STR_6609 :Blok toru nieznaleziony +STR_6610 :Element ścieżki nieznaleziony +STR_6611 :Element ściany nieznaleziony +STR_6612 :Element banera nieznaleziony +STR_6613 :Przeładuj obiekt +STR_6614 :Nie można zmienić opłaty za wstęp do parku +STR_6615 :Tor na tym kafelku wymaga wody +STR_6616 :Działanie niedozwolone dla tego typu pracownika +STR_6617 :Nie można zamienić elementu kafelka z samym sobą +STR_6618 :Nie można ograniczyć ani znieść ograniczeń dla obiektu… +STR_6619 :Typ obiektu nie może być ograniczony! +STR_6620 :Obiekt nieznaleziony! +STR_6621 :Ogranicz +STR_6622 :Ogranicz obiekt do edytora scenariuszy i trybu piaskownicy. +STR_6623 :Wpisz ‘help’, aby wyświetlić listę dostępnych poleceń. Wpisz ‘hide’, aby ukryć konsolę. +STR_6624 :Inspektor kafelków: Sortuj elementy +STR_6625 :Nieprawidłowy kolor +STR_6626 :Animacja odbita lustrzanie +STR_6627 :Za wysoka prędkość trasy! +STR_6628 :Można to zbudować tylko na krawędziach ścieżki! +STR_6629 :Wyśrodkuj poziomo przyciski paska narzędzi +STR_6630 :Ustawienie to wyrówna przyciski paska narzędzi poziomo na środku ekranu. Tradycyjny sposób ich wyrównania to umiejscowienie w lewym i prawym rogu. +STR_6631 :Ładowanie… +STR_6632 :Sprawdzanie plików obiektów… +STR_6633 :Sprawdzanie plików scenariuszy… +STR_6634 :Sprawdzanie plików projektów tras… +STR_6635 :Sprawdzanie paczek zasobów… +STR_6636 :Sprawdzanie sekwencji tytułowych… +STR_6637 :Ładowanie sekwencji tytułowej… +STR_6638 :Powiększ interfejs +STR_6639 :Modyfikuje interfejs, aby ułatwić obsługę dotykową +STR_6640 :Edytuj paczki zasobów… +STR_6641 :Okno ładowania/postępu +STR_6642 :{STRING} ({COMMA32} / {COMMA32}) +STR_6643 :{STRING} ({COMMA32} / {COMMA32} KiB) +STR_6644 :Ulepszenia obsługi dotykowej +STR_6645 :Powiększa niektóre elementy interfejsu, aby były łatwiejsze do kliknięcia lub dotknięcia. +STR_6646 :Autor: {STRING} +STR_6647 :Autorzy: {STRING} +STR_6648 :Ładowanie silnika wtyczek… +STR_6649 :Ładowanie scenariusza… +STR_6650 :Ładowanie zapisu gry… +STR_6651 :{STRING} ({COMMA32}%) +STR_6652 :Okno błędu +STR_6653 :Wszystkie źródła +STR_6654 :Wyświetlane źródła: {POP16}{UINT16} +STR_6655 :Tylko „{POP16}{STRINGID}” +STR_6656 :Usuń wszystkie ogrodzenia parku +STR_6657 :Nieposiadany teren +STR_6658 :Ustaw teren jako nieposiadany przez park i niedostępny do zakupu +STR_6659 :Goście ignorują ceny +STR_6660 :Goście będą ignorować ceny atrakcji i stoisk +STR_6661 :Losuj wszystkie +STR_6662 :Ustaw kolor losowo dla każdego wagonu lub pojazdu +STR_6663 :Kody związane z datą +STR_6664 :Pokaż kody związane z datą +STR_6665 :Kody związane z pogodą +STR_6666 :Pokaż kody związane z pogodą +STR_6667 :Fauna +STR_6668 :Kody związane z pracownikami +STR_6669 :Pokaż kody związane z pracownikami +STR_6670 :Zachowanie gości +STR_6671 :Pokazuj „prawdziwe” imiona pracowników +STR_6672 :Przełącz między pokazywaniem imion pracowników a numerami +STR_6673 :Przezroczyste +STR_6674 :{MONTH}, Rok {COMMA16} +STR_6675 :Imiona gości +STR_6676 :Co najmniej jeden obiekt z nazwami gości musi być wybrany +STR_6677 :Dodaj plaże wokół zbiorników wodnych +STR_6678 :Źródło mapy wysokości: +STR_6679 :Równina +STR_6680 :Szum Simplex +STR_6681 :Plik mapy wysokości +STR_6682 :Generator mapy - Generator +STR_6683 :Generator mapy - Teren +STR_6684 :Generator mapy - Woda +STR_6685 :Generator mapy - Lasy +STR_6686 :Stosunek drzew do terenu: +STR_6687 :Min. wysokość drzew: +STR_6688 :Maks. wysokość drzew: +STR_6689 :{UINT16}% +STR_6690 :Min. wysokość terenu +STR_6691 :Wprowadź minimalną wysokość terenu pomiędzy {COMMA16} a {COMMA16}: +STR_6692 :Maks. wysokość terenu +STR_6693 :Wprowadź maksymalną wysokość terenu pomiędzy {COMMA16} a {COMMA16}: +STR_6694 :Min. wysokość drzew +STR_6695 :Wprowadź minimalną wysokość drzew pomiędzy {COMMA16} a {COMMA16}: +STR_6696 :Maks. wysokość drzew +STR_6697 :Wprowadź maksymalną wysokość drzew pomiędzy {COMMA16} a {COMMA16}: +STR_6698 :Stosunek drzew do powierzchni terenu +STR_6699 :Wprowadź stosunek drzew do powierzchni terenu pomiędzy {COMMA16} a {COMMA16}: +STR_6700 :Bazowa częstotliwość szumu Simplex +STR_6701 :Wprowadź bazową częstotliwość pomiędzy {COMMA2DP32} a {COMMA2DP32}: +STR_6702 :Oktawy szumu Simplex +STR_6703 :Wprowadź oktawy pomiędzy {COMMA16} a {COMMA16}: +STR_6704 :{COMMA2DP32} +STR_6705 :Wczytaj… +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}: diff --git a/data/language/pt-BR.txt b/data/language/pt-BR.txt index 7d8bfd2a87..6da43c9e85 100644 --- a/data/language/pt-BR.txt +++ b/data/language/pt-BR.txt @@ -99,6 +99,7 @@ STR_0094 :Montanha-Russa de Trilho Único STR_0095 :Montanha-Russa Alpina STR_0096 :Montanha-Russa de Madeira Clássica STR_0097 :Montanha-Russa em Pé Clássica +STR_0098 :Montanha-Russa acelerada por LSM STR_0512 :Uma montanha russa compacta com subida de elevação em espiral e quedas suaves e retorcidas STR_0513 :Uma montanha russa de looping onde passageiros andam em pé STR_0514 :Trens suspensos abaixo do trilho da montanha-russa balançam para fora nas curvas @@ -183,6 +184,7 @@ STR_0604 :Passageiros andam numa fila única em uma pista estreita de monotri STR_0605 :Passageiros descem de tobogã por um trilho de aço sinuoso, freando para controlar suas velocidades STR_0606 :Uma montanha-russa de madeira de estilo mais antigo com um trajeto rápido e duro, com muito ‘tempo no ar’, alguma força G lateral e projetada para um sentimento de ‘perda de controle’ STR_0607 :Uma montanha-russa de aço intensa e de estilo antigo onde os passageiros andam em pé +STR_0608 :Os trens da montanha-russa são acelerados por motores síncronos lineares, acelerando por curvas e giros estreitos STR_0767 :Visitante {INT32} STR_0768 :Faxineiro {INT32} STR_0769 :Mecânico {INT32} @@ -3609,7 +3611,7 @@ STR_6537 :Permitir o uso de caminhos normais como filas de espera STR_6538 :Mostra caminhos normais na lista da janela de Caminhos. STR_6539 :Freio Travado STR_6540 :{WINDOW_COLOUR_2}Agradecimento especial às seguintes empresas por permitirem semelhança com elas: -STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG +STR_6541 :{WINDOW_COLOUR_2}Rocky Mountain Construction Group, Josef Wiegand GmbH & Co. KG, Intamin Amusement Rides Int. Corp. Est. STR_6542 :Contribuidores STR_6543 :Contribuidores… STR_6544 :Empréstimo não pode ser negativo! diff --git a/data/scenario_patches/0b8cc95.parkpatch b/data/scenario_patches/0b8cc95.parkpatch new file mode 100644 index 0000000000..bfbf52c33e --- /dev/null +++ b/data/scenario_patches/0b8cc95.parkpatch @@ -0,0 +1,31 @@ +{ + "scenario_name": "Rollercoaster Heaven", + "sha256": "0b8cc952c399e1515546a4ababe5ba2f7aace83915a7e51c56ee901568c9ef56", + "elements_to_delete": [ + { + "element_index": 0, + "coordinates": [ + [ 23, 79 ], [ 24, 79 ] + ] + }, + { + "element_index": 1, + "coordinates": [ + [ 87, 13 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.crazy_paving", + "coordinates": [ [ 24, 79, 14 ], [ 87, 13, 18 ] ] + }, + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.crazy_paving", + "coordinates": [ [ 23, 79, 12 ] ], + "slope_direction": 2 + } + ] +} diff --git a/data/scenario_patches/2696a05.parkpatch b/data/scenario_patches/2696a05.parkpatch index 391ddbd0f9..54c597985b 100644 --- a/data/scenario_patches/2696a05.parkpatch +++ b/data/scenario_patches/2696a05.parkpatch @@ -18,5 +18,20 @@ [ 140, 74 ], [ 141, 74 ], [ 142, 74 ], [ 143, 74 ], [ 144, 74 ], [ 145, 74 ], [ 146, 74 ], [ 147, 74 ] ] } - } + }, + "elements_to_delete": [ + { + "element_index": 1, + "coordinates": [ + [ 86, 75 ], [ 86, 77 ], [ 86, 78 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.bamboo_brown", + "surface": "rct2.footpath_surface.dirt", + "coordinates": [ [ 86, 74, 12 ], [ 86, 75, 12 ], [ 86, 76, 12 ], [ 86, 77, 12 ], [ 86, 78, 12 ] ] + } + ] } diff --git a/data/scenario_patches/2980c28.parkpatch b/data/scenario_patches/2980c28.parkpatch new file mode 100644 index 0000000000..e16ab06d8f --- /dev/null +++ b/data/scenario_patches/2980c28.parkpatch @@ -0,0 +1,21 @@ +{ + "scenario_name": "Mines of Africa", + "sha256": "2980c287d81e4e96a46db30d1a80e6bfa0caace6a14488dddc6f20ac71676cff", + "elements_to_delete": [ + { + "element_index": 1, + "coordinates": [ + [ 43, 46 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.queue_yellow", + "coordinates": [ [ 43, 46, 6 ] ], + "slope_direction": 3, + "queue": true + } + ] +} diff --git a/data/scenario_patches/4a762ae.parkpatch b/data/scenario_patches/4a762ae.parkpatch new file mode 100644 index 0000000000..01986fc1c2 --- /dev/null +++ b/data/scenario_patches/4a762ae.parkpatch @@ -0,0 +1,40 @@ +{ + "scenario_name": "Iceberg Islands", + "sha256": "4a762ae89bf279dbcaead9e457c21014a9e39eb4a46cf1cbf63304450f9ed050", + "elements_to_delete": [ + { + "element_index": 2, + "coordinates": [ + [ 49, 43 ], [ 50, 43 ], [ 51, 43 ], [ 44, 55 ] + ] + }, + { + "element_index": 1, + "coordinates": [ + [ 44, 54 ], [ 44, 53 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct1.footpath_surface.queue_blue", + "coordinates": [ [ 51, 43, 24 ], [ 44, 55, 20 ] ], + "queue": true + }, + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct1.footpath_surface.queue_blue", + "coordinates": [ [ 50, 43, 24 ], [ 49, 43, 26 ] ], + "slope_direction": 0, + "queue": true + }, + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct1.footpath_surface.queue_blue", + "coordinates": [ [ 44, 54, 18 ], [ 44, 53, 16 ] ], + "slope_direction": 1, + "queue": true + } + ] +} diff --git a/data/scenario_patches/5c95a4e.parkpatch b/data/scenario_patches/5c95a4e.parkpatch index 6c30ef46bf..67b6961874 100644 --- a/data/scenario_patches/5c95a4e.parkpatch +++ b/data/scenario_patches/5c95a4e.parkpatch @@ -7,5 +7,18 @@ [ 11, 31 ], [ 68, 112 ], [ 72, 118 ] ] } - } + }, + "paths": [ + { + "railings": "rct2.footpath_railings.wood", + "surface": "rct1.footpath_surface.crazy_paving", + "coordinates": [ [ 83, 81, 22 ] ] + }, + { + "railings": "rct2.footpath_railings.wood", + "surface": "rct1.footpath_surface.crazy_paving", + "coordinates": [ [ 85, 77, 22 ] ], + "slope_direction": 2 + } + ] } diff --git a/data/scenario_patches/7f38f1b.parkpatch b/data/scenario_patches/7f38f1b.parkpatch index a282000c56..5ab76eb98e 100644 --- a/data/scenario_patches/7f38f1b.parkpatch +++ b/data/scenario_patches/7f38f1b.parkpatch @@ -4,11 +4,11 @@ "land_ownership": { "available": { "coordinates": [ - [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], - [ 75, 167 ], + [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], + [ 75, 167 ], [ 61, 92 ], [ 61, 93 ], [ 61, 94 ], [ 61, 95 ], [ 62, 90 ], [ 62, 91 ], [ 62, 92 ], [ 62, 93 ], [ 62, 94 ], [ 92, 57 ], [ 93, 57 ], - [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], + [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], [ 168, 20 ], [ 169, 20 ], [ 46, 51 ], [ 58, 159 ], [ 71, 201 ], [ 126, 15 ], [ 190, 6 ] ] @@ -21,5 +21,12 @@ [ 103, 76 ], [ 104, 76 ] ] } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.bamboo_brown", + "surface": "rct2.footpath_surface.dirt", + "coordinates": [ [ 144, 100, 34 ] ] + } ] } diff --git a/data/scenario_patches/7ffdb44.parkpatch b/data/scenario_patches/7ffdb44.parkpatch index db6206427e..6fd885f4b6 100644 --- a/data/scenario_patches/7ffdb44.parkpatch +++ b/data/scenario_patches/7ffdb44.parkpatch @@ -4,11 +4,11 @@ "land_ownership": { "available": { "coordinates": [ - [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], - [ 75, 167 ], + [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], + [ 75, 167 ], [ 61, 92 ], [ 61, 93 ], [ 61, 94 ], [ 61, 95 ], [ 62, 90 ], [ 62, 91 ], [ 62, 92 ], [ 62, 93 ], [ 62, 94 ], [ 92, 57 ], [ 93, 57 ], - [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], + [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], [ 168, 20 ], [ 169, 20 ], [ 46, 51 ], [ 58, 159 ], [ 71, 201 ], [ 126, 15 ], [ 190, 6 ] ] @@ -21,5 +21,12 @@ [ 103, 76 ], [ 104, 76 ] ] } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.bamboo_brown", + "surface": "rct2.footpath_surface.dirt", + "coordinates": [ [ 144, 100, 34 ] ] + } ] } diff --git a/data/scenario_patches/b080197.parkpatch b/data/scenario_patches/b080197.parkpatch new file mode 100644 index 0000000000..642e69bf10 --- /dev/null +++ b/data/scenario_patches/b080197.parkpatch @@ -0,0 +1,21 @@ +{ + "scenario_name": "Mines of Africa (.sea)", + "sha256": "b080197d430a6ded46945035a95c8f2d9e3064637e9119e68270554eda48e747", + "elements_to_delete": [ + { + "element_index": 1, + "coordinates": [ + [ 43, 46 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.queue_yellow", + "coordinates": [ [ 43, 46, 6 ] ], + "slope_direction": 3, + "queue": true + } + ] +} diff --git a/data/scenario_patches/b20bd80.parkpatch b/data/scenario_patches/b20bd80.parkpatch new file mode 100644 index 0000000000..973c8e350e --- /dev/null +++ b/data/scenario_patches/b20bd80.parkpatch @@ -0,0 +1,40 @@ +{ + "scenario_name": "Iceberg Islands (.sea)", + "sha256": "b20bd803c0a99c8748b48688501ba6ef8a5ce5d746540a486617e0564aa407d5", + "elements_to_delete": [ + { + "element_index": 2, + "coordinates": [ + [ 49, 43 ], [ 50, 43 ], [ 51, 43 ], [ 44, 55 ] + ] + }, + { + "element_index": 1, + "coordinates": [ + [ 44, 54 ], [ 44, 53 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.queue_yellow", + "coordinates": [ [ 51, 43, 24 ], [ 44, 55, 20 ] ], + "queue": true + }, + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.queue_yellow", + "coordinates": [ [ 50, 43, 24 ], [ 49, 43, 26 ] ], + "slope_direction": 0, + "queue": true + }, + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.queue_yellow", + "coordinates": [ [ 44, 54, 18 ], [ 44, 53, 16 ] ], + "slope_direction": 1, + "queue": true + } + ] +} diff --git a/data/scenario_patches/c1d4056.parkpatch b/data/scenario_patches/c1d4056.parkpatch index 7f291735a1..96934e447d 100644 --- a/data/scenario_patches/c1d4056.parkpatch +++ b/data/scenario_patches/c1d4056.parkpatch @@ -4,11 +4,11 @@ "land_ownership": { "available": { "coordinates": [ - [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], - [ 75, 167 ], + [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], + [ 75, 167 ], [ 61, 92 ], [ 61, 93 ], [ 61, 94 ], [ 61, 95 ], [ 62, 90 ], [ 62, 91 ], [ 62, 92 ], [ 62, 93 ], [ 62, 94 ], [ 92, 57 ], [ 93, 57 ], - [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], + [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], [ 168, 20 ], [ 169, 20 ], [ 46, 51 ], [ 58, 159 ], [ 71, 201 ], [ 126, 15 ], [ 190, 6 ] ] @@ -21,5 +21,12 @@ [ 103, 76 ], [ 104, 76 ] ] } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.bamboo_brown", + "surface": "rct2.footpath_surface.dirt", + "coordinates": [ [ 144, 100, 34 ] ] + } ] } diff --git a/data/scenario_patches/c82272a.parkpatch b/data/scenario_patches/c82272a.parkpatch index a75e9e8fef..e220c663c5 100644 --- a/data/scenario_patches/c82272a.parkpatch +++ b/data/scenario_patches/c82272a.parkpatch @@ -4,11 +4,11 @@ "land_ownership": { "available": { "coordinates": [ - [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], - [ 75, 167 ], + [ 104, 190 ], [ 105, 190 ], [ 108, 197 ], + [ 75, 167 ], [ 61, 92 ], [ 61, 93 ], [ 61, 94 ], [ 61, 95 ], [ 62, 90 ], [ 62, 91 ], [ 62, 92 ], [ 62, 93 ], [ 62, 94 ], [ 92, 57 ], [ 93, 57 ], - [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], + [ 89, 40 ], [ 89, 41 ], [ 89, 42 ], [ 88, 42 ], [ 168, 20 ], [ 169, 20 ], [ 46, 51 ], [ 58, 159 ], [ 71, 201 ], [ 126, 15 ], [ 190, 6 ] ] @@ -21,5 +21,12 @@ [ 103, 76 ], [ 104, 76 ] ] } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.bamboo_brown", + "surface": "rct2.footpath_surface.dirt", + "coordinates": [ [ 144, 100, 34 ] ] + } ] } diff --git a/data/scenario_patches/eabcb3d.parkpatch b/data/scenario_patches/eabcb3d.parkpatch new file mode 100644 index 0000000000..e266f8fc1b --- /dev/null +++ b/data/scenario_patches/eabcb3d.parkpatch @@ -0,0 +1,31 @@ +{ + "scenario_name": "Rollercoaster Heaven (.sea)", + "sha256": "eabcb3d924e8e3438bfd90f6758a723c89df4136a817533d34985598d58ba38f", + "elements_to_delete": [ + { + "element_index": 0, + "coordinates": [ + [ 23, 79 ], [ 24, 79 ] + ] + }, + { + "element_index": 1, + "coordinates": [ + [ 87, 13 ] + ] + } + ], + "paths": [ + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.crazy_paving", + "coordinates": [ [ 24, 79, 14 ], [ 87, 13, 18 ] ] + }, + { + "railings": "rct2.footpath_railings.concrete", + "surface": "rct2.footpath_surface.crazy_paving", + "coordinates": [ [ 23, 79, 12 ] ], + "slope_direction": 2 + } + ] +} diff --git a/data/scenario_patches/scenario_to_hash b/data/scenario_patches/scenario_to_hash index 6d352dc211..3ffa3ec789 100644 --- a/data/scenario_patches/scenario_to_hash +++ b/data/scenario_patches/scenario_to_hash @@ -39,6 +39,8 @@ 'fcc15f9c9b42bdd4aa8761c3a6df17c1293aa616780bc4aadd348d191e275112'], 'Lost City Founder': ['13e81f2', '13e81f23ab1a7051b5465e4a7bb214b4188f2264d499f8f7e106372c3a984331'], + 'Mines of Africa': ['2980c28', + '2980c287d81e4e96a46db30d1a80e6bfa0caace6a14488dddc6f20ac71676cff'], 'Mirage Madness': ['2696a05', '2696a059c2c1b23c60cbfcc293fd29cfec45d7e3da7f3b38bc2b52aff834fd34'], 'Mythological Madness': ['ef0c020', @@ -51,6 +53,8 @@ '33bac63d13aa7513ac8536d865cbc6fa4a2189c79e3943869e6380072e71bce7'], 'Rock ‘n’ Roll Revival': ['d48bbfe', 'd48bbfe4833347dfbf5befe63eb3795df3bce36cdc9152048ee7851e36d45ad9'], + 'Rollercoaster Heaven': ['0b8cc95', + '0b8cc952c399e1515546a4ababe5ba2f7aace83915a7e51c56ee901568c9ef56'], 'Schneider Shores': ['e57112f', 'e57112f58a7710d3e80242e867fb65d720e0cd3b67bebfd6b7df8b404fc7ea2b'], 'Sherwood Forest': ['825134a', @@ -87,6 +91,8 @@ '102a1c52853e77b6efd448a44572a862fa440615b4ea9ae5d7fb31c48c96aac9'], 'Hydro Hills': ['bfbd61f', 'bfbd61f6d22cdc5f2e017935f4e9e5969dece159218a08c695bfd727382cc717'], + 'Iceberg Islands': ['4a762ae', + '4a762ae89bf279dbcaead9e457c21014a9e39eb4a46cf1cbf63304450f9ed050'], 'katie\'s dreamland': ['73d0921', '73d0921f1d49388ffb4deb300c6ebb3920564410c2239580a7d1145fa54c2d4a'], 'Leafy Lake': ['83bd798', @@ -130,7 +136,9 @@ 'Haunted Harbour': ['b2cebe1', 'b2cebe149b2330e071a028d079f6632af144fb44e076a5eca89780eb4007e136'], 'hydro hills': ['ce24961', - 'ce249614e735c560c5019318bc6fa8603ba6630576f7fb038def0bdac3e143ef'] + 'ce249614e735c560c5019318bc6fa8603ba6630576f7fb038def0bdac3e143ef'], + 'Iceberg Islands': ['b20bd80', + 'b20bd803c0a99c8748b48688501ba6ef8a5ce5d746540a486617e0564aa407d5'], 'katie\'s dreamland': ['b8b572d', 'b8b572d394b145535cdb20f66b0bee9a497683a5885e4d78af6773c5bc0323ff'], 'mel\'s world': ['bfaf504', @@ -195,6 +203,8 @@ 'adffe2ff1e06ebeb821bbf01263125dc40311a8350722c62908be8d1c8852259'], 'Lost City Founder': ['70ce3e1', '70ce3e11f1dd59929a6d82d0f6f88897c95b94d1f9d4efd6ef3a0c6c449f966f'], + 'Mines of Africa': ['b080197', + 'b080197d430a6ded46945035a95c8f2d9e3064637e9119e68270554eda48e747'], 'Mirage Madness': ['82aeaf6', '82aeaf6bd628bf26dabd1ca87455b667f3081598bcf4d4c7751e2bdfbd266ac2'], 'Mythological Madness': ['6633d17', @@ -207,6 +217,8 @@ 'b43b07e47f2e6cb762a86760ac0242595617aa59bfd9811cec7e2dcc121ae367'], 'Rock ‘n’ Roll Revival': ['f71c978', 'f71c9788ab40ac591d5c96397fad8b12d9d3ac7830eac53f6ee5dc024c8c2bcf'], + 'Rollercoaster Heaven': ['eabcb3d', + 'eabcb3d924e8e3438bfd90f6758a723c89df4136a817533d34985598d58ba38f'], 'Schneider Shores': ['0d53bdc', '0d53bdc076d75d86b31b6b3e6948e3d45671cf5aeff6b2b3c07a7618923223f5'], 'Sherwood Forest': ['a04b536', @@ -220,4 +232,4 @@ 'Six Flags over Texas': ['6226822', '62268223a1539c92b7494973263457c9e9bf386c1e68eef21d377854f0ac0e38'], 'Wacky Waikiki': ['72cf3d2', - '72cf3d220740fd64f7681d3533320598cf6d3b71dff484bc43045e8d9d7a1a4b'], \ No newline at end of file + '72cf3d220740fd64f7681d3533320598cf6d3b71dff484bc43045e8d9d7a1a4b'], diff --git a/debian/control b/debian/control index cda461f2c9..92701ff896 100644 --- a/debian/control +++ b/debian/control @@ -4,7 +4,7 @@ Section: misc Priority: optional Standards-Version: 3.9.2 Multi-Arch: same -Build-Depends: debhelper (>= 9), cmake (>= 3.8), libsdl2-dev, g++ (>= 4:10), pkg-config, nlohmann-json3-dev (>= 3.6.0), libspeex-dev, libspeexdsp-dev, libcurl4-openssl-dev, libcrypto++-dev, libfontconfig1-dev, libfreetype6-dev, libpng-dev, libssl-dev, libzip-dev (>= 1.0.0), libicu-dev (>= 59.0), libflac-dev, libvorbis-dev +Build-Depends: debhelper (>= 9), cmake (>= 3.8), libsdl2-dev, g++ (>= 4:10), pkg-config, nlohmann-json3-dev (>= 3.9.0), libspeex-dev, libspeexdsp-dev, libcurl4-openssl-dev, libcrypto++-dev, libfontconfig1-dev, libfreetype6-dev, libpng-dev, libssl-dev, libzip-dev (>= 1.0.0), libicu-dev (>= 59.0), libflac-dev, libvorbis-dev Package: openrct2 Architecture: any diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 11e195689c..24cd452ac3 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,6 +1,25 @@ +0.4.17 (in development) +------------------------------------------------------------------------ +- Feature: [#23166] Add Galician translation. +- Feature: [#23227] Add Classic Wooden Twister roller coaster, for better compatibility with RCT1. +- Improved: [#23051] Add large sloped turns and new inversions to the Twister, Vertical Drop, Hyper and Flying Roller Coasters. +- Improved: [#23123] Improve sorting of roller coasters in build new ride menu. +- Improved: [#23211] Add boosters to classic wooden roller coaster (cheats only). +- Improved: [#23229] Add debug option for making the sprite sorting algorithm stable. +- Improved: [#23233] Add diagonal booster to LSM Launched Coaster. +- Improved: [#23277] Add small, medium and large turns, diagonal track and S-bends to the Boat Hire. +- Fix: [#20070, #22972] Missing and mismatched flat and sloped footpaths on several scenarios. +- Fix: [#22726] ‘Force park rating’ cheat is not saved with the park. +- Fix: [#23064] Stand-Up Roller Coaster unbanked to banked track pieces are misaligned. +- Fix: [#23066] Stand-Up Roller Coaster has many supports that don't join up to the track. +- Fix: [#23206] Multiplayer desyncs when FPS is uncapped. +- Fix: [#23238] Updating a guest’s favourite ride works differently from vanilla RCT2. +- Fix: [objects#355] Fix colour preset settings of the Stand-Up Roller Coaster trains. +- Fix: [objects#355] Fix colour preset settings of many vehicles from Wacky Worlds and Time Twister. + 0.4.16 (2024-11-03) ------------------------------------------------------------------------ -- Feature: [#20810] New ride type: LSM Launched Roller Coaster. +- Feature: [#22797] New ride type: LSM Launched Roller Coaster. - Improved: [#22937] Add banked sloped turns and many other pieces to the Corkscrew, Hypercoaster and Lay-down Roller Coaster. - Improved: [#22967] Add medium and large half loops to the Wooden and Classic Wooden Roller Coasters. - Improved: [#23010] Make AppImage compatible with Ubuntu 22.04 and Debian Bookworm again. @@ -17,7 +36,7 @@ - Fix: [#23015] Crash when loading a save game when the construction window is still open. - Fix: [#23018] Crash when loading a new game when the construction window is still open. - Fix: [#23023] Large scenery clearance height interpreted as negative when greater than 127. -- Fix: [#23044] "remove_unused_objects" command causes blank peep names. +- Fix: [#23044] “remove_unused_objects” command causes blank peep names. - Fix: [#23048] Map generator allows map sizes out of range through text input. - Fix: [#23058] [Plugin] Changing window colours doesn’t trigger the window to be fully redrawn. - Fix: [#23085] LIM Launched Roller Coaster medium half loops clip into each other when built back-to-back. diff --git a/distribution/linux/openrct2.appdata.xml b/distribution/linux/openrct2.appdata.xml index f7a9a962de..93218e981b 100644 --- a/distribution/linux/openrct2.appdata.xml +++ b/distribution/linux/openrct2.appdata.xml @@ -5,7 +5,19 @@ GPL-3.0 OpenRCT2 Amusement park simulation + Simulador de parcs d’atraccions + Freizeitparksimulation + Simulador de parques de atraccións + 놀이공원 시뮬레이션 + Symulator parku rozrywki + Simulador de parque de diversões The OpenRCT2 Team + Equip de l’OpenRCT2 + Das OpenRCT2-Team + O equipo OpenRCT2 + OpenRCT2 팀 + Zespół OpenRCT2 + Equipe do OpenRCT2 openrct2.desktop

@@ -17,28 +29,190 @@ objective in a set time limit whilst sandbox allows the player to build a more flexible park with optionally no restrictions or finance.

+

+ L’OpenRCT2 és una reimplementació de codi obert del RollerCoaster Tycoon 2 (RCT2). + El joc consisteix en construir i mantenir un parc d’atraccions i gestionar-ne també + les paradetes i instal·lacions. El jugador ha d’obtenir beneficis i mantenir una bona + reputació del seu parc i alhora fer que els seus visitants siguin feliços. L’OpenRCT2 + permet jugar en escenaris o en mode lliure. Als escenaris, el jugador ha de completar + alguns objectius en un determinat període de temps, mentre que al mode lliure pot + construir amb més flexibilitat, fins i tot sense restriccions. +

+

+ OpenRCT2 ist eine Open-Source-Reimplementierung von RollerCoaster Tycoon 2 (RCT2). + Im Spiel geht es um den Bau und die Verwaltung eines Freizeitparks mit Attraktionen, + Läden und Einrichtungen. Der Spieler muss versuchen, Profit zu erwirtschaften und + eine gute Parkreputation aufrecht zu erhalten, während die Gäste bei Laune gehalten + werden. In OpenRCT2 kann mal sowohl Szenarien als auch in einen Sandboxmodus + spielen. In Szenarien muss der Spieler ein bestimmtes Ziel innerhalb eines Zeitlimits + erfüllen. In der Sandbox kann der Spieler einen flexibleren Park bauen – falls + gewünscht ohne Einschränkungen. +

+

+ OpenRCT2 é unha reimplementación de código aberto de RollerCoaster Tycoon 2 (RCT2). + O xogo centrase na construción e mantemento dun parque de atraccións que conten + atraccións, tendas e instalacións. O xogador debe tentar obter beneficios e manter + unha boa reputación do parque mentres mantén ledos aos visitantes. OpenRCT2 permite + xogar en escenario ou libre. Escenarios requiren que o xogador complete un determinado + obxectivo nun límite de tempo establecido mentres co libre permite ao xogador crear un + parque máis flexible, sen restriccións ou con opcións de finanzas sen límites. +

+

+ OpenRCT는 RollerCoaster Tycoon 2 (RCT2)의 오픈 소스 재구현판입니다. + 놀이기구, 상점, 매점 등을 건설하고 유지하는 것이 게임 플레이의 중심이 됩니다. + 플레이어는 수익을 내고 손님을 만족시키는 동시에 좋은 공원 평판을 유지해야 합니다. + OpenRCT2에서는 시나리오나 모래상자 플레이를 모두 플레이할 수 있습니다. + 시나리오에서는 플레이어가 정해진 시간 이내에 특정 목표를 완수해야 하는 반면, + 모래상자에서는 플레이어가 자금이타 금지 행위에 대한 제한 없이 더 유연한 공원을 + 만들 수 있습니다. +

+

+ OpenRCT2 to open-source'owa reimplementacja gry RollerCoaster Tycoon 2 (RCT2). + Rozgrywka polega na budowaniu i zarządzaniu parkiem rozrywki zawierającym + przeróżne atrakcje, sklepy i udogodnienia. Gracz musi starać się osiągnąć zysk i utrzymać + dobrą reputację parku, jednocześnie dbając o zadowolenie gości. OpenRCT2 umożliwia + rozgrywkę w scenariuszach oraz w trybie sandbox. Scenariusze wymagają od gracza ukończenia + określonego celu w wyznaczonym czasie, podczas gdy tryb sandbox pozwala na + swobodne budowanie parku, z możliwością wyłączenia ograniczeń i finansów. +

+

+ OpenRCT2 é uma reimplementação de código aberto do RollerCoaster Tycoon 2 (RCT2). + A dinâmica de jogo gira em torno de construir e manter um parque de diversões contendo + atrações, lojas e instalações. O jogador deve tentar gerar lucro e manter uma boa + reputação para o parque, enquanto tenta fazer com que os visitantes continuem felizes. + O OpenRCT2 permite tanto jogos em cenários quanto em “caixa de areia”. Os cenários + demandam que o jogador atinja um certo objetivo em um determinado prazo, enquanto a + “caixa de areia” deixa o jogador construir um parque mais flexível, opcionalmente sem + restrições ou finanças. +

+

OpenRCT2 features many changes compared to the original RollerCoaster Tycoon 2 game. A few of them are listed here.

+

+ L’OpenRCT2 té molts canvis respecte al joc RollerCoaster Tycoon 2 original, com ara: +

+

+ OpenRCT2 hat viele Änderungen im Verleich mit dem Originalspiel RollerCoaster Tycoon 2. Hier sind einige von ihnen aufgelistet. +

+

+ OpenRCT2 presenta moitos cambios en comparación co xogo orixinal de RollerCoaster Tycoon 2. Algúns deles son: +

+

+ OpenRCT2는 오리지널 RollerCoaster Tycoon 2 게임에 비해 많은 기능적 변화가 있습니다. 여기에 일부 기능이 나열되어 있습니다. +

+

+ OpenRCT2 zawiera wiele zmian w porównaniu do oryginalnej gry RollerCoaster Tycoon 2. Oto kilka z nich: +

+

+ O OpenRCT2 conta com muitas mudanças quando comparado ao jogo RollerCoaster Tycoon 2 original. Aqui são listadas algumas delas. +

+ +

Original RollerCoaster Tycoon 2 or RollerCoaster Tycoon Classic game files are required in order to play OpenRCT2.

+

+ Per a jugar a l’OpenRCT2, fan falta els fitxers originals del RollerCoaster Tycoon 2 o del RollerCoaster Tycoon clàssic. +

+

+ Die Originaldateien von RollerCoaster Tycoon 2 oder RollerCoaster Tycoon Classic werden benötigt, um OpenRCT2 zu spielen. +

+

+ Os ficheiros do xogo RollerCoaster Tycoon 2 ou RollerCoaster Tycoon Classic son necesarios para xogar a OpenRCT2. +

+

+ OpenRCT2를 플레이하기 위해서는 오리지널 RollerCoaster Tycoon 2 또는 RollerCoaster Tycoon Classic 게임 파일이 필요합니다. +

+

+ Do działania OpenRCT2 wymagane są pliki z RollerCoaster Tycoon 2 lub RollerCoaster Tycoon Classic. +

+

+ Arquivos dos jogos originais RollerCoaster Tycoon 2 ou RollerCoaster Tycoon Classic são necessários para jogar OpenRCT2. +

https://camo.githubusercontent.com/f513bc551e2c9e04e292724113ea4789726d23921d286f21dad39a6e955b5a56/68747470733a2f2f692e696d6775722e636f6d2f6537434b3553632e706e67 Amusement park featuring an inverted roller coaster, a river rapids ride and custom scenery + Freizeitpark mit einer umgekehrten Achterbahn, einer Stromschnellenattraktion und einer eigens errichteten Szenerie + Parque de atraccións con montañas rusas invertidas, un percorrido de rápidos e escenarios personalizados. + 인버티드 롤러코스터를 구현한 놀이공원과 리버 래피드 기구 및 커스텀 풍경 오브젝트 + Park rozrywki z odwróconą kolejką górską, spływem rwącą rzeką i niestandardową scenerią + Parque de diversões que conta com uma montanha-russa invertida, corredeira de rio e cenários customizados https://openrct2.io/ diff --git a/distribution/readme.txt b/distribution/readme.txt index e2865eb25b..c423d4be13 100644 --- a/distribution/readme.txt +++ b/distribution/readme.txt @@ -1,4 +1,4 @@ -Last updated: 2024-08-04 +Last updated: 2024-11-19 ------------------------------------------------------------------------ @@ -13,7 +13,8 @@ Table of contents 6.0) Translation 7.0) Troubleshooting 8.0) Licensing -9.0) Credits +9.0) Privacy policy +10.0) Credits 1.0) About ---- ----- @@ -153,9 +154,14 @@ SDL2 | zlib licence. zlib | zlib licence. Google Test | BSD 3 clause licence. Google Benchmark | Apache 2.0 licence. +sfl | zlib licence. Licences for sub-libraries used by the above may vary. For more information, visit the libraries' respective official websites. -9.0) Credits +9.0) Privacy policy + +For privacy policy, see the file 'PRIVACY.md'. + +10.0) Credits ---- ------- For the full list of contributors to OpenRCT2, see the file 'contributors.md'. diff --git a/distribution/windows/install.nsi b/distribution/windows/install.nsi index 7f79863ffa..a9a4bac6c0 100644 --- a/distribution/windows/install.nsi +++ b/distribution/windows/install.nsi @@ -35,7 +35,7 @@ SetCompressor LZMA ; Version Info VIProductVersion "${APPVERSIONINTERNAL}" -VIAddVersionKey "ProductName" "OpenRCT2 ${APPBITS}-bit Installer for ${SUPPORTED_OS}" +VIAddVersionKey "ProductName" "OpenRCT2 ${PLATFORM} Installer for ${SUPPORTED_OS}" VIAddVersionKey "Comments" "Installs ${APPNAMEANDVERSION}" VIAddVersionKey "CompanyName" "OpenRCT2 Developers" VIAddVersionKey "FileDescription" "Installs ${APPNAMEANDVERSION}" @@ -44,7 +44,7 @@ VIAddVersionKey "InternalName" "InstOpenRCT2-${APPARCH}" VIAddVersionKey "FileVersion" "${APPVERSION}-${APPARCH}" VIAddVersionKey "LegalCopyright" " " ; Main Install settings -Name "${APPNAMEANDVERSION} ${APPBITS}-bit for ${SUPPORTED_OS}" +Name "${APPNAMEANDVERSION} ${PLATFORM} for ${SUPPORTED_OS}" ; NOTE: Keep trailing backslash! InstallDirRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenRCT2" "Install Folder" @@ -170,6 +170,9 @@ Section "!OpenRCT2" Section1 File ..\..\contributors.md Push "$INSTDIR\contributors.md" Call unix2dos + File ..\..\PRIVACY.md + Push "$INSTDIR\PRIVACY.md" + Call unix2dos File ..\scripting.md Push "$INSTDIR\scripting.md" Call unix2dos @@ -204,6 +207,7 @@ Section "!OpenRCT2" Section1 CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" "$INSTDIR\Readme.txt" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk" "$INSTDIR\Changelog.txt" CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Contributors.lnk" "$INSTDIR\contributors.md" + CreateShortCut "$SMPROGRAMS\$SHORTCUTS\Privacy Policy.lnk" "$INSTDIR\PRIVACY.md" !insertmacro MUI_STARTMENU_WRITE_END SectionEnd @@ -240,12 +244,14 @@ Section "Uninstall" Delete "$SMPROGRAMS\$SHORTCUTS\Readme.lnk" Delete "$SMPROGRAMS\$SHORTCUTS\Changelog.lnk" Delete "$SMPROGRAMS\$SHORTCUTS\Contributors.lnk" + Delete "$SMPROGRAMS\$SHORTCUTS\Privacy Policy.lnk" ; Clean up OpenRCT2 dir Delete "$INSTDIR\changelog.txt" Delete "$INSTDIR\licence.txt" Delete "$INSTDIR\readme.txt" Delete "$INSTDIR\contributors.md" + Delete "$INSTDIR\PRIVACY.md" Delete "$INSTDIR\scripting.md" Delete "$INSTDIR\openrct2.d.ts" Delete "$INSTDIR\${OPENRCT2_EXE}" diff --git a/openrct2.proj b/openrct2.proj index 1d96adb75c..a25d37c4f0 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.10/objects.zip - e4953075d8dbe13ef48e8c4e87621cf3503a9d23 + https://github.com/OpenRCT2/objects/releases/download/v1.4.11/objects.zip + da04330679de2eff53a94a6505802512bfec6403 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.83/replays.zip - FFC98C36AFEC68DC6A48E863413D4E2364A202B3 + https://github.com/OpenRCT2/replays/releases/download/v0.0.84/replays.zip + 90B848AB344E29A2CF1E3E48539F06F5845772C3 diff --git a/readme.md b/readme.md index 83b455715f..794c82b5d0 100644 --- a/readme.md +++ b/readme.md @@ -52,9 +52,13 @@ If you want to help translate the game to your language, please stop by the Loca - 4.4 - [Graphics](#44-graphics) - 4.5 - [Audio](#45-audio) - 4.6 - [Scenarios](#46-scenarios) -- 5 - [Licence](#5-licence) -- 6 - [More information](#6-more-information) -- 7 - [Sponsors](#7-sponsors) +- 5 - [Policies](#5-policies) + - 5.1 - [Code of conduct](#51-code-of-conduct) + - 5.2 - [Code signing policy](#52-code-signing-policy) + - 5.3 - [Privacy policy](#53-privacy-policy) +- 6 - [Licence](#6-licence) +- 7 - [More information](#7-more-information) +- 8 - [Sponsors](#8-sponsors) --- @@ -128,7 +132,7 @@ OpenRCT2 requires original files of RollerCoaster Tycoon 2 to play. It can be bo - libpng (>= 1.2) - speexdsp (only for UI client) - curl (only if building with http support) - - nlohmann-json (>= 3.6.0) + - nlohmann-json (>= 3.9.0) - openssl (>= 1.0; only if building with multiplayer support) - icu (>= 59.0) - zlib @@ -246,12 +250,32 @@ We would also like to distribute additional scenarios with the game, when the ti --- -# 5. Licence +# 5. Policies + +## 5.1 Code of Conduct + +We have a [Code of Conduct](CODE_OF_CONDUCT.md) that applies to all OpenRCT2 projects. Please read it. + +## 5.2 Code signing policy + +We sign our releases with a digital certificate provided by SignPath Foundation. + +Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/). + +Signed releases can only be done by member of the [development team](https://github.com/OpenRCT2/OpenRCT2/blob/develop/contributors.md#development-team). + +## 5.3 Privacy policy + +See [PRIVACY.md](PRIVACY.md) for more information. + +--- + +# 6. Licence **OpenRCT2** is licensed under the GNU General Public License version 3 or (at your option) any later version. See the [`licence.txt`](licence.txt) file for more details. --- -# 6. More information +# 7. More information - [GitHub](https://github.com/OpenRCT2/OpenRCT2) - [OpenRCT2.org](https://openrct2.org) - [Forums](https://openrct2.org/forums/) @@ -266,11 +290,11 @@ We would also like to distribute additional scenarios with the game, when the ti | [![icon_x128](https://user-images.githubusercontent.com/604665/53047651-2c533c00-3493-11e9-911a-1a3540fc1156.png)](https://github.com/OpenLoco/OpenLoco) | [![](https://github.com/OpenTTD/OpenTTD/raw/850d05d24d4768c81d97765204ef2a487dd4972c/media/openttd.128.png)](https://github.com/OpenTTD/OpenTTD) | [![](https://user-images.githubusercontent.com/550290/36507534-4693f354-175a-11e8-93a7-faa0481474fb.png)](https://github.com/SFTtech/openage) | [![](https://raw.githubusercontent.com/OpenRA/OpenRA/bleed/packaging/artwork/ra_128x128.png)](https://github.com/OpenRA/OpenRA) | | Chris Sawyer's Locomotion | Transport Tycoon Deluxe | Age of Empires 2 | Red Alert | -# 7. Sponsors +# 8. Sponsors Companies that kindly allow us to use their stuff: -| [DigitalOcean](https://www.digitalocean.com/) | [JetBrains](https://www.jetbrains.com/) | [Backtrace](https://backtrace.io/) | -|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------| -| [![do_logo_vertical_blue svg](https://user-images.githubusercontent.com/550290/36508276-8b572f0e-175c-11e8-8622-9febbce756b2.png)](https://www.digitalocean.com/) | [![jetbrains](https://user-images.githubusercontent.com/550290/36413299-0e0985ea-161e-11e8-8a01-3ef523b5905b.png)](https://www.jetbrains.com/) | [![backtrace](https://user-images.githubusercontent.com/550290/47113259-d0647680-d258-11e8-97c3-1a2c6bde6d11.png)](https://backtrace.io/) | -| Hosting of various services | CLion and other products | Minidump uploads and inspection | +| [DigitalOcean](https://www.digitalocean.com/) | [JetBrains](https://www.jetbrains.com/) | [Backtrace](https://backtrace.io/) | [SignPath](https://signpath.org/) | +|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------| +| [![do_logo_vertical_blue svg](https://user-images.githubusercontent.com/550290/36508276-8b572f0e-175c-11e8-8622-9febbce756b2.png)](https://www.digitalocean.com/) | [![jetbrains](https://user-images.githubusercontent.com/550290/36413299-0e0985ea-161e-11e8-8a01-3ef523b5905b.png)](https://www.jetbrains.com/) | [![backtrace](https://user-images.githubusercontent.com/550290/47113259-d0647680-d258-11e8-97c3-1a2c6bde6d11.png)](https://backtrace.io/) | [![Image](https://github.com/user-attachments/assets/2b5679e0-76a4-4ae7-bb37-a6a507a53466)](https://signpath.org/) | +| Hosting of various services | CLion and other products | Minidump uploads and inspection | Free code signing provided by [SignPath.io](https://about.signpath.io/), certificate by [SignPath Foundation](https://signpath.org/). | diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 7105f9b22a..b622f3effb 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -2847,6 +2847,36 @@ "y": -9, "palette": "keep" }, + { + "path": "track/lattice_triangle/diagonal_booster_0.png", + "x": -32, + "y": 3 + }, + { + "path": "track/lattice_triangle/diagonal_booster_1.png", + "x": -8, + "y": -9 + }, + { + "path": "track/lattice_triangle/diagonal_booster_alt_0.png", + "x": -32, + "y": 2 + }, + { + "path": "track/lattice_triangle/diagonal_booster_alt_1.png", + "x": -8, + "y": -9 + }, + { + "path": "track/lattice_triangle/diagonal_booster_alt_2.png", + "x": -32, + "y": 3 + }, + { + "path": "track/lattice_triangle/diagonal_booster_alt_3.png", + "x": -8, + "y": -9 + }, { "path": "track/lattice_triangle/drive_tyre_1.png", "x": -22, @@ -6535,6 +6565,2094 @@ "x": -25, "y": -5 }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_1.png", + "x": -26, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_2.png", + "x": -32, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_3.png", + "x": 8, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_1_4.png", + "x": -18, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_1.png", + "x": -27, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_2.png", + "x": -16, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_3.png", + "x": -24, + "y": 12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_2_4.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_1.png", + "x": -6, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_2.png", + "x": 6, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_3.png", + "x": -32, + "y": -2, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_3_4.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_1.png", + "x": -27, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_2.png", + "x": -27, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_3.png", + "x": 0, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_diag_gentle_up_4_4.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_1.png", + "x": -26, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_2.png", + "x": -19, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_3.png", + "x": -13, + "y": -18, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_1_4.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_1.png", + "x": -27, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_2.png", + "x": -34, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_3.png", + "x": -2, + "y": -2, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_2_4.png", + "x": -14, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_1.png", + "x": -16, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_2.png", + "x": -8, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_3.png", + "x": 0, + "y": 13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_3_4.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_1.png", + "x": -17, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_2.png", + "x": -8, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_3.png", + "x": -32, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_diag_gentle_up_4_4.png", + "x": -13, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -18, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png", + "x": -12, + "y": 7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png", + "x": -10, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png", + "x": -19, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png", + "x": -19, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png", + "x": -24, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png", + "x": -14, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png", + "x": -25, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png", + "x": -24, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png", + "x": -32, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png", + "x": 5, + "y": 7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png", + "x": -16, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png", + "x": -24, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png", + "x": -13, + "y": -18, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png", + "x": -24, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png", + "x": -13, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png", + "x": -11, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png", + "x": -28, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png", + "x": -32, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png", + "x": -13, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png", + "x": -32, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png", + "x": -13, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png", + "x": -13, + "y": -25, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png", + "x": -12, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png", + "x": -32, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png", + "x": -13, + "y": -25, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_1.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_2.png", + "x": -13, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/left_bank_to_gentle_up_left_bank_diag_4.png", + "x": -9, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_2.png", + "x": -9, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_3.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/right_bank_to_gentle_up_right_bank_diag_4.png", + "x": -13, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_1.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_2.png", + "x": -13, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_3.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_left_bank_diag_4.png", + "x": -9, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_1.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_2.png", + "x": -9, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_3.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_right_bank_diag_4.png", + "x": -13, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_1.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_2.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_diag_4.png", + "x": -9, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_2.png", + "x": -9, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_3.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_diag_4.png", + "x": -12, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_1_1.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_1_2.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_3.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_left_bank_diag_4.png", + "x": -12, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_1.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_2.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_3_1.png", + "x": -32, + "y": -3, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_3_2.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/flat_to_gentle_up_right_bank_diag_4.png", + "x": -12, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_1_1.png", + "x": -32, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_1_2.png", + "x": -32, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_2.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_3.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_left_bank_to_flat_diag_4.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_1.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_2.png", + "x": -12, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_3_1.png", + "x": -31, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_3_2.png", + "x": -32, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/gentle_up_right_bank_to_flat_diag_4.png", + "x": -12, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png", + "x": -20, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png", + "x": -28, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png", + "x": 15, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png", + "x": -12, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png", + "x": -27, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png", + "x": -32, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png", + "x": -24, + "y": 13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png", + "x": -32, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png", + "x": -9, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png", + "x": 0, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png", + "x": -32, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png", + "x": -12, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png", + "x": -26, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png", + "x": -27, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png", + "x": 0, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png", + "x": 0, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png", + "x": -26, + "y": -22, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png", + "x": -23, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png", + "x": -15, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png", + "x": -32, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png", + "x": -20, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png", + "x": -33, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png", + "x": 2, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png", + "x": -13, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png", + "x": -9, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png", + "x": -8, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png", + "x": 0, + "y": 13, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png", + "x": 0, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png", + "x": -18, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png", + "x": -8, + "y": -24, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png", + "x": -32, + "y": 8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png", + "x": -12, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -33, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png", + "x": -3, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png", + "x": -12, + "y": -1, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png", + "x": -12, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png", + "x": -19, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png", + "x": -26, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png", + "x": -28, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png", + "x": -12, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png", + "x": -25, + "y": -6, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png", + "x": -26, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png", + "x": -32, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png", + "x": -20, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png", + "x": -16, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png", + "x": -26, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png", + "x": -32, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png", + "x": -29, + "y": -32, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png", + "x": -27, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png", + "x": -12, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png", + "x": -10, + "y": -7, + "palette": "keep" + }, + { + "path": "track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png", + "x": -29, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_1.png", + "x": -24, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_2.png", + "x": -24, + "y": -72, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_3.png", + "x": -28, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_4.png", + "x": -24, + "y": -50, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_1_5.png", + "x": -24, + "y": -37, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_1.png", + "x": -24, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_2.png", + "x": -32, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_3.png", + "x": -25, + "y": -52, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_4.png", + "x": -22, + "y": -58, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_2_5.png", + "x": -17, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_1.png", + "x": -16, + "y": -5, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_2.png", + "x": -18, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_3.png", + "x": 10, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_4.png", + "x": -8, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_3_5.png", + "x": -16, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_1.png", + "x": -26, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_2.png", + "x": -26, + "y": -28, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_3.png", + "x": -16, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_4.png", + "x": -45, + "y": -39, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_left_4_5.png", + "x": -25, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_1.png", + "x": -24, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_2.png", + "x": -26, + "y": -28, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_3.png", + "x": -23, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_4.png", + "x": -31, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_1_5.png", + "x": -32, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_1.png", + "x": -24, + "y": -4, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_2.png", + "x": -16, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_3.png", + "x": -24, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_4.png", + "x": -16, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_2_5.png", + "x": -26, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_1.png", + "x": -42, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_2.png", + "x": -16, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_3.png", + "x": -28, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_4.png", + "x": -31, + "y": -57, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_3_5.png", + "x": -25, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_1.png", + "x": -26, + "y": -11, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_2.png", + "x": -11, + "y": -73, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_3.png", + "x": 9, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_4.png", + "x": -18, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_corkscrew_right_4_5.png", + "x": -25, + "y": -37, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_1.png", + "x": -26, + "y": -34, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_2.png", + "x": -33, + "y": -55, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_3.png", + "x": -32, + "y": -95, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_4.png", + "x": -44, + "y": -123, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_1_5.png", + "x": -26, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_1.png", + "x": -27, + "y": -10, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_2.png", + "x": -16, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_3.png", + "x": -16, + "y": -85, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_4.png", + "x": -33, + "y": -148, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_5.png", + "x": -25, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_1.png", + "x": -29, + "y": -12, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_2.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_3.png", + "x": -6, + "y": -69, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_4.png", + "x": -32, + "y": -154, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_5.png", + "x": -19, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_1.png", + "x": -24, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_2.png", + "x": -26, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_3.png", + "x": -32, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_4.png", + "x": -12, + "y": -126, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_4_5.png", + "x": -27, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_1.png", + "x": -27, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_2.png", + "x": -22, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_3.png", + "x": -21, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_4.png", + "x": -46, + "y": -125, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_1_5.png", + "x": -27, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_1.png", + "x": -27, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_2.png", + "x": -32, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_3.png", + "x": -32, + "y": -62, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_4.png", + "x": -27, + "y": -153, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_5.png", + "x": -24, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_1.png", + "x": -32, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_2.png", + "x": -32, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_3.png", + "x": -32, + "y": -85, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_4.png", + "x": -13, + "y": -149, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_5.png", + "x": -14, + "y": -45, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_1.png", + "x": -23, + "y": -33, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_2.png", + "x": -17, + "y": -52, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_3.png", + "x": -5, + "y": -102, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_4.png", + "x": -32, + "y": -125, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_4_5.png", + "x": -32, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_2_2_2.png", + "x": -16, + "y": -38, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_left_3_2_2.png", + "x": 0, + "y": -14, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_2_2_2.png", + "x": -32, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/medium_half_loop_right_3_2_2.png", + "x": -32, + "y": -35, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_1.png", + "x": -26, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_2.png", + "x": -13, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_3.png", + "x": -12, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_1_4.png", + "x": -23, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_1.png", + "x": -27, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_2.png", + "x": -28, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_3.png", + "x": -23, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_2_4.png", + "x": -21, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_1.png", + "x": -22, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_2.png", + "x": -23, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_3.png", + "x": -8, + "y": -16, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_3_4.png", + "x": -27, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_1.png", + "x": -18, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_2.png", + "x": -11, + "y": -42, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_3.png", + "x": -22, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_left_4_4.png", + "x": -23, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_1.png", + "x": -26, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_2.png", + "x": -30, + "y": -43, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_3.png", + "x": -22, + "y": -20, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_1_4.png", + "x": -27, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_1.png", + "x": -27, + "y": -17, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_2.png", + "x": -16, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_3.png", + "x": -14, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_2_4.png", + "x": -12, + "y": -27, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_1.png", + "x": -9, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_2.png", + "x": -9, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_3.png", + "x": -11, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_3_4.png", + "x": -24, + "y": -21, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_1.png", + "x": -19, + "y": -13, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_2.png", + "x": -33, + "y": -15, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_3.png", + "x": -26, + "y": -26, + "palette": "keep" + }, + { + "path": "track/bm/zero_g_roll_right_4_4.png", + "x": -26, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_1.png", + "x": -25, + "y": -47, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_2.png", + "x": -26, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_3.png", + "x": -17, + "y": -52, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_4.png", + "x": -17, + "y": -42, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_1_5.png", + "x": -21, + "y": -29, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_1.png", + "x": -25, + "y": -44, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_2.png", + "x": -28, + "y": -34, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_3.png", + "x": -32, + "y": -26, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_2_4.png", + "x": -30, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_1.png", + "x": -9, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_2.png", + "x": -17, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_3.png", + "x": -31, + "y": -41, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_4.png", + "x": -24, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_5.png", + "x": -9, + "y": -9, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_3_6.png", + "x": -27, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_1.png", + "x": -18, + "y": -55, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_2.png", + "x": -17, + "y": -48, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_3.png", + "x": -10, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_4.png", + "x": -9, + "y": -39, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_left_4_5.png", + "x": -23, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_1.png", + "x": -25, + "y": -57, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_2.png", + "x": -32, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_3.png", + "x": -32, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_4.png", + "x": -32, + "y": -40, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_1_5.png", + "x": -32, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_1.png", + "x": -24, + "y": -32, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_2.png", + "x": -25, + "y": -30, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_3.png", + "x": -24, + "y": -41, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_4.png", + "x": -19, + "y": -31, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_5.png", + "x": -8, + "y": -8, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_2_6.png", + "x": -8, + "y": -23, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_1.png", + "x": -19, + "y": -43, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_2.png", + "x": -14, + "y": -33, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_3.png", + "x": -5, + "y": -26, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_3_4.png", + "x": -25, + "y": -19, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_1.png", + "x": -23, + "y": -46, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_2.png", + "x": -21, + "y": -50, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_3.png", + "x": -32, + "y": -51, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_4.png", + "x": -29, + "y": -42, + "palette": "keep" + }, + { + "path": "track/bm/large_zero_g_roll_right_4_5.png", + "x": -25, + "y": -29, + "palette": "keep" + }, { "path": "track/railway/quarter_turn_3_tiles_sw_se_part_3.png", "x": -8, @@ -8314,6 +10432,378 @@ "y": -9, "palette": "keep" }, + { + "path": "track/standup/25455.png", + "x": -23, + "y": -4, + "palette": "keep" + }, + { + "path": "track/standup/25457.png", + "x": -24, + "y": -13, + "palette": "keep" + }, + { + "path": "track/standup/25459.png", + "x": -26, + "y": -3, + "palette": "keep" + }, + { + "path": "track/standup/25461.png", + "x": -28, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25462.png", + "x": 3, + "y": 3, + "palette": "keep" + }, + { + "path": "track/standup/25463.png", + "x": -30, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25464.png", + "x": -2, + "y": 1, + "palette": "keep" + }, + { + "path": "track/standup/25466.png", + "x": -18, + "y": -9, + "palette": "keep" + }, + { + "path": "track/standup/25468.png", + "x": -18, + "y": -8, + "palette": "keep" + }, + { + "path": "track/standup/25470.png", + "x": -14, + "y": 1, + "palette": "keep" + }, + { + "path": "track/standup/25471.png", + "x": 7, + "y": 3, + "palette": "keep" + }, + { + "path": "track/standup/25472.png", + "x": -27, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25473.png", + "x": 4, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25521.png", + "x": -23, + "y": -6, + "palette": "keep" + }, + { + "path": "track/standup/25523.png", + "x": -32, + "y": -6, + "palette": "keep" + }, + { + "path": "track/standup/25526.png", + "x": -8, + "y": -2, + "palette": "keep" + }, + { + "path": "track/standup/25528.png", + "x": -6, + "y": 0, + "palette": "keep" + }, + { + "path": "track/standup/25530.png", + "x": -4, + "y": -2, + "palette": "keep" + }, + { + "path": "track/standup/25659.png", + "x": -23, + "y": -4, + "palette": "keep" + }, + { + "path": "track/standup/25661.png", + "x": -12, + "y": 0, + "palette": "keep" + }, + { + "path": "track/standup/25664.png", + "x": -26, + "y": 2, + "palette": "keep" + }, + { + "path": "track/standup/25665.png", + "x": 16, + "y": 8, + "palette": "keep" + }, + { + "path": "track/standup/25666.png", + "x": -10, + "y": -4, + "palette": "keep" + }, + { + "path": "track/standup/25668.png", + "x": -32, + "y": -8, + "palette": "keep" + }, + { + "path": "track/standup/25672.png", + "x": -4, + "y": -2, + "palette": "keep" + }, + { + "path": "track/standup/25673.png", + "x": -32, + "y": 11, + "palette": "keep" + }, + { + "path": "track/standup/25676.png", + "x": -28, + "y": -2, + "palette": "keep" + }, + { + "path": "track/standup/25677.png", + "x": 12, + "y": 10, + "palette": "keep" + }, + { + "path": "track/standup/25680.png", + "x": -22, + "y": -8, + "palette": "keep" + }, + { + "path": "track/standup/25684.png", + "x": -10, + "y": 1, + "palette": "keep" + }, + { + "path": "track/standup/25685.png", + "x": -30, + "y": 9, + "palette": "keep" + }, + { + "path": "track/standup/25686.png", + "x": -11, + "y": -5, + "palette": "keep" + }, + { + "path": "track/standup/25687.png", + "x": -24, + "y": -4, + "palette": "keep" + }, + { + "path": "track/standup/25689.png", + "x": -8, + "y": 0, + "palette": "keep" + }, + { + "path": "track/standup/25781.png", + "x": -23, + "y": -5, + "palette": "keep" + }, + { + "path": "track/standup/25783.png", + "x": -28, + "y": -17, + "palette": "keep" + }, + { + "path": "track/standup/25785.png", + "x": -18, + "y": -11, + "palette": "keep" + }, + { + "path": "track/standup/25787.png", + "x": -27, + "y": 3, + "palette": "keep" + }, + { + "path": "track/standup/25788.png", + "x": -1, + "y": 2, + "palette": "keep" + }, + { + "path": "track/standup/25792.png", + "x": -33, + "y": -10, + "palette": "keep" + }, + { + "path": "track/standup/25794.png", + "x": -16, + "y": -14, + "palette": "keep" + }, + { + "path": "track/standup/25796.png", + "x": -12, + "y": 0, + "palette": "keep" + }, + { + "path": "track/standup/25797.png", + "x": 9, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25798.png", + "x": -26, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25799.png", + "x": 5, + "y": 3, + "palette": "keep" + }, + { + "path": "track/standup/25803.png", + "x": -23, + "y": -10, + "palette": "keep" + }, + { + "path": "track/standup/25805.png", + "x": -32, + "y": -17, + "palette": "keep" + }, + { + "path": "track/standup/25807.png", + "x": -24, + "y": -5, + "palette": "keep" + }, + { + "path": "track/standup/25809.png", + "x": -26, + "y": 3, + "palette": "keep" + }, + { + "path": "track/standup/25810.png", + "x": 2, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25811.png", + "x": -31, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25812.png", + "x": -5, + "y": 0, + "palette": "keep" + }, + { + "path": "track/standup/25814.png", + "x": -32, + "y": -14, + "palette": "keep" + }, + { + "path": "track/standup/25816.png", + "x": -12, + "y": -9, + "palette": "keep" + }, + { + "path": "track/standup/25820.png", + "x": -25, + "y": 4, + "palette": "keep" + }, + { + "path": "track/standup/25821.png", + "x": 5, + "y": 3, + "palette": "keep" + }, + { + "path": "track/standup/25825.png", + "x": -23, + "y": -4, + "palette": "keep" + }, + { + "path": "track/standup/25827.png", + "x": -24, + "y": -9, + "palette": "keep" + }, + { + "path": "track/standup/25834.png", + "x": -9, + "y": -2, + "palette": "keep" + }, + { + "path": "track/standup/25835.png", + "x": 19, + "y": 9, + "palette": "keep" + }, + { + "path": "track/standup/25843.png", + "x": -32, + "y": 9, + "palette": "keep" + }, + { + "path": "track/standup/25844.png", + "x": -10, + "y": -3, + "palette": "keep" + }, { "path": "track/steeplechase/brake_horizontal.png", "x": -32, @@ -14513,6 +17003,1008 @@ "y": -22, "palette": "keep" }, + { + "path": "track/boat_hire/small_turn_left_1_1.png", + "x": -25, + "y": -4, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_1_2.png", + "x": -9, + "y": -5, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_1_3.png", + "x": -19, + "y": 8, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_1_4.png", + "x": -20, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_1_5.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_1_6.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_2_1.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_2_2.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_2_3.png", + "x": -8, + "y": 23, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_2_4.png", + "x": -16, + "y": 2, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_2_5.png", + "x": -24, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_2_6.png", + "x": -21, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_3_1.png", + "x": -14, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_3_2.png", + "x": -15, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_3_3.png", + "x": 18, + "y": 8, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_3_4.png", + "x": 15, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_3_5.png", + "x": 6, + "y": -4, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_3_6.png", + "x": -15, + "y": -5, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_4_1.png", + "x": -20, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_4_2.png", + "x": -22, + "y": 15, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_4_3.png", + "x": -18, + "y": 19, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_4_4.png", + "x": -10, + "y": -2, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_4_5.png", + "x": -25, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/small_turn_left_4_6.png", + "x": -9, + "y": 15, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_1.png", + "x": -25, + "y": -1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_2.png", + "x": -9, + "y": 4, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_3.png", + "x": -32, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_4.png", + "x": -14, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_5.png", + "x": -1, + "y": 11, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_6.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_7.png", + "x": -15, + "y": 6, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_8.png", + "x": -32, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_9.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_1_10.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_1.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_2.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_3.png", + "x": -2, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_4.png", + "x": -20, + "y": 6, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_5.png", + "x": -32, + "y": 11, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_6.png", + "x": -11, + "y": 25, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_7.png", + "x": -4, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_8.png", + "x": -30, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_9.png", + "x": -32, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_2_10.png", + "x": -17, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_1.png", + "x": -20, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_2.png", + "x": -2, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_3.png", + "x": 5, + "y": 6, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_4.png", + "x": 2, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_5.png", + "x": -7, + "y": 6, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_6.png", + "x": -30, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_7.png", + "x": 29, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_8.png", + "x": 2, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_9.png", + "x": -2, + "y": -1, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_3_10.png", + "x": -19, + "y": 4, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_1.png", + "x": -16, + "y": 4, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_2.png", + "x": -32, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_3.png", + "x": -24, + "y": 13, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_4.png", + "x": -12, + "y": 25, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_5.png", + "x": -8, + "y": -4, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_6.png", + "x": -32, + "y": 8, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_7.png", + "x": -21, + "y": 13, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_8.png", + "x": -4, + "y": 25, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_9.png", + "x": -25, + "y": 4, + "palette": "keep" + }, + { + "path": "track/boat_hire/medium_turn_left_4_10.png", + "x": -9, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_1.png", + "x": -25, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_2.png", + "x": -9, + "y": 4, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_3.png", + "x": -31, + "y": 10, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_4.png", + "x": -12, + "y": -12, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_5.png", + "x": 2, + "y": 8, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_6.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_7.png", + "x": -14, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_1_8.png", + "x": -13, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_1.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_2.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_3.png", + "x": -4, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_4.png", + "x": -20, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_5.png", + "x": -32, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_6.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_7.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_8.png", + "x": -8, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_9.png", + "x": -20, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_2_10.png", + "x": -28, + "y": 15, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_1.png", + "x": -22, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_2.png", + "x": -6, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_3.png", + "x": -8, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_4.png", + "x": 18, + "y": 13, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_5.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_6.png", + "x": -21, + "y": 2, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_7.png", + "x": -10, + "y": -4, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_3_8.png", + "x": -13, + "y": -2, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_1.png", + "x": -14, + "y": 3, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_2.png", + "x": -30, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_3.png", + "x": -32, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_4.png", + "x": -20, + "y": 21, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_5.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_6.png", + "x": -14, + "y": 2, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_7.png", + "x": 0, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_left_to_diag_4_8.png", + "x": 0, + "y": 17, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_1.png", + "x": -25, + "y": 3, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_2.png", + "x": -9, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_3.png", + "x": -22, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_4.png", + "x": -6, + "y": 21, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_5.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_6.png", + "x": -28, + "y": 2, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_7.png", + "x": -32, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_1_8.png", + "x": -26, + "y": 17, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_1.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_2.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_3.png", + "x": -13, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_4.png", + "x": -30, + "y": 13, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_5.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_6.png", + "x": 5, + "y": 2, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_7.png", + "x": 5, + "y": -4, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_2_8.png", + "x": -14, + "y": -2, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_1.png", + "x": -32, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_2.png", + "x": -16, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_3.png", + "x": -12, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_4.png", + "x": -30, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_5.png", + "x": -18, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_6.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_7.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_8.png", + "x": -12, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_9.png", + "x": 0, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_3_10.png", + "x": 0, + "y": 15, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_1.png", + "x": -4, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_2.png", + "x": -20, + "y": 4, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_3.png", + "x": 21, + "y": 10, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_4.png", + "x": -12, + "y": -12, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_5.png", + "x": -20, + "y": 8, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_6.png", + "x": 0, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_7.png", + "x": 10, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/large_turn_right_to_diag_4_8.png", + "x": -13, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/flat_diag_1_1.png", + "x": -32, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/flat_diag_1_2.png", + "x": -32, + "y": 16, + "palette": "keep" + }, + { + "path": "track/boat_hire/flat_diag_2.png", + "x": -13, + "y": -2, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_1.png", + "x": -25, + "y": -1, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_2.png", + "x": -9, + "y": 7, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_3.png", + "x": -32, + "y": 3, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_4.png", + "x": -16, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_5.png", + "x": -1, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_6.png", + "x": 4, + "y": 10, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_7.png", + "x": -22, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_1_8.png", + "x": -4, + "y": 8, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_1.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_2.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_3.png", + "x": -2, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_4.png", + "x": -20, + "y": 6, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_5.png", + "x": -32, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_6.png", + "x": -12, + "y": 25, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_7.png", + "x": -14, + "y": 3, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_left_2_8.png", + "x": -32, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_1.png", + "x": -25, + "y": 3, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_2.png", + "x": -9, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_3.png", + "x": -25, + "y": 12, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_4.png", + "x": -7, + "y": 25, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_5.png", + "x": -4, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_6.png", + "x": -32, + "y": 6, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_7.png", + "x": -32, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_1_8.png", + "x": -19, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_1.png", + "x": -9, + "y": 1, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_2.png", + "x": -25, + "y": 9, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_3.png", + "x": -14, + "y": 5, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_4.png", + "x": -32, + "y": 10, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_5.png", + "x": 28, + "y": 14, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_6.png", + "x": 1, + "y": 0, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_7.png", + "x": -2, + "y": -1, + "palette": "keep" + }, + { + "path": "track/boat_hire/s_bend_right_2_8.png", + "x": -20, + "y": 7, + "palette": "keep" + }, { "path": "support/flat_to_steep_1_1.png", "x": -32, diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_1.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_1.png new file mode 100644 index 0000000000..1330edd67b Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_1.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_2.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_2.png new file mode 100644 index 0000000000..4d9dc99466 Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_1_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..863557ffca Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..557291536a Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..93060086cb Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..5496857bde Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..76266459a8 Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_1.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_1.png new file mode 100644 index 0000000000..ac7c02203b Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_1.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_2.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_2.png new file mode 100644 index 0000000000..a567e63bab Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_3_2.png differ diff --git a/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..4ce40a5e4c Binary files /dev/null and b/resources/g2/track/bm/flat_to_gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_1.png b/resources/g2/track/bm/gentle_up_left_bank_diag_1.png new file mode 100644 index 0000000000..b137a4861e Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..048c1714c8 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..0fbc3a7937 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..8eee915fd0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_1.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_1.png new file mode 100644 index 0000000000..f82bf610b4 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_2.png new file mode 100644 index 0000000000..2bcb61bb49 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_1_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_2.png new file mode 100644 index 0000000000..c4d8a863b6 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_3.png new file mode 100644 index 0000000000..53ca24b47d Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_4.png new file mode 100644 index 0000000000..05ec980b34 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_flat_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png new file mode 100644 index 0000000000..71790c7670 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png new file mode 100644 index 0000000000..04845ac2ee Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_1_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png new file mode 100644 index 0000000000..50094f0393 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png new file mode 100644 index 0000000000..a239572df7 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png new file mode 100644 index 0000000000..bd1c876578 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_gentle_up_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_1.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_1.png new file mode 100644 index 0000000000..abf22cb7ae Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_2.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_2.png new file mode 100644 index 0000000000..564af32b3c Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_3.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_3.png new file mode 100644 index 0000000000..90a07d96c0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_4.png b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_4.png new file mode 100644 index 0000000000..288fccc0f0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_left_bank_to_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..93f6647223 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..2e48e0bcf0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_3.png b/resources/g2/track/bm/gentle_up_right_bank_diag_3.png new file mode 100644 index 0000000000..154857b6f2 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..39bedc50ae Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_1.png new file mode 100644 index 0000000000..1889ac2359 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_2.png new file mode 100644 index 0000000000..2b7bfa5a94 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_1.png new file mode 100644 index 0000000000..324fa0ab7b Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_2.png new file mode 100644 index 0000000000..5dae45dc2b Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_3_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_4.png new file mode 100644 index 0000000000..56c8b77bb2 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_flat_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png new file mode 100644 index 0000000000..6e2e36d4d1 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png new file mode 100644 index 0000000000..689c8cdadb Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png new file mode 100644 index 0000000000..9820ffd2f0 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png new file mode 100644 index 0000000000..53defdfd1a Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_3_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png new file mode 100644 index 0000000000..c26972b6d3 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_gentle_up_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_1.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_1.png new file mode 100644 index 0000000000..3d11c088dd Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_2.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_2.png new file mode 100644 index 0000000000..b44dc387c4 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_3.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_3.png new file mode 100644 index 0000000000..b1d1841783 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_4.png b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_4.png new file mode 100644 index 0000000000..1842de3fca Binary files /dev/null and b/resources/g2/track/bm/gentle_up_right_bank_to_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png new file mode 100644 index 0000000000..053bff4c7f Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_1.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png new file mode 100644 index 0000000000..bd5033ed63 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_1_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..f5d3d219d9 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..bf75e23b57 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..a97983c19e Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..26368ac582 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..c93071b433 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png new file mode 100644 index 0000000000..701953fe99 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_1.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png new file mode 100644 index 0000000000..0996c34dd5 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_3_2.png differ diff --git a/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..125c48f498 Binary files /dev/null and b/resources/g2/track/bm/gentle_up_to_gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_1.png b/resources/g2/track/bm/large_corkscrew_left_1_1.png new file mode 100644 index 0000000000..b937ad056d Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_2.png b/resources/g2/track/bm/large_corkscrew_left_1_2.png new file mode 100644 index 0000000000..d6e0841d5a Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_3.png b/resources/g2/track/bm/large_corkscrew_left_1_3.png new file mode 100644 index 0000000000..e47904d100 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_4.png b/resources/g2/track/bm/large_corkscrew_left_1_4.png new file mode 100644 index 0000000000..f4dfc39086 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_1_5.png b/resources/g2/track/bm/large_corkscrew_left_1_5.png new file mode 100644 index 0000000000..4014f0976e Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_1_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_1.png b/resources/g2/track/bm/large_corkscrew_left_2_1.png new file mode 100644 index 0000000000..46c8168400 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_2.png b/resources/g2/track/bm/large_corkscrew_left_2_2.png new file mode 100644 index 0000000000..267bd68fb9 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_3.png b/resources/g2/track/bm/large_corkscrew_left_2_3.png new file mode 100644 index 0000000000..62b43ff094 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_4.png b/resources/g2/track/bm/large_corkscrew_left_2_4.png new file mode 100644 index 0000000000..462697c346 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_2_5.png b/resources/g2/track/bm/large_corkscrew_left_2_5.png new file mode 100644 index 0000000000..8722af6b72 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_2_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_1.png b/resources/g2/track/bm/large_corkscrew_left_3_1.png new file mode 100644 index 0000000000..ebcc865602 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_2.png b/resources/g2/track/bm/large_corkscrew_left_3_2.png new file mode 100644 index 0000000000..fd757e21f4 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_3.png b/resources/g2/track/bm/large_corkscrew_left_3_3.png new file mode 100644 index 0000000000..b04b68d9d0 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_4.png b/resources/g2/track/bm/large_corkscrew_left_3_4.png new file mode 100644 index 0000000000..96e2458635 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_3_5.png b/resources/g2/track/bm/large_corkscrew_left_3_5.png new file mode 100644 index 0000000000..1a81938aa2 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_3_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_1.png b/resources/g2/track/bm/large_corkscrew_left_4_1.png new file mode 100644 index 0000000000..f041c29e87 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_2.png b/resources/g2/track/bm/large_corkscrew_left_4_2.png new file mode 100644 index 0000000000..bd44b2b32f Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_3.png b/resources/g2/track/bm/large_corkscrew_left_4_3.png new file mode 100644 index 0000000000..6dbd298591 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_4.png b/resources/g2/track/bm/large_corkscrew_left_4_4.png new file mode 100644 index 0000000000..9500e7fa17 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_left_4_5.png b/resources/g2/track/bm/large_corkscrew_left_4_5.png new file mode 100644 index 0000000000..b53d083246 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_left_4_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_1.png b/resources/g2/track/bm/large_corkscrew_right_1_1.png new file mode 100644 index 0000000000..30971a185b Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_2.png b/resources/g2/track/bm/large_corkscrew_right_1_2.png new file mode 100644 index 0000000000..040838d28f Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_3.png b/resources/g2/track/bm/large_corkscrew_right_1_3.png new file mode 100644 index 0000000000..d3e9b08ec7 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_4.png b/resources/g2/track/bm/large_corkscrew_right_1_4.png new file mode 100644 index 0000000000..1c1589c5b8 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_1_5.png b/resources/g2/track/bm/large_corkscrew_right_1_5.png new file mode 100644 index 0000000000..b3041ef5d7 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_1_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_1.png b/resources/g2/track/bm/large_corkscrew_right_2_1.png new file mode 100644 index 0000000000..4f30664251 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_2.png b/resources/g2/track/bm/large_corkscrew_right_2_2.png new file mode 100644 index 0000000000..1dab5438ec Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_3.png b/resources/g2/track/bm/large_corkscrew_right_2_3.png new file mode 100644 index 0000000000..5f95313384 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_4.png b/resources/g2/track/bm/large_corkscrew_right_2_4.png new file mode 100644 index 0000000000..6a12983643 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_2_5.png b/resources/g2/track/bm/large_corkscrew_right_2_5.png new file mode 100644 index 0000000000..0f5ae1de43 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_2_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_1.png b/resources/g2/track/bm/large_corkscrew_right_3_1.png new file mode 100644 index 0000000000..c1b7b42f8b Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_2.png b/resources/g2/track/bm/large_corkscrew_right_3_2.png new file mode 100644 index 0000000000..9c70daf17d Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_3.png b/resources/g2/track/bm/large_corkscrew_right_3_3.png new file mode 100644 index 0000000000..31440f8c96 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_4.png b/resources/g2/track/bm/large_corkscrew_right_3_4.png new file mode 100644 index 0000000000..7ca6485de3 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_3_5.png b/resources/g2/track/bm/large_corkscrew_right_3_5.png new file mode 100644 index 0000000000..2e3b6f7ad3 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_3_5.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_1.png b/resources/g2/track/bm/large_corkscrew_right_4_1.png new file mode 100644 index 0000000000..23cbf7e7c2 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_1.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_2.png b/resources/g2/track/bm/large_corkscrew_right_4_2.png new file mode 100644 index 0000000000..571036237a Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_2.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_3.png b/resources/g2/track/bm/large_corkscrew_right_4_3.png new file mode 100644 index 0000000000..6e283d5260 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_3.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_4.png b/resources/g2/track/bm/large_corkscrew_right_4_4.png new file mode 100644 index 0000000000..a75a2ecb91 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_4.png differ diff --git a/resources/g2/track/bm/large_corkscrew_right_4_5.png b/resources/g2/track/bm/large_corkscrew_right_4_5.png new file mode 100644 index 0000000000..886e59b616 Binary files /dev/null and b/resources/g2/track/bm/large_corkscrew_right_4_5.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..07a3333c49 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..934de1995a Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..f5eb0565c8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..b82e906182 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..0841c3ae95 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..a9a6769e6b Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..60ca129964 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..52a22fa1d2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..8f80fe318f Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..f34090bee1 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..b3af42abfa Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..9e6d96a487 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..93e19d50b7 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..ba0ad07323 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..b4c207b685 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..f19688d365 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..e22b52928e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..fb125a9a0e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..dcd90c0eae Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..980df5151d Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..242cb02b90 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..c77fc1f26a Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..4e83215176 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..a68968b1cf Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..076632dbf4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..ba49b9186e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..bc0b19abc8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..b21d1e65b1 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_bank_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..bea103aeee Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..bc65d9bd7b Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..9e33894d4d Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..a77bddedef Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..68f84e8787 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..ea21ab3fc4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..37c576dcbc Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..6131a2b982 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..b46205e74e Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..015b44d34a Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..4b85d438ae Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..1ef94b9451 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..db2826b4d9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..9d1de1a741 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..6f4b37482b Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..e305c400f2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..9b89751709 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..c97b87dc12 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..c841413958 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..8847bad5eb Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..631774c76f Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..21f43870f3 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..9a27787066 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..df532007af Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..605a875b31 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..28e1ccce5d Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..7f38c16dd9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..bc1351b168 Binary files /dev/null and b/resources/g2/track/bm/large_turn_left_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..94a66b81b2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..b017f22fc6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..04ed948b27 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..ecd6d8fdfa Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..28559cd57e Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..5314e915ab Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..7f3a1bb0c9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..c6935a54b7 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..15795d8cb5 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..0a186983f2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..f7b56c53e6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..32a9f723e9 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..33f550dbe7 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..a24e35b77d Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..9fdcdb46e5 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..bffa7da90d Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..79e57ce8c6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..ef2827cc51 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..9b066b073e Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..b85a39fcad Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..24509ea9c8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..0f6643533b Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..7f2837d7c8 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..29cd1e87e3 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..ada0ff145f Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..985eb27d20 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..9076f6af53 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..40e7321686 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_bank_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_1.png new file mode 100644 index 0000000000..88a64053fe Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_2.png new file mode 100644 index 0000000000..39fe5903a6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_3.png new file mode 100644 index 0000000000..f63dda7ac4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_4.png new file mode 100644 index 0000000000..c098ff2d68 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_1.png new file mode 100644 index 0000000000..f02de850ae Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_2.png new file mode 100644 index 0000000000..7f22eda49c Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_3.png new file mode 100644 index 0000000000..1342d5a469 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_4.png new file mode 100644 index 0000000000..acf9d6bafe Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_1.png new file mode 100644 index 0000000000..2b4d62009c Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_2.png new file mode 100644 index 0000000000..dff7f5ef7c Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_3.png new file mode 100644 index 0000000000..cecbf735dd Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_4.png new file mode 100644 index 0000000000..7b5392091a Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_1.png new file mode 100644 index 0000000000..d87c823475 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_2.png new file mode 100644 index 0000000000..2d45a130fd Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_3.png new file mode 100644 index 0000000000..b93d191292 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_4.png new file mode 100644 index 0000000000..f10f781762 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_diag_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png new file mode 100644 index 0000000000..ec3c4c09d4 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png new file mode 100644 index 0000000000..10f53e8bca Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png new file mode 100644 index 0000000000..714e1c7cf6 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_1_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png new file mode 100644 index 0000000000..7ef7c850d2 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png new file mode 100644 index 0000000000..07cffe6c16 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png new file mode 100644 index 0000000000..af22fab390 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_2_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png new file mode 100644 index 0000000000..1bc591d792 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png new file mode 100644 index 0000000000..26a4d0ee42 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png new file mode 100644 index 0000000000..0f83e8e619 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_3_4.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png new file mode 100644 index 0000000000..6d3511c987 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_1.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_2.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png new file mode 100644 index 0000000000..901c87e437 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_3.png differ diff --git a/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png new file mode 100644 index 0000000000..5301553d21 Binary files /dev/null and b/resources/g2/track/bm/large_turn_right_to_orthogonal_gentle_up_4_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_1.png b/resources/g2/track/bm/large_zero_g_roll_left_1_1.png new file mode 100644 index 0000000000..583894dde0 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_2.png b/resources/g2/track/bm/large_zero_g_roll_left_1_2.png new file mode 100644 index 0000000000..39e123df82 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_3.png b/resources/g2/track/bm/large_zero_g_roll_left_1_3.png new file mode 100644 index 0000000000..f793ae76b5 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_4.png b/resources/g2/track/bm/large_zero_g_roll_left_1_4.png new file mode 100644 index 0000000000..150aec64a2 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_1_5.png b/resources/g2/track/bm/large_zero_g_roll_left_1_5.png new file mode 100644 index 0000000000..c07aa7f432 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_1_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_1.png b/resources/g2/track/bm/large_zero_g_roll_left_2_1.png new file mode 100644 index 0000000000..3fcfec8f4d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_2.png b/resources/g2/track/bm/large_zero_g_roll_left_2_2.png new file mode 100644 index 0000000000..2e6d0dd1d3 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_3.png b/resources/g2/track/bm/large_zero_g_roll_left_2_3.png new file mode 100644 index 0000000000..d959c97cc6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_2_4.png b/resources/g2/track/bm/large_zero_g_roll_left_2_4.png new file mode 100644 index 0000000000..604d2f4143 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_2_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_1.png b/resources/g2/track/bm/large_zero_g_roll_left_3_1.png new file mode 100644 index 0000000000..808a681081 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_2.png b/resources/g2/track/bm/large_zero_g_roll_left_3_2.png new file mode 100644 index 0000000000..e6a2ccf09f Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_3.png b/resources/g2/track/bm/large_zero_g_roll_left_3_3.png new file mode 100644 index 0000000000..d5203f8216 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_4.png b/resources/g2/track/bm/large_zero_g_roll_left_3_4.png new file mode 100644 index 0000000000..32e54b4a21 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_5.png b/resources/g2/track/bm/large_zero_g_roll_left_3_5.png new file mode 100644 index 0000000000..f62f82740d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_3_6.png b/resources/g2/track/bm/large_zero_g_roll_left_3_6.png new file mode 100644 index 0000000000..cb1caa331d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_3_6.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_1.png b/resources/g2/track/bm/large_zero_g_roll_left_4_1.png new file mode 100644 index 0000000000..222bc08d99 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_2.png b/resources/g2/track/bm/large_zero_g_roll_left_4_2.png new file mode 100644 index 0000000000..b76cb1e205 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_3.png b/resources/g2/track/bm/large_zero_g_roll_left_4_3.png new file mode 100644 index 0000000000..e73b45b87c Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_4.png b/resources/g2/track/bm/large_zero_g_roll_left_4_4.png new file mode 100644 index 0000000000..e8dbb2f18a Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_left_4_5.png b/resources/g2/track/bm/large_zero_g_roll_left_4_5.png new file mode 100644 index 0000000000..1f4fd496bc Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_left_4_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_1.png b/resources/g2/track/bm/large_zero_g_roll_right_1_1.png new file mode 100644 index 0000000000..77bfa85594 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_2.png b/resources/g2/track/bm/large_zero_g_roll_right_1_2.png new file mode 100644 index 0000000000..f635df1b5c Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_3.png b/resources/g2/track/bm/large_zero_g_roll_right_1_3.png new file mode 100644 index 0000000000..6a60203ec2 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_4.png b/resources/g2/track/bm/large_zero_g_roll_right_1_4.png new file mode 100644 index 0000000000..ca3715a209 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_1_5.png b/resources/g2/track/bm/large_zero_g_roll_right_1_5.png new file mode 100644 index 0000000000..2900f8586f Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_1_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_1.png b/resources/g2/track/bm/large_zero_g_roll_right_2_1.png new file mode 100644 index 0000000000..2ab00a9f28 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_2.png b/resources/g2/track/bm/large_zero_g_roll_right_2_2.png new file mode 100644 index 0000000000..7bee0039e6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_3.png b/resources/g2/track/bm/large_zero_g_roll_right_2_3.png new file mode 100644 index 0000000000..9ae6c454fa Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_4.png b/resources/g2/track/bm/large_zero_g_roll_right_2_4.png new file mode 100644 index 0000000000..5f264c23e6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_5.png b/resources/g2/track/bm/large_zero_g_roll_right_2_5.png new file mode 100644 index 0000000000..9ee4ba0c92 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_5.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_2_6.png b/resources/g2/track/bm/large_zero_g_roll_right_2_6.png new file mode 100644 index 0000000000..908cad8ed5 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_2_6.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_1.png b/resources/g2/track/bm/large_zero_g_roll_right_3_1.png new file mode 100644 index 0000000000..6e25339f5d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_2.png b/resources/g2/track/bm/large_zero_g_roll_right_3_2.png new file mode 100644 index 0000000000..1e5038341a Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_3.png b/resources/g2/track/bm/large_zero_g_roll_right_3_3.png new file mode 100644 index 0000000000..475427a44d Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_3_4.png b/resources/g2/track/bm/large_zero_g_roll_right_3_4.png new file mode 100644 index 0000000000..cb4089fca5 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_3_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_1.png b/resources/g2/track/bm/large_zero_g_roll_right_4_1.png new file mode 100644 index 0000000000..211edd895c Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_1.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_2.png b/resources/g2/track/bm/large_zero_g_roll_right_4_2.png new file mode 100644 index 0000000000..83e7d366db Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_2.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_3.png b/resources/g2/track/bm/large_zero_g_roll_right_4_3.png new file mode 100644 index 0000000000..399bf4f5e6 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_3.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_4.png b/resources/g2/track/bm/large_zero_g_roll_right_4_4.png new file mode 100644 index 0000000000..a80a818ce7 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_4.png differ diff --git a/resources/g2/track/bm/large_zero_g_roll_right_4_5.png b/resources/g2/track/bm/large_zero_g_roll_right_4_5.png new file mode 100644 index 0000000000..79546f9954 Binary files /dev/null and b/resources/g2/track/bm/large_zero_g_roll_right_4_5.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_1.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_1.png new file mode 100644 index 0000000000..fe1bd7aef5 Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_1.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_2.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_2.png new file mode 100644 index 0000000000..b508c1c835 Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_2.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_3.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_3.png new file mode 100644 index 0000000000..eb0476708a Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_3.png differ diff --git a/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_4.png b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_4.png new file mode 100644 index 0000000000..c3621238f8 Binary files /dev/null and b/resources/g2/track/bm/left_bank_to_gentle_up_left_bank_diag_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_1.png b/resources/g2/track/bm/medium_half_loop_left_1_1.png new file mode 100644 index 0000000000..2f3759ab87 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_2.png b/resources/g2/track/bm/medium_half_loop_left_1_2.png new file mode 100644 index 0000000000..b230401b3e Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_3.png b/resources/g2/track/bm/medium_half_loop_left_1_3.png new file mode 100644 index 0000000000..9065c70cb8 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_4.png b/resources/g2/track/bm/medium_half_loop_left_1_4.png new file mode 100644 index 0000000000..f502821ecf Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_1_5.png b/resources/g2/track/bm/medium_half_loop_left_1_5.png new file mode 100644 index 0000000000..f242002ca6 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_1_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_1.png b/resources/g2/track/bm/medium_half_loop_left_2_1.png new file mode 100644 index 0000000000..5597987545 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_2.png b/resources/g2/track/bm/medium_half_loop_left_2_2.png new file mode 100644 index 0000000000..bcd075348c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_2_2.png b/resources/g2/track/bm/medium_half_loop_left_2_2_2.png new file mode 100644 index 0000000000..d2f4d5e75c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_3.png b/resources/g2/track/bm/medium_half_loop_left_2_3.png new file mode 100644 index 0000000000..ac74431884 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_4.png b/resources/g2/track/bm/medium_half_loop_left_2_4.png new file mode 100644 index 0000000000..e32da6135f Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_2_5.png b/resources/g2/track/bm/medium_half_loop_left_2_5.png new file mode 100644 index 0000000000..9856862ded Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_2_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_1.png b/resources/g2/track/bm/medium_half_loop_left_3_1.png new file mode 100644 index 0000000000..e6d8c1bf07 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_2.png b/resources/g2/track/bm/medium_half_loop_left_3_2.png new file mode 100644 index 0000000000..e0e7dc4cbd Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_2_2.png b/resources/g2/track/bm/medium_half_loop_left_3_2_2.png new file mode 100644 index 0000000000..1a8bbf2a65 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_3.png b/resources/g2/track/bm/medium_half_loop_left_3_3.png new file mode 100644 index 0000000000..60d4b5bcd1 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_4.png b/resources/g2/track/bm/medium_half_loop_left_3_4.png new file mode 100644 index 0000000000..2180a7dd8c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_3_5.png b/resources/g2/track/bm/medium_half_loop_left_3_5.png new file mode 100644 index 0000000000..f540fb0134 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_3_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_1.png b/resources/g2/track/bm/medium_half_loop_left_4_1.png new file mode 100644 index 0000000000..c160e3ebf3 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_2.png b/resources/g2/track/bm/medium_half_loop_left_4_2.png new file mode 100644 index 0000000000..4eb61a6f77 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_3.png b/resources/g2/track/bm/medium_half_loop_left_4_3.png new file mode 100644 index 0000000000..d06c373561 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_4.png b/resources/g2/track/bm/medium_half_loop_left_4_4.png new file mode 100644 index 0000000000..9b564d5391 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_left_4_5.png b/resources/g2/track/bm/medium_half_loop_left_4_5.png new file mode 100644 index 0000000000..405b9c4293 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_left_4_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_1.png b/resources/g2/track/bm/medium_half_loop_right_1_1.png new file mode 100644 index 0000000000..f1c382ddcf Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_2.png b/resources/g2/track/bm/medium_half_loop_right_1_2.png new file mode 100644 index 0000000000..47039a93ca Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_3.png b/resources/g2/track/bm/medium_half_loop_right_1_3.png new file mode 100644 index 0000000000..266a859da7 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_4.png b/resources/g2/track/bm/medium_half_loop_right_1_4.png new file mode 100644 index 0000000000..933d722bd1 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_1_5.png b/resources/g2/track/bm/medium_half_loop_right_1_5.png new file mode 100644 index 0000000000..55c4e2e21d Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_1_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_1.png b/resources/g2/track/bm/medium_half_loop_right_2_1.png new file mode 100644 index 0000000000..870a429c48 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_2.png b/resources/g2/track/bm/medium_half_loop_right_2_2.png new file mode 100644 index 0000000000..a56320146e Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_2_2.png b/resources/g2/track/bm/medium_half_loop_right_2_2_2.png new file mode 100644 index 0000000000..203167b45b Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_3.png b/resources/g2/track/bm/medium_half_loop_right_2_3.png new file mode 100644 index 0000000000..41f2df9e3c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_4.png b/resources/g2/track/bm/medium_half_loop_right_2_4.png new file mode 100644 index 0000000000..e8fc033ef4 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_2_5.png b/resources/g2/track/bm/medium_half_loop_right_2_5.png new file mode 100644 index 0000000000..9be584ff56 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_2_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_1.png b/resources/g2/track/bm/medium_half_loop_right_3_1.png new file mode 100644 index 0000000000..49c7fc9b07 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_2.png b/resources/g2/track/bm/medium_half_loop_right_3_2.png new file mode 100644 index 0000000000..5eda37d62f Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_2_2.png b/resources/g2/track/bm/medium_half_loop_right_3_2_2.png new file mode 100644 index 0000000000..565747b91b Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_2_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_3.png b/resources/g2/track/bm/medium_half_loop_right_3_3.png new file mode 100644 index 0000000000..3c6b2a778c Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_4.png b/resources/g2/track/bm/medium_half_loop_right_3_4.png new file mode 100644 index 0000000000..71dd87e1ed Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_3_5.png b/resources/g2/track/bm/medium_half_loop_right_3_5.png new file mode 100644 index 0000000000..f130b6a5bb Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_3_5.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_1.png b/resources/g2/track/bm/medium_half_loop_right_4_1.png new file mode 100644 index 0000000000..a2b8d5e299 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_1.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_2.png b/resources/g2/track/bm/medium_half_loop_right_4_2.png new file mode 100644 index 0000000000..7e824fab68 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_2.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_3.png b/resources/g2/track/bm/medium_half_loop_right_4_3.png new file mode 100644 index 0000000000..feea7cff21 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_3.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_4.png b/resources/g2/track/bm/medium_half_loop_right_4_4.png new file mode 100644 index 0000000000..d865fa3ab7 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_4.png differ diff --git a/resources/g2/track/bm/medium_half_loop_right_4_5.png b/resources/g2/track/bm/medium_half_loop_right_4_5.png new file mode 100644 index 0000000000..012cfc0e84 Binary files /dev/null and b/resources/g2/track/bm/medium_half_loop_right_4_5.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_1.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_1.png new file mode 100644 index 0000000000..cbadc20f5a Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_1.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_2.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_2.png new file mode 100644 index 0000000000..38ed74398b Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_2.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_3.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_3.png new file mode 100644 index 0000000000..cfea637c67 Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_3.png differ diff --git a/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_4.png b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_4.png new file mode 100644 index 0000000000..6c8fc34152 Binary files /dev/null and b/resources/g2/track/bm/right_bank_to_gentle_up_right_bank_diag_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_1.png b/resources/g2/track/bm/zero_g_roll_left_1_1.png new file mode 100644 index 0000000000..c01f156f08 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_2.png b/resources/g2/track/bm/zero_g_roll_left_1_2.png new file mode 100644 index 0000000000..20258378f0 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_3.png b/resources/g2/track/bm/zero_g_roll_left_1_3.png new file mode 100644 index 0000000000..c6eecb30c4 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_1_4.png b/resources/g2/track/bm/zero_g_roll_left_1_4.png new file mode 100644 index 0000000000..791a4d0589 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_1_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_1.png b/resources/g2/track/bm/zero_g_roll_left_2_1.png new file mode 100644 index 0000000000..94d1e3695c Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_2.png b/resources/g2/track/bm/zero_g_roll_left_2_2.png new file mode 100644 index 0000000000..4313b70eda Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_3.png b/resources/g2/track/bm/zero_g_roll_left_2_3.png new file mode 100644 index 0000000000..0642f846ab Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_2_4.png b/resources/g2/track/bm/zero_g_roll_left_2_4.png new file mode 100644 index 0000000000..a104413974 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_2_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_1.png b/resources/g2/track/bm/zero_g_roll_left_3_1.png new file mode 100644 index 0000000000..2ab8fb172f Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_2.png b/resources/g2/track/bm/zero_g_roll_left_3_2.png new file mode 100644 index 0000000000..1bcce0d160 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_3.png b/resources/g2/track/bm/zero_g_roll_left_3_3.png new file mode 100644 index 0000000000..656fa26668 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_3_4.png b/resources/g2/track/bm/zero_g_roll_left_3_4.png new file mode 100644 index 0000000000..ab30c1352e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_3_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_1.png b/resources/g2/track/bm/zero_g_roll_left_4_1.png new file mode 100644 index 0000000000..47d93ab45e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_2.png b/resources/g2/track/bm/zero_g_roll_left_4_2.png new file mode 100644 index 0000000000..a55877d811 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_3.png b/resources/g2/track/bm/zero_g_roll_left_4_3.png new file mode 100644 index 0000000000..9d4b6ccdf8 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_left_4_4.png b/resources/g2/track/bm/zero_g_roll_left_4_4.png new file mode 100644 index 0000000000..4f65dc867b Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_left_4_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_1.png b/resources/g2/track/bm/zero_g_roll_right_1_1.png new file mode 100644 index 0000000000..172e6e9ae0 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_2.png b/resources/g2/track/bm/zero_g_roll_right_1_2.png new file mode 100644 index 0000000000..0c361f4699 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_3.png b/resources/g2/track/bm/zero_g_roll_right_1_3.png new file mode 100644 index 0000000000..e25ea83f1a Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_1_4.png b/resources/g2/track/bm/zero_g_roll_right_1_4.png new file mode 100644 index 0000000000..df21e5782b Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_1_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_1.png b/resources/g2/track/bm/zero_g_roll_right_2_1.png new file mode 100644 index 0000000000..a24bd77c98 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_2.png b/resources/g2/track/bm/zero_g_roll_right_2_2.png new file mode 100644 index 0000000000..dc56c5b854 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_3.png b/resources/g2/track/bm/zero_g_roll_right_2_3.png new file mode 100644 index 0000000000..5060ed25a9 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_2_4.png b/resources/g2/track/bm/zero_g_roll_right_2_4.png new file mode 100644 index 0000000000..80c2bae88b Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_2_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_1.png b/resources/g2/track/bm/zero_g_roll_right_3_1.png new file mode 100644 index 0000000000..895a1e3388 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_2.png b/resources/g2/track/bm/zero_g_roll_right_3_2.png new file mode 100644 index 0000000000..79683a3990 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_3.png b/resources/g2/track/bm/zero_g_roll_right_3_3.png new file mode 100644 index 0000000000..0d523fc053 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_3_4.png b/resources/g2/track/bm/zero_g_roll_right_3_4.png new file mode 100644 index 0000000000..ec3f45229e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_3_4.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_1.png b/resources/g2/track/bm/zero_g_roll_right_4_1.png new file mode 100644 index 0000000000..5ee95e4206 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_1.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_2.png b/resources/g2/track/bm/zero_g_roll_right_4_2.png new file mode 100644 index 0000000000..d78be9e9c7 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_2.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_3.png b/resources/g2/track/bm/zero_g_roll_right_4_3.png new file mode 100644 index 0000000000..831d109e06 Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_3.png differ diff --git a/resources/g2/track/bm/zero_g_roll_right_4_4.png b/resources/g2/track/bm/zero_g_roll_right_4_4.png new file mode 100644 index 0000000000..7dc9a5450e Binary files /dev/null and b/resources/g2/track/bm/zero_g_roll_right_4_4.png differ diff --git a/resources/g2/track/boat_hire/flat_diag_1_1.png b/resources/g2/track/boat_hire/flat_diag_1_1.png new file mode 100644 index 0000000000..93c86a41c9 Binary files /dev/null and b/resources/g2/track/boat_hire/flat_diag_1_1.png differ diff --git a/resources/g2/track/boat_hire/flat_diag_1_2.png b/resources/g2/track/boat_hire/flat_diag_1_2.png new file mode 100644 index 0000000000..ccaff52823 Binary files /dev/null and b/resources/g2/track/boat_hire/flat_diag_1_2.png differ diff --git a/resources/g2/track/boat_hire/flat_diag_2.png b/resources/g2/track/boat_hire/flat_diag_2.png new file mode 100644 index 0000000000..5e3478d8d3 Binary files /dev/null and b/resources/g2/track/boat_hire/flat_diag_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_1.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_1.png new file mode 100644 index 0000000000..52efa2f605 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_2.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_2.png new file mode 100644 index 0000000000..9710d93d04 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_3.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_3.png new file mode 100644 index 0000000000..bc51d79659 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_4.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_4.png new file mode 100644 index 0000000000..63b27ff102 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_5.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_5.png new file mode 100644 index 0000000000..43f85a938c Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_6.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_6.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_7.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_7.png new file mode 100644 index 0000000000..12b3bd8e47 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_1_8.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_8.png new file mode 100644 index 0000000000..20bc791f33 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_1_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_1.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_1.png new file mode 100644 index 0000000000..7d43e53a1f Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_10.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_10.png new file mode 100644 index 0000000000..998e05c38f Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_10.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_2.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_2.png new file mode 100644 index 0000000000..9b3dbdc144 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_3.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_3.png new file mode 100644 index 0000000000..75a5bfcec5 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_4.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_4.png new file mode 100644 index 0000000000..285e70f853 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_5.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_5.png new file mode 100644 index 0000000000..2281567949 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_6.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_6.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_7.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_7.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_8.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_8.png new file mode 100644 index 0000000000..a1bb81aa42 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_2_9.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_9.png new file mode 100644 index 0000000000..4a0184ae6d Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_2_9.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_1.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_1.png new file mode 100644 index 0000000000..93b3902909 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_2.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_2.png new file mode 100644 index 0000000000..89f7db7bd5 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_3.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_3.png new file mode 100644 index 0000000000..f54a0ef08e Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_4.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_4.png new file mode 100644 index 0000000000..76a1fe096b Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_5.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_5.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_6.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_6.png new file mode 100644 index 0000000000..f6f3f02c92 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_7.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_7.png new file mode 100644 index 0000000000..a6eea09be8 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_3_8.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_8.png new file mode 100644 index 0000000000..7c6eb15054 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_3_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_1.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_1.png new file mode 100644 index 0000000000..4c491bc676 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_2.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_2.png new file mode 100644 index 0000000000..d5918bdf8d Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_3.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_3.png new file mode 100644 index 0000000000..603d0805cd Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_4.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_4.png new file mode 100644 index 0000000000..bcf8f00f4c Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_5.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_5.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_6.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_6.png new file mode 100644 index 0000000000..a125a67085 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_7.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_7.png new file mode 100644 index 0000000000..2553222918 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_left_to_diag_4_8.png b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_8.png new file mode 100644 index 0000000000..7cdddfa2c7 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_left_to_diag_4_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_1.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_1.png new file mode 100644 index 0000000000..2cdfb9acc8 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_2.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_2.png new file mode 100644 index 0000000000..3d6a5efb0b Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_3.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_3.png new file mode 100644 index 0000000000..876823a532 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_4.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_4.png new file mode 100644 index 0000000000..0acd5980b0 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_5.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_5.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_6.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_6.png new file mode 100644 index 0000000000..e8ae545fcb Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_7.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_7.png new file mode 100644 index 0000000000..0c35ad3216 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_1_8.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_8.png new file mode 100644 index 0000000000..57b2070a2e Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_1_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_1.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_1.png new file mode 100644 index 0000000000..dbf45ba645 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_2.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_2.png new file mode 100644 index 0000000000..654c4a0399 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_3.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_3.png new file mode 100644 index 0000000000..244af32485 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_4.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_4.png new file mode 100644 index 0000000000..1f4f234365 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_5.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_5.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_6.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_6.png new file mode 100644 index 0000000000..8aa6999a51 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_7.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_7.png new file mode 100644 index 0000000000..12113da0f5 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_2_8.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_8.png new file mode 100644 index 0000000000..a3fbf2ca20 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_2_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_1.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_1.png new file mode 100644 index 0000000000..999074e7d0 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_10.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_10.png new file mode 100644 index 0000000000..64e7db633f Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_10.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_2.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_2.png new file mode 100644 index 0000000000..d7a9fc1415 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_3.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_3.png new file mode 100644 index 0000000000..93dcbfad14 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_4.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_4.png new file mode 100644 index 0000000000..b695108b4e Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_5.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_5.png new file mode 100644 index 0000000000..35b0244333 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_6.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_6.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_7.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_7.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_8.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_8.png new file mode 100644 index 0000000000..8a01daf4f0 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_8.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_3_9.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_9.png new file mode 100644 index 0000000000..f00c854db0 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_3_9.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_1.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_1.png new file mode 100644 index 0000000000..d6e5fdcb86 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_1.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_2.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_2.png new file mode 100644 index 0000000000..93f4da3705 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_2.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_3.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_3.png new file mode 100644 index 0000000000..98149e701b Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_3.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_4.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_4.png new file mode 100644 index 0000000000..2c0c439714 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_4.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_5.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_5.png new file mode 100644 index 0000000000..6efdadf235 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_5.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_6.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_6.png new file mode 100644 index 0000000000..251476d353 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_6.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_7.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_7.png new file mode 100644 index 0000000000..86861600b5 Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_7.png differ diff --git a/resources/g2/track/boat_hire/large_turn_right_to_diag_4_8.png b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_8.png new file mode 100644 index 0000000000..cb914354fa Binary files /dev/null and b/resources/g2/track/boat_hire/large_turn_right_to_diag_4_8.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_1.png b/resources/g2/track/boat_hire/medium_turn_left_1_1.png new file mode 100644 index 0000000000..d5ee3f12e6 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_1.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_10.png b/resources/g2/track/boat_hire/medium_turn_left_1_10.png new file mode 100644 index 0000000000..2aef658add Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_10.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_2.png b/resources/g2/track/boat_hire/medium_turn_left_1_2.png new file mode 100644 index 0000000000..df54682461 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_2.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_3.png b/resources/g2/track/boat_hire/medium_turn_left_1_3.png new file mode 100644 index 0000000000..034d380fb2 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_3.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_4.png b/resources/g2/track/boat_hire/medium_turn_left_1_4.png new file mode 100644 index 0000000000..5de803fa5b Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_4.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_5.png b/resources/g2/track/boat_hire/medium_turn_left_1_5.png new file mode 100644 index 0000000000..92e5db848f Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_5.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_6.png b/resources/g2/track/boat_hire/medium_turn_left_1_6.png new file mode 100644 index 0000000000..dc81f8861a Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_6.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_7.png b/resources/g2/track/boat_hire/medium_turn_left_1_7.png new file mode 100644 index 0000000000..1f7afe8b0b Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_7.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_8.png b/resources/g2/track/boat_hire/medium_turn_left_1_8.png new file mode 100644 index 0000000000..9c4503b375 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_8.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_1_9.png b/resources/g2/track/boat_hire/medium_turn_left_1_9.png new file mode 100644 index 0000000000..81e42dbc8c Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_1_9.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_1.png b/resources/g2/track/boat_hire/medium_turn_left_2_1.png new file mode 100644 index 0000000000..b6aec9ee92 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_1.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_10.png b/resources/g2/track/boat_hire/medium_turn_left_2_10.png new file mode 100644 index 0000000000..b619907ae0 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_10.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_2.png b/resources/g2/track/boat_hire/medium_turn_left_2_2.png new file mode 100644 index 0000000000..2d1742ebde Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_2.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_3.png b/resources/g2/track/boat_hire/medium_turn_left_2_3.png new file mode 100644 index 0000000000..920a7d36f2 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_3.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_4.png b/resources/g2/track/boat_hire/medium_turn_left_2_4.png new file mode 100644 index 0000000000..f8357ee1d7 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_4.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_5.png b/resources/g2/track/boat_hire/medium_turn_left_2_5.png new file mode 100644 index 0000000000..785087d18c Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_5.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_6.png b/resources/g2/track/boat_hire/medium_turn_left_2_6.png new file mode 100644 index 0000000000..14d8234a10 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_6.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_7.png b/resources/g2/track/boat_hire/medium_turn_left_2_7.png new file mode 100644 index 0000000000..5ff4414e30 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_7.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_8.png b/resources/g2/track/boat_hire/medium_turn_left_2_8.png new file mode 100644 index 0000000000..7a4a0364e2 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_8.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_2_9.png b/resources/g2/track/boat_hire/medium_turn_left_2_9.png new file mode 100644 index 0000000000..d454774feb Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_2_9.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_1.png b/resources/g2/track/boat_hire/medium_turn_left_3_1.png new file mode 100644 index 0000000000..a9190b532d Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_1.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_10.png b/resources/g2/track/boat_hire/medium_turn_left_3_10.png new file mode 100644 index 0000000000..d39ab57c0a Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_10.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_2.png b/resources/g2/track/boat_hire/medium_turn_left_3_2.png new file mode 100644 index 0000000000..f69912c6fb Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_2.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_3.png b/resources/g2/track/boat_hire/medium_turn_left_3_3.png new file mode 100644 index 0000000000..e36271cd2c Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_3.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_4.png b/resources/g2/track/boat_hire/medium_turn_left_3_4.png new file mode 100644 index 0000000000..e1aafc5931 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_4.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_5.png b/resources/g2/track/boat_hire/medium_turn_left_3_5.png new file mode 100644 index 0000000000..958e021e90 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_5.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_6.png b/resources/g2/track/boat_hire/medium_turn_left_3_6.png new file mode 100644 index 0000000000..2a4d35f021 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_6.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_7.png b/resources/g2/track/boat_hire/medium_turn_left_3_7.png new file mode 100644 index 0000000000..34b5796dc9 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_7.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_8.png b/resources/g2/track/boat_hire/medium_turn_left_3_8.png new file mode 100644 index 0000000000..b939435255 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_8.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_3_9.png b/resources/g2/track/boat_hire/medium_turn_left_3_9.png new file mode 100644 index 0000000000..585aaa79f3 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_3_9.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_1.png b/resources/g2/track/boat_hire/medium_turn_left_4_1.png new file mode 100644 index 0000000000..18d5a4dcb9 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_1.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_10.png b/resources/g2/track/boat_hire/medium_turn_left_4_10.png new file mode 100644 index 0000000000..09435e57d1 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_10.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_2.png b/resources/g2/track/boat_hire/medium_turn_left_4_2.png new file mode 100644 index 0000000000..de7a1148ff Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_2.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_3.png b/resources/g2/track/boat_hire/medium_turn_left_4_3.png new file mode 100644 index 0000000000..df2d3794d2 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_3.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_4.png b/resources/g2/track/boat_hire/medium_turn_left_4_4.png new file mode 100644 index 0000000000..87a6aff354 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_4.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_5.png b/resources/g2/track/boat_hire/medium_turn_left_4_5.png new file mode 100644 index 0000000000..786efdfd60 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_5.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_6.png b/resources/g2/track/boat_hire/medium_turn_left_4_6.png new file mode 100644 index 0000000000..ae1b3c350e Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_6.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_7.png b/resources/g2/track/boat_hire/medium_turn_left_4_7.png new file mode 100644 index 0000000000..dda475790a Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_7.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_8.png b/resources/g2/track/boat_hire/medium_turn_left_4_8.png new file mode 100644 index 0000000000..79d7a65137 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_8.png differ diff --git a/resources/g2/track/boat_hire/medium_turn_left_4_9.png b/resources/g2/track/boat_hire/medium_turn_left_4_9.png new file mode 100644 index 0000000000..b1f88f5338 Binary files /dev/null and b/resources/g2/track/boat_hire/medium_turn_left_4_9.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_1.png b/resources/g2/track/boat_hire/s_bend_left_1_1.png new file mode 100644 index 0000000000..749c1349b1 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_1.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_2.png b/resources/g2/track/boat_hire/s_bend_left_1_2.png new file mode 100644 index 0000000000..804273372c Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_2.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_3.png b/resources/g2/track/boat_hire/s_bend_left_1_3.png new file mode 100644 index 0000000000..f785b56cf1 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_3.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_4.png b/resources/g2/track/boat_hire/s_bend_left_1_4.png new file mode 100644 index 0000000000..6cce831e5f Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_4.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_5.png b/resources/g2/track/boat_hire/s_bend_left_1_5.png new file mode 100644 index 0000000000..f2338f312a Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_5.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_6.png b/resources/g2/track/boat_hire/s_bend_left_1_6.png new file mode 100644 index 0000000000..157ec85e76 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_6.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_7.png b/resources/g2/track/boat_hire/s_bend_left_1_7.png new file mode 100644 index 0000000000..b3dea4a2bc Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_7.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_1_8.png b/resources/g2/track/boat_hire/s_bend_left_1_8.png new file mode 100644 index 0000000000..450955c962 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_1_8.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_1.png b/resources/g2/track/boat_hire/s_bend_left_2_1.png new file mode 100644 index 0000000000..c5889ead76 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_1.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_2.png b/resources/g2/track/boat_hire/s_bend_left_2_2.png new file mode 100644 index 0000000000..4e72a66261 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_2.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_3.png b/resources/g2/track/boat_hire/s_bend_left_2_3.png new file mode 100644 index 0000000000..8dc33dbce0 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_3.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_4.png b/resources/g2/track/boat_hire/s_bend_left_2_4.png new file mode 100644 index 0000000000..2020cfcfc6 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_4.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_5.png b/resources/g2/track/boat_hire/s_bend_left_2_5.png new file mode 100644 index 0000000000..b9111e0273 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_5.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_6.png b/resources/g2/track/boat_hire/s_bend_left_2_6.png new file mode 100644 index 0000000000..457ec0cbce Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_6.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_7.png b/resources/g2/track/boat_hire/s_bend_left_2_7.png new file mode 100644 index 0000000000..225a3c0501 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_7.png differ diff --git a/resources/g2/track/boat_hire/s_bend_left_2_8.png b/resources/g2/track/boat_hire/s_bend_left_2_8.png new file mode 100644 index 0000000000..9079c53dd1 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_left_2_8.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_1.png b/resources/g2/track/boat_hire/s_bend_right_1_1.png new file mode 100644 index 0000000000..c6cb44874a Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_1.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_2.png b/resources/g2/track/boat_hire/s_bend_right_1_2.png new file mode 100644 index 0000000000..87e088ca75 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_2.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_3.png b/resources/g2/track/boat_hire/s_bend_right_1_3.png new file mode 100644 index 0000000000..d035540f61 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_3.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_4.png b/resources/g2/track/boat_hire/s_bend_right_1_4.png new file mode 100644 index 0000000000..9914ce8342 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_4.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_5.png b/resources/g2/track/boat_hire/s_bend_right_1_5.png new file mode 100644 index 0000000000..d2d2e26202 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_5.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_6.png b/resources/g2/track/boat_hire/s_bend_right_1_6.png new file mode 100644 index 0000000000..d766a89112 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_6.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_7.png b/resources/g2/track/boat_hire/s_bend_right_1_7.png new file mode 100644 index 0000000000..a9b108bc0c Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_7.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_1_8.png b/resources/g2/track/boat_hire/s_bend_right_1_8.png new file mode 100644 index 0000000000..9253d28729 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_1_8.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_1.png b/resources/g2/track/boat_hire/s_bend_right_2_1.png new file mode 100644 index 0000000000..35d455b10f Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_1.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_2.png b/resources/g2/track/boat_hire/s_bend_right_2_2.png new file mode 100644 index 0000000000..4a68ef77ae Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_2.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_3.png b/resources/g2/track/boat_hire/s_bend_right_2_3.png new file mode 100644 index 0000000000..0a7938d134 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_3.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_4.png b/resources/g2/track/boat_hire/s_bend_right_2_4.png new file mode 100644 index 0000000000..7fd3e1aac9 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_4.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_5.png b/resources/g2/track/boat_hire/s_bend_right_2_5.png new file mode 100644 index 0000000000..e9174b3483 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_5.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_6.png b/resources/g2/track/boat_hire/s_bend_right_2_6.png new file mode 100644 index 0000000000..3f3fad0d53 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_6.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_7.png b/resources/g2/track/boat_hire/s_bend_right_2_7.png new file mode 100644 index 0000000000..7013bdd8d4 Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_7.png differ diff --git a/resources/g2/track/boat_hire/s_bend_right_2_8.png b/resources/g2/track/boat_hire/s_bend_right_2_8.png new file mode 100644 index 0000000000..951ac2897b Binary files /dev/null and b/resources/g2/track/boat_hire/s_bend_right_2_8.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_1_1.png b/resources/g2/track/boat_hire/small_turn_left_1_1.png new file mode 100644 index 0000000000..188172dec2 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_1_1.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_1_2.png b/resources/g2/track/boat_hire/small_turn_left_1_2.png new file mode 100644 index 0000000000..46d0af8371 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_1_2.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_1_3.png b/resources/g2/track/boat_hire/small_turn_left_1_3.png new file mode 100644 index 0000000000..50becdad95 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_1_3.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_1_4.png b/resources/g2/track/boat_hire/small_turn_left_1_4.png new file mode 100644 index 0000000000..2c5d454e0e Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_1_4.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_1_5.png b/resources/g2/track/boat_hire/small_turn_left_1_5.png new file mode 100644 index 0000000000..83d8837537 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_1_5.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_1_6.png b/resources/g2/track/boat_hire/small_turn_left_1_6.png new file mode 100644 index 0000000000..69fdae5b07 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_1_6.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_2_1.png b/resources/g2/track/boat_hire/small_turn_left_2_1.png new file mode 100644 index 0000000000..81be773d34 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_2_1.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_2_2.png b/resources/g2/track/boat_hire/small_turn_left_2_2.png new file mode 100644 index 0000000000..3ae2cf835a Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_2_2.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_2_3.png b/resources/g2/track/boat_hire/small_turn_left_2_3.png new file mode 100644 index 0000000000..592be11f91 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_2_3.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_2_4.png b/resources/g2/track/boat_hire/small_turn_left_2_4.png new file mode 100644 index 0000000000..cc002b219e Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_2_4.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_2_5.png b/resources/g2/track/boat_hire/small_turn_left_2_5.png new file mode 100644 index 0000000000..4ccd46e620 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_2_5.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_2_6.png b/resources/g2/track/boat_hire/small_turn_left_2_6.png new file mode 100644 index 0000000000..39d6860e30 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_2_6.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_3_1.png b/resources/g2/track/boat_hire/small_turn_left_3_1.png new file mode 100644 index 0000000000..9dff5077c8 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_3_1.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_3_2.png b/resources/g2/track/boat_hire/small_turn_left_3_2.png new file mode 100644 index 0000000000..09c5a72917 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_3_2.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_3_3.png b/resources/g2/track/boat_hire/small_turn_left_3_3.png new file mode 100644 index 0000000000..03dbb819c2 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_3_3.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_3_4.png b/resources/g2/track/boat_hire/small_turn_left_3_4.png new file mode 100644 index 0000000000..71eddb8b89 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_3_4.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_3_5.png b/resources/g2/track/boat_hire/small_turn_left_3_5.png new file mode 100644 index 0000000000..14c0febc5e Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_3_5.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_3_6.png b/resources/g2/track/boat_hire/small_turn_left_3_6.png new file mode 100644 index 0000000000..9fc72c2f0f Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_3_6.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_4_1.png b/resources/g2/track/boat_hire/small_turn_left_4_1.png new file mode 100644 index 0000000000..c297380723 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_4_1.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_4_2.png b/resources/g2/track/boat_hire/small_turn_left_4_2.png new file mode 100644 index 0000000000..0420e0f32c Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_4_2.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_4_3.png b/resources/g2/track/boat_hire/small_turn_left_4_3.png new file mode 100644 index 0000000000..38241ff3ae Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_4_3.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_4_4.png b/resources/g2/track/boat_hire/small_turn_left_4_4.png new file mode 100644 index 0000000000..6f19fdf62a Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_4_4.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_4_5.png b/resources/g2/track/boat_hire/small_turn_left_4_5.png new file mode 100644 index 0000000000..b80ca59c59 Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_4_5.png differ diff --git a/resources/g2/track/boat_hire/small_turn_left_4_6.png b/resources/g2/track/boat_hire/small_turn_left_4_6.png new file mode 100644 index 0000000000..6971d8df5c Binary files /dev/null and b/resources/g2/track/boat_hire/small_turn_left_4_6.png differ diff --git a/resources/g2/track/lattice_triangle/diagonal_booster_0.png b/resources/g2/track/lattice_triangle/diagonal_booster_0.png new file mode 100644 index 0000000000..b3260656d3 Binary files /dev/null and b/resources/g2/track/lattice_triangle/diagonal_booster_0.png differ diff --git a/resources/g2/track/lattice_triangle/diagonal_booster_1.png b/resources/g2/track/lattice_triangle/diagonal_booster_1.png new file mode 100644 index 0000000000..cb2f306260 Binary files /dev/null and b/resources/g2/track/lattice_triangle/diagonal_booster_1.png differ diff --git a/resources/g2/track/lattice_triangle/diagonal_booster_alt_0.png b/resources/g2/track/lattice_triangle/diagonal_booster_alt_0.png new file mode 100644 index 0000000000..259e83f917 Binary files /dev/null and b/resources/g2/track/lattice_triangle/diagonal_booster_alt_0.png differ diff --git a/resources/g2/track/lattice_triangle/diagonal_booster_alt_1.png b/resources/g2/track/lattice_triangle/diagonal_booster_alt_1.png new file mode 100644 index 0000000000..98715fb7e8 Binary files /dev/null and b/resources/g2/track/lattice_triangle/diagonal_booster_alt_1.png differ diff --git a/resources/g2/track/lattice_triangle/diagonal_booster_alt_2.png b/resources/g2/track/lattice_triangle/diagonal_booster_alt_2.png new file mode 100644 index 0000000000..879a700f1b Binary files /dev/null and b/resources/g2/track/lattice_triangle/diagonal_booster_alt_2.png differ diff --git a/resources/g2/track/lattice_triangle/diagonal_booster_alt_3.png b/resources/g2/track/lattice_triangle/diagonal_booster_alt_3.png new file mode 100644 index 0000000000..7b160e3e18 Binary files /dev/null and b/resources/g2/track/lattice_triangle/diagonal_booster_alt_3.png differ diff --git a/resources/g2/track/standup/25455.png b/resources/g2/track/standup/25455.png new file mode 100644 index 0000000000..6bcf750694 Binary files /dev/null and b/resources/g2/track/standup/25455.png differ diff --git a/resources/g2/track/standup/25457.png b/resources/g2/track/standup/25457.png new file mode 100644 index 0000000000..3c9d50ca96 Binary files /dev/null and b/resources/g2/track/standup/25457.png differ diff --git a/resources/g2/track/standup/25459.png b/resources/g2/track/standup/25459.png new file mode 100644 index 0000000000..26ad69b6c3 Binary files /dev/null and b/resources/g2/track/standup/25459.png differ diff --git a/resources/g2/track/standup/25461.png b/resources/g2/track/standup/25461.png new file mode 100644 index 0000000000..6a18060384 Binary files /dev/null and b/resources/g2/track/standup/25461.png differ diff --git a/resources/g2/track/standup/25462.png b/resources/g2/track/standup/25462.png new file mode 100644 index 0000000000..a0133a9dfd Binary files /dev/null and b/resources/g2/track/standup/25462.png differ diff --git a/resources/g2/track/standup/25463.png b/resources/g2/track/standup/25463.png new file mode 100644 index 0000000000..6f93d84ec5 Binary files /dev/null and b/resources/g2/track/standup/25463.png differ diff --git a/resources/g2/track/standup/25464.png b/resources/g2/track/standup/25464.png new file mode 100644 index 0000000000..c5ab71e08b Binary files /dev/null and b/resources/g2/track/standup/25464.png differ diff --git a/resources/g2/track/standup/25466.png b/resources/g2/track/standup/25466.png new file mode 100644 index 0000000000..cbc8113105 Binary files /dev/null and b/resources/g2/track/standup/25466.png differ diff --git a/resources/g2/track/standup/25468.png b/resources/g2/track/standup/25468.png new file mode 100644 index 0000000000..35a6482a3e Binary files /dev/null and b/resources/g2/track/standup/25468.png differ diff --git a/resources/g2/track/standup/25470.png b/resources/g2/track/standup/25470.png new file mode 100644 index 0000000000..9c28d66924 Binary files /dev/null and b/resources/g2/track/standup/25470.png differ diff --git a/resources/g2/track/standup/25471.png b/resources/g2/track/standup/25471.png new file mode 100644 index 0000000000..f3c7e44b7d Binary files /dev/null and b/resources/g2/track/standup/25471.png differ diff --git a/resources/g2/track/standup/25472.png b/resources/g2/track/standup/25472.png new file mode 100644 index 0000000000..1730f0c825 Binary files /dev/null and b/resources/g2/track/standup/25472.png differ diff --git a/resources/g2/track/standup/25473.png b/resources/g2/track/standup/25473.png new file mode 100644 index 0000000000..7850ffa7f7 Binary files /dev/null and b/resources/g2/track/standup/25473.png differ diff --git a/resources/g2/track/standup/25521.png b/resources/g2/track/standup/25521.png new file mode 100644 index 0000000000..d706c59ce4 Binary files /dev/null and b/resources/g2/track/standup/25521.png differ diff --git a/resources/g2/track/standup/25523.png b/resources/g2/track/standup/25523.png new file mode 100644 index 0000000000..ab93b63fd4 Binary files /dev/null and b/resources/g2/track/standup/25523.png differ diff --git a/resources/g2/track/standup/25526.png b/resources/g2/track/standup/25526.png new file mode 100644 index 0000000000..3eefbeef53 Binary files /dev/null and b/resources/g2/track/standup/25526.png differ diff --git a/resources/g2/track/standup/25528.png b/resources/g2/track/standup/25528.png new file mode 100644 index 0000000000..ecbeed208a Binary files /dev/null and b/resources/g2/track/standup/25528.png differ diff --git a/resources/g2/track/standup/25530.png b/resources/g2/track/standup/25530.png new file mode 100644 index 0000000000..2f2aafdd73 Binary files /dev/null and b/resources/g2/track/standup/25530.png differ diff --git a/resources/g2/track/standup/25659.png b/resources/g2/track/standup/25659.png new file mode 100644 index 0000000000..562ee358e8 Binary files /dev/null and b/resources/g2/track/standup/25659.png differ diff --git a/resources/g2/track/standup/25661.png b/resources/g2/track/standup/25661.png new file mode 100644 index 0000000000..6e825f4a09 Binary files /dev/null and b/resources/g2/track/standup/25661.png differ diff --git a/resources/g2/track/standup/25664.png b/resources/g2/track/standup/25664.png new file mode 100644 index 0000000000..b95d69f8ac Binary files /dev/null and b/resources/g2/track/standup/25664.png differ diff --git a/resources/g2/track/standup/25665.png b/resources/g2/track/standup/25665.png new file mode 100644 index 0000000000..775c009d29 Binary files /dev/null and b/resources/g2/track/standup/25665.png differ diff --git a/resources/g2/track/standup/25666.png b/resources/g2/track/standup/25666.png new file mode 100644 index 0000000000..8154bcbc87 Binary files /dev/null and b/resources/g2/track/standup/25666.png differ diff --git a/resources/g2/track/standup/25668.png b/resources/g2/track/standup/25668.png new file mode 100644 index 0000000000..f4b9ad0d78 Binary files /dev/null and b/resources/g2/track/standup/25668.png differ diff --git a/resources/g2/track/standup/25672.png b/resources/g2/track/standup/25672.png new file mode 100644 index 0000000000..b7b65dd513 Binary files /dev/null and b/resources/g2/track/standup/25672.png differ diff --git a/resources/g2/track/standup/25673.png b/resources/g2/track/standup/25673.png new file mode 100644 index 0000000000..019299f9b7 Binary files /dev/null and b/resources/g2/track/standup/25673.png differ diff --git a/resources/g2/track/standup/25676.png b/resources/g2/track/standup/25676.png new file mode 100644 index 0000000000..375acafa9d Binary files /dev/null and b/resources/g2/track/standup/25676.png differ diff --git a/resources/g2/track/standup/25677.png b/resources/g2/track/standup/25677.png new file mode 100644 index 0000000000..a3cb8884cb Binary files /dev/null and b/resources/g2/track/standup/25677.png differ diff --git a/resources/g2/track/standup/25680.png b/resources/g2/track/standup/25680.png new file mode 100644 index 0000000000..f0d9e2548d Binary files /dev/null and b/resources/g2/track/standup/25680.png differ diff --git a/resources/g2/track/standup/25684.png b/resources/g2/track/standup/25684.png new file mode 100644 index 0000000000..a6b104ad85 Binary files /dev/null and b/resources/g2/track/standup/25684.png differ diff --git a/resources/g2/track/standup/25685.png b/resources/g2/track/standup/25685.png new file mode 100644 index 0000000000..6dcf97109f Binary files /dev/null and b/resources/g2/track/standup/25685.png differ diff --git a/resources/g2/track/standup/25686.png b/resources/g2/track/standup/25686.png new file mode 100644 index 0000000000..972cfe971f Binary files /dev/null and b/resources/g2/track/standup/25686.png differ diff --git a/resources/g2/track/standup/25687.png b/resources/g2/track/standup/25687.png new file mode 100644 index 0000000000..7ce24146d7 Binary files /dev/null and b/resources/g2/track/standup/25687.png differ diff --git a/resources/g2/track/standup/25689.png b/resources/g2/track/standup/25689.png new file mode 100644 index 0000000000..d8c7f39452 Binary files /dev/null and b/resources/g2/track/standup/25689.png differ diff --git a/resources/g2/track/standup/25781.png b/resources/g2/track/standup/25781.png new file mode 100644 index 0000000000..5fef810314 Binary files /dev/null and b/resources/g2/track/standup/25781.png differ diff --git a/resources/g2/track/standup/25783.png b/resources/g2/track/standup/25783.png new file mode 100644 index 0000000000..54e4784be9 Binary files /dev/null and b/resources/g2/track/standup/25783.png differ diff --git a/resources/g2/track/standup/25785.png b/resources/g2/track/standup/25785.png new file mode 100644 index 0000000000..260f520db1 Binary files /dev/null and b/resources/g2/track/standup/25785.png differ diff --git a/resources/g2/track/standup/25787.png b/resources/g2/track/standup/25787.png new file mode 100644 index 0000000000..f8d0c670ca Binary files /dev/null and b/resources/g2/track/standup/25787.png differ diff --git a/resources/g2/track/standup/25788.png b/resources/g2/track/standup/25788.png new file mode 100644 index 0000000000..f20e54eb57 Binary files /dev/null and b/resources/g2/track/standup/25788.png differ diff --git a/resources/g2/track/standup/25792.png b/resources/g2/track/standup/25792.png new file mode 100644 index 0000000000..b3d6a84e06 Binary files /dev/null and b/resources/g2/track/standup/25792.png differ diff --git a/resources/g2/track/standup/25794.png b/resources/g2/track/standup/25794.png new file mode 100644 index 0000000000..529edfe3b5 Binary files /dev/null and b/resources/g2/track/standup/25794.png differ diff --git a/resources/g2/track/standup/25796.png b/resources/g2/track/standup/25796.png new file mode 100644 index 0000000000..88d87285c6 Binary files /dev/null and b/resources/g2/track/standup/25796.png differ diff --git a/resources/g2/track/standup/25797.png b/resources/g2/track/standup/25797.png new file mode 100644 index 0000000000..4effad4389 Binary files /dev/null and b/resources/g2/track/standup/25797.png differ diff --git a/resources/g2/track/standup/25798.png b/resources/g2/track/standup/25798.png new file mode 100644 index 0000000000..6b18a9b871 Binary files /dev/null and b/resources/g2/track/standup/25798.png differ diff --git a/resources/g2/track/standup/25799.png b/resources/g2/track/standup/25799.png new file mode 100644 index 0000000000..bc00e610dd Binary files /dev/null and b/resources/g2/track/standup/25799.png differ diff --git a/resources/g2/track/standup/25803.png b/resources/g2/track/standup/25803.png new file mode 100644 index 0000000000..aaa3ffa182 Binary files /dev/null and b/resources/g2/track/standup/25803.png differ diff --git a/resources/g2/track/standup/25805.png b/resources/g2/track/standup/25805.png new file mode 100644 index 0000000000..e1fdaff5e8 Binary files /dev/null and b/resources/g2/track/standup/25805.png differ diff --git a/resources/g2/track/standup/25807.png b/resources/g2/track/standup/25807.png new file mode 100644 index 0000000000..7efece319e Binary files /dev/null and b/resources/g2/track/standup/25807.png differ diff --git a/resources/g2/track/standup/25809.png b/resources/g2/track/standup/25809.png new file mode 100644 index 0000000000..ce7dfbcebb Binary files /dev/null and b/resources/g2/track/standup/25809.png differ diff --git a/resources/g2/track/standup/25810.png b/resources/g2/track/standup/25810.png new file mode 100644 index 0000000000..d820835446 Binary files /dev/null and b/resources/g2/track/standup/25810.png differ diff --git a/resources/g2/track/standup/25811.png b/resources/g2/track/standup/25811.png new file mode 100644 index 0000000000..68b91d9fcd Binary files /dev/null and b/resources/g2/track/standup/25811.png differ diff --git a/resources/g2/track/standup/25812.png b/resources/g2/track/standup/25812.png new file mode 100644 index 0000000000..dfd2437beb Binary files /dev/null and b/resources/g2/track/standup/25812.png differ diff --git a/resources/g2/track/standup/25814.png b/resources/g2/track/standup/25814.png new file mode 100644 index 0000000000..6e528c4167 Binary files /dev/null and b/resources/g2/track/standup/25814.png differ diff --git a/resources/g2/track/standup/25816.png b/resources/g2/track/standup/25816.png new file mode 100644 index 0000000000..3a1e0a1f71 Binary files /dev/null and b/resources/g2/track/standup/25816.png differ diff --git a/resources/g2/track/standup/25820.png b/resources/g2/track/standup/25820.png new file mode 100644 index 0000000000..53159afd1a Binary files /dev/null and b/resources/g2/track/standup/25820.png differ diff --git a/resources/g2/track/standup/25821.png b/resources/g2/track/standup/25821.png new file mode 100644 index 0000000000..179bc68158 Binary files /dev/null and b/resources/g2/track/standup/25821.png differ diff --git a/resources/g2/track/standup/25825.png b/resources/g2/track/standup/25825.png new file mode 100644 index 0000000000..112cf37168 Binary files /dev/null and b/resources/g2/track/standup/25825.png differ diff --git a/resources/g2/track/standup/25827.png b/resources/g2/track/standup/25827.png new file mode 100644 index 0000000000..deaff64a3a Binary files /dev/null and b/resources/g2/track/standup/25827.png differ diff --git a/resources/g2/track/standup/25834.png b/resources/g2/track/standup/25834.png new file mode 100644 index 0000000000..f9fb397848 Binary files /dev/null and b/resources/g2/track/standup/25834.png differ diff --git a/resources/g2/track/standup/25835.png b/resources/g2/track/standup/25835.png new file mode 100644 index 0000000000..8b6a31987b Binary files /dev/null and b/resources/g2/track/standup/25835.png differ diff --git a/resources/g2/track/standup/25843.png b/resources/g2/track/standup/25843.png new file mode 100644 index 0000000000..422182453e Binary files /dev/null and b/resources/g2/track/standup/25843.png differ diff --git a/resources/g2/track/standup/25844.png b/resources/g2/track/standup/25844.png new file mode 100644 index 0000000000..dd1f913620 Binary files /dev/null and b/resources/g2/track/standup/25844.png differ diff --git a/scripts/build b/scripts/build index c1dbe3a00a..5e6164d204 100755 --- a/scripts/build +++ b/scripts/build @@ -12,17 +12,15 @@ cd $basedir if [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]]; then # Patch version.h - if [[ -n "$OPENRCT2_BUILD" ]]; then - echo -e "\033[0;36mPatching version.h...\033[0m" - fileversion=$OPENRCT2_VERSION.$OPENRCT2_BUILD - productversion="$fileversion-${OPENRCT2_SHA1_SHORT}" - fileversion=${fileversion//./,} - # FILEVERSION in the resource file can only take up to 4 digits in the version string, so we remove the surplus of version numbers - fileversion=$(echo $fileversion | cut -f1-4 -d",") - echo "#define OPENRCT2_FILE_VERSION $fileversion" > "resources/version.h" - echo "#define OPENRCT2_PRODUCT_VERSION \"$productversion\"" >> "resources/version.h" - cat "resources/version.h" - fi + echo -e "\033[0;36mPatching version.h...\033[0m" + fileversion=$OPENRCT2_VERSION.$OPENRCT2_BUILD + productversion="$fileversion-${OPENRCT2_SHA1_SHORT}" + fileversion=${fileversion//./,} + # FILEVERSION in the resource file can only take up to 4 digits in the version string, so we remove the surplus of version numbers + fileversion=$(echo $fileversion | cut -f1-4 -d",") + echo "#define OPENRCT2_FILE_VERSION $fileversion" > "resources/version.h" + echo "#define OPENRCT2_PRODUCT_VERSION \"$productversion\"" >> "resources/version.h" + cat "resources/version.h" # Build everything echo -e "\033[0;36mBuilding OpenRCT2 for Windows $CONFIGURATION|$PLATFORM...\033[0m" diff --git a/scripts/build-portable b/scripts/build-portable index 50b85d251e..61cda98659 100755 --- a/scripts/build-portable +++ b/scripts/build-portable @@ -22,6 +22,7 @@ if [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]]; then 7z a -r $destination \ openrct2.exe openrct2.com data \ ../contributors.md \ + ../PRIVACY.md \ ../licence.txt \ ../distribution/changelog.txt \ ../distribution/readme.txt \ diff --git a/scripts/setenv b/scripts/setenv index 9ad51e1643..ef2593f60e 100755 --- a/scripts/setenv +++ b/scripts/setenv @@ -16,9 +16,7 @@ echo -e "\033[0;36mSetting up environment for OpenRCT2...\033[0m" # Get the build number (number of commits since last tag) get_build_number() { - local pattern='.+-([0-9]+)-.+' - [[ $OPENRCT2_DESCRIBE =~ $pattern ]] - echo "${BASH_REMATCH[1]}" + echo "${DISTANCE_FROM_TAG}" } export OPENRCT2_BUILD=$(get_build_number) diff --git a/src/openrct2-android/app/src/main/CMakeLists.txt b/src/openrct2-android/app/src/main/CMakeLists.txt index 4e3dfb59db..43129b5317 100644 --- a/src/openrct2-android/app/src/main/CMakeLists.txt +++ b/src/openrct2-android/app/src/main/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.8.0) +cmake_minimum_required(VERSION 3.10) project(openrct2-android CXX) diff --git a/src/openrct2-cli/CMakeLists.txt b/src/openrct2-cli/CMakeLists.txt index 7fb991eaac..0c0d258704 100644 --- a/src/openrct2-cli/CMakeLists.txt +++ b/src/openrct2-cli/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.9) +cmake_minimum_required(VERSION 3.10) + project(openrct2-cli CXX) if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) diff --git a/src/openrct2-ui/CMakeLists.txt b/src/openrct2-ui/CMakeLists.txt index a9b1986b16..d98a5a159f 100644 --- a/src/openrct2-ui/CMakeLists.txt +++ b/src/openrct2-ui/CMakeLists.txt @@ -1,5 +1,6 @@ # CMAKE project for openrct2-ui (UI build of OpenRCT2) -cmake_minimum_required(VERSION 3.9) +cmake_minimum_required(VERSION 3.10) + if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) message(FATAL_ERROR "Building in-source is not supported! Create a build dir and remove ${CMAKE_SOURCE_DIR}/CMakeCache.txt") endif () @@ -157,7 +158,7 @@ endif () # Only valid for Clang for now: # - GCC 8 does not support -Wno-pragma-once-outside-header # - Other compilers status unknown -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +if (ENABLE_HEADERS_CHECK AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(OPENRCT2_HEADERS_CHECK ${OPENRCT2_UI_HEADERS}) # OpenGLAPIProc.h is not meant to be included directly. list(REMOVE_ITEM OPENRCT2_HEADERS_CHECK "${CMAKE_CURRENT_LIST_DIR}/drawing/engines/opengl/OpenGLAPIProc.h") @@ -183,6 +184,7 @@ if(MACOS_BUNDLE) PUBLIC ${ROOT_DIR}/distribution/readme.txt PUBLIC ${ROOT_DIR}/distribution/changelog.txt PUBLIC ${ROOT_DIR}/contributors.md + PUBLIC ${ROOT_DIR}/PRIVACY.md PUBLIC ${ROOT_DIR}/resources/mac/openrct2.icns ) @@ -191,6 +193,7 @@ if(MACOS_BUNDLE) ${ROOT_DIR}/distribution/readme.txt ${ROOT_DIR}/distribution/changelog.txt ${ROOT_DIR}/contributors.md + ${ROOT_DIR}/PRIVACY.md ${ROOT_DIR}/resources/mac/openrct2.icns ) diff --git a/src/openrct2-ui/TextComposition.cpp b/src/openrct2-ui/TextComposition.cpp index da08505389..282b4c5f8f 100644 --- a/src/openrct2-ui/TextComposition.cpp +++ b/src/openrct2-ui/TextComposition.cpp @@ -20,10 +20,10 @@ #include #ifdef __MACOSX__ -// macOS uses COMMAND rather than CTRL for many keyboard shortcuts -# define KEYBOARD_PRIMARY_MODIFIER KMOD_GUI + // macOS uses COMMAND rather than CTRL for many keyboard shortcuts + #define KEYBOARD_PRIMARY_MODIFIER KMOD_GUI #else -# define KEYBOARD_PRIMARY_MODIFIER KMOD_CTRL + #define KEYBOARD_PRIMARY_MODIFIER KMOD_CTRL #endif using namespace OpenRCT2; diff --git a/src/openrct2-ui/UiContext.Android.cpp b/src/openrct2-ui/UiContext.Android.cpp index 0293c151a0..7ba0237ace 100644 --- a/src/openrct2-ui/UiContext.Android.cpp +++ b/src/openrct2-ui/UiContext.Android.cpp @@ -9,17 +9,17 @@ #ifdef __ANDROID__ -# include "UiContext.h" + #include "UiContext.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Ui { diff --git a/src/openrct2-ui/UiContext.Linux.cpp b/src/openrct2-ui/UiContext.Linux.cpp index bf5f0158e3..9f943e7412 100644 --- a/src/openrct2-ui/UiContext.Linux.cpp +++ b/src/openrct2-ui/UiContext.Linux.cpp @@ -9,23 +9,23 @@ #if (defined(__unix__) || defined(__EMSCRIPTEN__)) && !defined(__ANDROID__) && !defined(__APPLE__) -# include "UiContext.h" + #include "UiContext.h" -# include "UiStringIds.h" + #include "UiStringIds.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Ui { @@ -52,7 +52,7 @@ namespace OpenRCT2::Ui bool IsSteamOverlayAttached() override { -# ifdef __linux__ + #ifdef __linux__ // See http://syprog.blogspot.ru/2011/12/listing-loaded-shared-objects-in-linux.html struct lmap { @@ -87,9 +87,9 @@ namespace OpenRCT2::Ui dlclose(processHandle); } return result; -# else + #else return false; // Needed for OpenBSD, likely all other Unixes. -# endif + #endif } void ShowMessageBox(SDL_Window* window, const std::string& message) override diff --git a/src/openrct2-ui/UiContext.Win32.cpp b/src/openrct2-ui/UiContext.Win32.cpp index 317c96a200..db7379e452 100644 --- a/src/openrct2-ui/UiContext.Win32.cpp +++ b/src/openrct2-ui/UiContext.Win32.cpp @@ -9,30 +9,30 @@ #ifdef _WIN32 -// Windows.h needs to be included first // clang-format off -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include -# include -# include + // windows.h needs to be included first + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include + #include + #undef CreateWindow // clang-format on -# undef CreateWindow -// Then the rest -# include "UiContext.h" + // Then the rest + #include "UiContext.h" -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include -// Native resource IDs -# include "../../resources/resource.h" + // Native resource IDs + #include "../../resources/resource.h" using namespace Microsoft::WRL; diff --git a/src/openrct2-ui/UiContext.cpp b/src/openrct2-ui/UiContext.cpp index 885463cc1f..cb8d98b072 100644 --- a/src/openrct2-ui/UiContext.cpp +++ b/src/openrct2-ui/UiContext.cpp @@ -55,10 +55,10 @@ using namespace OpenRCT2::Scripting; using namespace OpenRCT2::Ui; #ifdef __MACOSX__ -// macOS uses COMMAND rather than CTRL for many keyboard shortcuts -# define KEYBOARD_PRIMARY_MODIFIER KMOD_GUI + // macOS uses COMMAND rather than CTRL for many keyboard shortcuts + #define KEYBOARD_PRIMARY_MODIFIER KMOD_GUI #else -# define KEYBOARD_PRIMARY_MODIFIER KMOD_CTRL + #define KEYBOARD_PRIMARY_MODIFIER KMOD_CTRL #endif class UiContext final : public IUiContext diff --git a/src/openrct2-ui/UiStringIds.h b/src/openrct2-ui/UiStringIds.h index 93f1086549..e706b417a4 100644 --- a/src/openrct2-ui/UiStringIds.h +++ b/src/openrct2-ui/UiStringIds.h @@ -455,6 +455,7 @@ namespace OpenRCT2 STR_DEBUG_PAINT_SHOW_DIRTY_VISUALS = 6144, STR_DEBUG_PAINT_SHOW_SEGMENT_HEIGHTS = 5901, STR_DEBUG_PAINT_SHOW_WIDE_PATHS = 6261, + STR_DEBUG_PAINT_STABLE_SORT = 6710, // Window: DemolishRidePrompt STR_DEMOLISH = 994, @@ -908,7 +909,7 @@ namespace OpenRCT2 STR_ENTER_MIN_LAND = 6691, STR_ENTER_MIN_TREE_ALTITUDE = 6695, STR_ENTER_OCTAVES = 6703, - STR_ENTER_SMOOTH_STRENGTH = 6708, + STR_ENTER_SMOOTH_STRENGTH = 6709, STR_ENTER_TREE_TO_LAND_RATIO = 6699, STR_ENTER_WATER_LEVEL = 5186, STR_HEIGHTMAP_FILE = 6681, @@ -944,9 +945,9 @@ namespace OpenRCT2 STR_MIN_TREE_ALTITUDE = 6694, STR_SIMPLEX_BASE_FREQUENCY = 6700, STR_SIMPLEX_OCTAVES = 6702, - STR_SMOOTH_STRENGTH = 6709, + STR_SMOOTH_STRENGTH = 6708, STR_TERRAIN_LABEL = 2693, - STR_TREE_TO_LAND_RATIO = 6694, + STR_TREE_TO_LAND_RATIO = 6698, STR_WATER_LEVEL = 5185, STR_WATER_LEVEL_LABEL = 2692, diff --git a/src/openrct2-ui/WindowManager.cpp b/src/openrct2-ui/WindowManager.cpp index 07e85644d9..dfdf3684dd 100644 --- a/src/openrct2-ui/WindowManager.cpp +++ b/src/openrct2-ui/WindowManager.cpp @@ -246,8 +246,8 @@ public: { uint32_t type = intent->GetUIntExtra(INTENT_EXTRA_LOADSAVE_TYPE); std::string defaultName = intent->GetStringExtra(INTENT_EXTRA_PATH); - loadsave_callback callback = reinterpret_cast( - intent->GetPointerExtra(INTENT_EXTRA_CALLBACK)); + LoadSaveCallback callback = reinterpret_cast( + intent->GetCloseCallbackExtra(INTENT_EXTRA_CALLBACK)); TrackDesign* trackDesign = static_cast(intent->GetPointerExtra(INTENT_EXTRA_TRACK_DESIGN)); auto* w = LoadsaveOpen( type, defaultName, @@ -265,7 +265,7 @@ public: case WindowClass::NetworkStatus: { std::string message = intent->GetStringExtra(INTENT_EXTRA_MESSAGE); - close_callback callback = intent->GetCloseCallbackExtra(INTENT_EXTRA_CALLBACK); + CloseCallback callback = intent->GetCloseCallbackExtra(INTENT_EXTRA_CALLBACK); return NetworkStatusOpen(message, callback); } case WindowClass::ObjectLoadError: @@ -294,7 +294,7 @@ public: } case WindowClass::ScenarioSelect: return ScenarioselectOpen( - reinterpret_cast(intent->GetPointerExtra(INTENT_EXTRA_CALLBACK))); + reinterpret_cast(intent->GetCloseCallbackExtra(INTENT_EXTRA_CALLBACK))); case WindowClass::Null: // Intent does not hold a window class @@ -335,7 +335,7 @@ public: case INTENT_ACTION_PROGRESS_OPEN: { std::string message = intent->GetStringExtra(INTENT_EXTRA_MESSAGE); - close_callback callback = intent->GetCloseCallbackExtra(INTENT_EXTRA_CALLBACK); + CloseCallback callback = intent->GetCloseCallbackExtra(INTENT_EXTRA_CALLBACK); return ProgressWindowOpen(message, callback); } diff --git a/src/openrct2-ui/audio/FlacAudioSource.cpp b/src/openrct2-ui/audio/FlacAudioSource.cpp index 7b76758fcb..757e9487ad 100644 --- a/src/openrct2-ui/audio/FlacAudioSource.cpp +++ b/src/openrct2-ui/audio/FlacAudioSource.cpp @@ -13,10 +13,10 @@ #include #ifndef DISABLE_FLAC -# include -# include -# include -# include + #include + #include + #include + #include #endif namespace OpenRCT2::Audio diff --git a/src/openrct2-ui/audio/OggAudioSource.cpp b/src/openrct2-ui/audio/OggAudioSource.cpp index 214767dd04..803253fc2c 100644 --- a/src/openrct2-ui/audio/OggAudioSource.cpp +++ b/src/openrct2-ui/audio/OggAudioSource.cpp @@ -14,10 +14,10 @@ #include #ifndef DISABLE_VORBIS -# include -# include -# include -# include + #include + #include + #include + #include #endif namespace OpenRCT2::Audio diff --git a/src/openrct2-ui/audio/SDLAudioSource.h b/src/openrct2-ui/audio/SDLAudioSource.h index 5a5533cef8..37afb7d377 100644 --- a/src/openrct2-ui/audio/SDLAudioSource.h +++ b/src/openrct2-ui/audio/SDLAudioSource.h @@ -22,9 +22,9 @@ namespace OpenRCT2::Audio struct IAudioMixer; #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" -# pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif class SDLAudioSource : public IAudioSource { @@ -46,7 +46,7 @@ namespace OpenRCT2::Audio IAudioMixer* GetMixer(); }; #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif std::unique_ptr CreateAudioSource(SDL_RWops* rw); diff --git a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp index f16d14c5bc..fbfb3dc6ea 100644 --- a/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/HardwareDisplayDrawingEngine.cpp @@ -150,7 +150,9 @@ public: SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "0"); _screenTexture = SDL_CreateTexture(_sdlRenderer, pixelFormat, SDL_TEXTUREACCESS_STREAMING, width, height); - Guard::Assert(_screenTexture != nullptr, "Failed to create screen texture: %s", SDL_GetError()); + Guard::Assert( + _screenTexture != nullptr, "Failed to create unscaled screen texture (%ux%u, pixelFormat = %u): %s", width, + height, pixelFormat, SDL_GetError()); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, scaleQualityBuffer); @@ -158,12 +160,17 @@ public: _scaledScreenTexture = SDL_CreateTexture( _sdlRenderer, pixelFormat, SDL_TEXTUREACCESS_TARGET, width * scale, height * scale); - Guard::Assert(_scaledScreenTexture != nullptr, "Failed to create scaled screen texture: %s", SDL_GetError()); + Guard::Assert( + _scaledScreenTexture != nullptr, + "Failed to create scaled screen texture (%ux%u, scale = %u, pixelFormat = %u): %s", width, height, scale, + pixelFormat, SDL_GetError()); } else { _screenTexture = SDL_CreateTexture(_sdlRenderer, pixelFormat, SDL_TEXTUREACCESS_STREAMING, width, height); - Guard::Assert(_screenTexture != nullptr, "Failed to create screen texture: %s", SDL_GetError()); + Guard::Assert( + _screenTexture != nullptr, "Failed to create screen texture (%ux%u, pixelFormat = %u): %s", width, height, + pixelFormat, SDL_GetError()); } uint32_t format; diff --git a/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp b/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp index bcd74090c7..5fa541f612 100644 --- a/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/ApplyPaletteShader.cpp @@ -9,7 +9,7 @@ #ifndef DISABLE_OPENGL -# include "ApplyPaletteShader.h" + #include "ApplyPaletteShader.h" using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp b/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp index 7bbb1f2f4b..0f35d335a8 100644 --- a/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/ApplyTransparencyShader.cpp @@ -9,7 +9,7 @@ #ifndef DISABLE_OPENGL -# include "ApplyTransparencyShader.h" + #include "ApplyTransparencyShader.h" using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp b/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp index 5b0ed0df48..06ebe29e16 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/DrawLineShader.cpp @@ -9,9 +9,9 @@ #ifndef DISABLE_OPENGL -# include "DrawLineShader.h" + #include "DrawLineShader.h" -# include "OpenGLFramebuffer.h" + #include "OpenGLFramebuffer.h" using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp b/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp index ed43dddb34..f473806d53 100644 --- a/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/DrawRectShader.cpp @@ -9,7 +9,7 @@ #ifndef DISABLE_OPENGL -# include "DrawRectShader.h" + #include "DrawRectShader.h" using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp index d54f1c70cc..31347ad169 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.cpp @@ -9,20 +9,20 @@ #ifndef DISABLE_OPENGL -# include "OpenGLAPI.h" + #include "OpenGLAPI.h" -# if OPENGL_NO_LINK + #if OPENGL_NO_LINK -# define OPENGL_PROC(TYPE, PROC) TYPE PROC = nullptr; -# include "OpenGLAPIProc.h" -# undef OPENGL_PROC + #define OPENGL_PROC(TYPE, PROC) TYPE PROC = nullptr; + #include "OpenGLAPIProc.h" + #undef OPENGL_PROC -# include -# include + #include + #include static const char* TryLoadAllProcAddresses() { -# define OPENGL_PROC(TYPE, PROC) \ + #define OPENGL_PROC(TYPE, PROC) \ { \ PROC = reinterpret_cast(SDL_GL_GetProcAddress(#PROC)); \ if (PROC == nullptr) \ @@ -30,13 +30,13 @@ static const char* TryLoadAllProcAddresses() return #PROC; \ } \ } -# include "OpenGLAPIProc.h" -# undef OPENGL_PROC + #include "OpenGLAPIProc.h" + #undef OPENGL_PROC return nullptr; } -# endif /* #if OPENGL_NO_LINK */ + #endif /* #if OPENGL_NO_LINK */ using namespace OpenRCT2::Ui; @@ -65,14 +65,14 @@ bool OpenGLAPI::Initialise() { OpenGLState::Reset(); -# ifdef OPENGL_NO_LINK + #ifdef OPENGL_NO_LINK const char* failedProcName = TryLoadAllProcAddresses(); if (failedProcName != nullptr) { Console::Error::WriteLine("Failed to load %s.", failedProcName); return false; } -# endif + #endif return true; } diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h index 185a81463d..4c0302d555 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPI.h @@ -13,31 +13,31 @@ #ifdef OPENGL_NO_LINK -// BEGIN [Do not define 1.1 function signatures] -# define glActiveTexture __static__glActiveTexture -# define glBegin __static__glBegin -# define glBindTexture __static__glBindTexture -# define glBlendFunc __static__glBlendFunc -# define glClear __static__glClear -# define glClearColor __static__glClearColor -# define glCullFace __static__glCullFace -# define glDeleteTextures __static__glDeleteTextures -# define glDepthFunc __static__glDepthFunc -# define glDisable __static__glDisable -# define glDrawArrays __static__glDrawArrays -# define glEnable __static__glEnable -# define glEnd __static__glEnd -# define glGenTextures __static__glGenTextures -# define glGetError __static__glGetError -# define glPixelStorei __static__glPixelStorei -# define glReadPixels __static__glReadPixels -# define glTexImage2D __static__glTexImage2D -# define glTexParameteri __static__glTexParameteri -# define glViewport __static__glViewport -# define glTexSubImage3D __static__glTexSubImage3D -# define glTexImage3D __static__glTexImage3D -# define glGetIntegerv __static__glGetIntegerv -# define glGetTexImage __static__glGetTexImage + // BEGIN [Do not define 1.1 function signatures] + #define glActiveTexture __static__glActiveTexture + #define glBegin __static__glBegin + #define glBindTexture __static__glBindTexture + #define glBlendFunc __static__glBlendFunc + #define glClear __static__glClear + #define glClearColor __static__glClearColor + #define glCullFace __static__glCullFace + #define glDeleteTextures __static__glDeleteTextures + #define glDepthFunc __static__glDepthFunc + #define glDisable __static__glDisable + #define glDrawArrays __static__glDrawArrays + #define glEnable __static__glEnable + #define glEnd __static__glEnd + #define glGenTextures __static__glGenTextures + #define glGetError __static__glGetError + #define glPixelStorei __static__glPixelStorei + #define glReadPixels __static__glReadPixels + #define glTexImage2D __static__glTexImage2D + #define glTexParameteri __static__glTexParameteri + #define glViewport __static__glViewport + #define glTexSubImage3D __static__glTexSubImage3D + #define glTexImage3D __static__glTexImage3D + #define glGetIntegerv __static__glGetIntegerv + #define glGetTexImage __static__glGetTexImage #endif @@ -49,31 +49,31 @@ #ifdef OPENGL_NO_LINK -// END [Do not define 1.1 function signatures] -# undef glActiveTexture -# undef glBegin -# undef glBindTexture -# undef glBlendFunc -# undef glClear -# undef glClearColor -# undef glCullFace -# undef glDeleteTextures -# undef glDepthFunc -# undef glDisable -# undef glDrawArrays -# undef glEnable -# undef glEnd -# undef glGenTextures -# undef glGetError -# undef glPixelStorei -# undef glReadPixels -# undef glTexImage2D -# undef glTexParameteri -# undef glViewport -# undef glTexSubImage3D -# undef glTexImage3D -# undef glGetIntegerv -# undef glGetTexImage + // END [Do not define 1.1 function signatures] + #undef glActiveTexture + #undef glBegin + #undef glBindTexture + #undef glBlendFunc + #undef glClear + #undef glClearColor + #undef glCullFace + #undef glDeleteTextures + #undef glDepthFunc + #undef glDisable + #undef glDrawArrays + #undef glEnable + #undef glEnd + #undef glGenTextures + #undef glGetError + #undef glPixelStorei + #undef glReadPixels + #undef glTexImage2D + #undef glTexParameteri + #undef glViewport + #undef glTexSubImage3D + #undef glTexImage3D + #undef glGetIntegerv + #undef glGetTexImage // 1.1 function signatures using PFNGLBEGINPROC = void(APIENTRYP)(GLenum mode); @@ -107,9 +107,9 @@ using PFNGLTEXIMAGE3DPROC = void(APIENTRYP)( using PFNGLGETINTERGERVPROC = void(APIENTRYP)(GLenum pname, GLint* data); using PFNGLGETTEXIMAGEPROC = void(APIENTRYP)(GLenum target, GLint level, GLenum format, GLenum type, GLvoid* img); -# define OPENGL_PROC(TYPE, PROC) extern TYPE PROC; -# include "OpenGLAPIProc.h" -# undef OPENGL_PROC + #define OPENGL_PROC(TYPE, PROC) extern TYPE PROC; + #include "OpenGLAPIProc.h" + #undef OPENGL_PROC #endif /* OPENGL_NO_LINK */ diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h index 1597d1c7c3..0245978654 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLAPIProc.h @@ -8,7 +8,7 @@ *****************************************************************************/ #ifndef OPENGL_PROC -# error "Do not include OpenGLAPIProc.h directly. Include OpenGLAPI.h instead." + #error "Do not include OpenGLAPIProc.h directly. Include OpenGLAPI.h instead." #endif // 1.1 function pointers diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp index 00f987d5c8..c7790b0bc8 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLDrawingEngine.cpp @@ -9,34 +9,34 @@ #ifndef DISABLE_OPENGL -# include "../DrawingEngineFactory.hpp" -# include "ApplyPaletteShader.h" -# include "DrawCommands.h" -# include "DrawLineShader.h" -# include "DrawRectShader.h" -# include "GLSLTypes.h" -# include "OpenGLAPI.h" -# include "OpenGLFramebuffer.h" -# include "SwapFramebuffer.h" -# include "TextureCache.h" -# include "TransparencyDepth.h" + #include "../DrawingEngineFactory.hpp" + #include "ApplyPaletteShader.h" + #include "DrawCommands.h" + #include "DrawLineShader.h" + #include "DrawRectShader.h" + #include "GLSLTypes.h" + #include "OpenGLAPI.h" + #include "OpenGLFramebuffer.h" + #include "SwapFramebuffer.h" + #include "TextureCache.h" + #include "TransparencyDepth.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include using namespace OpenRCT2; using namespace OpenRCT2::Drawing; @@ -977,7 +977,7 @@ void OpenGLDrawingContext::DrawGlyph(DrawPixelInfo& dpi, const ImageId image, in void OpenGLDrawingContext::DrawTTFBitmap( DrawPixelInfo& dpi, TextDrawInfo* info, TTFSurface* surface, int32_t x, int32_t y, uint8_t hintingThreshold) { -# ifndef NO_TTF + #ifndef NO_TTF auto baseId = static_cast(0x7FFFF) - 1024; auto imageId = baseId + _ttfGlId; _engine.InvalidateImage(imageId); @@ -1062,7 +1062,7 @@ void OpenGLDrawingContext::DrawTTFBitmap( command.colour = info->palette[1]; command.bounds = { left, top, right, bottom }; command.depth = _drawCount++; -# endif // NO_TTF + #endif // NO_TTF } void OpenGLDrawingContext::FlushCommandBuffers() @@ -1149,10 +1149,10 @@ ScreenRect OpenGLDrawingContext::CalculateClipping(const DrawPixelInfo& dpi) con const DrawPixelInfo* screenDPI = _engine.GetDPI(); const int32_t bytesPerRow = screenDPI->LineStride(); const int32_t bitsOffset = static_cast(dpi.bits - screenDPI->bits); -# ifndef NDEBUG + #ifndef NDEBUG const ptrdiff_t bitsSize = static_cast(screenDPI->height) * static_cast(bytesPerRow); assert(static_cast(bitsOffset) < bitsSize && static_cast(bitsOffset) >= 0); -# endif + #endif const int32_t left = bitsOffset % bytesPerRow; const int32_t top = bitsOffset / bytesPerRow; diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp index f636647799..0a4c6751ee 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLFramebuffer.cpp @@ -9,12 +9,12 @@ #ifndef DISABLE_OPENGL -# include "OpenGLFramebuffer.h" + #include "OpenGLFramebuffer.h" -# include -# include -# include -# include + #include + #include + #include + #include using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp index 7e9278087d..f30420086f 100644 --- a/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/OpenGLShaderProgram.cpp @@ -9,14 +9,14 @@ #ifndef DISABLE_OPENGL -# include "OpenGLShaderProgram.h" + #include "OpenGLShaderProgram.h" -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp b/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp index cf44c003b5..e143365714 100644 --- a/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/SwapFramebuffer.cpp @@ -9,9 +9,9 @@ #ifndef DISABLE_OPENGL -# include "SwapFramebuffer.h" + #include "SwapFramebuffer.h" -# include "OpenGLFramebuffer.h" + #include "OpenGLFramebuffer.h" using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp index 414e39b3b3..57c220001b 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/TextureCache.cpp @@ -9,16 +9,16 @@ #ifndef DISABLE_OPENGL -# include "TextureCache.h" + #include "TextureCache.h" -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include using namespace OpenRCT2::Ui; @@ -352,9 +352,9 @@ AtlasTextureInfo TextureCache::AllocateImage(int32_t imageWidth, int32_t imageHe auto atlasIndex = static_cast(_atlases.size()); int32_t atlasSize = powf(2, static_cast(Atlas::CalculateImageSizeOrder(imageWidth, imageHeight))); -# ifdef DEBUG + #ifdef DEBUG LOG_VERBOSE("new texture atlas #%d (size %d) allocated", atlasIndex, atlasSize); -# endif + #endif _atlases.emplace_back(atlasIndex, atlasSize); _atlases.back().Initialise(_atlasesTextureDimensions, _atlasesTextureDimensions); diff --git a/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp index 04b40f59d3..a703f57961 100644 --- a/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp +++ b/src/openrct2-ui/drawing/engines/opengl/TransparencyDepth.cpp @@ -9,12 +9,12 @@ #ifndef DISABLE_OPENGL -# include "TransparencyDepth.h" + #include "TransparencyDepth.h" -# include -# include -# include -# include + #include + #include + #include + #include namespace OpenRCT2::Ui { diff --git a/src/openrct2-ui/input/Shortcuts.cpp b/src/openrct2-ui/input/Shortcuts.cpp index d91f354187..b2412ca430 100644 --- a/src/openrct2-ui/input/Shortcuts.cpp +++ b/src/openrct2-ui/input/Shortcuts.cpp @@ -597,7 +597,7 @@ static void ShortcutDecreaseElementHeight() static void ShortcutToggleClearanceChecks() { auto cheatSetAction = CheatSetAction( - CheatType::DisableClearanceChecks, GetGameState().Cheats.DisableClearanceChecks ? 0 : 1); + CheatType::DisableClearanceChecks, GetGameState().Cheats.disableClearanceChecks ? 0 : 1); GameActions::Execute(&cheatSetAction); } diff --git a/src/openrct2-ui/interface/ViewportInteraction.cpp b/src/openrct2-ui/interface/ViewportInteraction.cpp index b7d15b726d..54015cd4b3 100644 --- a/src/openrct2-ui/interface/ViewportInteraction.cpp +++ b/src/openrct2-ui/interface/ViewportInteraction.cpp @@ -377,7 +377,7 @@ namespace OpenRCT2::Ui else { // FIXME: Why does it *2 the value? - if (!GetGameState().Cheats.SandboxMode && !MapIsLocationOwned({ info.Loc, tileElement->GetBaseZ() * 2 })) + if (!GetGameState().Cheats.sandboxMode && !MapIsLocationOwned({ info.Loc, tileElement->GetBaseZ() * 2 })) { info.interactionType = ViewportInteractionItem::None; return info; @@ -508,7 +508,7 @@ namespace OpenRCT2::Ui return info; } case ViewportInteractionItem::ParkEntrance: - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) break; if (tileElement->GetType() != TileElementType::Entrance) diff --git a/src/openrct2-ui/ride/Construction.h b/src/openrct2-ui/ride/Construction.h index 42d2f347c1..392edf426c 100644 --- a/src/openrct2-ui/ride/Construction.h +++ b/src/openrct2-ui/ride/Construction.h @@ -47,6 +47,7 @@ namespace OpenRCT2 TrackElemType::LeftHalfBankedHelixDownLarge, TrackElemType::RightHalfBankedHelixDownLarge, TrackElemType::Booster, + TrackElemType::DiagBooster, TrackElemType::Brakes, TrackElemType::DiagBrakes, TrackElemType::Down25Brakes, @@ -143,7 +144,7 @@ namespace OpenRCT2 constexpr size_t DropdownLength = DropdownOrder.size(); // Update the magic number with the current number of track elements to silence - static_assert(EnumValue(TrackElemType::Count) == 340, "Reminder to add new track element to special dropdown list"); + static_assert(EnumValue(TrackElemType::Count) == 341, "Reminder to add new track element to special dropdown list"); constexpr bool TrackPieceDirectionIsDiagonal(const uint8_t direction) { diff --git a/src/openrct2-ui/ride/VehicleSounds.cpp b/src/openrct2-ui/ride/VehicleSounds.cpp index 8530bee3ab..361ff999b6 100644 --- a/src/openrct2-ui/ride/VehicleSounds.cpp +++ b/src/openrct2-ui/ride/VehicleSounds.cpp @@ -11,12 +11,12 @@ #include #include #include -#include #include #include #include #include #include +#include namespace OpenRCT2::Audio { @@ -236,7 +236,7 @@ namespace OpenRCT2::Audio * rct2: 0x006BB9FF */ static void UpdateSoundParams( - const Vehicle& vehicle, FixedVector& vehicleSoundParamsList) + const Vehicle& vehicle, sfl::static_vector& vehicleSoundParamsList) { if (!SoundCanPlay(vehicle)) return; @@ -536,7 +536,7 @@ namespace OpenRCT2::Audio if (!IsAvailable()) return; - FixedVector vehicleSoundParamsList; + sfl::static_vector vehicleSoundParamsList; VehicleSoundsUpdateWindowSetup(); diff --git a/src/openrct2-ui/scripting/CustomImages.cpp b/src/openrct2-ui/scripting/CustomImages.cpp index 76b5ac3acd..3e06b01f1c 100644 --- a/src/openrct2-ui/scripting/CustomImages.cpp +++ b/src/openrct2-ui/scripting/CustomImages.cpp @@ -9,15 +9,15 @@ #ifdef ENABLE_SCRIPTING -# include "CustomImages.h" + #include "CustomImages.h" -# include "ScGraphicsContext.hpp" + #include "ScGraphicsContext.hpp" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include using namespace OpenRCT2::Drawing; diff --git a/src/openrct2-ui/scripting/CustomImages.h b/src/openrct2-ui/scripting/CustomImages.h index e78e8256af..1e9ed79cc6 100644 --- a/src/openrct2-ui/scripting/CustomImages.h +++ b/src/openrct2-ui/scripting/CustomImages.h @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/CustomListView.cpp b/src/openrct2-ui/scripting/CustomListView.cpp index 8550a34709..332d028b39 100644 --- a/src/openrct2-ui/scripting/CustomListView.cpp +++ b/src/openrct2-ui/scripting/CustomListView.cpp @@ -9,17 +9,17 @@ #ifdef ENABLE_SCRIPTING -# include "CustomListView.h" + #include "CustomListView.h" -# include "../interface/Viewport.h" -# include "../interface/Widget.h" -# include "../interface/Window.h" + #include "../interface/Viewport.h" + #include "../interface/Widget.h" + #include "../interface/Window.h" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include using namespace OpenRCT2::Scripting; using namespace OpenRCT2::Ui::Windows; diff --git a/src/openrct2-ui/scripting/CustomListView.h b/src/openrct2-ui/scripting/CustomListView.h index 3a473e723f..8eca117a46 100644 --- a/src/openrct2-ui/scripting/CustomListView.h +++ b/src/openrct2-ui/scripting/CustomListView.h @@ -11,15 +11,15 @@ #ifdef ENABLE_SCRIPTING -# include "../interface/Window.h" + #include "../interface/Window.h" -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Ui::Windows { diff --git a/src/openrct2-ui/scripting/CustomMenu.cpp b/src/openrct2-ui/scripting/CustomMenu.cpp index 898d600e9e..ad73c492d5 100644 --- a/src/openrct2-ui/scripting/CustomMenu.cpp +++ b/src/openrct2-ui/scripting/CustomMenu.cpp @@ -9,14 +9,14 @@ #ifdef ENABLE_SCRIPTING -# include "CustomMenu.h" + #include "CustomMenu.h" -# include "../interface/Viewport.h" + #include "../interface/Viewport.h" -# include -# include -# include -# include + #include + #include + #include + #include using namespace OpenRCT2; using namespace OpenRCT2::Ui; diff --git a/src/openrct2-ui/scripting/CustomMenu.h b/src/openrct2-ui/scripting/CustomMenu.h index 7a30868b4b..6ac95b55f2 100644 --- a/src/openrct2-ui/scripting/CustomMenu.h +++ b/src/openrct2-ui/scripting/CustomMenu.h @@ -11,13 +11,13 @@ #ifdef ENABLE_SCRIPTING -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include enum class CursorID : uint8_t; diff --git a/src/openrct2-ui/scripting/CustomWindow.cpp b/src/openrct2-ui/scripting/CustomWindow.cpp index 4924c089c3..0059c3d2bf 100644 --- a/src/openrct2-ui/scripting/CustomWindow.cpp +++ b/src/openrct2-ui/scripting/CustomWindow.cpp @@ -9,28 +9,28 @@ #ifdef ENABLE_SCRIPTING -# include "../UiContext.h" -# include "../UiStringIds.h" -# include "../interface/Dropdown.h" -# include "../interface/Widget.h" -# include "../scripting/ScGraphicsContext.hpp" -# include "../scripting/ScWidget.hpp" -# include "../windows/Window.h" -# include "CustomListView.h" -# include "ScUi.hpp" -# include "ScWindow.hpp" + #include "../UiContext.h" + #include "../UiStringIds.h" + #include "../interface/Dropdown.h" + #include "../interface/Widget.h" + #include "../scripting/ScGraphicsContext.hpp" + #include "../scripting/ScWidget.hpp" + #include "../windows/Window.h" + #include "CustomListView.h" + #include "ScUi.hpp" + #include "ScWindow.hpp" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include using namespace OpenRCT2; using namespace OpenRCT2::Scripting; diff --git a/src/openrct2-ui/scripting/CustomWindow.h b/src/openrct2-ui/scripting/CustomWindow.h index 13f8a81410..17fe8de3f7 100644 --- a/src/openrct2-ui/scripting/CustomWindow.h +++ b/src/openrct2-ui/scripting/CustomWindow.h @@ -11,11 +11,11 @@ #ifdef ENABLE_SCRIPTING -# include "../interface/Window.h" + #include "../interface/Window.h" -# include -# include -# include + #include + #include + #include namespace OpenRCT2::Ui::Windows { diff --git a/src/openrct2-ui/scripting/ScGraphicsContext.hpp b/src/openrct2-ui/scripting/ScGraphicsContext.hpp index ad1ec00091..98ba930e22 100644 --- a/src/openrct2-ui/scripting/ScGraphicsContext.hpp +++ b/src/openrct2-ui/scripting/ScGraphicsContext.hpp @@ -11,10 +11,10 @@ #ifdef ENABLE_SCRIPTING -# include "CustomImages.h" + #include "CustomImages.h" -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScImageManager.hpp b/src/openrct2-ui/scripting/ScImageManager.hpp index 296c47dc6c..c6cdf9e75f 100644 --- a/src/openrct2-ui/scripting/ScImageManager.hpp +++ b/src/openrct2-ui/scripting/ScImageManager.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "CustomImages.h" + #include "CustomImages.h" -# include -# include -# include -# include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScTileSelection.hpp b/src/openrct2-ui/scripting/ScTileSelection.hpp index 9be4723d6e..e19920979f 100644 --- a/src/openrct2-ui/scripting/ScTileSelection.hpp +++ b/src/openrct2-ui/scripting/ScTileSelection.hpp @@ -11,8 +11,8 @@ #ifdef ENABLE_SCRIPTING -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScTitleSequence.hpp b/src/openrct2-ui/scripting/ScTitleSequence.hpp index 5d179018ef..434fef4664 100644 --- a/src/openrct2-ui/scripting/ScTitleSequence.hpp +++ b/src/openrct2-ui/scripting/ScTitleSequence.hpp @@ -11,23 +11,23 @@ #ifdef ENABLE_SCRIPTING -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScUi.hpp b/src/openrct2-ui/scripting/ScUi.hpp index c1b8a3d4ae..140a5ca658 100644 --- a/src/openrct2-ui/scripting/ScUi.hpp +++ b/src/openrct2-ui/scripting/ScUi.hpp @@ -11,20 +11,20 @@ #ifdef ENABLE_SCRIPTING -# include "../windows/Window.h" -# include "CustomMenu.h" -# include "ScImageManager.hpp" -# include "ScTileSelection.hpp" -# include "ScViewport.hpp" -# include "ScWindow.hpp" + #include "../windows/Window.h" + #include "CustomMenu.h" + #include "ScImageManager.hpp" + #include "ScTileSelection.hpp" + #include "ScViewport.hpp" + #include "ScWindow.hpp" -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScViewport.hpp b/src/openrct2-ui/scripting/ScViewport.hpp index 5315050b53..49410bcc9d 100644 --- a/src/openrct2-ui/scripting/ScViewport.hpp +++ b/src/openrct2-ui/scripting/ScViewport.hpp @@ -11,14 +11,14 @@ #ifdef ENABLE_SCRIPTING -# include "../interface/Window.h" + #include "../interface/Window.h" -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScWidget.hpp b/src/openrct2-ui/scripting/ScWidget.hpp index 5bb00ccd7f..7324a435b1 100644 --- a/src/openrct2-ui/scripting/ScWidget.hpp +++ b/src/openrct2-ui/scripting/ScWidget.hpp @@ -11,17 +11,17 @@ #ifdef ENABLE_SCRIPTING -# include "../interface/Widget.h" -# include "../interface/Window.h" -# include "CustomListView.h" -# include "CustomWindow.h" -# include "ScViewport.hpp" + #include "../interface/Widget.h" + #include "../interface/Window.h" + #include "CustomListView.h" + #include "CustomWindow.h" + #include "ScViewport.hpp" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/ScWindow.hpp b/src/openrct2-ui/scripting/ScWindow.hpp index 6289386ad9..b07da7d872 100644 --- a/src/openrct2-ui/scripting/ScWindow.hpp +++ b/src/openrct2-ui/scripting/ScWindow.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "ScWidget.hpp" + #include "ScWidget.hpp" -# include -# include -# include -# include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2-ui/scripting/UiExtensions.cpp b/src/openrct2-ui/scripting/UiExtensions.cpp index 05a27456f8..eb8a963f6c 100644 --- a/src/openrct2-ui/scripting/UiExtensions.cpp +++ b/src/openrct2-ui/scripting/UiExtensions.cpp @@ -9,19 +9,19 @@ #ifdef ENABLE_SCRIPTING -# include "UiExtensions.h" + #include "UiExtensions.h" -# include "CustomImages.h" -# include "CustomMenu.h" -# include "ScGraphicsContext.hpp" -# include "ScImageManager.hpp" -# include "ScTileSelection.hpp" -# include "ScTitleSequence.hpp" -# include "ScUi.hpp" -# include "ScWidget.hpp" -# include "ScWindow.hpp" + #include "CustomImages.h" + #include "CustomMenu.h" + #include "ScGraphicsContext.hpp" + #include "ScImageManager.hpp" + #include "ScTileSelection.hpp" + #include "ScTitleSequence.hpp" + #include "ScUi.hpp" + #include "ScWidget.hpp" + #include "ScWindow.hpp" -# include + #include using namespace OpenRCT2::Scripting; diff --git a/src/openrct2-ui/windows/Cheats.cpp b/src/openrct2-ui/windows/Cheats.cpp index 8b06add9be..5469dd4f6a 100644 --- a/src/openrct2-ui/windows/Cheats.cpp +++ b/src/openrct2-ui/windows/Cheats.cpp @@ -549,10 +549,10 @@ static StringId window_cheats_page_titles[] = { { auto ft = Formatter::Common(); ft.Add(1000.00_GBP); - SetCheckboxValue(WIDX_GUEST_IGNORE_RIDE_INTENSITY, gameState.Cheats.IgnoreRideIntensity); - SetCheckboxValue(WIDX_GUEST_IGNORE_PRICE, gameState.Cheats.IgnorePrice); - SetCheckboxValue(WIDX_DISABLE_VANDALISM, gameState.Cheats.DisableVandalism); - SetCheckboxValue(WIDX_DISABLE_LITTERING, gameState.Cheats.DisableLittering); + SetCheckboxValue(WIDX_GUEST_IGNORE_RIDE_INTENSITY, gameState.Cheats.ignoreRideIntensity); + SetCheckboxValue(WIDX_GUEST_IGNORE_PRICE, gameState.Cheats.ignorePrice); + SetCheckboxValue(WIDX_DISABLE_VANDALISM, gameState.Cheats.disableVandalism); + SetCheckboxValue(WIDX_DISABLE_LITTERING, gameState.Cheats.disableLittering); break; } case WINDOW_CHEATS_PAGE_PARK: @@ -561,32 +561,32 @@ static StringId window_cheats_page_titles[] = { widgets[WIDX_OPEN_CLOSE_PARK].text = STR_CHEAT_CLOSE_PARK; SetCheckboxValue(WIDX_FORCE_PARK_RATING, Park::GetForcedRating() >= 0); - SetCheckboxValue(WIDX_NEVERENDING_MARKETING, gameState.Cheats.NeverendingMarketing); - SetCheckboxValue(WIDX_ALLOW_BUILD_IN_PAUSE_MODE, gameState.Cheats.BuildInPauseMode); - SetCheckboxValue(WIDX_ALLOW_REGULAR_PATH_AS_QUEUE, gameState.Cheats.AllowRegularPathAsQueue); - SetCheckboxValue(WIDX_ALLOW_SPECIAL_COLOUR_SCHEMES, gameState.Cheats.AllowSpecialColourSchemes); + SetCheckboxValue(WIDX_NEVERENDING_MARKETING, gameState.Cheats.neverendingMarketing); + SetCheckboxValue(WIDX_ALLOW_BUILD_IN_PAUSE_MODE, gameState.Cheats.buildInPauseMode); + SetCheckboxValue(WIDX_ALLOW_REGULAR_PATH_AS_QUEUE, gameState.Cheats.allowRegularPathAsQueue); + SetCheckboxValue(WIDX_ALLOW_SPECIAL_COLOUR_SCHEMES, gameState.Cheats.allowSpecialColourSchemes); break; case WINDOW_CHEATS_PAGE_RIDES: - SetCheckboxValue(WIDX_UNLOCK_OPERATING_LIMITS, gameState.Cheats.UnlockOperatingLimits); - SetCheckboxValue(WIDX_DISABLE_BRAKES_FAILURE, gameState.Cheats.DisableBrakesFailure); - SetCheckboxValue(WIDX_DISABLE_ALL_BREAKDOWNS, gameState.Cheats.DisableAllBreakdowns); - SetCheckboxValue(WIDX_SHOW_ALL_OPERATING_MODES, gameState.Cheats.ShowAllOperatingModes); + SetCheckboxValue(WIDX_UNLOCK_OPERATING_LIMITS, gameState.Cheats.unlockOperatingLimits); + SetCheckboxValue(WIDX_DISABLE_BRAKES_FAILURE, gameState.Cheats.disableBrakesFailure); + SetCheckboxValue(WIDX_DISABLE_ALL_BREAKDOWNS, gameState.Cheats.disableAllBreakdowns); + SetCheckboxValue(WIDX_SHOW_ALL_OPERATING_MODES, gameState.Cheats.showAllOperatingModes); SetCheckboxValue( - WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, gameState.Cheats.ShowVehiclesFromOtherTrackTypes); - SetCheckboxValue(WIDX_DISABLE_TRAIN_LENGTH_LIMITS, gameState.Cheats.DisableTrainLengthLimit); - SetCheckboxValue(WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, gameState.Cheats.EnableChainLiftOnAllTrack); - SetCheckboxValue(WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES, gameState.Cheats.AllowArbitraryRideTypeChanges); - SetCheckboxValue(WIDX_DISABLE_RIDE_VALUE_AGING, gameState.Cheats.DisableRideValueAging); - SetCheckboxValue(WIDX_IGNORE_RESEARCH_STATUS, gameState.Cheats.IgnoreResearchStatus); - SetCheckboxValue(WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES, gameState.Cheats.EnableAllDrawableTrackPieces); - SetCheckboxValue(WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, gameState.Cheats.AllowTrackPlaceInvalidHeights); - SetCheckboxValue(WIDX_MAKE_DESTRUCTIBLE, gameState.Cheats.MakeAllDestructible); + WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES, gameState.Cheats.showVehiclesFromOtherTrackTypes); + SetCheckboxValue(WIDX_DISABLE_TRAIN_LENGTH_LIMITS, gameState.Cheats.disableTrainLengthLimit); + SetCheckboxValue(WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK, gameState.Cheats.enableChainLiftOnAllTrack); + SetCheckboxValue(WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES, gameState.Cheats.allowArbitraryRideTypeChanges); + SetCheckboxValue(WIDX_DISABLE_RIDE_VALUE_AGING, gameState.Cheats.disableRideValueAging); + SetCheckboxValue(WIDX_IGNORE_RESEARCH_STATUS, gameState.Cheats.ignoreResearchStatus); + SetCheckboxValue(WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES, gameState.Cheats.enableAllDrawableTrackPieces); + SetCheckboxValue(WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS, gameState.Cheats.allowTrackPlaceInvalidHeights); + SetCheckboxValue(WIDX_MAKE_DESTRUCTIBLE, gameState.Cheats.makeAllDestructible); break; case WINDOW_CHEATS_PAGE_STAFF: - SetCheckboxValue(WIDX_DISABLE_PLANT_AGING, gameState.Cheats.DisablePlantAging); + SetCheckboxValue(WIDX_DISABLE_PLANT_AGING, gameState.Cheats.disablePlantAging); break; case WINDOW_CHEATS_PAGE_WEATHER: - SetCheckboxValue(WIDX_FREEZE_WEATHER, gameState.Cheats.FreezeWeather); + SetCheckboxValue(WIDX_FREEZE_WEATHER, gameState.Cheats.freezeWeather); break; } @@ -595,7 +595,7 @@ static StringId window_cheats_page_titles[] = { // Staff speed window_cheats_staff_widgets[WIDX_STAFF_SPEED].text = _staffSpeedNames[EnumValue( - gameState.Cheats.SelectedStaffSpeed)]; + gameState.Cheats.selectedStaffSpeed)]; if (gScreenFlags & SCREEN_FLAGS_EDITOR) { @@ -1007,7 +1007,7 @@ static StringId window_cheats_page_titles[] = { WindowDropdownShowTextCustomWidth( { windowPos.x + dropdownWidget->left, windowPos.y + dropdownWidget->top }, dropdownWidget->height() + 1, colours[1], 0, Dropdown::Flag::StayOpen, 3, dropdownWidget->width() - 3); - Dropdown::SetChecked(EnumValue(gameState.Cheats.SelectedStaffSpeed), true); + Dropdown::SetChecked(EnumValue(gameState.Cheats.selectedStaffSpeed), true); } } } @@ -1060,7 +1060,7 @@ static StringId window_cheats_page_titles[] = { CheatsSet(CheatType::HaveFun); break; case WIDX_NEVERENDING_MARKETING: - CheatsSet(CheatType::NeverEndingMarketing, !gameState.Cheats.NeverendingMarketing); + CheatsSet(CheatType::NeverendingMarketing, !gameState.Cheats.neverendingMarketing); break; case WIDX_FORCE_PARK_RATING: if (Park::GetForcedRating() >= 0) @@ -1073,13 +1073,13 @@ static StringId window_cheats_page_titles[] = { } break; case WIDX_ALLOW_BUILD_IN_PAUSE_MODE: - CheatsSet(CheatType::BuildInPauseMode, !gameState.Cheats.BuildInPauseMode); + CheatsSet(CheatType::BuildInPauseMode, !gameState.Cheats.buildInPauseMode); break; case WIDX_ALLOW_REGULAR_PATH_AS_QUEUE: - CheatsSet(CheatType::AllowRegularPathAsQueue, !gameState.Cheats.AllowRegularPathAsQueue); + CheatsSet(CheatType::AllowRegularPathAsQueue, !gameState.Cheats.allowRegularPathAsQueue); break; case WIDX_ALLOW_SPECIAL_COLOUR_SCHEMES: - CheatsSet(CheatType::AllowSpecialColourSchemes, !gameState.Cheats.AllowSpecialColourSchemes); + CheatsSet(CheatType::AllowSpecialColourSchemes, !gameState.Cheats.allowSpecialColourSchemes); break; } } @@ -1105,7 +1105,7 @@ static StringId window_cheats_page_titles[] = { CheatsSet(CheatType::RemoveLitter); break; case WIDX_DISABLE_PLANT_AGING: - CheatsSet(CheatType::DisablePlantAging, !gameState.Cheats.DisablePlantAging); + CheatsSet(CheatType::DisablePlantAging, !gameState.Cheats.disablePlantAging); break; } } @@ -1116,7 +1116,7 @@ static StringId window_cheats_page_titles[] = { switch (widgetIndex) { case WIDX_FREEZE_WEATHER: - CheatsSet(CheatType::FreezeWeather, !gameState.Cheats.FreezeWeather); + CheatsSet(CheatType::FreezeWeather, !gameState.Cheats.freezeWeather); break; case WIDX_CREATE_DUCKS: CheatsSet(CheatType::CreateDucks, kCheatsDuckIncrement); @@ -1141,17 +1141,17 @@ static StringId window_cheats_page_titles[] = { switch (dropdownIndex) { case 0: - gameState.Cheats.SelectedStaffSpeed = StaffSpeedCheat::None; + gameState.Cheats.selectedStaffSpeed = StaffSpeedCheat::None; speed = kCheatsStaffNormalSpeed; break; case 1: - gameState.Cheats.SelectedStaffSpeed = StaffSpeedCheat::Frozen; + gameState.Cheats.selectedStaffSpeed = StaffSpeedCheat::Frozen; speed = kCheatsStaffFreezeSpeed; break; case 2: - gameState.Cheats.SelectedStaffSpeed = StaffSpeedCheat::Fast; + gameState.Cheats.selectedStaffSpeed = StaffSpeedCheat::Fast; speed = kCheatsStaffFastSpeed; } CheatsSet(CheatType::SetStaffSpeed, speed); @@ -1245,16 +1245,16 @@ static StringId window_cheats_page_titles[] = { CheatsSet(CheatType::GiveAllGuests, OBJECT_UMBRELLA); break; case WIDX_GUEST_IGNORE_RIDE_INTENSITY: - CheatsSet(CheatType::IgnoreRideIntensity, !gameState.Cheats.IgnoreRideIntensity); + CheatsSet(CheatType::IgnoreRideIntensity, !gameState.Cheats.ignoreRideIntensity); break; case WIDX_GUEST_IGNORE_PRICE: - CheatsSet(CheatType::IgnorePrice, !gameState.Cheats.IgnorePrice); + CheatsSet(CheatType::IgnorePrice, !gameState.Cheats.ignorePrice); break; case WIDX_DISABLE_VANDALISM: - CheatsSet(CheatType::DisableVandalism, !gameState.Cheats.DisableVandalism); + CheatsSet(CheatType::DisableVandalism, !gameState.Cheats.disableVandalism); break; case WIDX_DISABLE_LITTERING: - CheatsSet(CheatType::DisableLittering, !gameState.Cheats.DisableLittering); + CheatsSet(CheatType::DisableLittering, !gameState.Cheats.disableLittering); break; } } @@ -1268,19 +1268,19 @@ static StringId window_cheats_page_titles[] = { CheatsSet(CheatType::RenewRides); break; case WIDX_MAKE_DESTRUCTIBLE: - CheatsSet(CheatType::MakeDestructible, !gameState.Cheats.MakeAllDestructible); + CheatsSet(CheatType::MakeDestructible, !gameState.Cheats.makeAllDestructible); break; case WIDX_FIX_ALL: CheatsSet(CheatType::FixRides); break; case WIDX_UNLOCK_OPERATING_LIMITS: - CheatsSet(CheatType::FastLiftHill, !gameState.Cheats.UnlockOperatingLimits); + CheatsSet(CheatType::FastLiftHill, !gameState.Cheats.unlockOperatingLimits); break; case WIDX_DISABLE_BRAKES_FAILURE: - CheatsSet(CheatType::DisableBrakesFailure, !gameState.Cheats.DisableBrakesFailure); + CheatsSet(CheatType::DisableBrakesFailure, !gameState.Cheats.disableBrakesFailure); break; case WIDX_DISABLE_ALL_BREAKDOWNS: - CheatsSet(CheatType::DisableAllBreakdowns, !gameState.Cheats.DisableAllBreakdowns); + CheatsSet(CheatType::DisableAllBreakdowns, !gameState.Cheats.disableAllBreakdowns); break; case WIDX_RESET_CRASH_STATUS: CheatsSet(CheatType::ResetCrashStatus); @@ -1290,59 +1290,59 @@ static StringId window_cheats_page_titles[] = { break; case WIDX_SHOW_ALL_OPERATING_MODES: { - if (!gameState.Cheats.ShowAllOperatingModes) + if (!gameState.Cheats.showAllOperatingModes) { ContextShowError(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {}); } - CheatsSet(CheatType::ShowAllOperatingModes, !gameState.Cheats.ShowAllOperatingModes); + CheatsSet(CheatType::ShowAllOperatingModes, !gameState.Cheats.showAllOperatingModes); } break; case WIDX_SHOW_VEHICLES_FROM_OTHER_TRACK_TYPES: { - if (!gameState.Cheats.ShowVehiclesFromOtherTrackTypes) + if (!gameState.Cheats.showVehiclesFromOtherTrackTypes) { ContextShowError(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {}); } - CheatsSet(CheatType::ShowVehiclesFromOtherTrackTypes, !gameState.Cheats.ShowVehiclesFromOtherTrackTypes); + CheatsSet(CheatType::ShowVehiclesFromOtherTrackTypes, !gameState.Cheats.showVehiclesFromOtherTrackTypes); } break; case WIDX_DISABLE_TRAIN_LENGTH_LIMITS: { - if (!gameState.Cheats.DisableTrainLengthLimit) + if (!gameState.Cheats.disableTrainLengthLimit) { ContextShowError(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {}); } - CheatsSet(CheatType::DisableTrainLengthLimit, !gameState.Cheats.DisableTrainLengthLimit); + CheatsSet(CheatType::DisableTrainLengthLimit, !gameState.Cheats.disableTrainLengthLimit); } break; case WIDX_ENABLE_CHAIN_LIFT_ON_ALL_TRACK: - CheatsSet(CheatType::EnableChainLiftOnAllTrack, !gameState.Cheats.EnableChainLiftOnAllTrack); + CheatsSet(CheatType::EnableChainLiftOnAllTrack, !gameState.Cheats.enableChainLiftOnAllTrack); break; case WIDX_ENABLE_ARBITRARY_RIDE_TYPE_CHANGES: { - if (!gameState.Cheats.AllowArbitraryRideTypeChanges) + if (!gameState.Cheats.allowArbitraryRideTypeChanges) { ContextShowError(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {}); } - CheatsSet(CheatType::AllowArbitraryRideTypeChanges, !gameState.Cheats.AllowArbitraryRideTypeChanges); + CheatsSet(CheatType::AllowArbitraryRideTypeChanges, !gameState.Cheats.allowArbitraryRideTypeChanges); } break; case WIDX_DISABLE_RIDE_VALUE_AGING: - CheatsSet(CheatType::DisableRideValueAging, !gameState.Cheats.DisableRideValueAging); + CheatsSet(CheatType::DisableRideValueAging, !gameState.Cheats.disableRideValueAging); break; case WIDX_IGNORE_RESEARCH_STATUS: - CheatsSet(CheatType::IgnoreResearchStatus, !gameState.Cheats.IgnoreResearchStatus); + CheatsSet(CheatType::IgnoreResearchStatus, !gameState.Cheats.ignoreResearchStatus); break; case WIDX_ENABLE_ALL_DRAWABLE_TRACK_PIECES: - CheatsSet(CheatType::EnableAllDrawableTrackPieces, !gameState.Cheats.EnableAllDrawableTrackPieces); + CheatsSet(CheatType::EnableAllDrawableTrackPieces, !gameState.Cheats.enableAllDrawableTrackPieces); break; case WIDX_ALLOW_TRACK_PLACE_INVALID_HEIGHTS: { - if (!gameState.Cheats.AllowTrackPlaceInvalidHeights) + if (!gameState.Cheats.allowTrackPlaceInvalidHeights) { ContextShowError(STR_WARNING_IN_CAPS, STR_THIS_FEATURE_IS_CURRENTLY_UNSTABLE, {}); } - CheatsSet(CheatType::AllowTrackPlaceInvalidHeights, !gameState.Cheats.AllowTrackPlaceInvalidHeights); + CheatsSet(CheatType::AllowTrackPlaceInvalidHeights, !gameState.Cheats.allowTrackPlaceInvalidHeights); } break; } diff --git a/src/openrct2-ui/windows/DebugPaint.cpp b/src/openrct2-ui/windows/DebugPaint.cpp index c90559fbbc..92b64dac6a 100644 --- a/src/openrct2-ui/windows/DebugPaint.cpp +++ b/src/openrct2-ui/windows/DebugPaint.cpp @@ -27,10 +27,11 @@ namespace OpenRCT2::Ui::Windows WIDX_TOGGLE_SHOW_SEGMENT_HEIGHTS, WIDX_TOGGLE_SHOW_BOUND_BOXES, WIDX_TOGGLE_SHOW_DIRTY_VISUALS, + WIDX_TOGGLE_STABLE_PAINT_SORT, }; constexpr int32_t WINDOW_WIDTH = 200; - constexpr int32_t WINDOW_HEIGHT = 8 + 15 + 15 + 15 + 15 + 11 + 8; + constexpr int32_t WINDOW_HEIGHT = 8 + (15 * 6) + 8; // clang-format off static Widget window_debug_paint_widgets[] = { @@ -40,6 +41,7 @@ namespace OpenRCT2::Ui::Windows MakeWidget({8, 8 + 15 * 2}, { 185, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_DEBUG_PAINT_SHOW_SEGMENT_HEIGHTS), MakeWidget({8, 8 + 15 * 3}, { 185, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_DEBUG_PAINT_SHOW_BOUND_BOXES ), MakeWidget({8, 8 + 15 * 4}, { 185, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_DEBUG_PAINT_SHOW_DIRTY_VISUALS ), + MakeWidget({8, 8 + 15 * 5}, { 185, 12}, WindowWidgetType::Checkbox, WindowColour::Secondary, STR_DEBUG_PAINT_STABLE_SORT ), kWidgetsEnd, }; // clang-format on @@ -91,6 +93,11 @@ namespace OpenRCT2::Ui::Windows gShowDirtyVisuals = !gShowDirtyVisuals; GfxInvalidateScreen(); break; + + case WIDX_TOGGLE_STABLE_PAINT_SORT: + gPaintStableSort = !gPaintStableSort; + GfxInvalidateScreen(); + break; } } @@ -136,6 +143,7 @@ namespace OpenRCT2::Ui::Windows WidgetSetCheckboxValue(*this, WIDX_TOGGLE_SHOW_SEGMENT_HEIGHTS, gShowSupportSegmentHeights); WidgetSetCheckboxValue(*this, WIDX_TOGGLE_SHOW_BOUND_BOXES, gPaintBoundingBoxes); WidgetSetCheckboxValue(*this, WIDX_TOGGLE_SHOW_DIRTY_VISUALS, gShowDirtyVisuals); + WidgetSetCheckboxValue(*this, WIDX_TOGGLE_STABLE_PAINT_SORT, gPaintStableSort); } void OnDraw(DrawPixelInfo& dpi) override diff --git a/src/openrct2-ui/windows/Dropdown.cpp b/src/openrct2-ui/windows/Dropdown.cpp index 2c6fcd0af0..a541064936 100644 --- a/src/openrct2-ui/windows/Dropdown.cpp +++ b/src/openrct2-ui/windows/Dropdown.cpp @@ -498,7 +498,7 @@ static constexpr colour_t kColoursDropdownOrder[] = { { int32_t defaultIndex = -1; - const bool specialColoursEnabled = !alwaysHideSpecialColours && GetGameState().Cheats.AllowSpecialColourSchemes; + const bool specialColoursEnabled = !alwaysHideSpecialColours && GetGameState().Cheats.allowSpecialColourSchemes; auto numColours = specialColoursEnabled ? static_cast(COLOUR_COUNT) : kColourNumNormal; // Set items for (uint64_t i = 0; i < numColours; i++) diff --git a/src/openrct2-ui/windows/EditorParkEntrance.cpp b/src/openrct2-ui/windows/EditorParkEntrance.cpp index 05108e445e..5a74703035 100644 --- a/src/openrct2-ui/windows/EditorParkEntrance.cpp +++ b/src/openrct2-ui/windows/EditorParkEntrance.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/src/openrct2-ui/windows/Footpath.cpp b/src/openrct2-ui/windows/Footpath.cpp index b6f0a551b6..6b4a28726e 100644 --- a/src/openrct2-ui/windows/Footpath.cpp +++ b/src/openrct2-ui/windows/Footpath.cpp @@ -44,6 +44,8 @@ #include #include +using namespace OpenRCT2::Numerics; + namespace OpenRCT2::Ui::Windows { static money64 FootpathProvisionalSet( @@ -670,7 +672,7 @@ namespace OpenRCT2::Ui::Windows uint32_t numPathTypes = 0; // If the game is in sandbox mode, also show paths that are normally restricted to the scenario editor - bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode); + bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode); _dropdownEntries.clear(); std::optional defaultIndex; @@ -688,14 +690,14 @@ namespace OpenRCT2::Ui::Windows } // If regular paths can be used as queue, only hide the path if we’re _not_ looking at a queue, // but the path surface is one. - if (GetGameState().Cheats.AllowRegularPathAsQueue && !showQueues + if (GetGameState().Cheats.allowRegularPathAsQueue && !showQueues && ((pathType->Flags & FOOTPATH_ENTRY_FLAG_IS_QUEUE) != 0)) { continue; } // If the cheat is disabled, hide queues from the regular path view and vice versa. else if ( - !GetGameState().Cheats.AllowRegularPathAsQueue + !GetGameState().Cheats.allowRegularPathAsQueue && showQueues != ((pathType->Flags & FOOTPATH_ENTRY_FLAG_IS_QUEUE) != 0)) { continue; @@ -821,10 +823,10 @@ namespace OpenRCT2::Ui::Windows auto info = GetMapCoordinatesFromPos(screenCoords, interactionFlags); if (info.interactionType != ViewportInteractionItem::None) { - const bool allowInvalidHeights = GetGameState().Cheats.AllowTrackPlaceInvalidHeights; + const bool allowInvalidHeights = GetGameState().Cheats.allowTrackPlaceInvalidHeights; const auto heightStep = kCoordsZStep * (!allowInvalidHeights ? 2 : 1); - _footpathPlaceCtrlZ = Floor2(info.Element->GetBaseZ(), heightStep); + _footpathPlaceCtrlZ = floor2(info.Element->GetBaseZ(), heightStep); _footpathPlaceCtrlState = true; } } @@ -854,9 +856,9 @@ namespace OpenRCT2::Ui::Windows _footpathPlaceShiftZ = mainWnd->viewport->zoom.ApplyTo(_footpathPlaceShiftZ); } - const bool allowInvalidHeights = GetGameState().Cheats.AllowTrackPlaceInvalidHeights; + const bool allowInvalidHeights = GetGameState().Cheats.allowTrackPlaceInvalidHeights; const auto heightStep = kCoordsZStep * (!allowInvalidHeights ? 2 : 1); - _footpathPlaceShiftZ = Floor2(_footpathPlaceShiftZ, heightStep); + _footpathPlaceShiftZ = floor2(_footpathPlaceShiftZ, heightStep); // Clamp to maximum possible value of BaseHeight can offer. _footpathPlaceShiftZ = std::min(_footpathPlaceShiftZ, maxHeight); @@ -886,7 +888,7 @@ namespace OpenRCT2::Ui::Windows if (surfaceElement == nullptr) return std::nullopt; - auto mapZ = Floor2(surfaceElement->GetBaseZ(), 16); + auto mapZ = floor2(surfaceElement->GetBaseZ(), 16); mapZ += _footpathPlaceShiftZ; mapZ = std::max(mapZ, 16); _footpathPlaceZ = mapZ; @@ -1589,7 +1591,7 @@ namespace OpenRCT2::Ui::Windows void KeyboardShortcutDemolishCurrent() { if (IsWidgetDisabled(WIDX_REMOVE) || widgets[WIDX_REMOVE].type == WindowWidgetType::Empty - || (!GetGameState().Cheats.BuildInPauseMode && GameIsPaused())) + || (!GetGameState().Cheats.buildInPauseMode && GameIsPaused())) { return; } diff --git a/src/openrct2-ui/windows/GameBottomToolbar.cpp b/src/openrct2-ui/windows/GameBottomToolbar.cpp index 6b2d74fd8f..0f31d5418e 100644 --- a/src/openrct2-ui/windows/GameBottomToolbar.cpp +++ b/src/openrct2-ui/windows/GameBottomToolbar.cpp @@ -300,7 +300,7 @@ namespace OpenRCT2::Ui::Windows { GfxDrawSprite(cliped_dpi, ImageId(image_id_base + 32, guest->BalloonColour), clipCoords); } - if (image_id_base >= kPeepSpriteUmbrellaStateNoneId + if (image_id_base >= kPeepSpriteUmbrellaStateWalkingId && image_id_base < kPeepSpriteUmbrellaStateSittingIdleId + 4) { GfxDrawSprite(cliped_dpi, ImageId(image_id_base + 32, guest->UmbrellaColour), clipCoords); diff --git a/src/openrct2-ui/windows/Guest.cpp b/src/openrct2-ui/windows/Guest.cpp index 3a0242438a..3d1ad43415 100644 --- a/src/openrct2-ui/windows/Guest.cpp +++ b/src/openrct2-ui/windows/Guest.cpp @@ -580,7 +580,7 @@ namespace OpenRCT2::Ui::Windows } // If holding umbrella - if (animationFrame >= kPeepSpriteUmbrellaStateNoneId + if (animationFrame >= kPeepSpriteUmbrellaStateWalkingId && animationFrame < kPeepSpriteUmbrellaStateSittingIdleId + 4) { GfxDrawSprite(clipDpi, ImageId(animationFrame + 32, guest->UmbrellaColour), screenCoords); diff --git a/src/openrct2-ui/windows/GuestList.cpp b/src/openrct2-ui/windows/GuestList.cpp index e873bbf185..aa288bae2f 100644 --- a/src/openrct2-ui/windows/GuestList.cpp +++ b/src/openrct2-ui/windows/GuestList.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -25,11 +26,12 @@ #include #include #include -#include #include #include #include +using namespace OpenRCT2::Numerics; + namespace OpenRCT2::Ui::Windows { static constexpr StringId WINDOW_TITLE = STR_GUESTS; @@ -815,7 +817,7 @@ namespace OpenRCT2::Ui::Windows bool IsRefreshOfGroupsRequired() { - uint32_t tick256 = Floor2(GetGameState().CurrentTicks, 256); + uint32_t tick256 = floor2(GetGameState().CurrentTicks, 256); if (_selectedView == _lastFindGroupsSelectedView) { if (_lastFindGroupsWait != 0 || _lastFindGroupsTick == tick256) @@ -843,7 +845,7 @@ namespace OpenRCT2::Ui::Windows void RefreshGroups() { - _lastFindGroupsTick = Floor2(GetGameState().CurrentTicks, 256); + _lastFindGroupsTick = floor2(GetGameState().CurrentTicks, 256); _lastFindGroupsSelectedView = _selectedView; _lastFindGroupsWait = 320; _groups.clear(); diff --git a/src/openrct2-ui/windows/InstallTrack.cpp b/src/openrct2-ui/windows/InstallTrack.cpp index 6636334a91..453617d46f 100644 --- a/src/openrct2-ui/windows/InstallTrack.cpp +++ b/src/openrct2-ui/windows/InstallTrack.cpp @@ -239,9 +239,9 @@ namespace OpenRCT2::Ui::Windows } const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { - if (td.trackAndVehicle.rtdIndex == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) { // Holes auto ft = Formatter(); diff --git a/src/openrct2-ui/windows/LandRights.cpp b/src/openrct2-ui/windows/LandRights.cpp index 2d85fb0190..e509ee5cf1 100644 --- a/src/openrct2-ui/windows/LandRights.cpp +++ b/src/openrct2-ui/windows/LandRights.cpp @@ -98,7 +98,7 @@ namespace OpenRCT2::Ui::Windows bool IsOwnershipMode() const { - return (gScreenFlags & SCREEN_FLAGS_EDITOR) != 0 || GetGameState().Cheats.SandboxMode; + return (gScreenFlags & SCREEN_FLAGS_EDITOR) != 0 || GetGameState().Cheats.sandboxMode; } void SwitchToMode(LandRightsMode mode) diff --git a/src/openrct2-ui/windows/Map.cpp b/src/openrct2-ui/windows/Map.cpp index 049532acc7..7cf558b873 100644 --- a/src/openrct2-ui/windows/Map.cpp +++ b/src/openrct2-ui/windows/Map.cpp @@ -73,7 +73,7 @@ namespace OpenRCT2::Ui::Windows static bool isEditorOrSandbox() { - return (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode; + return (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode; } static constexpr StringId WINDOW_TITLE = STR_MAP_LABEL; diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 0fd661cb60..5f9160fe1d 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -942,7 +942,7 @@ namespace OpenRCT2::Ui::Windows { auto intent = Intent(WindowClass::Loadsave); intent.PutExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_LOAD | LOADSAVETYPE_HEIGHTMAP); - intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(HeightmapLoadsaveCallback)); + intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(HeightmapLoadsaveCallback)); ContextOpenIntent(&intent); return; } diff --git a/src/openrct2-ui/windows/NetworkStatus.cpp b/src/openrct2-ui/windows/NetworkStatus.cpp index a42c262512..50255cd6b5 100644 --- a/src/openrct2-ui/windows/NetworkStatus.cpp +++ b/src/openrct2-ui/windows/NetworkStatus.cpp @@ -110,7 +110,7 @@ namespace OpenRCT2::Ui::Windows DrawText(dpi, screenCoords, { COLOUR_BLACK }, _buffer.c_str()); } - void SetCloseCallBack(close_callback onClose) + void SetCloseCallBack(CloseCallback onClose) { _onClose = onClose; } @@ -127,12 +127,12 @@ namespace OpenRCT2::Ui::Windows } private: - close_callback _onClose = nullptr; + CloseCallback _onClose = nullptr; std::string _windowNetworkStatusText; std::string _password; }; - WindowBase* NetworkStatusOpen(const std::string& text, close_callback onClose) + WindowBase* NetworkStatusOpen(const std::string& text, CloseCallback onClose) { ContextForceCloseWindowByClass(WindowClass::ProgressWindow); diff --git a/src/openrct2-ui/windows/NewCampaign.cpp b/src/openrct2-ui/windows/NewCampaign.cpp index 0e82515560..dd78ff9e20 100644 --- a/src/openrct2-ui/windows/NewCampaign.cpp +++ b/src/openrct2-ui/windows/NewCampaign.cpp @@ -151,7 +151,7 @@ namespace OpenRCT2::Ui::Windows continue; if (rtd.HasFlag(RtdFlag::sellsDrinks)) continue; - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) continue; RideList.push_back(curRide.id); diff --git a/src/openrct2-ui/windows/NewRide.cpp b/src/openrct2-ui/windows/NewRide.cpp index b17e59929c..0ffcfd8ab5 100644 --- a/src/openrct2-ui/windows/NewRide.cpp +++ b/src/openrct2-ui/windows/NewRide.cpp @@ -68,6 +68,7 @@ namespace OpenRCT2::Ui::Windows RIDE_TYPE_VIRGINIA_REEL, RIDE_TYPE_REVERSER_ROLLER_COASTER, RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER, + RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER, RIDE_TYPE_WOODEN_ROLLER_COASTER, RIDE_TYPE_WOODEN_WILD_MOUSE, RIDE_TYPE_STEEL_WILD_MOUSE, @@ -86,26 +87,26 @@ namespace OpenRCT2::Ui::Windows RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER, RIDE_TYPE_TWISTER_ROLLER_COASTER, RIDE_TYPE_HYPER_TWISTER, + RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER, RIDE_TYPE_GIGA_COASTER, RIDE_TYPE_SUSPENDED_SWINGING_COASTER, RIDE_TYPE_COMPACT_INVERTED_COASTER, RIDE_TYPE_INVERTED_ROLLER_COASTER, RIDE_TYPE_INVERTED_IMPULSE_COASTER, + RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, + RIDE_TYPE_FLYING_ROLLER_COASTER, + RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER, RIDE_TYPE_MINI_SUSPENDED_COASTER, RIDE_TYPE_STEEPLECHASE, RIDE_TYPE_BOBSLEIGH_COASTER, RIDE_TYPE_MINE_RIDE, RIDE_TYPE_HEARTLINE_TWISTER_COASTER, - RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, - RIDE_TYPE_FLYING_ROLLER_COASTER, - RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER, RIDE_TYPE_REVERSE_FREEFALL_COASTER, RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, RIDE_TYPE_HYBRID_COASTER, RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER, RIDE_TYPE_ALPINE_COASTER, - RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER, // Gentle rides RIDE_TYPE_MONORAIL_CYCLES, @@ -617,7 +618,7 @@ namespace OpenRCT2::Ui::Windows auto currentRideEntry = GetRideEntryByIndex(rideEntryIndex); // Skip if vehicle type is not invented yet - if (!RideEntryIsInvented(rideEntryIndex) && !GetGameState().Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(rideEntryIndex) && !GetGameState().Cheats.ignoreResearchStatus) { continue; } @@ -679,7 +680,7 @@ namespace OpenRCT2::Ui::Windows for (auto rideEntryIndex : rideEntries) { // Skip if vehicle type is not invented yet - if (!RideEntryIsInvented(rideEntryIndex) && !GetGameState().Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(rideEntryIndex) && !GetGameState().Cheats.ignoreResearchStatus) continue; // Ride entries diff --git a/src/openrct2-ui/windows/ProgressWindow.cpp b/src/openrct2-ui/windows/ProgressWindow.cpp index 0ca872e532..2866eddc16 100644 --- a/src/openrct2-ui/windows/ProgressWindow.cpp +++ b/src/openrct2-ui/windows/ProgressWindow.cpp @@ -70,7 +70,7 @@ namespace OpenRCT2::Ui::Windows class ProgressWindow final : public Window { private: - close_callback _onClose = nullptr; + CloseCallback _onClose = nullptr; StringId _progressFormat; std::string _progressTitle; @@ -213,7 +213,7 @@ namespace OpenRCT2::Ui::Windows Invalidate(); } - void SetCloseCallback(close_callback onClose) + void SetCloseCallback(CloseCallback onClose) { _onClose = onClose; } @@ -231,7 +231,7 @@ namespace OpenRCT2::Ui::Windows } }; - WindowBase* ProgressWindowOpen(const std::string& text, close_callback onClose) + WindowBase* ProgressWindowOpen(const std::string& text, CloseCallback onClose) { ContextForceCloseWindowByClass(WindowClass::NetworkStatus); diff --git a/src/openrct2-ui/windows/Ride.cpp b/src/openrct2-ui/windows/Ride.cpp index 7825032de6..4e89347cd3 100644 --- a/src/openrct2-ui/windows/Ride.cpp +++ b/src/openrct2-ui/windows/Ride.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -1362,7 +1363,7 @@ namespace OpenRCT2::Ui::Windows if (!rtd.HasFlag(RtdFlag::hasDataLogging)) disabledTabs |= (1uLL << WIDX_TAB_8); // 0x800 - if (ride->type == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) disabledTabs |= (1uLL << WIDX_TAB_2 | 1uLL << WIDX_TAB_3 | 1uLL << WIDX_TAB_4); // 0xE0 if (rtd.HasFlag(RtdFlag::noVehicles)) @@ -1383,7 +1384,7 @@ namespace OpenRCT2::Ui::Windows disabledTabs |= (1uLL << WIDX_TAB_6); // 0x200 } - if (rtd.HasFlag(RtdFlag::isCashMachine) || rtd.HasFlag(RtdFlag::isFirstAid) + if (rtd.specialType == RtdSpecialType::cashMachine || rtd.specialType == RtdSpecialType::firstAid || (GetGameState().Park.Flags & PARK_FLAGS_NO_MONEY) != 0) disabledTabs |= (1uLL << WIDX_TAB_9); // 0x1000 @@ -1707,7 +1708,7 @@ namespace OpenRCT2::Ui::Windows } } } - if (GetGameState().Cheats.AllowArbitraryRideTypeChanges) + if (GetGameState().Cheats.allowArbitraryRideTypeChanges) { minHeight += 15; } @@ -2009,8 +2010,10 @@ namespace OpenRCT2::Ui::Windows const auto& gameState = GetGameState(); const auto& rtd = ride.GetRideTypeDescriptor(); - if (gameState.Cheats.ShowVehiclesFromOtherTrackTypes - && !(rtd.HasFlag(RtdFlag::isFlatRide) || rtd.HasFlag(RtdFlag::isMaze) || ride.type == RIDE_TYPE_MINI_GOLF)) + if (gameState.Cheats.showVehiclesFromOtherTrackTypes + && !( + rtd.HasFlag(RtdFlag::isFlatRide) || rtd.specialType == RtdSpecialType::maze + || rtd.specialType == RtdSpecialType::miniGolf)) { selectionShouldBeExpanded = true; rideTypeIterator = 0; @@ -2037,7 +2040,7 @@ namespace OpenRCT2::Ui::Windows if (selectionShouldBeExpanded && rtdIterator.HasFlag(RtdFlag::isFlatRide)) continue; if (selectionShouldBeExpanded - && (rtdIterator.HasFlag(RtdFlag::isMaze) || rideTypeIterator == RIDE_TYPE_MINI_GOLF)) + && (rtdIterator.specialType == RtdSpecialType::maze || rtd.specialType == RtdSpecialType::miniGolf)) continue; auto& rideEntries = objManager.GetAllRideEntries(rideTypeIterator); @@ -2048,7 +2051,7 @@ namespace OpenRCT2::Ui::Windows continue; // Skip if vehicle type has not been invented yet - if (!RideEntryIsInvented(rideEntryIndex) && !gameState.Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(rideEntryIndex) && !gameState.Cheats.ignoreResearchStatus) continue; auto name = currentRideEntry->naming.Name; @@ -2336,7 +2339,7 @@ namespace OpenRCT2::Ui::Windows const auto& gameState = GetGameState(); disabled_widgets &= ~((1uLL << WIDX_DEMOLISH) | (1uLL << WIDX_CONSTRUCTION)); if (ride->lifecycle_flags & (RIDE_LIFECYCLE_INDESTRUCTIBLE | RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) - && !gameState.Cheats.MakeAllDestructible) + && !gameState.Cheats.makeAllDestructible) disabled_widgets |= (1uLL << WIDX_DEMOLISH); auto ft = Formatter::Common(); @@ -2375,7 +2378,7 @@ namespace OpenRCT2::Ui::Windows AnchorBorderWidgets(); - const int32_t offset = gameState.Cheats.AllowArbitraryRideTypeChanges ? 15 : 0; + const int32_t offset = gameState.Cheats.allowArbitraryRideTypeChanges ? 15 : 0; // Anchor main page specific widgets widgets[WIDX_VIEWPORT].right = width - 26; widgets[WIDX_VIEWPORT].bottom = height - (14 + offset); @@ -2393,7 +2396,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_RIDE_TYPE_DROPDOWN].top = height - 16; widgets[WIDX_RIDE_TYPE_DROPDOWN].bottom = height - 5; - if (!gameState.Cheats.AllowArbitraryRideTypeChanges) + if (!gameState.Cheats.allowArbitraryRideTypeChanges) { widgets[WIDX_RIDE_TYPE].type = WindowWidgetType::Empty; widgets[WIDX_RIDE_TYPE_DROPDOWN].type = WindowWidgetType::Empty; @@ -2486,6 +2489,7 @@ namespace OpenRCT2::Ui::Windows if (vehicle == nullptr) return STR_EMPTY; + auto& rtd = ride->GetRideTypeDescriptor(); if (vehicle->status != Vehicle::Status::Crashing && vehicle->status != Vehicle::Status::Crashed) { auto trackType = vehicle->GetTrackType(); @@ -2494,7 +2498,7 @@ namespace OpenRCT2::Ui::Windows || trackType == TrackElemType::DiagUp25ToFlat || trackType == TrackElemType::DiagUp60ToFlat || trackType == TrackElemType::DiagBlockBrakes) { - if (ride->GetRideTypeDescriptor().SupportsTrackGroup(TrackGroup::blockBrakes) && vehicle->velocity == 0) + if (rtd.SupportsTrackGroup(TrackGroup::blockBrakes) && vehicle->velocity == 0) { ft.Add(STR_STOPPED_BY_BLOCK_BRAKES); return STR_BLACK_STRING; @@ -2502,7 +2506,7 @@ namespace OpenRCT2::Ui::Windows } } - if (ride->type == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) return STR_EMPTY; auto stringId = VehicleStatusNames[EnumValue(vehicle->status)]; @@ -2808,7 +2812,7 @@ namespace OpenRCT2::Ui::Windows const auto& gameState = GetGameState(); // Trains - if (rideEntry->cars_per_flat_ride > 1 || gameState.Cheats.DisableTrainLengthLimit) + if (rideEntry->cars_per_flat_ride > 1 || gameState.Cheats.disableTrainLengthLimit) { widgets[WIDX_VEHICLE_TRAINS].type = WindowWidgetType::Spinner; widgets[WIDX_VEHICLE_TRAINS_INCREASE].type = WindowWidgetType::Button; @@ -2822,7 +2826,7 @@ namespace OpenRCT2::Ui::Windows } // Cars per train - if (rideEntry->zero_cars + 1 < rideEntry->max_cars_in_train || gameState.Cheats.DisableTrainLengthLimit) + if (rideEntry->zero_cars + 1 < rideEntry->max_cars_in_train || gameState.Cheats.disableTrainLengthLimit) { widgets[WIDX_VEHICLE_CARS_PER_TRAIN].type = WindowWidgetType::Spinner; widgets[WIDX_VEHICLE_CARS_PER_TRAIN_INCREASE].type = WindowWidgetType::Button; @@ -2836,7 +2840,7 @@ namespace OpenRCT2::Ui::Windows } if (ride->GetRideTypeDescriptor().HasFlag(RtdFlag::allowReversedTrains) - || (gameState.Cheats.DisableTrainLengthLimit && !ride->GetRideTypeDescriptor().HasFlag(RtdFlag::isFlatRide))) + || (gameState.Cheats.disableTrainLengthLimit && !ride->GetRideTypeDescriptor().HasFlag(RtdFlag::isFlatRide))) { widgets[WIDX_VEHICLE_REVERSED_TRAINS_CHECKBOX].type = WindowWidgetType::Checkbox; if (ride->HasLifecycleFlag(RIDE_LIFECYCLE_REVERSED_TRAINS)) @@ -3079,9 +3083,9 @@ namespace OpenRCT2::Ui::Windows const auto& operatingSettings = ride->GetRideTypeDescriptor().OperatingSettings; const auto& gameState = GetGameState(); uint8_t maxValue = operatingSettings.MaxValue; - uint8_t minValue = gameState.Cheats.UnlockOperatingLimits ? 0 : operatingSettings.MinValue; + uint8_t minValue = gameState.Cheats.unlockOperatingLimits ? 0 : operatingSettings.MinValue; - if (gameState.Cheats.UnlockOperatingLimits) + if (gameState.Cheats.unlockOperatingLimits) { maxValue = OpenRCT2::Limits::kCheatsMaxOperatingLimit; } @@ -3101,8 +3105,8 @@ namespace OpenRCT2::Ui::Windows const auto& operatingSettings = ride->GetRideTypeDescriptor().OperatingSettings; const auto& gameState = GetGameState(); uint8_t maxValue = operatingSettings.MaxValue; - uint8_t minValue = gameState.Cheats.UnlockOperatingLimits ? 0 : operatingSettings.MinValue; - if (gameState.Cheats.UnlockOperatingLimits) + uint8_t minValue = gameState.Cheats.unlockOperatingLimits ? 0 : operatingSettings.MinValue; + if (gameState.Cheats.unlockOperatingLimits) { maxValue = OpenRCT2::Limits::kCheatsMaxOperatingLimit; } @@ -3239,10 +3243,10 @@ namespace OpenRCT2::Ui::Windows ModeTweakDecrease(); break; case WIDX_LIFT_HILL_SPEED_INCREASE: - upperBound = GetGameState().Cheats.UnlockOperatingLimits + upperBound = GetGameState().Cheats.unlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit : ride->GetRideTypeDescriptor().LiftData.maximum_speed; - lowerBound = GetGameState().Cheats.UnlockOperatingLimits + lowerBound = GetGameState().Cheats.unlockOperatingLimits ? 0 : ride->GetRideTypeDescriptor().LiftData.minimum_speed; SetOperatingSetting( @@ -3250,10 +3254,10 @@ namespace OpenRCT2::Ui::Windows std::clamp(ride->lift_hill_speed + 1, lowerBound, upperBound)); break; case WIDX_LIFT_HILL_SPEED_DECREASE: - upperBound = GetGameState().Cheats.UnlockOperatingLimits + upperBound = GetGameState().Cheats.unlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit : ride->GetRideTypeDescriptor().LiftData.maximum_speed; - lowerBound = GetGameState().Cheats.UnlockOperatingLimits + lowerBound = GetGameState().Cheats.unlockOperatingLimits ? 0 : ride->GetRideTypeDescriptor().LiftData.minimum_speed; SetOperatingSetting( @@ -3301,7 +3305,7 @@ namespace OpenRCT2::Ui::Windows LoadDropdown(&widgets[widgetIndex]); break; case WIDX_OPERATE_NUMBER_OF_CIRCUITS_INCREASE: - upperBound = GetGameState().Cheats.UnlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit + upperBound = GetGameState().Cheats.unlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit : OpenRCT2::Limits::kMaxCircuitsPerRide; lowerBound = 1; SetOperatingSetting( @@ -3309,7 +3313,7 @@ namespace OpenRCT2::Ui::Windows std::clamp(ride->num_circuits + 1, lowerBound, upperBound)); break; case WIDX_OPERATE_NUMBER_OF_CIRCUITS_DECREASE: - upperBound = GetGameState().Cheats.UnlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit + upperBound = GetGameState().Cheats.unlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit : OpenRCT2::Limits::kMaxCircuitsPerRide; lowerBound = 1; SetOperatingSetting( @@ -3354,9 +3358,9 @@ namespace OpenRCT2::Ui::Windows const auto& operatingSettings = ride.GetRideTypeDescriptor().OperatingSettings; const auto& gameState = GetGameState(); - int16_t maxValue = gameState.Cheats.UnlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit + int16_t maxValue = gameState.Cheats.unlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit : operatingSettings.MaxValue; - int16_t minValue = gameState.Cheats.UnlockOperatingLimits ? 0 : operatingSettings.MinValue; + int16_t minValue = gameState.Cheats.unlockOperatingLimits ? 0 : operatingSettings.MinValue; const auto& title = widgets[WIDX_MODE_TWEAK_LABEL].text; Formatter ft; @@ -3437,9 +3441,9 @@ namespace OpenRCT2::Ui::Windows { const auto& operatingSettings = ride->GetRideTypeDescriptor().OperatingSettings; const auto& gameState = GetGameState(); - uint32_t maxValue = gameState.Cheats.UnlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit + uint32_t maxValue = gameState.Cheats.unlockOperatingLimits ? OpenRCT2::Limits::kCheatsMaxOperatingLimit : operatingSettings.MaxValue; - uint32_t minValue = gameState.Cheats.UnlockOperatingLimits ? 0 : operatingSettings.MinValue; + uint32_t minValue = gameState.Cheats.unlockOperatingLimits ? 0 : operatingSettings.MinValue; auto multiplier = ride->GetRideTypeDescriptor().OperatingSettings.OperatingSettingMultiplier; try @@ -4622,7 +4626,7 @@ namespace OpenRCT2::Ui::Windows // Maze style const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { widgets[WIDX_MAZE_STYLE].type = WindowWidgetType::DropdownMenu; widgets[WIDX_MAZE_STYLE_DROPDOWN].type = WindowWidgetType::Button; @@ -4689,7 +4693,7 @@ namespace OpenRCT2::Ui::Windows } // Track supports colour - if (HasTrackColour(*ride, 2) && !rtd.HasFlag(RtdFlag::isMaze)) + if (HasTrackColour(*ride, 2) && rtd.specialType != RtdSpecialType::maze) { widgets[WIDX_TRACK_SUPPORT_COLOUR].type = WindowWidgetType::ColourBtn; widgets[WIDX_TRACK_SUPPORT_COLOUR].image = GetColourButtonImage(trackColour.supports); @@ -4872,7 +4876,7 @@ namespace OpenRCT2::Ui::Windows // Track const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { GfxDrawSprite(dpi, ImageId(MazeOptions[trackColour.supports].sprite), screenCoords); } @@ -5104,7 +5108,7 @@ namespace OpenRCT2::Ui::Windows } } - if (GetGameState().Cheats.UnlockOperatingLimits || musicObj->SupportsRideType(ride->type)) + if (GetGameState().Cheats.unlockOperatingLimits || musicObj->SupportsRideType(ride->type)) { musicOrder.push_back(i); } @@ -5452,7 +5456,7 @@ namespace OpenRCT2::Ui::Windows intent.PutExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_SAVE | LOADSAVETYPE_TRACK); intent.PutExtra(INTENT_EXTRA_TRACK_DESIGN, _trackDesign.get()); intent.PutExtra(INTENT_EXTRA_PATH, trackName); - intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(&TrackDesignCallback)); + intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(&TrackDesignCallback)); ContextOpenIntent(&intent); } @@ -5721,7 +5725,7 @@ namespace OpenRCT2::Ui::Windows if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_NO_RAW_STATS)) { - if (ride->type == RIDE_TYPE_MINI_GOLF) + if (ride->GetRideTypeDescriptor().specialType == RtdSpecialType::miniGolf) { // Holes ft = Formatter(); @@ -5873,7 +5877,7 @@ namespace OpenRCT2::Ui::Windows screenCoords.y += kListRowHeight; } - if (ride->type != RIDE_TYPE_MINI_GOLF) + if (ride->GetRideTypeDescriptor().specialType != RtdSpecialType::miniGolf) { // Inversions if (ride->inversions != 0) @@ -6314,7 +6318,7 @@ namespace OpenRCT2::Ui::Windows ShopItem shopItem; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) { shopItem = ShopItem::Admission; } @@ -6420,7 +6424,7 @@ namespace OpenRCT2::Ui::Windows auto rideEntry = ride->GetRideEntry(); const auto& rtd = ride->GetRideTypeDescriptor(); - return Park::RidePricesUnlocked() || rtd.HasFlag(RtdFlag::isToilet) + return Park::RidePricesUnlocked() || rtd.specialType == RtdSpecialType::toilet || (rideEntry != nullptr && rideEntry->shop_item[0] != ShopItem::None); } @@ -6595,7 +6599,8 @@ namespace OpenRCT2::Ui::Windows // If ride prices are locked, do not allow setting the price, unless we're dealing with a shop or toilet. const auto& rtd = ride->GetRideTypeDescriptor(); - if (!Park::RidePricesUnlocked() && rideEntry->shop_item[0] == ShopItem::None && !rtd.HasFlag(RtdFlag::isToilet)) + if (!Park::RidePricesUnlocked() && rideEntry->shop_item[0] == ShopItem::None + && rtd.specialType != RtdSpecialType::toilet) { disabled_widgets |= (1uLL << WIDX_PRIMARY_PRICE); widgets[WIDX_PRIMARY_PRICE_LABEL].tooltip = STR_RIDE_INCOME_ADMISSION_PAY_FOR_ENTRY_TIP; @@ -6614,7 +6619,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_PRIMARY_PRICE].text = STR_FREE; ShopItem primaryItem = ShopItem::Admission; - if (rtd.HasFlag(RtdFlag::isToilet) || ((primaryItem = rideEntry->shop_item[0]) != ShopItem::None)) + if (rtd.specialType == RtdSpecialType::toilet || ((primaryItem = rideEntry->shop_item[0]) != ShopItem::None)) { widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WindowWidgetType::Checkbox; diff --git a/src/openrct2-ui/windows/RideConstruction.cpp b/src/openrct2-ui/windows/RideConstruction.cpp index 43d6aa7419..b69fc7834c 100644 --- a/src/openrct2-ui/windows/RideConstruction.cpp +++ b/src/openrct2-ui/windows/RideConstruction.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include #include @@ -45,7 +46,6 @@ #include #include #include -#include #include #include #include @@ -58,6 +58,7 @@ constexpr int8_t kDefaultSpeedIncrement = 2; constexpr int8_t kDefaultMinimumSpeed = 2; +using namespace OpenRCT2::Numerics; using namespace OpenRCT2::TrackMetaData; namespace OpenRCT2::Ui::Windows @@ -425,7 +426,7 @@ namespace OpenRCT2::Ui::Windows } } if (currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::upInclineRequiresLift) - && !GetGameState().Cheats.EnableAllDrawableTrackPieces) + && !GetGameState().Cheats.enableAllDrawableTrackPieces) { // Disable lift hill toggle and banking if current track piece is uphill if (_previousTrackPitchEnd == TrackPitch::Up25 || _previousTrackPitchEnd == TrackPitch::Up60 @@ -748,7 +749,7 @@ namespace OpenRCT2::Ui::Windows { disabledWidgets |= (1uLL << WIDX_SLOPE_DOWN); } - if ((_currentTrackHasLiftHill) && !GetGameState().Cheats.EnableChainLiftOnAllTrack) + if ((_currentTrackHasLiftHill) && !GetGameState().Cheats.enableChainLiftOnAllTrack) { if (_currentTrackPitchEnd != TrackPitch::None && !IsTrackEnabled(TrackGroup::liftHillCurve)) { @@ -841,7 +842,7 @@ namespace OpenRCT2::Ui::Windows { if (_currentTrackPitchEnd == TrackPitch::None && _previousTrackRollEnd != TrackRoll::None && (!currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::upInclineRequiresLift) - || GetGameState().Cheats.EnableAllDrawableTrackPieces)) + || GetGameState().Cheats.enableAllDrawableTrackPieces)) { disabledWidgets &= ~(1uLL << WIDX_SLOPE_UP); } @@ -905,7 +906,7 @@ namespace OpenRCT2::Ui::Windows } // If chain lift cheat is enabled then show the chain lift widget no matter what - if (GetGameState().Cheats.EnableChainLiftOnAllTrack) + if (GetGameState().Cheats.enableChainLiftOnAllTrack) { disabledWidgets &= ~(1uLL << WIDX_CHAIN_LIFT); } @@ -1330,7 +1331,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_CHAIN_LIFT: RideConstructionInvalidateCurrentTrack(); _currentTrackHasLiftHill = !_currentTrackHasLiftHill; - if ((_currentTrackHasLiftHill) && !GetGameState().Cheats.EnableChainLiftOnAllTrack) + if ((_currentTrackHasLiftHill) && !GetGameState().Cheats.enableChainLiftOnAllTrack) _currentTrackAlternative.unset(AlternativeTrackFlag::alternativePieces); _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); @@ -1383,7 +1384,7 @@ namespace OpenRCT2::Ui::Windows { auto trackSpeedIncrement = kDefaultSpeedIncrement; auto trackSpeedMinimum = kDefaultMinimumSpeed; - if (GetGameState().Cheats.UnlockOperatingLimits) + if (GetGameState().Cheats.unlockOperatingLimits) { trackSpeedMinimum = 0; } @@ -1414,7 +1415,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_O_TRACK: RideConstructionInvalidateCurrentTrack(); _currentTrackAlternative.set(AlternativeTrackFlag::alternativePieces); - if (!GetGameState().Cheats.EnableChainLiftOnAllTrack) + if (!GetGameState().Cheats.enableChainLiftOnAllTrack) _currentTrackHasLiftHill = false; _currentTrackPrice = kMoney64Undefined; WindowRideConstructionUpdateActiveElements(); @@ -1775,13 +1776,13 @@ namespace OpenRCT2::Ui::Windows const auto& gameState = GetGameState(); if (currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::upInclineRequiresLift) && (_currentTrackPitchEnd == TrackPitch::Up25 || _currentTrackPitchEnd == TrackPitch::Up60) - && !gameState.Cheats.EnableAllDrawableTrackPieces) + && !gameState.Cheats.enableAllDrawableTrackPieces) { _currentTrackHasLiftHill = true; } if ((IsTrackEnabled(TrackGroup::liftHill) && !_currentlySelectedTrack.isTrackType) - || (gameState.Cheats.EnableChainLiftOnAllTrack + || (gameState.Cheats.enableChainLiftOnAllTrack && currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::hasTrack))) { widgets[WIDX_CHAIN_LIFT].type = WindowWidgetType::FlatBtn; @@ -2479,7 +2480,7 @@ namespace OpenRCT2::Ui::Windows { _currentTrackPitchEnd = slope; _currentTrackPrice = kMoney64Undefined; - if (_rideConstructionState == RideConstructionState::Front && !GetGameState().Cheats.EnableChainLiftOnAllTrack) + if (_rideConstructionState == RideConstructionState::Front && !GetGameState().Cheats.enableChainLiftOnAllTrack) { switch (slope) { @@ -2760,8 +2761,9 @@ namespace OpenRCT2::Ui::Windows continue; // Non-default vehicle visuals do not use this system, so we have to assume it supports all the track pieces. - if (currentRideEntry->Cars[0].PaintStyle != VEHICLE_VISUAL_DEFAULT || rideType == RIDE_TYPE_CHAIRLIFT - || (currentRideEntry->Cars[0].flags & CAR_ENTRY_FLAG_SLIDE_SWING)) + auto& firstCar = currentRideEntry->Cars[0]; + if (firstCar.PaintStyle != VEHICLE_VISUAL_DEFAULT || (firstCar.flags & CAR_ENTRY_FLAG_CHAIRLIFT) + || (firstCar.flags & CAR_ENTRY_FLAG_SLIDE_SWING)) { disabledGroups.reset(); break; @@ -2993,7 +2995,7 @@ namespace OpenRCT2::Ui::Windows { _trackPlaceShiftZ = mainWnd->viewport->zoom.ApplyTo(_trackPlaceShiftZ); } - _trackPlaceShiftZ = Floor2(_trackPlaceShiftZ, 8); + _trackPlaceShiftZ = floor2(_trackPlaceShiftZ, 8); // Clamp to maximum possible value of BaseHeight can offer. _trackPlaceShiftZ = std::min(_trackPlaceShiftZ, maxHeight); @@ -3018,7 +3020,7 @@ namespace OpenRCT2::Ui::Windows auto surfaceElement = MapGetSurfaceElementAt(mapCoords); if (surfaceElement == nullptr) return std::nullopt; - auto mapZ = Floor2(surfaceElement->GetBaseZ(), 16); + auto mapZ = floor2(surfaceElement->GetBaseZ(), 16); mapZ += _trackPlaceShiftZ; mapZ = std::max(mapZ, 16); _trackPlaceZ = mapZ; @@ -3058,7 +3060,7 @@ namespace OpenRCT2::Ui::Windows { WindowRideConstructionUpdateEnabledTrackPieces(); if (auto currentRide = GetRide(_currentRideIndex); - !currentRide || currentRide->GetRideTypeDescriptor().HasFlag(RtdFlag::isMaze)) + !currentRide || currentRide->GetRideTypeDescriptor().specialType == RtdSpecialType::maze) { return; } @@ -3292,7 +3294,7 @@ namespace OpenRCT2::Ui::Windows } const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { auto window = static_cast(WindowFindByClass(WindowClass::RideConstruction)); if (!window) @@ -3348,7 +3350,7 @@ namespace OpenRCT2::Ui::Windows // search for appropriate z value for ghost, up to max ride height int numAttempts = (z <= MAX_TRACK_HEIGHT ? ((MAX_TRACK_HEIGHT - z) / kCoordsZStep + 1) : 2); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { for (int zAttempts = 0; zAttempts < numAttempts; ++zAttempts) { @@ -3571,7 +3573,7 @@ namespace OpenRCT2::Ui::Windows // FIX not sure exactly why it starts trial and error place from a lower Z, but it causes issues with disable // clearance - if (!GetGameState().Cheats.DisableClearanceChecks && z > kMinimumLandZ) + if (!GetGameState().Cheats.disableClearanceChecks && z > kMinimumLandZ) { z -= LAND_HEIGHT_STEP; } @@ -3585,7 +3587,7 @@ namespace OpenRCT2::Ui::Windows int numAttempts = (z <= MAX_TRACK_HEIGHT ? ((MAX_TRACK_HEIGHT - z) / kCoordsZStep + 1) : 2); const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { for (int32_t zAttempts = 0; zAttempts < numAttempts; ++zAttempts) { @@ -4599,7 +4601,7 @@ namespace OpenRCT2::Ui::Windows { if (_gotoStartPlacementMode) { - _currentTrackBegin.z = Floor2(piecePos.z, kCoordsZStep); + _currentTrackBegin.z = floor2(piecePos.z, kCoordsZStep); _rideConstructionState = RideConstructionState::Front; _currentTrackSelectionFlags = 0; _currentTrackPieceDirection = piecePos.direction & 3; @@ -4688,7 +4690,7 @@ namespace OpenRCT2::Ui::Windows RideConstructionRemoveGhosts(); const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { int32_t flags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST; auto gameAction = MazeSetTrackAction(CoordsXYZD{ trackPos, 0 }, true, rideIndex, GC_SET_MAZE_TRACK_BUILD); @@ -4927,7 +4929,7 @@ namespace OpenRCT2::Ui::Windows if (coveredVariant != TrackElemType::None && (availableGroups.get(EnumValue(ted.definition.group)))) { trackType = coveredVariant; - if (!GetGameState().Cheats.EnableChainLiftOnAllTrack) + if (!GetGameState().Cheats.enableChainLiftOnAllTrack) liftHillAndInvertedState.unset(LiftHillAndInverted::liftHill); } } @@ -4977,7 +4979,7 @@ namespace OpenRCT2::Ui::Windows turnOffLiftHill = true; } - if (turnOffLiftHill && !GetGameState().Cheats.EnableChainLiftOnAllTrack) + if (turnOffLiftHill && !GetGameState().Cheats.enableChainLiftOnAllTrack) { liftHillAndInvertedState.unset(LiftHillAndInverted::liftHill); _currentTrackHasLiftHill = false; @@ -5050,7 +5052,7 @@ namespace OpenRCT2::Ui::Windows int32_t z = _unkF440C5.z; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { const int32_t flags = GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED | GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST; const CoordsXYZD quadrants[kNumOrthogonalDirections] = { diff --git a/src/openrct2-ui/windows/SavePrompt.cpp b/src/openrct2-ui/windows/SavePrompt.cpp index 57d525c114..c268854c97 100644 --- a/src/openrct2-ui/windows/SavePrompt.cpp +++ b/src/openrct2-ui/windows/SavePrompt.cpp @@ -173,7 +173,7 @@ namespace OpenRCT2::Ui::Windows intent = CreateSaveGameAsIntent(); } Close(); - intent->PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(WindowSavePromptCallback)); + intent->PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(WindowSavePromptCallback)); ContextOpenIntent(intent.get()); break; } diff --git a/src/openrct2-ui/windows/ScenarioSelect.cpp b/src/openrct2-ui/windows/ScenarioSelect.cpp index 8c4ab4d378..1b7aa88986 100644 --- a/src/openrct2-ui/windows/ScenarioSelect.cpp +++ b/src/openrct2-ui/windows/ScenarioSelect.cpp @@ -761,7 +761,7 @@ namespace OpenRCT2::Ui::Windows } }; - WindowBase* ScenarioselectOpen(scenarioselect_callback callback) + WindowBase* ScenarioselectOpen(ScenarioSelectCallback callback) { return ScenarioselectOpen([callback](std::string_view scenario) { callback(std::string(scenario).c_str()); }); } diff --git a/src/openrct2-ui/windows/Scenery.cpp b/src/openrct2-ui/windows/Scenery.cpp index b20d1d2c49..3804434ac6 100644 --- a/src/openrct2-ui/windows/Scenery.cpp +++ b/src/openrct2-ui/windows/Scenery.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +60,8 @@ #include #include +using namespace OpenRCT2::Numerics; + namespace OpenRCT2::Ui::Windows { static constexpr StringId WINDOW_TITLE = STR_NONE; @@ -679,7 +682,7 @@ namespace OpenRCT2::Ui::Windows widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WindowWidgetType::FlatBtn; } - if ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) + if ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) { widgets[WIDX_RESTRICT_SCENERY].type = WindowWidgetType::Button; if (IsSceneryItemRestricted(tabSelectedScenery)) @@ -2363,7 +2366,7 @@ namespace OpenRCT2::Ui::Windows void Sub6E1F34UpdateScreenCoordsAndButtonsPressed(bool canRaiseItem, ScreenCoordsXY& screenPos) { - if (!canRaiseItem && !GetGameState().Cheats.DisableSupportLimits) + if (!canRaiseItem && !GetGameState().Cheats.disableSupportLimits) { gSceneryCtrlPressed = false; gSceneryShiftPressed = false; @@ -2421,7 +2424,7 @@ namespace OpenRCT2::Ui::Windows { gSceneryShiftPressZOffset = mainWnd->viewport->zoom.ApplyTo(gSceneryShiftPressZOffset); } - gSceneryShiftPressZOffset = Floor2(gSceneryShiftPressZOffset, 8); + gSceneryShiftPressZOffset = floor2(gSceneryShiftPressZOffset, 8); screenPos.x = gSceneryShiftPressX; screenPos.y = gSceneryShiftPressY; diff --git a/src/openrct2-ui/windows/ServerList.cpp b/src/openrct2-ui/windows/ServerList.cpp index 3b7e3e9c4d..196d48728d 100644 --- a/src/openrct2-ui/windows/ServerList.cpp +++ b/src/openrct2-ui/windows/ServerList.cpp @@ -9,32 +9,32 @@ #ifndef DISABLE_NETWORK -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Ui::Windows { -# define WWIDTH_MIN 500 -# define WHEIGHT_MIN 300 -# define WWIDTH_MAX 1200 -# define WHEIGHT_MAX 800 -# define ITEM_HEIGHT (3 + 9 + 3) + #define WWIDTH_MIN 500 + #define WHEIGHT_MIN 300 + #define WWIDTH_MAX 1200 + #define WHEIGHT_MAX 800 + #define ITEM_HEIGHT (3 + 9 + 3) constexpr size_t MaxPlayerNameLength = 32; @@ -91,7 +91,7 @@ namespace OpenRCT2::Ui::Windows std::string _version; public: -# pragma region Window Override Events + #pragma region Window Override Events void OnOpen() override { @@ -433,7 +433,7 @@ namespace OpenRCT2::Ui::Windows } } -# pragma endregion + #pragma endregion private: void ServerListFetchServersBegin() diff --git a/src/openrct2-ui/windows/ServerStart.cpp b/src/openrct2-ui/windows/ServerStart.cpp index f24b12d24d..dc851cb5ea 100644 --- a/src/openrct2-ui/windows/ServerStart.cpp +++ b/src/openrct2-ui/windows/ServerStart.cpp @@ -9,17 +9,17 @@ #ifndef DISABLE_NETWORK -# include "../interface/Theme.h" + #include "../interface/Theme.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include namespace OpenRCT2::Ui::Windows { @@ -139,7 +139,7 @@ namespace OpenRCT2::Ui::Windows NetworkSetPassword(_password); auto intent = Intent(WindowClass::Loadsave); intent.PutExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME); - intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(LoadSaveCallback)); + intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(LoadSaveCallback)); ContextOpenIntent(&intent); break; } diff --git a/src/openrct2-ui/windows/Staff.cpp b/src/openrct2-ui/windows/Staff.cpp index 62ea364b92..6558fda86d 100644 --- a/src/openrct2-ui/windows/Staff.cpp +++ b/src/openrct2-ui/windows/Staff.cpp @@ -7,11 +7,10 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#include "../interface/Theme.h" -#include "../interface/ViewportQuery.h" - #include +#include #include +#include #include #include #include @@ -36,6 +35,8 @@ #include #include +using namespace OpenRCT2::Numerics; + namespace OpenRCT2::Ui::Windows { static constexpr StringId WINDOW_TITLE = STR_STRINGID; @@ -582,7 +583,7 @@ namespace OpenRCT2::Ui::Windows if (page == WINDOW_STAFF_OVERVIEW) { offset = _tabAnimationOffset; - offset = Floor2(offset, 4); + offset = floor2(offset, 4); } imageIndex += offset; diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index 319bc78b0b..998f69f2e7 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -43,13 +44,14 @@ #include #include #include -#include #include #include #include #include #include +using namespace OpenRCT2::Numerics; + namespace OpenRCT2::Ui::Windows { enum @@ -916,7 +918,7 @@ namespace OpenRCT2::Ui::Windows GfxDrawSprite(dpi, ImageId(SPR_G2_SANDBOX), screenPos); // Draw an overlay if clearance checks are disabled - if (GetGameState().Cheats.DisableClearanceChecks) + if (GetGameState().Cheats.disableClearanceChecks) { auto colour = ColourWithFlags{ COLOUR_DARK_ORANGE }.withFlag(ColourFlag::withOutline, true); DrawTextBasic( @@ -1448,15 +1450,15 @@ namespace OpenRCT2::Ui::Windows } auto& gameState = GetGameState(); - if (gameState.Cheats.SandboxMode) + if (gameState.Cheats.sandboxMode) { Dropdown::SetChecked(DDIDX_ENABLE_SANDBOX_MODE, true); } - if (gameState.Cheats.DisableClearanceChecks) + if (gameState.Cheats.disableClearanceChecks) { Dropdown::SetChecked(DDIDX_DISABLE_CLEARANCE_CHECKS, true); } - if (gameState.Cheats.DisableSupportLimits) + if (gameState.Cheats.disableSupportLimits) { Dropdown::SetChecked(DDIDX_DISABLE_SUPPORT_LIMITS, true); } @@ -1488,13 +1490,13 @@ namespace OpenRCT2::Ui::Windows ContextOpenWindow(WindowClass::EditorObjectiveOptions); break; case DDIDX_ENABLE_SANDBOX_MODE: - CheatsSet(CheatType::SandboxMode, !GetGameState().Cheats.SandboxMode); + CheatsSet(CheatType::SandboxMode, !GetGameState().Cheats.sandboxMode); break; case DDIDX_DISABLE_CLEARANCE_CHECKS: - CheatsSet(CheatType::DisableClearanceChecks, !GetGameState().Cheats.DisableClearanceChecks); + CheatsSet(CheatType::DisableClearanceChecks, !GetGameState().Cheats.disableClearanceChecks); break; case DDIDX_DISABLE_SUPPORT_LIMITS: - CheatsSet(CheatType::DisableSupportLimits, !GetGameState().Cheats.DisableSupportLimits); + CheatsSet(CheatType::DisableSupportLimits, !GetGameState().Cheats.disableSupportLimits); break; } } diff --git a/src/openrct2-ui/windows/TrackDesignPlace.cpp b/src/openrct2-ui/windows/TrackDesignPlace.cpp index c1c83bf06c..02db21bcf3 100644 --- a/src/openrct2-ui/windows/TrackDesignPlace.cpp +++ b/src/openrct2-ui/windows/TrackDesignPlace.cpp @@ -37,6 +37,7 @@ #include #include +using namespace OpenRCT2::Numerics; using namespace OpenRCT2::TrackMetaData; namespace OpenRCT2::Ui::Windows @@ -207,7 +208,7 @@ namespace OpenRCT2::Ui::Windows } money64 cost = kMoney64Undefined; - if (GameIsNotPaused() || GetGameState().Cheats.BuildInPauseMode) + if (GameIsNotPaused() || GetGameState().Cheats.buildInPauseMode) { ClearProvisional(); auto res = FindValidTrackDesignPlaceHeight(trackLoc, GAME_COMMAND_FLAG_NO_SPEND | GAME_COMMAND_FLAG_GHOST); @@ -415,7 +416,7 @@ namespace OpenRCT2::Ui::Windows } const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { DrawMiniPreviewMaze(td, pass, origin, min, max); } @@ -466,7 +467,7 @@ namespace OpenRCT2::Ui::Windows auto info = GetMapCoordinatesFromPos(screenCoords, interactionFlags); if (info.interactionType == ViewportInteractionItem::Terrain) { - _trackPlaceCtrlZ = Floor2(surfaceElement->GetBaseZ(), kCoordsZStep); + _trackPlaceCtrlZ = floor2(surfaceElement->GetBaseZ(), kCoordsZStep); // Increase Z above water if (surfaceElement->GetWaterHeight() > 0) @@ -474,7 +475,7 @@ namespace OpenRCT2::Ui::Windows } else { - _trackPlaceCtrlZ = Floor2(info.Element->GetBaseZ(), kCoordsZStep); + _trackPlaceCtrlZ = floor2(info.Element->GetBaseZ(), kCoordsZStep); } _trackPlaceCtrlState = true; @@ -504,7 +505,7 @@ namespace OpenRCT2::Ui::Windows _trackPlaceShiftZ = mainWnd->viewport->zoom.ApplyTo(_trackPlaceShiftZ); // Floor to closest kCoordsZStep - _trackPlaceShiftZ = Floor2(_trackPlaceShiftZ, kCoordsZStep); + _trackPlaceShiftZ = floor2(_trackPlaceShiftZ, kCoordsZStep); // Clamp to maximum possible value of BaseHeight can offer. _trackPlaceShiftZ = std::min(_trackPlaceShiftZ, maxHeight); @@ -517,7 +518,7 @@ namespace OpenRCT2::Ui::Windows if (!_trackPlaceCtrlState) { - _trackPlaceZ = Floor2(surfaceElement->GetBaseZ(), kCoordsZStep); + _trackPlaceZ = floor2(surfaceElement->GetBaseZ(), kCoordsZStep); // Increase Z above water if (surfaceElement->GetWaterHeight() > 0) diff --git a/src/openrct2-ui/windows/TrackList.cpp b/src/openrct2-ui/windows/TrackList.cpp index 60ef169386..de95175fed 100644 --- a/src/openrct2-ui/windows/TrackList.cpp +++ b/src/openrct2-ui/windows/TrackList.cpp @@ -562,9 +562,9 @@ namespace OpenRCT2::Ui::Windows if (GetRideTypeDescriptor(_loadedTrackDesign->trackAndVehicle.rtdIndex).HasFlag(RtdFlag::hasTrack)) { const auto& rtd = GetRideTypeDescriptor(_loadedTrackDesign->trackAndVehicle.rtdIndex); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { - if (_loadedTrackDesign->trackAndVehicle.rtdIndex == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) { // Holes ft = Formatter(); diff --git a/src/openrct2-ui/windows/Window.h b/src/openrct2-ui/windows/Window.h index aaf44d7a81..75b39767ca 100644 --- a/src/openrct2-ui/windows/Window.h +++ b/src/openrct2-ui/windows/Window.h @@ -24,8 +24,8 @@ struct Vehicle; enum class GuestListFilterType : int32_t; enum class ScatterToolDensity : uint8_t; -using loadsave_callback = void (*)(int32_t result, const utf8* path); -using scenarioselect_callback = void (*)(const utf8* path); +using LoadSaveCallback = void (*)(int32_t result, const utf8* path); +using ScenarioSelectCallback = void (*)(const utf8* path); namespace OpenRCT2::Ui::Windows { @@ -118,7 +118,7 @@ namespace OpenRCT2::Ui::Windows WindowBase* GuestListOpen(); WindowBase* GuestListOpenWithFilter(GuestListFilterType type, int32_t index); WindowBase* StaffFirePromptOpen(Peep* peep); - WindowBase* ScenarioselectOpen(scenarioselect_callback callback); + WindowBase* ScenarioselectOpen(ScenarioSelectCallback callback); WindowBase* ScenarioselectOpen(std::function callback); WindowBase* ErrorOpen(StringId title, StringId message, const class Formatter& formatter, bool autoClose = false); @@ -174,11 +174,11 @@ namespace OpenRCT2::Ui::Windows WindowBase* MazeConstructionOpen(); void WindowMazeConstructionUpdatePressedWidgets(); - WindowBase* NetworkStatusOpen(const std::string& text, close_callback onClose); + WindowBase* NetworkStatusOpen(const std::string& text, CloseCallback onClose); WindowBase* NetworkStatusOpenPassword(); void WindowNetworkStatusClose(); - WindowBase* ProgressWindowOpen(const std::string& text, close_callback onClose = nullptr); + WindowBase* ProgressWindowOpen(const std::string& text, CloseCallback onClose = nullptr); void ProgressWindowSet(uint32_t currentProgress, uint32_t totalCount, StringId format = STR_NONE); void ProgressWindowClose(); diff --git a/src/openrct2/CMakeLists.txt b/src/openrct2/CMakeLists.txt index 27cb45aa71..81afc79674 100644 --- a/src/openrct2/CMakeLists.txt +++ b/src/openrct2/CMakeLists.txt @@ -1,4 +1,5 @@ -cmake_minimum_required(VERSION 3.9) +cmake_minimum_required(VERSION 3.10) + project(libopenrct2 CXX) if (CMAKE_BINARY_DIR STREQUAL CMAKE_SOURCE_DIR) @@ -261,7 +262,7 @@ endif() # Only valid for Clang for now: # - GCC 8 does not support -Wno-pragma-once-outside-header # - Other compilers status unknown -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") +if (ENABLE_HEADERS_CHECK AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") add_library(${PROJECT_NAME}-headers-check OBJECT ${OPENRCT2_CORE_HEADERS}) set_target_properties(${PROJECT_NAME}-headers-check PROPERTIES LINKER_LANGUAGE CXX) set_source_files_properties(${OPENRCT2_CORE_HEADERS} PROPERTIES LANGUAGE CXX) diff --git a/src/openrct2/Cheats.cpp b/src/openrct2/Cheats.cpp index 5a3d0a237d..7427f8931f 100644 --- a/src/openrct2/Cheats.cpp +++ b/src/openrct2/Cheats.cpp @@ -30,33 +30,34 @@ using namespace OpenRCT2; void CheatsReset() { auto& gameState = GetGameState(); - gameState.Cheats.SandboxMode = false; - gameState.Cheats.DisableClearanceChecks = false; - gameState.Cheats.DisableSupportLimits = false; - gameState.Cheats.ShowAllOperatingModes = false; - gameState.Cheats.ShowVehiclesFromOtherTrackTypes = false; - gameState.Cheats.DisableTrainLengthLimit = false; - gameState.Cheats.EnableChainLiftOnAllTrack = false; - gameState.Cheats.UnlockOperatingLimits = false; - gameState.Cheats.DisableBrakesFailure = false; - gameState.Cheats.DisableAllBreakdowns = false; - gameState.Cheats.BuildInPauseMode = false; - gameState.Cheats.IgnoreRideIntensity = false; - gameState.Cheats.IgnorePrice = false; - gameState.Cheats.DisableVandalism = false; - gameState.Cheats.DisableLittering = false; - gameState.Cheats.NeverendingMarketing = false; - gameState.Cheats.FreezeWeather = false; - gameState.Cheats.DisablePlantAging = false; - gameState.Cheats.AllowArbitraryRideTypeChanges = false; - gameState.Cheats.DisableRideValueAging = false; - gameState.Cheats.IgnoreResearchStatus = false; - gameState.Cheats.EnableAllDrawableTrackPieces = false; - gameState.Cheats.AllowTrackPlaceInvalidHeights = false; - gameState.Cheats.AllowRegularPathAsQueue = false; - gameState.Cheats.AllowSpecialColourSchemes = false; - gameState.Cheats.MakeAllDestructible = false; - gameState.Cheats.SelectedStaffSpeed = StaffSpeedCheat::None; + gameState.Cheats.sandboxMode = false; + gameState.Cheats.disableClearanceChecks = false; + gameState.Cheats.disableSupportLimits = false; + gameState.Cheats.showAllOperatingModes = false; + gameState.Cheats.showVehiclesFromOtherTrackTypes = false; + gameState.Cheats.disableTrainLengthLimit = false; + gameState.Cheats.enableChainLiftOnAllTrack = false; + gameState.Cheats.unlockOperatingLimits = false; + gameState.Cheats.disableBrakesFailure = false; + gameState.Cheats.disableAllBreakdowns = false; + gameState.Cheats.buildInPauseMode = false; + gameState.Cheats.ignoreRideIntensity = false; + gameState.Cheats.ignorePrice = false; + gameState.Cheats.disableVandalism = false; + gameState.Cheats.disableLittering = false; + gameState.Cheats.neverendingMarketing = false; + gameState.Cheats.freezeWeather = false; + gameState.Cheats.disablePlantAging = false; + gameState.Cheats.allowArbitraryRideTypeChanges = false; + gameState.Cheats.disableRideValueAging = false; + gameState.Cheats.ignoreResearchStatus = false; + gameState.Cheats.enableAllDrawableTrackPieces = false; + gameState.Cheats.allowTrackPlaceInvalidHeights = false; + gameState.Cheats.allowRegularPathAsQueue = false; + gameState.Cheats.allowSpecialColourSchemes = false; + gameState.Cheats.makeAllDestructible = false; + gameState.Cheats.selectedStaffSpeed = StaffSpeedCheat::None; + gameState.Cheats.forcedParkRating = kForcedParkRatingDisabled; } void CheatsSet(CheatType cheatType, int64_t param1 /* = 0*/, int64_t param2 /* = 0*/) @@ -85,36 +86,37 @@ void CheatsSerialise(DataSerialiser& ds) uint64_t countOffset = stream.GetPosition(); ds << count; - CheatEntrySerialise(ds, CheatType::SandboxMode, gameState.Cheats.SandboxMode, count); - CheatEntrySerialise(ds, CheatType::DisableClearanceChecks, gameState.Cheats.DisableClearanceChecks, count); - CheatEntrySerialise(ds, CheatType::DisableSupportLimits, gameState.Cheats.DisableSupportLimits, count); - CheatEntrySerialise(ds, CheatType::ShowAllOperatingModes, gameState.Cheats.ShowAllOperatingModes, count); + CheatEntrySerialise(ds, CheatType::SandboxMode, gameState.Cheats.sandboxMode, count); + CheatEntrySerialise(ds, CheatType::DisableClearanceChecks, gameState.Cheats.disableClearanceChecks, count); + CheatEntrySerialise(ds, CheatType::DisableSupportLimits, gameState.Cheats.disableSupportLimits, count); + CheatEntrySerialise(ds, CheatType::ShowAllOperatingModes, gameState.Cheats.showAllOperatingModes, count); CheatEntrySerialise( - ds, CheatType::ShowVehiclesFromOtherTrackTypes, gameState.Cheats.ShowVehiclesFromOtherTrackTypes, count); - CheatEntrySerialise(ds, CheatType::FastLiftHill, gameState.Cheats.UnlockOperatingLimits, count); - CheatEntrySerialise(ds, CheatType::DisableBrakesFailure, gameState.Cheats.DisableBrakesFailure, count); - CheatEntrySerialise(ds, CheatType::DisableAllBreakdowns, gameState.Cheats.DisableAllBreakdowns, count); - CheatEntrySerialise(ds, CheatType::BuildInPauseMode, gameState.Cheats.BuildInPauseMode, count); - CheatEntrySerialise(ds, CheatType::IgnoreRideIntensity, gameState.Cheats.IgnoreRideIntensity, count); - CheatEntrySerialise(ds, CheatType::DisableVandalism, gameState.Cheats.DisableVandalism, count); - CheatEntrySerialise(ds, CheatType::DisableLittering, gameState.Cheats.DisableLittering, count); - CheatEntrySerialise(ds, CheatType::NeverEndingMarketing, gameState.Cheats.NeverendingMarketing, count); - CheatEntrySerialise(ds, CheatType::FreezeWeather, gameState.Cheats.FreezeWeather, count); - CheatEntrySerialise(ds, CheatType::DisableTrainLengthLimit, gameState.Cheats.DisableTrainLengthLimit, count); - CheatEntrySerialise(ds, CheatType::DisablePlantAging, gameState.Cheats.DisablePlantAging, count); - CheatEntrySerialise(ds, CheatType::EnableChainLiftOnAllTrack, gameState.Cheats.EnableChainLiftOnAllTrack, count); + ds, CheatType::ShowVehiclesFromOtherTrackTypes, gameState.Cheats.showVehiclesFromOtherTrackTypes, count); + CheatEntrySerialise(ds, CheatType::FastLiftHill, gameState.Cheats.unlockOperatingLimits, count); + CheatEntrySerialise(ds, CheatType::DisableBrakesFailure, gameState.Cheats.disableBrakesFailure, count); + CheatEntrySerialise(ds, CheatType::DisableAllBreakdowns, gameState.Cheats.disableAllBreakdowns, count); + CheatEntrySerialise(ds, CheatType::BuildInPauseMode, gameState.Cheats.buildInPauseMode, count); + CheatEntrySerialise(ds, CheatType::IgnoreRideIntensity, gameState.Cheats.ignoreRideIntensity, count); + CheatEntrySerialise(ds, CheatType::DisableVandalism, gameState.Cheats.disableVandalism, count); + CheatEntrySerialise(ds, CheatType::DisableLittering, gameState.Cheats.disableLittering, count); + CheatEntrySerialise(ds, CheatType::NeverendingMarketing, gameState.Cheats.neverendingMarketing, count); + CheatEntrySerialise(ds, CheatType::FreezeWeather, gameState.Cheats.freezeWeather, count); + CheatEntrySerialise(ds, CheatType::DisableTrainLengthLimit, gameState.Cheats.disableTrainLengthLimit, count); + CheatEntrySerialise(ds, CheatType::DisablePlantAging, gameState.Cheats.disablePlantAging, count); + CheatEntrySerialise(ds, CheatType::EnableChainLiftOnAllTrack, gameState.Cheats.enableChainLiftOnAllTrack, count); CheatEntrySerialise( - ds, CheatType::AllowArbitraryRideTypeChanges, gameState.Cheats.AllowArbitraryRideTypeChanges, count); - CheatEntrySerialise(ds, CheatType::DisableRideValueAging, gameState.Cheats.DisableRideValueAging, count); - CheatEntrySerialise(ds, CheatType::IgnoreResearchStatus, gameState.Cheats.IgnoreResearchStatus, count); - CheatEntrySerialise(ds, CheatType::EnableAllDrawableTrackPieces, gameState.Cheats.EnableAllDrawableTrackPieces, count); + ds, CheatType::AllowArbitraryRideTypeChanges, gameState.Cheats.allowArbitraryRideTypeChanges, count); + CheatEntrySerialise(ds, CheatType::DisableRideValueAging, gameState.Cheats.disableRideValueAging, count); + CheatEntrySerialise(ds, CheatType::IgnoreResearchStatus, gameState.Cheats.ignoreResearchStatus, count); + CheatEntrySerialise(ds, CheatType::EnableAllDrawableTrackPieces, gameState.Cheats.enableAllDrawableTrackPieces, count); CheatEntrySerialise( - ds, CheatType::AllowTrackPlaceInvalidHeights, gameState.Cheats.AllowTrackPlaceInvalidHeights, count); - CheatEntrySerialise(ds, CheatType::AllowRegularPathAsQueue, gameState.Cheats.AllowRegularPathAsQueue, count); - CheatEntrySerialise(ds, CheatType::AllowSpecialColourSchemes, gameState.Cheats.AllowSpecialColourSchemes, count); - CheatEntrySerialise(ds, CheatType::MakeDestructible, gameState.Cheats.MakeAllDestructible, count); - CheatEntrySerialise(ds, CheatType::SetStaffSpeed, gameState.Cheats.SelectedStaffSpeed, count); - CheatEntrySerialise(ds, CheatType::IgnorePrice, gameState.Cheats.IgnorePrice, count); + ds, CheatType::AllowTrackPlaceInvalidHeights, gameState.Cheats.allowTrackPlaceInvalidHeights, count); + CheatEntrySerialise(ds, CheatType::AllowRegularPathAsQueue, gameState.Cheats.allowRegularPathAsQueue, count); + CheatEntrySerialise(ds, CheatType::AllowSpecialColourSchemes, gameState.Cheats.allowSpecialColourSchemes, count); + CheatEntrySerialise(ds, CheatType::MakeDestructible, gameState.Cheats.makeAllDestructible, count); + CheatEntrySerialise(ds, CheatType::SetStaffSpeed, gameState.Cheats.selectedStaffSpeed, count); + CheatEntrySerialise(ds, CheatType::IgnorePrice, gameState.Cheats.ignorePrice, count); + CheatEntrySerialise(ds, CheatType::SetForcedParkRating, gameState.Cheats.forcedParkRating, count); // Remember current position and update count. uint64_t endOffset = stream.GetPosition(); @@ -139,89 +141,91 @@ void CheatsSerialise(DataSerialiser& ds) switch (static_cast(type)) { case CheatType::SandboxMode: - ds << gameState.Cheats.SandboxMode; + ds << gameState.Cheats.sandboxMode; break; case CheatType::DisableClearanceChecks: - ds << gameState.Cheats.DisableClearanceChecks; + ds << gameState.Cheats.disableClearanceChecks; break; case CheatType::DisableSupportLimits: - ds << gameState.Cheats.DisableSupportLimits; + ds << gameState.Cheats.disableSupportLimits; break; case CheatType::ShowAllOperatingModes: - ds << gameState.Cheats.ShowAllOperatingModes; + ds << gameState.Cheats.showAllOperatingModes; break; case CheatType::ShowVehiclesFromOtherTrackTypes: - ds << gameState.Cheats.ShowVehiclesFromOtherTrackTypes; + ds << gameState.Cheats.showVehiclesFromOtherTrackTypes; break; case CheatType::FastLiftHill: - ds << gameState.Cheats.UnlockOperatingLimits; + ds << gameState.Cheats.unlockOperatingLimits; break; case CheatType::DisableBrakesFailure: - ds << gameState.Cheats.DisableBrakesFailure; + ds << gameState.Cheats.disableBrakesFailure; break; case CheatType::DisableAllBreakdowns: - ds << gameState.Cheats.DisableAllBreakdowns; + ds << gameState.Cheats.disableAllBreakdowns; break; case CheatType::BuildInPauseMode: - ds << gameState.Cheats.BuildInPauseMode; + ds << gameState.Cheats.buildInPauseMode; break; case CheatType::IgnoreRideIntensity: - ds << gameState.Cheats.IgnoreRideIntensity; + ds << gameState.Cheats.ignoreRideIntensity; break; case CheatType::IgnorePrice: - ds << gameState.Cheats.IgnorePrice; + ds << gameState.Cheats.ignorePrice; break; case CheatType::DisableVandalism: - ds << gameState.Cheats.DisableVandalism; + ds << gameState.Cheats.disableVandalism; break; case CheatType::DisableLittering: - ds << gameState.Cheats.DisableLittering; + ds << gameState.Cheats.disableLittering; break; - case CheatType::NeverEndingMarketing: - ds << gameState.Cheats.NeverendingMarketing; + case CheatType::NeverendingMarketing: + ds << gameState.Cheats.neverendingMarketing; break; case CheatType::FreezeWeather: - ds << gameState.Cheats.FreezeWeather; + ds << gameState.Cheats.freezeWeather; break; case CheatType::DisableTrainLengthLimit: - ds << gameState.Cheats.DisableTrainLengthLimit; + ds << gameState.Cheats.disableTrainLengthLimit; break; case CheatType::DisablePlantAging: - ds << gameState.Cheats.DisablePlantAging; + ds << gameState.Cheats.disablePlantAging; break; case CheatType::EnableChainLiftOnAllTrack: - ds << gameState.Cheats.EnableChainLiftOnAllTrack; + ds << gameState.Cheats.enableChainLiftOnAllTrack; break; case CheatType::AllowArbitraryRideTypeChanges: - ds << gameState.Cheats.AllowArbitraryRideTypeChanges; + ds << gameState.Cheats.allowArbitraryRideTypeChanges; break; case CheatType::DisableRideValueAging: - ds << gameState.Cheats.DisableRideValueAging; + ds << gameState.Cheats.disableRideValueAging; break; case CheatType::IgnoreResearchStatus: - ds << gameState.Cheats.IgnoreResearchStatus; + ds << gameState.Cheats.ignoreResearchStatus; break; case CheatType::EnableAllDrawableTrackPieces: - ds << gameState.Cheats.EnableAllDrawableTrackPieces; + ds << gameState.Cheats.enableAllDrawableTrackPieces; break; case CheatType::AllowTrackPlaceInvalidHeights: - ds << gameState.Cheats.AllowTrackPlaceInvalidHeights; + ds << gameState.Cheats.allowTrackPlaceInvalidHeights; break; case CheatType::NoCapOnQueueLengthDummy: ds << dummyBool; break; case CheatType::AllowRegularPathAsQueue: - ds << gameState.Cheats.AllowRegularPathAsQueue; + ds << gameState.Cheats.allowRegularPathAsQueue; break; case CheatType::AllowSpecialColourSchemes: - ds << gameState.Cheats.AllowSpecialColourSchemes; + ds << gameState.Cheats.allowSpecialColourSchemes; break; case CheatType::MakeDestructible: - ds << gameState.Cheats.MakeAllDestructible; + ds << gameState.Cheats.makeAllDestructible; break; case CheatType::SetStaffSpeed: - ds << gameState.Cheats.SelectedStaffSpeed; + ds << gameState.Cheats.selectedStaffSpeed; break; + case CheatType::SetForcedParkRating: + ds << gameState.Cheats.forcedParkRating; default: break; } @@ -305,7 +309,7 @@ const char* CheatsGetName(CheatType cheatType) return LanguageGetString(STR_CHANGE_WEATHER); case CheatType::FreezeWeather: return LanguageGetString(STR_CHEAT_FREEZE_WEATHER); - case CheatType::NeverEndingMarketing: + case CheatType::NeverendingMarketing: return LanguageGetString(STR_CHEAT_NEVERENDING_MARKETING); case CheatType::OpenClosePark: return LanguageGetString(STR_CHEAT_OPEN_PARK); diff --git a/src/openrct2/Cheats.h b/src/openrct2/Cheats.h index a244f9d0f3..bf1539fb30 100644 --- a/src/openrct2/Cheats.h +++ b/src/openrct2/Cheats.h @@ -20,33 +20,34 @@ enum class StaffSpeedCheat struct CheatsState { - bool SandboxMode; - bool DisableClearanceChecks; - bool DisableSupportLimits; - bool ShowAllOperatingModes; - bool ShowVehiclesFromOtherTrackTypes; - bool UnlockOperatingLimits; - bool DisableBrakesFailure; - bool DisableAllBreakdowns; - bool BuildInPauseMode; - bool IgnoreRideIntensity; - bool IgnorePrice; - bool DisableVandalism; - bool DisableLittering; - bool NeverendingMarketing; - bool FreezeWeather; - bool DisableTrainLengthLimit; - bool DisablePlantAging; - bool DisableRideValueAging; - bool EnableChainLiftOnAllTrack; - bool AllowArbitraryRideTypeChanges; - bool IgnoreResearchStatus; - bool EnableAllDrawableTrackPieces; - bool AllowTrackPlaceInvalidHeights; - bool AllowRegularPathAsQueue; - bool AllowSpecialColourSchemes; - bool MakeAllDestructible; - StaffSpeedCheat SelectedStaffSpeed; + bool sandboxMode; + bool disableClearanceChecks; + bool disableSupportLimits; + bool showAllOperatingModes; + bool showVehiclesFromOtherTrackTypes; + bool unlockOperatingLimits; + bool disableBrakesFailure; + bool disableAllBreakdowns; + bool buildInPauseMode; + bool ignoreRideIntensity; + bool ignorePrice; + bool disableVandalism; + bool disableLittering; + bool neverendingMarketing; + bool freezeWeather; + bool disableTrainLengthLimit; + bool disablePlantAging; + bool disableRideValueAging; + bool enableChainLiftOnAllTrack; + bool allowArbitraryRideTypeChanges; + bool ignoreResearchStatus; + bool enableAllDrawableTrackPieces; + bool allowTrackPlaceInvalidHeights; + bool allowRegularPathAsQueue; + bool allowSpecialColourSchemes; + bool makeAllDestructible; + StaffSpeedCheat selectedStaffSpeed; + int32_t forcedParkRating; }; enum class CheatType : int32_t @@ -91,7 +92,7 @@ enum class CheatType : int32_t OpenClosePark, HaveFun, SetForcedParkRating, - NeverEndingMarketing, + NeverendingMarketing, AllowArbitraryRideTypeChanges, OwnAllLand, DisableRideValueAging, @@ -129,11 +130,12 @@ enum }; constexpr auto kCheatsGiveGuestsMoney = 1000.00_GBP; -constexpr int kCheatsTramIncrement = 250; -constexpr int kCheatsDuckIncrement = 20; -constexpr int kCheatsStaffFastSpeed = 0xFF; -constexpr int kCheatsStaffNormalSpeed = 0x60; -constexpr int kCheatsStaffFreezeSpeed = 0; +constexpr int32_t kCheatsTramIncrement = 250; +constexpr int32_t kCheatsDuckIncrement = 20; +constexpr int32_t kCheatsStaffFastSpeed = 0xFF; +constexpr int32_t kCheatsStaffNormalSpeed = 0x60; +constexpr int32_t kCheatsStaffFreezeSpeed = 0; +constexpr int32_t kForcedParkRatingDisabled = -1; void CheatsReset(); const char* CheatsGetName(CheatType cheatType); diff --git a/src/openrct2/Context.cpp b/src/openrct2/Context.cpp index 4f2684257b..031e9aa9e0 100644 --- a/src/openrct2/Context.cpp +++ b/src/openrct2/Context.cpp @@ -8,8 +8,8 @@ *****************************************************************************/ #ifdef __EMSCRIPTEN__ -# include -# include + #include + #include #endif // __EMSCRIPTEN__ #include "AssetPackManager.h" @@ -57,6 +57,7 @@ #include "object/ObjectRepository.h" #include "paint/Painter.h" #include "park/ParkFile.h" +#include "peep/PeepAnimationData.h" #include "platform/Crash.h" #include "platform/Platform.h" #include "profiling/Profiling.h" @@ -1006,6 +1007,7 @@ namespace OpenRCT2 return result; } + // TODO: move function elsewhere? bool LoadBaseGraphics() { if (!GfxLoadG1(*_env)) @@ -1015,6 +1017,7 @@ namespace OpenRCT2 GfxLoadG2(); GfxLoadCsg(); FontSpriteInitialiseCharacters(); + inferMaxPeepSpriteDimensions(); return true; } diff --git a/src/openrct2/Diagnostic.cpp b/src/openrct2/Diagnostic.cpp index 93f757e018..33666bf974 100644 --- a/src/openrct2/Diagnostic.cpp +++ b/src/openrct2/Diagnostic.cpp @@ -17,7 +17,7 @@ #include #ifdef __ANDROID__ -# include + #include #endif using namespace OpenRCT2; diff --git a/src/openrct2/Diagnostic.h b/src/openrct2/Diagnostic.h index 1181d00b06..734085874f 100644 --- a/src/openrct2/Diagnostic.h +++ b/src/openrct2/Diagnostic.h @@ -44,28 +44,28 @@ enum class DiagnosticLevel */ #if defined(DEBUG) -# if DEBUG > 0 -# define DEBUG_LEVEL_1 1 -# if DEBUG > 1 -# define DEBUG_LEVEL_2 1 -# if DEBUG > 2 -# define DEBUG_LEVEL_3 1 -# else -# define DEBUG_LEVEL_3 0 -# endif // DEBUG > 2 -# else -# define DEBUG_LEVEL_3 0 -# define DEBUG_LEVEL_2 0 -# endif // DEBUG > 1 -# else -# define DEBUG_LEVEL_1 0 -# define DEBUG_LEVEL_2 0 -# define DEBUG_LEVEL_3 0 -# endif // DEBUG > 0 + #if DEBUG > 0 + #define DEBUG_LEVEL_1 1 + #if DEBUG > 1 + #define DEBUG_LEVEL_2 1 + #if DEBUG > 2 + #define DEBUG_LEVEL_3 1 + #else + #define DEBUG_LEVEL_3 0 + #endif // DEBUG > 2 + #else + #define DEBUG_LEVEL_3 0 + #define DEBUG_LEVEL_2 0 + #endif // DEBUG > 1 + #else + #define DEBUG_LEVEL_1 0 + #define DEBUG_LEVEL_2 0 + #define DEBUG_LEVEL_3 0 + #endif // DEBUG > 0 #else -# define DEBUG_LEVEL_3 0 -# define DEBUG_LEVEL_2 0 -# define DEBUG_LEVEL_1 0 + #define DEBUG_LEVEL_3 0 + #define DEBUG_LEVEL_2 0 + #define DEBUG_LEVEL_1 0 #endif // defined(DEBUG) extern bool _log_levels[static_cast(DiagnosticLevel::Count)]; @@ -75,10 +75,10 @@ void DiagnosticLogWithLocation( DiagnosticLevel diagnosticLevel, const char* file, const char* function, int32_t line, const char* format, ...); #ifdef _MSC_VER -# define DIAGNOSTIC_LOG_MACRO(level, format, ...) \ + #define DIAGNOSTIC_LOG_MACRO(level, format, ...) \ DiagnosticLogWithLocation(level, __FILE__, __FUNCTION__, __LINE__, format, ##__VA_ARGS__) #else -# define DIAGNOSTIC_LOG_MACRO(level, format, ...) \ + #define DIAGNOSTIC_LOG_MACRO(level, format, ...) \ DiagnosticLogWithLocation(level, __FILE__, __func__, __LINE__, format, ##__VA_ARGS__) #endif // _MSC_VER diff --git a/src/openrct2/Editor.cpp b/src/openrct2/Editor.cpp index 58ab763afc..80560a2a2d 100644 --- a/src/openrct2/Editor.cpp +++ b/src/openrct2/Editor.cpp @@ -128,7 +128,7 @@ namespace OpenRCT2::Editor ToolCancel(); auto intent = Intent(WindowClass::Loadsave); intent.PutExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME); - intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(ConvertSaveToScenarioCallback)); + intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(ConvertSaveToScenarioCallback)); ContextOpenIntent(&intent); } diff --git a/src/openrct2/Game.cpp b/src/openrct2/Game.cpp index 8940bfca52..444b9b3890 100644 --- a/src/openrct2/Game.cpp +++ b/src/openrct2/Game.cpp @@ -654,7 +654,7 @@ void GameLoadOrQuitNoSavePrompt() { auto intent = Intent(WindowClass::Loadsave); intent.PutExtra(INTENT_EXTRA_LOADSAVE_TYPE, LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME); - intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(GameLoadOrQuitNoSavePromptCallback)); + intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(GameLoadOrQuitNoSavePromptCallback)); ContextOpenIntent(&intent); } break; @@ -683,7 +683,7 @@ void GameLoadOrQuitNoSavePrompt() GameActions::Execute(&loadOrQuitAction); ToolCancel(); auto intent = Intent(WindowClass::ScenarioSelect); - intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(NewGameWindowCallback)); + intent.PutExtra(INTENT_EXTRA_CALLBACK, reinterpret_cast(NewGameWindowCallback)); ContextOpenIntent(&intent); break; } diff --git a/src/openrct2/Version.cpp b/src/openrct2/Version.cpp index 0b1863e608..ee76fdd1ea 100644 --- a/src/openrct2/Version.cpp +++ b/src/openrct2/Version.cpp @@ -19,7 +19,7 @@ using namespace OpenRCT2; #ifdef OPENRCT2_BUILD_INFO_HEADER -# include OPENRCT2_BUILD_INFO_HEADER + #include OPENRCT2_BUILD_INFO_HEADER #endif const char gVersionInfoTag[] = @@ -38,16 +38,16 @@ const char gVersionInfoFull[] = OPENRCT2_NAME ", " #endif #if defined(OPENRCT2_BRANCH) || defined(OPENRCT2_COMMIT_SHA1_SHORT) || !defined(NDEBUG) " (" -# if defined(OPENRCT2_BRANCH) && defined(OPENRCT2_COMMIT_SHA1_SHORT) + #if defined(OPENRCT2_BRANCH) && defined(OPENRCT2_COMMIT_SHA1_SHORT) OPENRCT2_COMMIT_SHA1_SHORT " on " OPENRCT2_BRANCH -# elif defined(OPENRCT2_COMMIT_SHA1_SHORT) + #elif defined(OPENRCT2_COMMIT_SHA1_SHORT) OPENRCT2_COMMIT_SHA1_SHORT -# elif defined(OPENRCT2_BRANCH) + #elif defined(OPENRCT2_BRANCH) OPENRCT2_BRANCH -# endif -# ifndef NDEBUG + #endif + #ifndef NDEBUG ", DEBUG" -# endif + #endif ")" #endif #ifdef OPENRCT2_BUILD_SERVER diff --git a/src/openrct2/Version.h b/src/openrct2/Version.h index f9da61cfb7..a44b865e70 100644 --- a/src/openrct2/Version.h +++ b/src/openrct2/Version.h @@ -15,61 +15,61 @@ #define OPENRCT2_VERSION "0.4.16" #if defined(__amd64__) || defined(_M_AMD64) -# define OPENRCT2_ARCHITECTURE "x86-64" + #define OPENRCT2_ARCHITECTURE "x86-64" #elif defined(__i386__) || defined(_M_IX86) -# define OPENRCT2_ARCHITECTURE "x86" + #define OPENRCT2_ARCHITECTURE "x86" #elif defined(__aarch64__) || defined(_M_ARM64) -# define OPENRCT2_ARCHITECTURE "AArch64" + #define OPENRCT2_ARCHITECTURE "AArch64" #elif defined(__arm__) || defined(_M_ARM) -# if defined(__ARM_ARCH_7A__) -# define OPENRCT2_ARCHITECTURE "arm-v7a" -# else -# define OPENRCT2_ARCHITECTURE "arm" -# endif + #if defined(__ARM_ARCH_7A__) + #define OPENRCT2_ARCHITECTURE "arm-v7a" + #else + #define OPENRCT2_ARCHITECTURE "arm" + #endif #elif defined(__powerpc__) || defined(_M_PPC) -# define OPENRCT2_ARCHITECTURE "PowerPC" + #define OPENRCT2_ARCHITECTURE "PowerPC" #elif defined(__mips64) -# define OPENRCT2_ARCHITECTURE "mips64" + #define OPENRCT2_ARCHITECTURE "mips64" #elif defined(__mips__) -# define OPENRCT2_ARCHITECTURE "mips" + #define OPENRCT2_ARCHITECTURE "mips" #elif defined(__riscv) -# define OPENRCT2_ARCHITECTURE "RISC-V" + #define OPENRCT2_ARCHITECTURE "RISC-V" #endif #ifdef __EMSCRIPTEN__ -# define OPENRCT2_ARCHITECTURE "Emscripten" + #define OPENRCT2_ARCHITECTURE "Emscripten" #endif #ifndef OPENRCT2_ARCHITECTURE -# error "OPENRCT2_ARCHITECTURE is undefined. Please add identification." + #error "OPENRCT2_ARCHITECTURE is undefined. Please add identification." #endif // Platform #ifdef _WIN32 -# define OPENRCT2_PLATFORM "Windows" + #define OPENRCT2_PLATFORM "Windows" #endif #if defined(__linux__) && !defined(__ANDROID__) -# define OPENRCT2_PLATFORM "Linux" + #define OPENRCT2_PLATFORM "Linux" #endif #if (defined(__APPLE__) && defined(__MACH__)) -# define OPENRCT2_PLATFORM "macOS" + #define OPENRCT2_PLATFORM "macOS" #endif #ifdef __FreeBSD__ -# define OPENRCT2_PLATFORM "FreeBSD" + #define OPENRCT2_PLATFORM "FreeBSD" #endif #ifdef __NetBSD__ -# define OPENRCT2_PLATFORM "NetBSD" + #define OPENRCT2_PLATFORM "NetBSD" #endif #ifdef __ANDROID__ -# define OPENRCT2_PLATFORM "Android" + #define OPENRCT2_PLATFORM "Android" #endif #ifdef __OpenBSD__ -# define OPENRCT2_PLATFORM "OpenBSD" + #define OPENRCT2_PLATFORM "OpenBSD" #endif #ifdef __EMSCRIPTEN__ -# define OPENRCT2_PLATFORM "Emscripten" + #define OPENRCT2_PLATFORM "Emscripten" #endif #ifndef OPENRCT2_PLATFORM -# error Unknown platform! + #error Unknown platform! #endif extern const char gVersionInfoFull[]; diff --git a/src/openrct2/actions/CheatSetAction.cpp b/src/openrct2/actions/CheatSetAction.cpp index 3106c75158..cc61d2b555 100644 --- a/src/openrct2/actions/CheatSetAction.cpp +++ b/src/openrct2/actions/CheatSetAction.cpp @@ -107,53 +107,53 @@ GameActions::Result CheatSetAction::Execute() const switch (static_cast(_cheatType.id)) { case CheatType::SandboxMode: - gameState.Cheats.SandboxMode = _param1 != 0; + gameState.Cheats.sandboxMode = _param1 != 0; WindowInvalidateByClass(WindowClass::Map); WindowInvalidateByClass(WindowClass::Footpath); break; case CheatType::DisableClearanceChecks: - gameState.Cheats.DisableClearanceChecks = _param1 != 0; + gameState.Cheats.disableClearanceChecks = _param1 != 0; // Required to update the clearance checks overlay on the Cheats button. WindowInvalidateByClass(WindowClass::TopToolbar); break; case CheatType::DisableSupportLimits: - gameState.Cheats.DisableSupportLimits = _param1 != 0; + gameState.Cheats.disableSupportLimits = _param1 != 0; break; case CheatType::ShowAllOperatingModes: - gameState.Cheats.ShowAllOperatingModes = _param1 != 0; + gameState.Cheats.showAllOperatingModes = _param1 != 0; break; case CheatType::ShowVehiclesFromOtherTrackTypes: - gameState.Cheats.ShowVehiclesFromOtherTrackTypes = _param1 != 0; + gameState.Cheats.showVehiclesFromOtherTrackTypes = _param1 != 0; break; case CheatType::FastLiftHill: - gameState.Cheats.UnlockOperatingLimits = _param1 != 0; + gameState.Cheats.unlockOperatingLimits = _param1 != 0; break; case CheatType::DisableBrakesFailure: - gameState.Cheats.DisableBrakesFailure = _param1 != 0; + gameState.Cheats.disableBrakesFailure = _param1 != 0; break; case CheatType::DisableAllBreakdowns: - gameState.Cheats.DisableAllBreakdowns = _param1 != 0; + gameState.Cheats.disableAllBreakdowns = _param1 != 0; break; case CheatType::DisableTrainLengthLimit: - gameState.Cheats.DisableTrainLengthLimit = _param1 != 0; + gameState.Cheats.disableTrainLengthLimit = _param1 != 0; break; case CheatType::EnableChainLiftOnAllTrack: - gameState.Cheats.EnableChainLiftOnAllTrack = _param1 != 0; + gameState.Cheats.enableChainLiftOnAllTrack = _param1 != 0; break; case CheatType::BuildInPauseMode: - gameState.Cheats.BuildInPauseMode = _param1 != 0; + gameState.Cheats.buildInPauseMode = _param1 != 0; break; case CheatType::IgnoreRideIntensity: - gameState.Cheats.IgnoreRideIntensity = _param1 != 0; + gameState.Cheats.ignoreRideIntensity = _param1 != 0; break; case CheatType::IgnorePrice: - gameState.Cheats.IgnorePrice = _param1 != 0; + gameState.Cheats.ignorePrice = _param1 != 0; break; case CheatType::DisableVandalism: - gameState.Cheats.DisableVandalism = _param1 != 0; + gameState.Cheats.disableVandalism = _param1 != 0; break; case CheatType::DisableLittering: - gameState.Cheats.DisableLittering = _param1 != 0; + gameState.Cheats.disableLittering = _param1 != 0; break; case CheatType::NoMoney: SetScenarioNoMoney(_param1 != 0); @@ -192,7 +192,7 @@ GameActions::Result CheatSetAction::Execute() const RemoveLitter(); break; case CheatType::DisablePlantAging: - gameState.Cheats.DisablePlantAging = _param1 != 0; + gameState.Cheats.disablePlantAging = _param1 != 0; break; case CheatType::SetStaffSpeed: SetStaffSpeed(_param1); @@ -201,7 +201,7 @@ GameActions::Result CheatSetAction::Execute() const RenewRides(); break; case CheatType::MakeDestructible: - gameState.Cheats.MakeAllDestructible = _param1 != 0; + gameState.Cheats.makeAllDestructible = _param1 != 0; WindowInvalidateByClass(WindowClass::Ride); break; case CheatType::FixRides: @@ -221,10 +221,10 @@ GameActions::Result CheatSetAction::Execute() const ClimateForceWeather(WeatherType{ static_cast(_param1) }); break; case CheatType::FreezeWeather: - gameState.Cheats.FreezeWeather = _param1 != 0; + gameState.Cheats.freezeWeather = _param1 != 0; break; - case CheatType::NeverEndingMarketing: - gameState.Cheats.NeverendingMarketing = _param1 != 0; + case CheatType::NeverendingMarketing: + gameState.Cheats.neverendingMarketing = _param1 != 0; break; case CheatType::OpenClosePark: ParkSetOpen(!gameState.Park.IsOpen()); @@ -236,20 +236,20 @@ GameActions::Result CheatSetAction::Execute() const Park::SetForcedRating(_param1); break; case CheatType::AllowArbitraryRideTypeChanges: - gameState.Cheats.AllowArbitraryRideTypeChanges = _param1 != 0; + gameState.Cheats.allowArbitraryRideTypeChanges = _param1 != 0; WindowInvalidateByClass(WindowClass::Ride); break; case CheatType::OwnAllLand: OwnAllLand(); break; case CheatType::DisableRideValueAging: - gameState.Cheats.DisableRideValueAging = _param1 != 0; + gameState.Cheats.disableRideValueAging = _param1 != 0; break; case CheatType::IgnoreResearchStatus: - gameState.Cheats.IgnoreResearchStatus = _param1 != 0; + gameState.Cheats.ignoreResearchStatus = _param1 != 0; break; case CheatType::EnableAllDrawableTrackPieces: - gameState.Cheats.EnableAllDrawableTrackPieces = _param1 != 0; + gameState.Cheats.enableAllDrawableTrackPieces = _param1 != 0; break; case CheatType::CreateDucks: CreateDucks(_param1); @@ -258,13 +258,13 @@ GameActions::Result CheatSetAction::Execute() const Duck::RemoveAll(); break; case CheatType::AllowTrackPlaceInvalidHeights: - gameState.Cheats.AllowTrackPlaceInvalidHeights = _param1 != 0; + gameState.Cheats.allowTrackPlaceInvalidHeights = _param1 != 0; break; case CheatType::AllowRegularPathAsQueue: - gameState.Cheats.AllowRegularPathAsQueue = _param1 != 0; + gameState.Cheats.allowRegularPathAsQueue = _param1 != 0; break; case CheatType::AllowSpecialColourSchemes: - gameState.Cheats.AllowSpecialColourSchemes = static_cast(_param1); + gameState.Cheats.allowSpecialColourSchemes = static_cast(_param1); break; case CheatType::RemoveParkFences: RemoveParkFences(); @@ -326,7 +326,7 @@ ParametersRange CheatSetAction::GetParameterRange(CheatType cheatType) const [[fallthrough]]; case CheatType::FreezeWeather: [[fallthrough]]; - case CheatType::NeverEndingMarketing: + case CheatType::NeverendingMarketing: [[fallthrough]]; case CheatType::AllowArbitraryRideTypeChanges: [[fallthrough]]; diff --git a/src/openrct2/actions/ClearAction.cpp b/src/openrct2/actions/ClearAction.cpp index 662bb77e65..2119c98da7 100644 --- a/src/openrct2/actions/ClearAction.cpp +++ b/src/openrct2/actions/ClearAction.cpp @@ -242,6 +242,6 @@ void ClearAction::ResetClearLargeSceneryFlag() bool ClearAction::MapCanClearAt(const CoordsXY& location) { - return (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode + return (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode || MapIsLocationOwnedOrHasRights(location); } diff --git a/src/openrct2/actions/CustomAction.cpp b/src/openrct2/actions/CustomAction.cpp index 922bf8ab67..d6eaaea72b 100644 --- a/src/openrct2/actions/CustomAction.cpp +++ b/src/openrct2/actions/CustomAction.cpp @@ -8,10 +8,10 @@ *****************************************************************************/ #ifdef ENABLE_SCRIPTING -# include "CustomAction.h" + #include "CustomAction.h" -# include "../Context.h" -# include "../scripting/ScriptEngine.h" + #include "../Context.h" + #include "../scripting/ScriptEngine.h" using namespace OpenRCT2; diff --git a/src/openrct2/actions/CustomAction.h b/src/openrct2/actions/CustomAction.h index eb44d92d5e..8011b1d333 100644 --- a/src/openrct2/actions/CustomAction.h +++ b/src/openrct2/actions/CustomAction.h @@ -11,7 +11,7 @@ #ifdef ENABLE_SCRIPTING -# include "GameAction.h" + #include "GameAction.h" class CustomAction final : public GameActionBase { diff --git a/src/openrct2/actions/FootpathAdditionPlaceAction.cpp b/src/openrct2/actions/FootpathAdditionPlaceAction.cpp index d175b002ce..8f47b12509 100644 --- a/src/openrct2/actions/FootpathAdditionPlaceAction.cpp +++ b/src/openrct2/actions/FootpathAdditionPlaceAction.cpp @@ -61,7 +61,7 @@ GameActions::Result FootpathAdditionPlaceAction::Query() const return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_POSITION_THIS_HERE, STR_OFF_EDGE_OF_MAP); } - if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) && !MapIsLocationOwned(_loc)) + if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); } diff --git a/src/openrct2/actions/FootpathAdditionRemoveAction.cpp b/src/openrct2/actions/FootpathAdditionRemoveAction.cpp index a9cfb875de..61c73ab5f9 100644 --- a/src/openrct2/actions/FootpathAdditionRemoveAction.cpp +++ b/src/openrct2/actions/FootpathAdditionRemoveAction.cpp @@ -53,7 +53,7 @@ GameActions::Result FootpathAdditionRemoveAction::Query() const return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REMOVE_THIS, STR_OFF_EDGE_OF_MAP); } - if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) && !MapIsLocationOwned(_loc)) + if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); } diff --git a/src/openrct2/actions/FootpathLayoutPlaceAction.cpp b/src/openrct2/actions/FootpathLayoutPlaceAction.cpp index 77a99bf527..010dd2e406 100644 --- a/src/openrct2/actions/FootpathLayoutPlaceAction.cpp +++ b/src/openrct2/actions/FootpathLayoutPlaceAction.cpp @@ -79,7 +79,7 @@ GameActions::Result FootpathLayoutPlaceAction::Query() const GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); } - if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) && !MapIsLocationOwned(_loc)) + if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { return GameActions::Result( GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); @@ -169,7 +169,7 @@ GameActions::Result FootpathLayoutPlaceAction::ElementInsertQuery(GameActions::R const auto clearanceData = canBuild.GetData(); gFootpathGroundFlags = clearanceData.GroundFlags; - if (!GetGameState().Cheats.DisableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) + if (!GetGameState().Cheats.disableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) { return GameActions::Result( GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); diff --git a/src/openrct2/actions/FootpathPlaceAction.cpp b/src/openrct2/actions/FootpathPlaceAction.cpp index 5deeeb6ddc..8f93f4b9e7 100644 --- a/src/openrct2/actions/FootpathPlaceAction.cpp +++ b/src/openrct2/actions/FootpathPlaceAction.cpp @@ -87,7 +87,7 @@ GameActions::Result FootpathPlaceAction::Query() const return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_BUILD_FOOTPATH_HERE, STR_OFF_EDGE_OF_MAP); } - if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) && !MapIsLocationOwned(_loc)) + if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_LAND_NOT_OWNED_BY_PARK); } @@ -144,7 +144,7 @@ GameActions::Result FootpathPlaceAction::Execute() const if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { - if (_direction != INVALID_DIRECTION && !GetGameState().Cheats.DisableClearanceChecks) + if (_direction != INVALID_DIRECTION && !GetGameState().Cheats.disableClearanceChecks) { // It is possible, let's remove walls between the old and new piece of path auto zLow = _loc.z; @@ -324,7 +324,7 @@ GameActions::Result FootpathPlaceAction::ElementInsertQuery(GameActions::Result const auto clearanceData = canBuild.GetData(); gFootpathGroundFlags = clearanceData.GroundFlags; - if (!GetGameState().Cheats.DisableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) + if (!GetGameState().Cheats.disableClearanceChecks && (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER)) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_FOOTPATH_HERE, STR_CANT_BUILD_THIS_UNDERWATER); diff --git a/src/openrct2/actions/FootpathRemoveAction.cpp b/src/openrct2/actions/FootpathRemoveAction.cpp index 39eafb1a58..4454052ea7 100644 --- a/src/openrct2/actions/FootpathRemoveAction.cpp +++ b/src/openrct2/actions/FootpathRemoveAction.cpp @@ -60,7 +60,7 @@ GameActions::Result FootpathRemoveAction::Query() const GameActions::Status::InvalidParameters, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_OFF_EDGE_OF_MAP); } - if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) && !MapIsLocationOwned(_loc)) + if (!((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) && !MapIsLocationOwned(_loc)) { return GameActions::Result( GameActions::Status::NotOwned, STR_CANT_REMOVE_FOOTPATH_FROM_HERE, STR_LAND_NOT_OWNED_BY_PARK); diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index 5d4dfa72a3..db9abbe56d 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -183,7 +183,7 @@ namespace OpenRCT2::GameActions { if (gGamePaused == 0) return true; - if (GetGameState().Cheats.BuildInPauseMode) + if (GetGameState().Cheats.buildInPauseMode) return true; if (actionFlags & GameActions::Flags::AllowWhilePaused) return true; diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index 753f0e9220..4e827c2e42 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -33,9 +33,9 @@ namespace OpenRCT2::GameActions } // namespace OpenRCT2::GameActions #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" -# pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif /** @@ -247,7 +247,7 @@ public: }; #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif template diff --git a/src/openrct2/actions/LandLowerAction.cpp b/src/openrct2/actions/LandLowerAction.cpp index 7b3cf49f26..4439be05c7 100644 --- a/src/openrct2/actions/LandLowerAction.cpp +++ b/src/openrct2/actions/LandLowerAction.cpp @@ -96,7 +96,7 @@ GameActions::Result LandLowerAction::QueryExecute(bool isExecuting) const if (surfaceElement == nullptr) continue; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { diff --git a/src/openrct2/actions/LandRaiseAction.cpp b/src/openrct2/actions/LandRaiseAction.cpp index adae6589b2..99156a1381 100644 --- a/src/openrct2/actions/LandRaiseAction.cpp +++ b/src/openrct2/actions/LandRaiseAction.cpp @@ -97,7 +97,7 @@ GameActions::Result LandRaiseAction::QueryExecute(bool isExecuting) const if (surfaceElement == nullptr) continue; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { diff --git a/src/openrct2/actions/LandSetHeightAction.cpp b/src/openrct2/actions/LandSetHeightAction.cpp index c31217efca..a3bcd97382 100644 --- a/src/openrct2/actions/LandSetHeightAction.cpp +++ b/src/openrct2/actions/LandSetHeightAction.cpp @@ -72,7 +72,7 @@ GameActions::Result LandSetHeightAction::Query() const return GameActions::Result(GameActions::Status::Disallowed, STR_NONE, errorMessage); } - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.sandboxMode) { if (!MapIsLocationInPark(_coords)) { @@ -81,7 +81,7 @@ GameActions::Result LandSetHeightAction::Query() const } money64 sceneryRemovalCost = 0; - if (!gameState.Cheats.DisableClearanceChecks) + if (!gameState.Cheats.disableClearanceChecks) { if (gameState.Park.Flags & PARK_FLAGS_FORBID_TREE_REMOVAL) { @@ -98,7 +98,7 @@ GameActions::Result LandSetHeightAction::Query() const } // Check for ride support limits - if (!gameState.Cheats.DisableSupportLimits) + if (!gameState.Cheats.disableSupportLimits) { errorMessage = CheckRideSupports(); if (errorMessage != STR_NONE) @@ -129,7 +129,7 @@ GameActions::Result LandSetHeightAction::Query() const return res; } - if (!gameState.Cheats.DisableClearanceChecks) + if (!gameState.Cheats.disableClearanceChecks) { uint8_t zCorner = _height; if (_style & kTileSlopeRaisedCornersMask) @@ -162,7 +162,7 @@ GameActions::Result LandSetHeightAction::Execute() const auto surfaceHeight = TileElementHeight(_coords); FootpathRemoveLitter({ _coords, surfaceHeight }); - if (!GetGameState().Cheats.DisableClearanceChecks) + if (!GetGameState().Cheats.disableClearanceChecks) { WallRemoveAt({ _coords, _height * 8 - 16, _height * 8 + 32 }); cost += GetSmallSceneryRemovalCost(); diff --git a/src/openrct2/actions/LandSetRightsAction.cpp b/src/openrct2/actions/LandSetRightsAction.cpp index a6308a903b..5a2a82e6f6 100644 --- a/src/openrct2/actions/LandSetRightsAction.cpp +++ b/src/openrct2/actions/LandSetRightsAction.cpp @@ -15,11 +15,11 @@ #include "../OpenRCT2.h" #include "../actions/LandSetHeightAction.h" #include "../audio/audio.h" +#include "../core/Numerics.hpp" #include "../interface/Window.h" #include "../localisation/StringIds.h" #include "../management/Finance.h" #include "../ride/RideData.h" -#include "../util/Math.hpp" #include "../windows/Intent.h" #include "../world/Park.h" #include "../world/Scenery.h" @@ -28,6 +28,7 @@ #include "../world/tile_element/SurfaceElement.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; LandSetRightsAction::LandSetRightsAction(const MapRange& range, LandSetRightSetting setting, uint8_t ownership) : _range(range) @@ -84,7 +85,7 @@ GameActions::Result LandSetRightsAction::QueryExecute(bool isExecuting) const res.Position = centre; res.Expenditure = ExpenditureType::LandPurchase; - if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.sandboxMode) { return GameActions::Result(GameActions::Status::NotInEditorMode, STR_NONE, STR_LAND_NOT_FOR_SALE); } @@ -220,7 +221,7 @@ GameActions::Result LandSetRightsAction::MapBuyLandRightsForTile(const CoordsXY& std::remove_if( gameState.PeepSpawns.begin(), gameState.PeepSpawns.end(), [x = loc.x, y = loc.y](const auto& spawn) { - return Floor2(spawn.x, 32) == x && Floor2(spawn.y, 32) == y; + return floor2(spawn.x, 32) == x && floor2(spawn.y, 32) == y; }), gameState.PeepSpawns.end()); } diff --git a/src/openrct2/actions/LargeSceneryPlaceAction.cpp b/src/openrct2/actions/LargeSceneryPlaceAction.cpp index 53f8097c78..91aa584d8e 100644 --- a/src/openrct2/actions/LargeSceneryPlaceAction.cpp +++ b/src/openrct2/actions/LargeSceneryPlaceAction.cpp @@ -152,7 +152,7 @@ GameActions::Result LargeSceneryPlaceAction::Query() const const auto clearanceData = canBuild.GetData(); int32_t tempSceneryGroundFlags = clearanceData.GroundFlags & (ELEMENT_IS_ABOVE_GROUND | ELEMENT_IS_UNDERGROUND); - if (!gameState.Cheats.DisableClearanceChecks) + if (!gameState.Cheats.disableClearanceChecks) { if ((clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER) || (clearanceData.GroundFlags & ELEMENT_IS_UNDERGROUND)) { @@ -175,7 +175,7 @@ GameActions::Result LargeSceneryPlaceAction::Query() const } if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !MapIsLocationOwned({ curTile, zLow }) - && !gameState.Cheats.SandboxMode) + && !gameState.Cheats.sandboxMode) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); @@ -297,7 +297,7 @@ GameActions::Result LargeSceneryPlaceAction::Execute() const if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { FootpathRemoveLitter({ curTile, zLow }); - if (!GetGameState().Cheats.DisableClearanceChecks) + if (!GetGameState().Cheats.disableClearanceChecks) { WallRemoveAt({ curTile, zLow, zHigh }); } diff --git a/src/openrct2/actions/LargeSceneryRemoveAction.cpp b/src/openrct2/actions/LargeSceneryRemoveAction.cpp index ad6f412f90..496920d969 100644 --- a/src/openrct2/actions/LargeSceneryRemoveAction.cpp +++ b/src/openrct2/actions/LargeSceneryRemoveAction.cpp @@ -89,7 +89,7 @@ GameActions::Result LargeSceneryRemoveAction::Query() const auto currentTile = CoordsXYZ{ firstTile.x, firstTile.y, firstTile.z } + currentTileRotatedOffset; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (GetGameState().Park.Flags & PARK_FLAGS_FORBID_TREE_REMOVAL) { @@ -169,7 +169,7 @@ GameActions::Result LargeSceneryRemoveAction::Execute() const auto currentTile = CoordsXYZ{ firstTile.x, firstTile.y, firstTile.z } + rotatedCurrentTile; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationOwned({ currentTile.x, currentTile.y, currentTile.z })) { diff --git a/src/openrct2/actions/LargeScenerySetColourAction.cpp b/src/openrct2/actions/LargeScenerySetColourAction.cpp index b5c179fa3c..c4dee96c2e 100644 --- a/src/openrct2/actions/LargeScenerySetColourAction.cpp +++ b/src/openrct2/actions/LargeScenerySetColourAction.cpp @@ -127,7 +127,7 @@ GameActions::Result LargeScenerySetColourAction::QueryExecute(bool isExecuting) auto rotatedTileCoords = CoordsXYZ{ CoordsXY{ tile.offset }.Rotate(_loc.direction), tile.offset.z }; auto currentTile = CoordsXYZ{ baseTile.x, baseTile.y, baseTile.z } + rotatedTileCoords; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationOwned(currentTile)) { diff --git a/src/openrct2/actions/MazePlaceTrackAction.cpp b/src/openrct2/actions/MazePlaceTrackAction.cpp index 5784aa74b3..36fc6235a1 100644 --- a/src/openrct2/actions/MazePlaceTrackAction.cpp +++ b/src/openrct2/actions/MazePlaceTrackAction.cpp @@ -65,7 +65,7 @@ GameActions::Result MazePlaceTrackAction::Query() const return res; } auto& gameState = GetGameState(); - if (!MapIsLocationOwned(_loc) && !gameState.Cheats.SandboxMode) + if (!MapIsLocationOwned(_loc) && !gameState.Cheats.sandboxMode) { res.Error = GameActions::Status::NotOwned; res.ErrorMessage = STR_LAND_NOT_OWNED_BY_PARK; @@ -90,7 +90,7 @@ GameActions::Result MazePlaceTrackAction::Query() const auto clearanceHeight = _loc.z + MAZE_CLEARANCE_HEIGHT; auto heightDifference = baseHeight - surfaceElement->GetBaseZ(); - if (heightDifference >= 0 && !gameState.Cheats.DisableSupportLimits) + if (heightDifference >= 0 && !gameState.Cheats.disableSupportLimits) { heightDifference /= kCoordsZPerTinyZ; diff --git a/src/openrct2/actions/MazeSetTrackAction.cpp b/src/openrct2/actions/MazeSetTrackAction.cpp index e754f26134..b3d0e0ef17 100644 --- a/src/openrct2/actions/MazeSetTrackAction.cpp +++ b/src/openrct2/actions/MazeSetTrackAction.cpp @@ -101,7 +101,7 @@ GameActions::Result MazeSetTrackAction::Query() const return res; } auto& gameState = GetGameState(); - if (!MapIsLocationOwned(_loc) && !gameState.Cheats.SandboxMode) + if (!MapIsLocationOwned(_loc) && !gameState.Cheats.sandboxMode) { res.Error = GameActions::Status::NotOwned; res.ErrorMessage = STR_LAND_NOT_OWNED_BY_PARK; @@ -126,7 +126,7 @@ GameActions::Result MazeSetTrackAction::Query() const auto clearanceHeight = _loc.z + 32; auto heightDifference = baseHeight - surfaceElement->GetBaseZ(); - if (heightDifference >= 0 && !gameState.Cheats.DisableSupportLimits) + if (heightDifference >= 0 && !gameState.Cheats.disableSupportLimits) { heightDifference /= kCoordsZPerTinyZ; diff --git a/src/openrct2/actions/ParkEntrancePlaceAction.cpp b/src/openrct2/actions/ParkEntrancePlaceAction.cpp index 713d6f647d..a583d4de80 100644 --- a/src/openrct2/actions/ParkEntrancePlaceAction.cpp +++ b/src/openrct2/actions/ParkEntrancePlaceAction.cpp @@ -56,7 +56,7 @@ void ParkEntrancePlaceAction::Serialise(DataSerialiser& stream) GameActions::Result ParkEntrancePlaceAction::Query() const { - if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.sandboxMode) { return GameActions::Result(GameActions::Status::NotInEditorMode, STR_CANT_BUILD_THIS_HERE, STR_NONE); } diff --git a/src/openrct2/actions/ParkEntranceRemoveAction.cpp b/src/openrct2/actions/ParkEntranceRemoveAction.cpp index aee81da261..cff3e7a14a 100644 --- a/src/openrct2/actions/ParkEntranceRemoveAction.cpp +++ b/src/openrct2/actions/ParkEntranceRemoveAction.cpp @@ -43,7 +43,7 @@ void ParkEntranceRemoveAction::Serialise(DataSerialiser& stream) GameActions::Result ParkEntranceRemoveAction::Query() const { - if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.sandboxMode) { return GameActions::Result(GameActions::Status::NotInEditorMode, STR_CANT_REMOVE_THIS, STR_NONE); } diff --git a/src/openrct2/actions/PeepSpawnPlaceAction.cpp b/src/openrct2/actions/PeepSpawnPlaceAction.cpp index 5e2898a692..62a211955a 100644 --- a/src/openrct2/actions/PeepSpawnPlaceAction.cpp +++ b/src/openrct2/actions/PeepSpawnPlaceAction.cpp @@ -45,7 +45,7 @@ void PeepSpawnPlaceAction::Serialise(DataSerialiser& stream) GameActions::Result PeepSpawnPlaceAction::Query() const { - if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_EDITOR) && !GetGameState().Cheats.sandboxMode) { return GameActions::Result(GameActions::Status::NotInEditorMode, STR_ERR_CANT_PLACE_PEEP_SPAWN_HERE, STR_NONE); } diff --git a/src/openrct2/actions/RideCreateAction.cpp b/src/openrct2/actions/RideCreateAction.cpp index 04435ae9c8..a3b0e9dbd8 100644 --- a/src/openrct2/actions/RideCreateAction.cpp +++ b/src/openrct2/actions/RideCreateAction.cpp @@ -18,6 +18,7 @@ #include "../interface/Window.h" #include "../localisation/Localisation.Date.h" #include "../localisation/StringIds.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectManager.h" #include "../rct1/RCT1.h" #include "../ride/Ride.h" @@ -163,7 +164,7 @@ GameActions::Result RideCreateAction::Execute() const ride->NumTrains = 1; auto& gameState = GetGameState(); - if (gameState.Cheats.DisableTrainLengthLimit) + if (gameState.Cheats.disableTrainLengthLimit) { // Reduce amount of proposed trains to prevent 32 trains from always spawning when limits are disabled if (rideEntry->cars_per_flat_ride == NoFlatRideCars) @@ -235,7 +236,7 @@ GameActions::Result RideCreateAction::Execute() const ride->price[0] = 0; } - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) { if (ShopItemHasCommonPrice(ShopItem::Admission)) { diff --git a/src/openrct2/actions/RideDemolishAction.cpp b/src/openrct2/actions/RideDemolishAction.cpp index 9ae83fbee3..f97ba1268d 100644 --- a/src/openrct2/actions/RideDemolishAction.cpp +++ b/src/openrct2/actions/RideDemolishAction.cpp @@ -67,7 +67,7 @@ GameActions::Result RideDemolishAction::Query() const if ((ride->lifecycle_flags & (RIDE_LIFECYCLE_INDESTRUCTIBLE | RIDE_LIFECYCLE_INDESTRUCTIBLE_TRACK) && _modifyType == RIDE_MODIFY_DEMOLISH) - && !GetGameState().Cheats.MakeAllDestructible) + && !GetGameState().Cheats.makeAllDestructible) { return GameActions::Result( GameActions::Status::NoClearance, STR_CANT_DEMOLISH_RIDE, diff --git a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp index b10188e9be..bf97fd04b4 100644 --- a/src/openrct2/actions/RideEntranceExitPlaceAction.cpp +++ b/src/openrct2/actions/RideEntranceExitPlaceAction.cpp @@ -102,7 +102,7 @@ GameActions::Result RideEntranceExitPlaceAction::Query() const { return GameActions::Result(GameActions::Status::InvalidParameters, errorTitle, STR_OFF_EDGE_OF_MAP); } - if (!GetGameState().Cheats.SandboxMode && !MapIsLocationOwned({ _loc, z })) + if (!GetGameState().Cheats.sandboxMode && !MapIsLocationOwned({ _loc, z })) { return GameActions::Result(GameActions::Status::NotOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); } @@ -173,7 +173,7 @@ GameActions::Result RideEntranceExitPlaceAction::Execute() const auto z = station.GetBaseZ(); if (!(GetFlags() & GAME_COMMAND_FLAG_ALLOW_DURING_PAUSED) && !(GetFlags() & GAME_COMMAND_FLAG_GHOST) - && !GetGameState().Cheats.DisableClearanceChecks) + && !GetGameState().Cheats.disableClearanceChecks) { FootpathRemoveLitter({ _loc, z }); WallRemoveAtZ({ _loc, z }); @@ -236,7 +236,7 @@ GameActions::Result RideEntranceExitPlaceAction::TrackPlaceQuery(const CoordsXYZ const auto errorTitle = isExit ? STR_CANT_BUILD_MOVE_EXIT_FOR_THIS_RIDE_ATTRACTION : STR_CANT_BUILD_MOVE_ENTRANCE_FOR_THIS_RIDE_ATTRACTION; - if (!GetGameState().Cheats.SandboxMode && !MapIsLocationOwned(loc)) + if (!GetGameState().Cheats.sandboxMode && !MapIsLocationOwned(loc)) { return GameActions::Result(GameActions::Status::NotOwned, errorTitle, STR_LAND_NOT_OWNED_BY_PARK); } diff --git a/src/openrct2/actions/RideSetPriceAction.cpp b/src/openrct2/actions/RideSetPriceAction.cpp index de24307cdc..c5a018e3b8 100644 --- a/src/openrct2/actions/RideSetPriceAction.cpp +++ b/src/openrct2/actions/RideSetPriceAction.cpp @@ -112,7 +112,7 @@ GameActions::Result RideSetPriceAction::Execute() const shopItem = ShopItem::Admission; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType != RtdSpecialType::toilet) { shopItem = rideEntry->shop_item[0]; if (shopItem == ShopItem::None) @@ -165,7 +165,7 @@ void RideSetPriceAction::RideSetCommonPrice(ShopItem shopItem) const auto invalidate = false; auto rideEntry = GetRideEntryByIndex(ride.subtype); const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet) && shopItem == ShopItem::Admission) + if (rtd.specialType == RtdSpecialType::toilet && shopItem == ShopItem::Admission) { if (ride.price[0] != _price) { diff --git a/src/openrct2/actions/RideSetSettingAction.cpp b/src/openrct2/actions/RideSetSettingAction.cpp index 245c1c23e6..437d94bfd5 100644 --- a/src/openrct2/actions/RideSetSettingAction.cpp +++ b/src/openrct2/actions/RideSetSettingAction.cpp @@ -70,7 +70,7 @@ GameActions::Result RideSetSettingAction::Query() const GameActions::Status::Disallowed, STR_CANT_CHANGE_OPERATING_MODE, STR_MUST_BE_CLOSED_FIRST); } - if (!RideIsModeValid(*ride) && !GetGameState().Cheats.ShowAllOperatingModes) + if (!RideIsModeValid(*ride) && !GetGameState().Cheats.showAllOperatingModes) { LOG_ERROR("Invalid ride mode: %u", _value); return GameActions::Result( @@ -149,7 +149,7 @@ GameActions::Result RideSetSettingAction::Query() const } break; case RideSetSetting::RideType: - if (!GetGameState().Cheats.AllowArbitraryRideTypeChanges) + if (!GetGameState().Cheats.allowArbitraryRideTypeChanges) { LOG_ERROR("Arbitrary ride type changes not allowed."); return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_CHANGE_OPERATING_MODE, STR_NONE); @@ -263,15 +263,15 @@ bool RideSetSettingAction::RideIsModeValid(const Ride& ride) const bool RideSetSettingAction::RideIsValidLiftHillSpeed(const Ride& ride) const { auto& gameState = GetGameState(); - int32_t minSpeed = gameState.Cheats.UnlockOperatingLimits ? 0 : ride.GetRideTypeDescriptor().LiftData.minimum_speed; - int32_t maxSpeed = gameState.Cheats.UnlockOperatingLimits ? 255 : ride.GetRideTypeDescriptor().LiftData.maximum_speed; + int32_t minSpeed = gameState.Cheats.unlockOperatingLimits ? 0 : ride.GetRideTypeDescriptor().LiftData.minimum_speed; + int32_t maxSpeed = gameState.Cheats.unlockOperatingLimits ? 255 : ride.GetRideTypeDescriptor().LiftData.maximum_speed; return _value >= minSpeed && _value <= maxSpeed; } bool RideSetSettingAction::RideIsValidNumCircuits() const { int32_t minNumCircuits = 1; - int32_t maxNumCircuits = GetGameState().Cheats.UnlockOperatingLimits ? 255 : Limits::kMaxCircuitsPerRide; + int32_t maxNumCircuits = GetGameState().Cheats.unlockOperatingLimits ? 255 : Limits::kMaxCircuitsPerRide; return _value >= minNumCircuits && _value <= maxNumCircuits; } @@ -280,7 +280,7 @@ bool RideSetSettingAction::RideIsValidOperationOption(const Ride& ride) const const auto& operatingSettings = ride.GetRideTypeDescriptor().OperatingSettings; uint8_t minValue = operatingSettings.MinValue; uint8_t maxValue = operatingSettings.MaxValue; - if (GetGameState().Cheats.UnlockOperatingLimits) + if (GetGameState().Cheats.unlockOperatingLimits) { minValue = 0; maxValue = 255; diff --git a/src/openrct2/actions/RideSetVehicleAction.cpp b/src/openrct2/actions/RideSetVehicleAction.cpp index b24dce20c6..b2b66d4549 100644 --- a/src/openrct2/actions/RideSetVehicleAction.cpp +++ b/src/openrct2/actions/RideSetVehicleAction.cpp @@ -159,7 +159,7 @@ GameActions::Result RideSetVehicleAction::Execute() const } uint8_t clampValue = _value; static_assert(sizeof(clampValue) == sizeof(ride->proposed_num_cars_per_train)); - if (!GetGameState().Cheats.DisableTrainLengthLimit) + if (!GetGameState().Cheats.disableTrainLengthLimit) { clampValue = std::clamp(clampValue, rideEntry->min_cars_in_train, rideEntry->max_cars_in_train); } @@ -182,7 +182,7 @@ GameActions::Result RideSetVehicleAction::Execute() const } RideSetVehicleColoursToRandomPreset(*ride, _colour); - if (!GetGameState().Cheats.DisableTrainLengthLimit) + if (!GetGameState().Cheats.disableTrainLengthLimit) { ride->proposed_num_cars_per_train = std::clamp( ride->proposed_num_cars_per_train, rideEntry->min_cars_in_train, rideEntry->max_cars_in_train); @@ -230,10 +230,10 @@ bool RideSetVehicleAction::RideIsVehicleTypeValid(const Ride& ride) const { const auto& rtd = ride.GetRideTypeDescriptor(); - if (gameState.Cheats.ShowVehiclesFromOtherTrackTypes + if (gameState.Cheats.showVehiclesFromOtherTrackTypes && !( - ride.GetRideTypeDescriptor().HasFlag(RtdFlag::isFlatRide) || rtd.HasFlag(RtdFlag::isMaze) - || ride.type == RIDE_TYPE_MINI_GOLF)) + ride.GetRideTypeDescriptor().HasFlag(RtdFlag::isFlatRide) || rtd.specialType == RtdSpecialType::maze + || rtd.specialType == RtdSpecialType::miniGolf)) { selectionShouldBeExpanded = true; rideTypeIterator = 0; @@ -255,7 +255,7 @@ bool RideSetVehicleAction::RideIsVehicleTypeValid(const Ride& ride) const continue; const auto& rtd = GetRideTypeDescriptor(rideTypeIterator); - if (rtd.HasFlag(RtdFlag::isMaze) || rideTypeIterator == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::maze || rtd.specialType == RtdSpecialType::miniGolf) continue; } @@ -265,7 +265,7 @@ bool RideSetVehicleAction::RideIsVehicleTypeValid(const Ride& ride) const { if (rideEntryIndex == _value) { - if (!RideEntryIsInvented(rideEntryIndex) && !gameState.Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(rideEntryIndex) && !gameState.Cheats.ignoreResearchStatus) { return false; } diff --git a/src/openrct2/actions/SmallSceneryPlaceAction.cpp b/src/openrct2/actions/SmallSceneryPlaceAction.cpp index 8e0a12cffe..176d054fb7 100644 --- a/src/openrct2/actions/SmallSceneryPlaceAction.cpp +++ b/src/openrct2/actions/SmallSceneryPlaceAction.cpp @@ -35,6 +35,7 @@ #include "SmallSceneryRemoveAction.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; SmallSceneryPlaceAction::SmallSceneryPlaceAction( const CoordsXYZD& loc, uint8_t quadrant, ObjectEntryIndex sceneryType, uint8_t primaryColour, uint8_t secondaryColour, @@ -172,7 +173,7 @@ GameActions::Result SmallSceneryPlaceAction::Query() const } auto& gameState = GetGameState(); - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.SandboxMode + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.sandboxMode && !MapIsLocationOwned({ _loc.x, _loc.y, targetHeight })) { return GameActions::Result(GameActions::Status::NotOwned, STR_CANT_POSITION_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); @@ -180,7 +181,7 @@ GameActions::Result SmallSceneryPlaceAction::Query() const auto* surfaceElement = MapGetSurfaceElementAt(_loc); - if (surfaceElement != nullptr && !gameState.Cheats.DisableClearanceChecks && surfaceElement->GetWaterHeight() > 0) + if (surfaceElement != nullptr && !gameState.Cheats.disableClearanceChecks && surfaceElement->GetWaterHeight() > 0) { int32_t water_height = surfaceElement->GetWaterHeight() - 1; if (water_height > targetHeight) @@ -190,7 +191,7 @@ GameActions::Result SmallSceneryPlaceAction::Query() const } } - if (!gameState.Cheats.DisableClearanceChecks && !(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_STACKABLE))) + if (!gameState.Cheats.disableClearanceChecks && !(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_STACKABLE))) { if (isOnWater) { @@ -208,13 +209,13 @@ GameActions::Result SmallSceneryPlaceAction::Query() const } } - if (!gameState.Cheats.DisableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_REQUIRE_FLAT_SURFACE)) + if (!gameState.Cheats.disableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_REQUIRE_FLAT_SURFACE)) && !supportsRequired && !isOnWater && surfaceElement != nullptr && (surfaceElement->GetSlope() != kTileSlopeFlat)) { return GameActions::Result(GameActions::Status::Disallowed, STR_CANT_POSITION_THIS_HERE, STR_LEVEL_LAND_REQUIRED); } - if (!gameState.Cheats.DisableSupportLimits && !(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_STACKABLE)) && supportsRequired) + if (!gameState.Cheats.disableSupportLimits && !(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_STACKABLE)) && supportsRequired) { if (!isOnWater) { @@ -235,7 +236,7 @@ GameActions::Result SmallSceneryPlaceAction::Query() const } int32_t zLow = targetHeight; - int32_t zHigh = zLow + Ceil2(sceneryEntry->height, kCoordsZStep); + int32_t zHigh = zLow + ceil2(sceneryEntry->height, kCoordsZStep); uint8_t collisionQuadrants = 0b1111; auto quadRotation{ 0 }; if (!(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_FULL_TILE))) @@ -367,14 +368,14 @@ GameActions::Result SmallSceneryPlaceAction::Execute() const if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { FootpathRemoveLitter({ _loc, targetHeight }); - if (!GetGameState().Cheats.DisableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_NO_WALLS))) + if (!GetGameState().Cheats.disableClearanceChecks && (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_NO_WALLS))) { WallRemoveAt({ _loc, targetHeight, targetHeight + sceneryEntry->height }); } } int32_t zLow = targetHeight; - int32_t zHigh = zLow + Ceil2(sceneryEntry->height, 8); + int32_t zHigh = zLow + ceil2(sceneryEntry->height, 8); uint8_t collisionQuadrants = 0b1111; auto quadRotation{ 0 }; if (!(sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_FULL_TILE))) diff --git a/src/openrct2/actions/SmallSceneryRemoveAction.cpp b/src/openrct2/actions/SmallSceneryRemoveAction.cpp index 443145bbb3..dea1d928b2 100644 --- a/src/openrct2/actions/SmallSceneryRemoveAction.cpp +++ b/src/openrct2/actions/SmallSceneryRemoveAction.cpp @@ -76,7 +76,7 @@ GameActions::Result SmallSceneryRemoveAction::Query() const res.Position = _loc; if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !(GetFlags() & GAME_COMMAND_FLAG_GHOST) - && !GetGameState().Cheats.SandboxMode) + && !GetGameState().Cheats.sandboxMode) { // Check if allowed to remove item if (GetGameState().Park.Flags & PARK_FLAGS_FORBID_TREE_REMOVAL) diff --git a/src/openrct2/actions/SmallScenerySetColourAction.cpp b/src/openrct2/actions/SmallScenerySetColourAction.cpp index 5283e66107..7dae014d62 100644 --- a/src/openrct2/actions/SmallScenerySetColourAction.cpp +++ b/src/openrct2/actions/SmallScenerySetColourAction.cpp @@ -84,7 +84,7 @@ GameActions::Result SmallScenerySetColourAction::QueryExecute(bool isExecuting) return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); } - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationOwned(_loc)) { diff --git a/src/openrct2/actions/StaffHireNewAction.cpp b/src/openrct2/actions/StaffHireNewAction.cpp index 1fb573abd8..e29db45b1b 100644 --- a/src/openrct2/actions/StaffHireNewAction.cpp +++ b/src/openrct2/actions/StaffHireNewAction.cpp @@ -134,7 +134,7 @@ GameActions::Result StaffHireNewAction::QueryExecute(bool execute) const newPeep->SpecialSprite = 0; newPeep->AnimationImageIdOffset = 0; newPeep->WalkingAnimationFrameNum = 0; - newPeep->AnimationType = PeepAnimationType::None; + newPeep->AnimationType = PeepAnimationType::Walking; newPeep->PathCheckOptimisation = 0; newPeep->PeepFlags = 0; newPeep->StaffLawnsMown = 0; @@ -201,7 +201,7 @@ GameActions::Result StaffHireNewAction::QueryExecute(bool execute) const newPeep->TrousersColour = colour; // Staff energy determines their walking speed - switch (GetGameState().Cheats.SelectedStaffSpeed) + switch (GetGameState().Cheats.selectedStaffSpeed) { case StaffSpeedCheat::None: newPeep->Energy = kCheatsStaffNormalSpeed; diff --git a/src/openrct2/actions/SurfaceSetStyleAction.cpp b/src/openrct2/actions/SurfaceSetStyleAction.cpp index 950f291521..41228a9067 100644 --- a/src/openrct2/actions/SurfaceSetStyleAction.cpp +++ b/src/openrct2/actions/SurfaceSetStyleAction.cpp @@ -88,7 +88,7 @@ GameActions::Result SurfaceSetStyleAction::Query() const auto& gameState = GetGameState(); // Do nothing if not in editor, sandbox mode or landscaping is forbidden - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.SandboxMode + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.sandboxMode && (gameState.Park.Flags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES)) { return GameActions::Result( @@ -105,7 +105,7 @@ GameActions::Result SurfaceSetStyleAction::Query() const if (!LocationValid(coords)) continue; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.sandboxMode) { if (!MapIsLocationInPark(coords)) continue; @@ -173,7 +173,7 @@ GameActions::Result SurfaceSetStyleAction::Execute() const if (!LocationValid(coords)) continue; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(coords)) continue; diff --git a/src/openrct2/actions/TrackDesignAction.cpp b/src/openrct2/actions/TrackDesignAction.cpp index 824f07499e..25234108b9 100644 --- a/src/openrct2/actions/TrackDesignAction.cpp +++ b/src/openrct2/actions/TrackDesignAction.cpp @@ -72,7 +72,7 @@ GameActions::Result TrackDesignAction::Query() const { // Force a fallback if the entry is not invented yet a track design of it is selected, // which can happen in select-by-track-type mode - if (!RideEntryIsInvented(entryIndex) && !gameState.Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(entryIndex) && !gameState.Cheats.ignoreResearchStatus) { entryIndex = OBJECT_ENTRY_INDEX_NULL; } @@ -146,7 +146,7 @@ GameActions::Result TrackDesignAction::Execute() const { // Force a fallback if the entry is not invented yet a track design using it is selected. // This can happen on rides with multiple vehicles where some have been invented and some haven’t. - if (!RideEntryIsInvented(entryIndex) && !gameState.Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(entryIndex) && !gameState.Cheats.ignoreResearchStatus) { entryIndex = OBJECT_ENTRY_INDEX_NULL; } diff --git a/src/openrct2/actions/TrackPlaceAction.cpp b/src/openrct2/actions/TrackPlaceAction.cpp index 500b21416d..9562536028 100644 --- a/src/openrct2/actions/TrackPlaceAction.cpp +++ b/src/openrct2/actions/TrackPlaceAction.cpp @@ -17,7 +17,6 @@ #include "../ride/Track.h" #include "../ride/TrackData.h" #include "../ride/TrackDesign.h" -#include "../util/Math.hpp" #include "../world/ConstructionClearance.h" #include "../world/Footpath.h" #include "../world/MapAnimation.h" @@ -30,6 +29,7 @@ #include "RideSetSettingAction.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; using namespace OpenRCT2::TrackMetaData; TrackPlaceAction::TrackPlaceAction( @@ -99,7 +99,7 @@ GameActions::Result TrackPlaceAction::Query() const } auto& gameState = GetGameState(); - if (_rideType != ride->type && !gameState.Cheats.AllowArbitraryRideTypeChanges) + if (_rideType != ride->type && !gameState.Cheats.allowArbitraryRideTypeChanges) { return GameActions::Result( GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_NONE); @@ -137,7 +137,7 @@ GameActions::Result TrackPlaceAction::Query() const if (!(GetActionFlags() & GameActions::Flags::AllowWhilePaused)) { - if (GameIsPaused() && !gameState.Cheats.BuildInPauseMode) + if (GameIsPaused() && !gameState.Cheats.buildInPauseMode) { return GameActions::Result( GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, @@ -167,7 +167,7 @@ GameActions::Result TrackPlaceAction::Query() const } // Backwards steep lift hills are allowed, even on roller coasters that do not support forwards steep lift hills. if (_trackPlaceFlags.has(LiftHillAndInverted::liftHill) && !rtd.SupportsTrackGroup(TrackGroup::liftHillSteep) - && !gameState.Cheats.EnableChainLiftOnAllTrack) + && !gameState.Cheats.enableChainLiftOnAllTrack) { const auto& ted = GetTrackElementDescriptor(_trackType); if (ted.flags & TRACK_ELEM_FLAG_IS_STEEP_UP) @@ -193,7 +193,7 @@ GameActions::Result TrackPlaceAction::Query() const return GameActions::Result( GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_OFF_EDGE_OF_MAP); } - if (!MapIsLocationOwned(tileCoords) && !gameState.Cheats.SandboxMode) + if (!MapIsLocationOwned(tileCoords) && !gameState.Cheats.sandboxMode) { return GameActions::Result( GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_LAND_NOT_OWNED_BY_PARK); @@ -209,7 +209,7 @@ GameActions::Result TrackPlaceAction::Query() const STR_TILE_ELEMENT_LIMIT_REACHED); } - if (!gameState.Cheats.AllowTrackPlaceInvalidHeights) + if (!gameState.Cheats.allowTrackPlaceInvalidHeights) { if (ted.flags & TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT) { @@ -247,7 +247,7 @@ GameActions::Result TrackPlaceAction::Query() const GameActions::Status::InvalidParameters, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, STR_TOO_LOW); } - int32_t baseZ = Floor2(mapLoc.z, kCoordsZStep); + int32_t baseZ = floor2(mapLoc.z, kCoordsZStep); int32_t clearanceZ = trackBlock.clearanceZ; if (trackBlock.flags & RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL && clearanceHeight > 24) @@ -259,7 +259,7 @@ GameActions::Result TrackPlaceAction::Query() const clearanceZ += clearanceHeight; } - clearanceZ = Floor2(clearanceZ, kCoordsZStep) + baseZ; + clearanceZ = floor2(clearanceZ, kCoordsZStep) + baseZ; if (clearanceZ > MAX_TRACK_HEIGHT) { @@ -312,7 +312,7 @@ GameActions::Result TrackPlaceAction::Query() const } } - if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER && !gameState.Cheats.DisableClearanceChecks) + if (clearanceData.GroundFlags & ELEMENT_IS_UNDERWATER && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_RIDE_CONSTRUCTION_CANT_CONSTRUCT_THIS_HERE, @@ -378,7 +378,7 @@ GameActions::Result TrackPlaceAction::Query() const STR_ERR_SURFACE_ELEMENT_NOT_FOUND); } - if (!gameState.Cheats.DisableSupportLimits) + if (!gameState.Cheats.disableSupportLimits) { int32_t ride_height = clearanceZ - surfaceElement->GetBaseZ(); if (ride_height >= 0) @@ -467,7 +467,7 @@ GameActions::Result TrackPlaceAction::Execute() const auto quarterTile = trackBlock.quarterTile.Rotate(_origin.direction); - int32_t baseZ = Floor2(mapLoc.z, kCoordsZStep); + int32_t baseZ = floor2(mapLoc.z, kCoordsZStep); int32_t clearanceZ = trackBlock.clearanceZ; if (trackBlock.flags & RCT_PREVIEW_TRACK_FLAG_IS_VERTICAL && clearanceHeight > 24) { @@ -478,7 +478,7 @@ GameActions::Result TrackPlaceAction::Execute() const clearanceZ += clearanceHeight; } - clearanceZ = Floor2(clearanceZ, kCoordsZStep) + baseZ; + clearanceZ = floor2(clearanceZ, kCoordsZStep) + baseZ; const auto mapLocWithClearance = CoordsXYRangedZ(mapLoc, baseZ, clearanceZ); auto crossingMode = (rtd.HasFlag(RtdFlag::supportsLevelCrossings) && _trackType == TrackElemType::Flat) @@ -504,7 +504,7 @@ GameActions::Result TrackPlaceAction::Execute() const } auto& gameState = GetGameState(); - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gameState.Cheats.DisableClearanceChecks) + if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gameState.Cheats.disableClearanceChecks) { FootpathRemoveLitter(mapLoc); if (rtd.HasFlag(RtdFlag::noWallsAroundTrack)) @@ -638,7 +638,7 @@ GameActions::Result TrackPlaceAction::Execute() const uint32_t availableDirections = entranceDirections & 0x0F; if (availableDirections != 0) { - if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gameState.Cheats.DisableClearanceChecks) + if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST) && !gameState.Cheats.disableClearanceChecks) { for (int32_t chosenDirection = Numerics::bitScanForward(availableDirections); chosenDirection != -1; chosenDirection = Numerics::bitScanForward(availableDirections)) @@ -680,7 +680,7 @@ GameActions::Result TrackPlaceAction::Execute() const } } - if (!gameState.Cheats.DisableClearanceChecks || !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) + if (!gameState.Cheats.disableClearanceChecks || !(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { FootpathConnectEdges(mapLoc, tileElement, GetFlags()); } @@ -711,7 +711,7 @@ GameActions::Result TrackPlaceAction::Execute() const if (ride->mode == RideMode::PoweredLaunch) { if (rtd.SupportsRideMode(RideMode::PoweredLaunchBlockSectioned) - || GetGameState().Cheats.ShowAllOperatingModes) + || GetGameState().Cheats.showAllOperatingModes) newMode = RideMode::PoweredLaunchBlockSectioned; else newMode = RideMode::PoweredLaunch; diff --git a/src/openrct2/actions/TrackRemoveAction.cpp b/src/openrct2/actions/TrackRemoveAction.cpp index 59e21498bf..f0469553ee 100644 --- a/src/openrct2/actions/TrackRemoveAction.cpp +++ b/src/openrct2/actions/TrackRemoveAction.cpp @@ -440,7 +440,7 @@ GameActions::Result TrackRemoveAction::Execute() const InvalidateTestResults(*ride); FootpathQueueChainReset(); - if (!GetGameState().Cheats.DisableClearanceChecks || !(tileElement->IsGhost())) + if (!GetGameState().Cheats.disableClearanceChecks || !(tileElement->IsGhost())) { FootpathRemoveEdgesAt(mapLoc, tileElement); } @@ -469,7 +469,7 @@ GameActions::Result TrackRemoveAction::Execute() const { ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; RideMode newMode = RideMode::ContinuousCircuit; - if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER) + if (ride->mode == RideMode::PoweredLaunchBlockSectioned) { newMode = RideMode::PoweredLaunch; } diff --git a/src/openrct2/actions/WallPlaceAction.cpp b/src/openrct2/actions/WallPlaceAction.cpp index 13918ca308..4e2a8846c7 100644 --- a/src/openrct2/actions/WallPlaceAction.cpp +++ b/src/openrct2/actions/WallPlaceAction.cpp @@ -92,7 +92,7 @@ GameActions::Result WallPlaceAction::Query() const auto& gameState = GetGameState(); auto mapSizeMax = GetMapSizeMaxXY(); if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) - && !gameState.Cheats.SandboxMode) + && !gameState.Cheats.sandboxMode) { if (_loc.z == 0) { @@ -151,14 +151,14 @@ GameActions::Result WallPlaceAction::Query() const { uint16_t waterHeight = surfaceElement->GetWaterHeight(); - if (targetHeight < waterHeight && !gameState.Cheats.DisableClearanceChecks) + if (targetHeight < waterHeight && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CANT_BUILD_THIS_UNDERWATER); } } - if (targetHeight < surfaceElement->GetBaseZ() && !gameState.Cheats.DisableClearanceChecks) + if (targetHeight < surfaceElement->GetBaseZ() && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); @@ -171,7 +171,7 @@ GameActions::Result WallPlaceAction::Query() const newBaseHeight += 2; if (surfaceElement->GetSlope() & (1 << newEdge)) { - if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.DisableClearanceChecks) + if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); @@ -187,7 +187,7 @@ GameActions::Result WallPlaceAction::Query() const if (surfaceElement->GetSlope() & (1 << newEdge)) { newBaseHeight += 2; - if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.DisableClearanceChecks) + if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_HERE, @@ -202,7 +202,7 @@ GameActions::Result WallPlaceAction::Query() const newEdge = (_edge + 3) & 3; if (surfaceElement->GetSlope() & (1 << newEdge)) { - if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.DisableClearanceChecks) + if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_HERE, STR_CAN_ONLY_BUILD_THIS_ABOVE_GROUND); @@ -218,7 +218,7 @@ GameActions::Result WallPlaceAction::Query() const if (surfaceElement->GetSlope() & (1 << newEdge)) { newBaseHeight += 2; - if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.DisableClearanceChecks) + if (targetHeight / 8 < newBaseHeight && !gameState.Cheats.disableClearanceChecks) { return GameActions::Result( GameActions::Status::Disallowed, STR_CANT_BUILD_THIS_HERE, @@ -261,7 +261,7 @@ GameActions::Result WallPlaceAction::Query() const clearanceHeight += wallEntry->height; bool wallAcrossTrack = false; - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) && !gameState.Cheats.DisableClearanceChecks) + if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) && !gameState.Cheats.disableClearanceChecks) { auto result = WallCheckObstruction(wallEntry, targetHeight / 8, clearanceHeight, &wallAcrossTrack); if (result.Error != GameActions::Status::Ok) @@ -339,7 +339,7 @@ GameActions::Result WallPlaceAction::Execute() const clearanceHeight += wallEntry->height; bool wallAcrossTrack = false; - if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) && !gameState.Cheats.DisableClearanceChecks) + if (!(GetFlags() & GAME_COMMAND_FLAG_TRACK_DESIGN) && !gameState.Cheats.disableClearanceChecks) { auto result = WallCheckObstruction(wallEntry, targetHeight / kCoordsZStep, clearanceHeight, &wallAcrossTrack); if (result.Error != GameActions::Status::Ok) diff --git a/src/openrct2/actions/WallRemoveAction.cpp b/src/openrct2/actions/WallRemoveAction.cpp index f524c96370..04d03eeeab 100644 --- a/src/openrct2/actions/WallRemoveAction.cpp +++ b/src/openrct2/actions/WallRemoveAction.cpp @@ -51,7 +51,7 @@ GameActions::Result WallRemoveAction::Query() const } const bool isGhost = GetFlags() & GAME_COMMAND_FLAG_GHOST; - if (!isGhost && !(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode + if (!isGhost && !(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode && !MapIsLocationOwned(_loc)) { return GameActions::Result(GameActions::Status::NotOwned, STR_CANT_REMOVE_THIS, STR_LAND_NOT_OWNED_BY_PARK); diff --git a/src/openrct2/actions/WallSetColourAction.cpp b/src/openrct2/actions/WallSetColourAction.cpp index 9cbedcc2d3..f5e24fea19 100644 --- a/src/openrct2/actions/WallSetColourAction.cpp +++ b/src/openrct2/actions/WallSetColourAction.cpp @@ -67,7 +67,7 @@ GameActions::Result WallSetColourAction::Query() const return GameActions::Result(GameActions::Status::InvalidParameters, STR_CANT_REPAINT_THIS, STR_OFF_EDGE_OF_MAP); } - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !MapIsLocationInPark(_loc) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !MapIsLocationInPark(_loc) && !GetGameState().Cheats.sandboxMode) { return GameActions::Result(GameActions::Status::NotOwned, STR_CANT_REPAINT_THIS, STR_LAND_NOT_OWNED_BY_PARK); } diff --git a/src/openrct2/actions/WaterLowerAction.cpp b/src/openrct2/actions/WaterLowerAction.cpp index 9005b0a01f..897d933381 100644 --- a/src/openrct2/actions/WaterLowerAction.cpp +++ b/src/openrct2/actions/WaterLowerAction.cpp @@ -80,7 +80,7 @@ GameActions::Result WaterLowerAction::QueryExecute(bool isExecuting) const if (surfaceElement == nullptr) continue; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { @@ -139,7 +139,7 @@ uint8_t WaterLowerAction::GetLowestHeight(const MapRange& validRange) const { for (int32_t x = validRange.GetLeft(); x <= validRange.GetRight(); x += kCoordsXYStep) { - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { diff --git a/src/openrct2/actions/WaterRaiseAction.cpp b/src/openrct2/actions/WaterRaiseAction.cpp index eede825891..c09e3262d8 100644 --- a/src/openrct2/actions/WaterRaiseAction.cpp +++ b/src/openrct2/actions/WaterRaiseAction.cpp @@ -80,7 +80,7 @@ GameActions::Result WaterRaiseAction::QueryExecute(bool isExecuting) const if (surfaceElement == nullptr) continue; - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { @@ -152,7 +152,7 @@ uint16_t WaterRaiseAction::GetHighestHeight(const MapRange& validRange) const { for (int32_t x = validRange.GetLeft(); x <= validRange.GetRight(); x += kCoordsXYStep) { - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ x, y })) { diff --git a/src/openrct2/actions/WaterSetHeightAction.cpp b/src/openrct2/actions/WaterSetHeightAction.cpp index 129d8bc69d..41b6ccef91 100644 --- a/src/openrct2/actions/WaterSetHeightAction.cpp +++ b/src/openrct2/actions/WaterSetHeightAction.cpp @@ -52,7 +52,7 @@ GameActions::Result WaterSetHeightAction::Query() const res.Position = { _coords, _height * kCoordsZStep }; auto& gameState = GetGameState(); - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.SandboxMode + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.sandboxMode && gameState.Park.Flags & PARK_FLAGS_FORBID_LANDSCAPE_CHANGES) { return GameActions::Result(GameActions::Status::Disallowed, STR_NONE, STR_FORBIDDEN_BY_THE_LOCAL_AUTHORITY); @@ -69,7 +69,7 @@ GameActions::Result WaterSetHeightAction::Query() const return GameActions::Result(GameActions::Status::NotOwned, STR_NONE, STR_LAND_NOT_OWNED_BY_PARK); } - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !gameState.Cheats.sandboxMode) { if (!MapIsLocationInPark(_coords)) { @@ -121,7 +121,7 @@ GameActions::Result WaterSetHeightAction::Execute() const int32_t surfaceHeight = TileElementHeight(_coords); FootpathRemoveLitter({ _coords, surfaceHeight }); - if (!GetGameState().Cheats.DisableClearanceChecks) + if (!GetGameState().Cheats.disableClearanceChecks) WallRemoveAtZ({ _coords, surfaceHeight }); SurfaceElement* surfaceElement = MapGetSurfaceElementAt(_coords); diff --git a/src/openrct2/command_line/RootCommands.cpp b/src/openrct2/command_line/RootCommands.cpp index 2fe5c348e0..4902c2bae6 100644 --- a/src/openrct2/command_line/RootCommands.cpp +++ b/src/openrct2/command_line/RootCommands.cpp @@ -34,9 +34,9 @@ using namespace OpenRCT2; #ifdef USE_BREAKPAD -# define IMPLIES_SILENT_BREAKPAD ", implies --silent-breakpad" + #define IMPLIES_SILENT_BREAKPAD ", implies --silent-breakpad" #else -# define IMPLIES_SILENT_BREAKPAD + #define IMPLIES_SILENT_BREAKPAD #endif // USE_BREAKPAD #ifndef DISABLE_NETWORK @@ -439,9 +439,10 @@ static void PrintAbout() Console::WriteLine("includes some 3rd party software under different licenses. See the file"); Console::WriteLine("\"licence.txt\" shipped with the game for details."); Console::WriteLine(); - Console::WriteLine("Website: https://openrct2.io"); - Console::WriteLine("GitHub: https://github.com/OpenRCT2/OpenRCT2"); - Console::WriteLine("Contributors: https://github.com/OpenRCT2/OpenRCT2/blob/develop/contributors.md"); + Console::WriteLine("Website: https://openrct2.io"); + Console::WriteLine("GitHub: https://github.com/OpenRCT2/OpenRCT2"); + Console::WriteLine("Contributors: https://github.com/OpenRCT2/OpenRCT2/blob/develop/contributors.md"); + Console::WriteLine("Privacy Policy: https://github.com/OpenRCT2/OpenRCT2/blob/develop/PRIVACY.md"); Console::WriteLine(); } diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index 679dc1d179..cd73947db1 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -17,7 +17,7 @@ // windows.h defines an interface keyword #ifdef interface -# undef interface + #undef interface #endif namespace OpenRCT2::Config diff --git a/src/openrct2/core/CallingConventions.h b/src/openrct2/core/CallingConventions.h index 5d0646b087..65247d5f7e 100644 --- a/src/openrct2/core/CallingConventions.h +++ b/src/openrct2/core/CallingConventions.h @@ -10,19 +10,19 @@ #pragma once #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) -# define OPENRCT2_X86 + #define OPENRCT2_X86 #elif defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_X64) || defined(_M_IX86)) // VS2008 -# define OPENRCT2_X86 + #define OPENRCT2_X86 #endif #if defined(__i386__) || defined(_M_IX86) -# define PLATFORM_X86 + #define PLATFORM_X86 #endif #if defined(__LP64__) || defined(_WIN64) -# define PLATFORM_64BIT + #define PLATFORM_64BIT #else -# define PLATFORM_32BIT + #define PLATFORM_32BIT #endif // C99's restrict keywords guarantees the pointer in question, for the whole of its lifetime, @@ -30,22 +30,22 @@ // aliasing the same memory area. Using it lets compiler generate better code. If your compiler // does not support it, feel free to drop it, at some performance hit. #ifdef _MSC_VER -# define RESTRICT __restrict + #define RESTRICT __restrict #else -# define RESTRICT __restrict__ + #define RESTRICT __restrict__ #endif #ifdef PLATFORM_X86 -# ifndef FASTCALL -# ifdef __GNUC__ -# define FASTCALL __attribute__((fastcall)) -# elif defined(_MSC_VER) -# define FASTCALL __fastcall -# else -# pragma message "Not using fastcall calling convention, please check your compiler support" -# define FASTCALL -# endif -# endif // FASTCALL + #ifndef FASTCALL + #ifdef __GNUC__ + #define FASTCALL __attribute__((fastcall)) + #elif defined(_MSC_VER) + #define FASTCALL __fastcall + #else + #pragma message "Not using fastcall calling convention, please check your compiler support" + #define FASTCALL + #endif + #endif // FASTCALL #else // PLATFORM_X86 -# define FASTCALL + #define FASTCALL #endif // PLATFORM_X86 diff --git a/src/openrct2/core/ChecksumStream.cpp b/src/openrct2/core/ChecksumStream.cpp index 2017b11e89..5944b6b019 100644 --- a/src/openrct2/core/ChecksumStream.cpp +++ b/src/openrct2/core/ChecksumStream.cpp @@ -34,9 +34,9 @@ namespace OpenRCT2 std::memcpy(&temp, reinterpret_cast(buffer) + i, maxLen); // Always use value as little endian, most common systems are little. -# if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) + #if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) temp = ByteSwapBE(temp); -# endif + #endif *hash ^= temp; *hash *= Prime; diff --git a/src/openrct2/core/Crypt.CNG.cpp b/src/openrct2/core/Crypt.CNG.cpp index 7622668364..e874476889 100644 --- a/src/openrct2/core/Crypt.CNG.cpp +++ b/src/openrct2/core/Crypt.CNG.cpp @@ -9,19 +9,19 @@ #if !defined(DISABLE_NETWORK) && defined(_WIN32) -# include "Crypt.h" + #include "Crypt.h" -# include "../platform/Platform.h" -# include "IStream.hpp" + #include "../platform/Platform.h" + #include "IStream.hpp" -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include // clang-format off // CNG: Cryptography API: Next Generation (CNG) diff --git a/src/openrct2/core/Crypt.OpenSSL.cpp b/src/openrct2/core/Crypt.OpenSSL.cpp index 08821c9137..12834a889e 100644 --- a/src/openrct2/core/Crypt.OpenSSL.cpp +++ b/src/openrct2/core/Crypt.OpenSSL.cpp @@ -9,16 +9,16 @@ #if !defined(DISABLE_NETWORK) && !defined(_WIN32) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -# include "Crypt.h" + #include "Crypt.h" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include using namespace OpenRCT2::Crypt; @@ -354,6 +354,6 @@ namespace OpenRCT2::Crypt } } // namespace OpenRCT2::Crypt -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif // DISABLE_NETWORK diff --git a/src/openrct2/core/DateTime.h b/src/openrct2/core/DateTime.h index 287c1c4a91..a5ff640a79 100644 --- a/src/openrct2/core/DateTime.h +++ b/src/openrct2/core/DateTime.h @@ -10,7 +10,7 @@ #pragma once #ifdef _MSC_VER -# include + #include #endif #include diff --git a/src/openrct2/core/Diagnostics.cpp b/src/openrct2/core/Diagnostics.cpp index 91a8e1f1af..74691744b7 100644 --- a/src/openrct2/core/Diagnostics.cpp +++ b/src/openrct2/core/Diagnostics.cpp @@ -8,7 +8,7 @@ *****************************************************************************/ #if defined(DEBUG) && defined(_WIN32) -# include + #include #endif #include "Diagnostics.hpp" @@ -18,12 +18,12 @@ namespace OpenRCT2::Debug void Break() { #if defined(DEBUG) -# if defined(_WIN32) + #if defined(_WIN32) if (IsDebuggerPresent()) { DebugBreak(); } -# endif + #endif #endif } } // namespace OpenRCT2::Debug diff --git a/src/openrct2/core/File.cpp b/src/openrct2/core/File.cpp index 11c9705284..dcd5fb4a30 100644 --- a/src/openrct2/core/File.cpp +++ b/src/openrct2/core/File.cpp @@ -8,9 +8,9 @@ *****************************************************************************/ #ifdef _WIN32 -# include + #include #else -# include + #include #endif #include "../Diagnostic.h" diff --git a/src/openrct2/core/FileScanner.cpp b/src/openrct2/core/FileScanner.cpp index 84c83253a7..321babd957 100644 --- a/src/openrct2/core/FileScanner.cpp +++ b/src/openrct2/core/FileScanner.cpp @@ -8,17 +8,17 @@ *****************************************************************************/ #ifdef _WIN32 -# include + #include #endif #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -# include -# include -# include -# include + #include + #include + #include + #include #elif defined(_WIN32) -// Windows needs this for widechar <-> utf8 conversion utils -# include "../localisation/Language.h" + // Windows needs this for widechar <-> utf8 conversion utils + #include "../localisation/Language.h" #endif #include "FileScanner.h" diff --git a/src/openrct2/core/FileStream.cpp b/src/openrct2/core/FileStream.cpp index ea82218932..25eb5a5793 100644 --- a/src/openrct2/core/FileStream.cpp +++ b/src/openrct2/core/FileStream.cpp @@ -15,14 +15,14 @@ #include #ifndef _WIN32 -# include + #include #else -# include + #include #endif #ifdef _MSC_VER -# define ftello _ftelli64 -# define fseeko _fseeki64 + #define ftello _ftelli64 + #define fseeko _fseeki64 #endif namespace OpenRCT2 diff --git a/src/openrct2/core/FileSystem.hpp b/src/openrct2/core/FileSystem.hpp index 5c750ab6be..2e1bd7571f 100644 --- a/src/openrct2/core/FileSystem.hpp +++ b/src/openrct2/core/FileSystem.hpp @@ -16,43 +16,43 @@ // Find out if std::filesystem is available: #if defined(_MSC_VER) // Visual Studio supports -# define HAVE_STD_FILESYSTEM 1 + #define HAVE_STD_FILESYSTEM 1 #elif defined(__APPLE__) // XCode has the header, but reports error when included. -# define HAVE_STD_FILESYSTEM 0 + #define HAVE_STD_FILESYSTEM 0 #elif defined(__ANDROID__) -# define HAVE_STD_FILESYSTEM 1 + #define HAVE_STD_FILESYSTEM 1 #elif defined(__has_include) // For GCC/Clang check if the header exists. -# if __has_include() -# define HAVE_STD_FILESYSTEM 1 -# else -# define HAVE_STD_FILESYSTEM 0 -# endif + #if __has_include() + #define HAVE_STD_FILESYSTEM 1 + #else + #define HAVE_STD_FILESYSTEM 0 + #endif #else // By default assume not supported. -# define HAVE_STD_FILESYSTEM 0 + #define HAVE_STD_FILESYSTEM 0 #endif #if HAVE_STD_FILESYSTEM -# include + #include namespace fs = std::filesystem; #else -# ifdef _WIN32 -# ifndef NOMINMAX -# define NOMINMAX -# endif -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# define BITMAP WIN32_BITMAP -# define PATTERN WIN32_PATTERN -# endif -# include -# ifdef _WIN32 -# undef CreateDirectory -# undef CreateWindow -# undef GetMessage -# undef BITMAP -# undef PATTERN -# endif + #ifdef _WIN32 + #ifndef NOMINMAX + #define NOMINMAX + #endif + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #define BITMAP WIN32_BITMAP + #define PATTERN WIN32_PATTERN + #endif + #include + #ifdef _WIN32 + #undef CreateDirectory + #undef CreateWindow + #undef GetMessage + #undef BITMAP + #undef PATTERN + #endif namespace fs = ghc::filesystem; #endif diff --git a/src/openrct2/core/FileWatcher.cpp b/src/openrct2/core/FileWatcher.cpp index 42b5c7e47e..f1de739d8c 100644 --- a/src/openrct2/core/FileWatcher.cpp +++ b/src/openrct2/core/FileWatcher.cpp @@ -15,14 +15,14 @@ #include #ifdef _WIN32 -# include + #include #elif defined(__linux__) -# include -# include -# include -# include + #include + #include + #include + #include #elif defined(__APPLE__) -# include + #include #endif #include "../core/Guard.hpp" diff --git a/src/openrct2/core/FileWatcher.h b/src/openrct2/core/FileWatcher.h index a5539d3fcf..9c5848211e 100644 --- a/src/openrct2/core/FileWatcher.h +++ b/src/openrct2/core/FileWatcher.h @@ -17,11 +17,11 @@ #include #ifdef _WIN32 -# include "FileSystem.hpp" + #include "FileSystem.hpp" typedef void* HANDLE; #elif defined(__APPLE__) -# include + #include #endif /** diff --git a/src/openrct2/core/FixedVector.h b/src/openrct2/core/FixedVector.h deleted file mode 100644 index 4b6ebe86e3..0000000000 --- a/src/openrct2/core/FixedVector.h +++ /dev/null @@ -1,178 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2024 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#pragma once - -#include "Guard.hpp" - -#include -#include -#include - -template -class FixedVector -{ -public: - using container = std::array; - using iterator = typename container::iterator; - using const_iterator = typename container::const_iterator; - using reverse_iterator = typename container::reverse_iterator; - using const_reverse_iterator = typename container::const_reverse_iterator; - using value_type = typename container::value_type; - using reference_type = value_type&; - using const_reference_type = const value_type&; - - constexpr iterator begin() - { - if (_count == 0) - return _data.end(); - - return _data.begin(); - } - - constexpr iterator end() - { - if (_count == 0) - return _data.end(); - return begin() + _count; - } - - constexpr const_iterator cbegin() const - { - if (_count == 0) - return _data.cend(); - - return _data.cbegin(); - } - - constexpr const_iterator cend() const - { - if (_count == 0) - return _data.cend(); - return cbegin() + _count; - } - - constexpr reverse_iterator rbegin() - { - if (_count == 0) - return _data.rend(); - return _data.rbegin() + (MAX - _count); - } - - constexpr reverse_iterator rend() - { - return _data.rend(); - } - - constexpr const_reverse_iterator rbegin() const - { - return _data.rbegin() + (MAX - _count); - } - - constexpr const_reverse_iterator rend() const - { - return _data.rend(); - } - - constexpr reference_type back() - { - return _data[_count - 1]; - } - - constexpr const_reference_type back() const - { - return _data[_count - 1]; - } - - constexpr void push_back(const T& val) - { - OpenRCT2::Guard::Assert(_count < MAX); - _data[_count++] = val; - } - - constexpr void push_back(T&& val) - { - OpenRCT2::Guard::Assert(_count < MAX); - _data[_count++] = std::move(val); - } - - constexpr iterator insert(iterator pos, const T& val) - { - // Make sure the end iterator is correct. - auto itCurEnd = end(); - push_back(val); - - // Shift all elements to the right - auto offset = pos - begin(); - std::rotate(_data.begin(), pos, itCurEnd); - - return _data.begin() + offset; - } - - constexpr iterator insert(iterator pos, T&& val) - { - // Make sure the end iterator is correct. - auto itCurEnd = end(); - emplace_back(std::move(val)); - - // Shift all elements to the right - auto offset = pos - begin(); - std::rotate(_data.begin() + offset, itCurEnd, end()); - - return _data.begin() + offset; - } - - template - constexpr reference_type emplace_back(Args&&... args) - { - OpenRCT2::Guard::Assert(_count < MAX); - reference_type res = _data[_count++]; - ::new (&res) T(std::forward(args)...); - return res; - } - - constexpr reference_type operator[](const size_t n) - { - return _data[n]; - } - - constexpr const_reference_type operator[](const size_t n) const - { - return _data[n]; - } - - constexpr void pop_back() - { - _count--; - } - - constexpr void clear() - { - _count = 0; - } - - constexpr size_t size() const - { - return _count; - } - - constexpr size_t capacity() const - { - return _data.size(); - } - - constexpr bool empty() const - { - return _count == 0; - } - -private: - size_t _count = 0; - container _data; -}; diff --git a/src/openrct2/core/Guard.cpp b/src/openrct2/core/Guard.cpp index f17037c4e8..d50358c20b 100644 --- a/src/openrct2/core/Guard.cpp +++ b/src/openrct2/core/Guard.cpp @@ -8,8 +8,8 @@ *****************************************************************************/ #ifdef _WIN32 -# include -# include + #include + #include #endif #include "../Version.h" @@ -144,12 +144,12 @@ namespace OpenRCT2::Guard static void ForceCrash() { -# ifdef USE_BREAKPAD + #ifdef USE_BREAKPAD // Force a crash that breakpad will handle allowing us to get a dump *((void**)0) = 0; -# else + #else assert(false); -# endif + #endif } #endif } // namespace OpenRCT2::Guard diff --git a/src/openrct2/core/Http.Android.cpp b/src/openrct2/core/Http.Android.cpp index 3f4a478819..73277f64f7 100644 --- a/src/openrct2/core/Http.Android.cpp +++ b/src/openrct2/core/Http.Android.cpp @@ -9,16 +9,16 @@ #if !defined(DISABLE_HTTP) && defined(__ANDROID__) -# include "Http.h" + #include "Http.h" -# include "../Version.h" -# include "../platform/Platform.h" + #include "../Version.h" + #include "../platform/Platform.h" -# include -# include -# include + #include + #include + #include -# define OPENRCT2_USER_AGENT "OpenRCT2/" OPENRCT2_VERSION + #define OPENRCT2_USER_AGENT "OpenRCT2/" OPENRCT2_VERSION namespace OpenRCT2::Http { diff --git a/src/openrct2/core/Http.WinHttp.cpp b/src/openrct2/core/Http.WinHttp.cpp index b75c3ce2cd..b2a7c37d35 100644 --- a/src/openrct2/core/Http.WinHttp.cpp +++ b/src/openrct2/core/Http.WinHttp.cpp @@ -9,16 +9,16 @@ #if !defined(DISABLE_HTTP) && defined(_WIN32) -# include "Http.h" + #include "Http.h" -# include "../Version.h" -# include "../core/Console.hpp" -# include "String.hpp" + #include "../Version.h" + #include "../core/Console.hpp" + #include "String.hpp" -# include -# include -# include -# include + #include + #include + #include + #include namespace OpenRCT2::Http { @@ -226,9 +226,9 @@ namespace OpenRCT2::Http } catch ([[maybe_unused]] const std::exception& e) { -# ifdef DEBUG + #ifdef DEBUG Console::Error::WriteLine("HTTP request failed: %s", e.what()); -# endif + #endif WinHttpCloseHandle(hSession); WinHttpCloseHandle(hConnect); WinHttpCloseHandle(hRequest); diff --git a/src/openrct2/core/Http.cURL.cpp b/src/openrct2/core/Http.cURL.cpp index 11cf9e5f8b..207edefce0 100644 --- a/src/openrct2/core/Http.cURL.cpp +++ b/src/openrct2/core/Http.cURL.cpp @@ -9,23 +9,23 @@ #if !defined(DISABLE_HTTP) && !defined(_WIN32) && !defined(__ANDROID__) -# include "Http.h" + #include "Http.h" -# include "../Version.h" -# include "../core/Console.hpp" + #include "../Version.h" + #include "../core/Console.hpp" -# include -# include -# include -# include + #include + #include + #include + #include -# if defined(_WIN32) && !defined(WIN32_LEAN_AND_MEAN) -// cURL includes windows.h, but we don't need all of it. -# define WIN32_LEAN_AND_MEAN -# endif -# include + #if defined(_WIN32) && !defined(WIN32_LEAN_AND_MEAN) + // cURL includes windows.h, but we don't need all of it. + #define WIN32_LEAN_AND_MEAN + #endif + #include -# define OPENRCT2_USER_AGENT "OpenRCT2/" OPENRCT2_VERSION + #define OPENRCT2_USER_AGENT "OpenRCT2/" OPENRCT2_VERSION namespace OpenRCT2::Http { diff --git a/src/openrct2/core/Http.h b/src/openrct2/core/Http.h index 7c03f88bdf..c53987897e 100644 --- a/src/openrct2/core/Http.h +++ b/src/openrct2/core/Http.h @@ -11,10 +11,10 @@ #ifndef DISABLE_HTTP -# include -# include -# include -# include + #include + #include + #include + #include namespace OpenRCT2::Http { diff --git a/src/openrct2/core/IStream.hpp b/src/openrct2/core/IStream.hpp index 9d08e2afe8..263676f8ba 100644 --- a/src/openrct2/core/IStream.hpp +++ b/src/openrct2/core/IStream.hpp @@ -19,9 +19,9 @@ #include #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" -# pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif namespace OpenRCT2 @@ -218,7 +218,7 @@ namespace OpenRCT2 } // namespace OpenRCT2 #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif class IOException : public std::runtime_error diff --git a/src/openrct2/core/Json.hpp b/src/openrct2/core/Json.hpp index c66ffd6ece..5d205ba980 100644 --- a/src/openrct2/core/Json.hpp +++ b/src/openrct2/core/Json.hpp @@ -15,9 +15,9 @@ #include #include -#if NLOHMANN_JSON_VERSION_MAJOR < 3 || (NLOHMANN_JSON_VERSION_MAJOR == 3 && NLOHMANN_JSON_VERSION_MINOR < 6) -# error "Unsupported version of nlohmann json library, must be >= 3.6" -#endif // NLOHMANN_JSON_VERSION_MAJOR < 3 || (NLOHMANN_JSON_VERSION_MAJOR == 3 && NLOHMANN_JSON_VERSION_MINOR < 6) +#if NLOHMANN_JSON_VERSION_MAJOR < 3 || (NLOHMANN_JSON_VERSION_MAJOR == 3 && NLOHMANN_JSON_VERSION_MINOR < 9) + #error "Unsupported version of nlohmann json library, must be >= 3.9" +#endif // NLOHMANN_JSON_VERSION_MAJOR < 3 || (NLOHMANN_JSON_VERSION_MAJOR == 3 && NLOHMANN_JSON_VERSION_MINOR < 9) using json_t = nlohmann::json; diff --git a/src/openrct2/core/Numerics.hpp b/src/openrct2/core/Numerics.hpp index 2a770a56d1..2064ca0b5e 100644 --- a/src/openrct2/core/Numerics.hpp +++ b/src/openrct2/core/Numerics.hpp @@ -9,13 +9,15 @@ #pragma once +#include +#include #include #include #include #include #ifdef _MSC_VER -# include + #include #endif namespace OpenRCT2::Numerics @@ -30,7 +32,7 @@ namespace OpenRCT2::Numerics int32_t success = __builtin_ffs(source); return success - 1; #else -# pragma message("Falling back to iterative bitscan forward, consider using intrinsics") + #pragma message("Falling back to iterative bitscan32 forward, consider using intrinsics") // This is a low-hanging optimisation boost, check if your compiler offers // any intrinsic. // cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093 @@ -44,7 +46,7 @@ namespace OpenRCT2::Numerics inline int64_t bitScanForward(uint64_t source) { -#if defined(_MSC_VER) && (_MSC_VER >= 1400) && defined(_M_X64) // Visual Studio 2005 +#if defined(_MSC_VER) && (_MSC_VER >= 1400) && (defined(_M_X64) || defined(_M_ARM64)) // Visual Studio 2005 unsigned long i; uint8_t success = _BitScanForward64(&i, source); return success != 0 ? i : -1; @@ -52,7 +54,7 @@ namespace OpenRCT2::Numerics int32_t success = __builtin_ffsll(source); return success - 1; #else -# pragma message("Falling back to iterative bitscan forward, consider using intrinsics") + #pragma message("Falling back to iterative bitscan64 forward, consider using intrinsics") // This is a low-hanging optimisation boost, check if your compiler offers // any intrinsic. // cf. https://github.com/OpenRCT2/OpenRCT2/pull/2093 @@ -64,6 +66,23 @@ namespace OpenRCT2::Numerics #endif } + // Rounds an integer down to the given power of 2. Alignment must be a power of 2. + template + constexpr T floor2(T value, size_t alignment) + { + // Ensure alignment is power of two or 0. + assert(alignment > 0 && std::has_single_bit(alignment)); + + return value & ~(alignment - 1); + } + + // Rounds an integer up to the given power of 2. Alignment must be a power of 2. + template + constexpr T ceil2(T value, size_t alignment) + { + return floor2(static_cast(value + alignment - 1), alignment); + } + /** * Bitwise left rotate * @tparam _UIntType unsigned integral type diff --git a/src/openrct2/core/RTL.FriBidi.cpp b/src/openrct2/core/RTL.FriBidi.cpp index 44b83b5b8a..614af97595 100644 --- a/src/openrct2/core/RTL.FriBidi.cpp +++ b/src/openrct2/core/RTL.FriBidi.cpp @@ -8,17 +8,17 @@ *****************************************************************************/ #if defined(_WIN32) && defined(USE_FRIBIDI) -# include "RTL.h" + #include "RTL.h" -# include "../Diagnostic.h" + #include "../Diagnostic.h" -# include + #include extern "C" { -# include -# include -# include -# include + #include + #include + #include + #include } static constexpr uint16_t BufferLength = 1024; @@ -50,10 +50,10 @@ std::string FixRTL(std::string& input) return std::string(outputString); } #elif defined(_WIN32) -# include "../Diagnostic.h" -# include "RTL.h" + #include "../Diagnostic.h" + #include "RTL.h" -# include + #include static bool hasWarned = false; diff --git a/src/openrct2/core/RTL.ICU.cpp b/src/openrct2/core/RTL.ICU.cpp index 1c817d0216..03e69519cf 100644 --- a/src/openrct2/core/RTL.ICU.cpp +++ b/src/openrct2/core/RTL.ICU.cpp @@ -8,16 +8,16 @@ *****************************************************************************/ #ifndef _WIN32 -# include "RTL.h" + #include "RTL.h" -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include std::string FixRTL(std::string& input) { diff --git a/src/openrct2/core/String.cpp b/src/openrct2/core/String.cpp index b0b09dca5b..d0a57c094f 100644 --- a/src/openrct2/core/String.cpp +++ b/src/openrct2/core/String.cpp @@ -17,14 +17,14 @@ #include #ifndef _WIN32 -# if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) -# include -# endif -# include -# include -# include + #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) + #include + #endif + #include + #include + #include #else -# include + #include #endif #include "../util/Util.h" @@ -34,8 +34,8 @@ #include "UTF8.h" #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) -# include -# define _stricmp(x, y) strcasecmp((x), (y)) + #include + #define _stricmp(x, y) strcasecmp((x), (y)) #endif namespace OpenRCT2::String @@ -57,17 +57,17 @@ namespace OpenRCT2::String WideCharToMultiByte(OpenRCT2::CodePage::UTF8, 0, src.data(), srcLen, result.data(), sizeReq, nullptr, nullptr); return result; #else -// Which constructor to use depends on the size of wchar_t... -// UTF-32 is the default on most POSIX systems; Windows uses UTF-16. -// Unfortunately, we'll have to help the compiler here. -# if U_SIZEOF_WCHAR_T == 4 + // Which constructor to use depends on the size of wchar_t... + // UTF-32 is the default on most POSIX systems; Windows uses UTF-16. + // Unfortunately, we'll have to help the compiler here. + #if U_SIZEOF_WCHAR_T == 4 icu::UnicodeString str = icu::UnicodeString::fromUTF32(reinterpret_cast(src.data()), src.length()); -# elif U_SIZEOF_WCHAR_T == 2 + #elif U_SIZEOF_WCHAR_T == 2 std::wstring wstr = std::wstring(src); icu::UnicodeString str = icu::UnicodeString(static_cast(wstr.c_str())); -# else -# error Unsupported U_SIZEOF_WCHAR_T size -# endif + #else + #error Unsupported U_SIZEOF_WCHAR_T size + #endif std::string result; str.toUTF8String(result); @@ -87,23 +87,23 @@ namespace OpenRCT2::String #else icu::UnicodeString str = icu::UnicodeString::fromUTF8(std::string(src)); -// Which constructor to use depends on the size of wchar_t... -// UTF-32 is the default on most POSIX systems; Windows uses UTF-16. -// Unfortunately, we'll have to help the compiler here. -# if U_SIZEOF_WCHAR_T == 4 + // Which constructor to use depends on the size of wchar_t... + // UTF-32 is the default on most POSIX systems; Windows uses UTF-16. + // Unfortunately, we'll have to help the compiler here. + #if U_SIZEOF_WCHAR_T == 4 size_t length = static_cast(str.length()); std::wstring result(length, '\0'); UErrorCode status = U_ZERO_ERROR; str.toUTF32(reinterpret_cast(&result[0]), str.length(), status); -# elif U_SIZEOF_WCHAR_T == 2 + #elif U_SIZEOF_WCHAR_T == 2 const char16_t* buffer = str.getBuffer(); std::wstring result = static_cast(buffer); -# else -# error Unsupported U_SIZEOF_WCHAR_T size -# endif + #else + #error Unsupported U_SIZEOF_WCHAR_T size + #endif return result; #endif diff --git a/src/openrct2/core/Zip.cpp b/src/openrct2/core/Zip.cpp index c2b930b2ae..3e00d342fc 100644 --- a/src/openrct2/core/Zip.cpp +++ b/src/openrct2/core/Zip.cpp @@ -12,7 +12,7 @@ #include "IStream.hpp" #ifndef __ANDROID__ -# include + #include #endif using namespace OpenRCT2; diff --git a/src/openrct2/core/ZipAndroid.cpp b/src/openrct2/core/ZipAndroid.cpp index a57d34293d..5d669f7dbf 100644 --- a/src/openrct2/core/ZipAndroid.cpp +++ b/src/openrct2/core/ZipAndroid.cpp @@ -9,16 +9,16 @@ #ifdef __ANDROID__ -# include "../Diagnostic.h" -# include "../platform/Platform.h" -# include "IStream.hpp" -# include "Memory.hpp" -# include "MemoryStream.h" -# include "Zip.h" + #include "../Diagnostic.h" + #include "../platform/Platform.h" + #include "IStream.hpp" + #include "Memory.hpp" + #include "MemoryStream.h" + #include "Zip.h" -# include -# include -# include + #include + #include + #include using namespace OpenRCT2; diff --git a/src/openrct2/drawing/AVX2Drawing.cpp b/src/openrct2/drawing/AVX2Drawing.cpp index aea86a804b..70f7a6dd6f 100644 --- a/src/openrct2/drawing/AVX2Drawing.cpp +++ b/src/openrct2/drawing/AVX2Drawing.cpp @@ -12,7 +12,7 @@ #ifdef __AVX2__ -# include + #include void MaskAvx2( int32_t width, int32_t height, const uint8_t* RESTRICT maskSrc, const uint8_t* RESTRICT colourSrc, uint8_t* RESTRICT dst, @@ -43,9 +43,9 @@ void MaskAvx2( #else -# ifdef OPENRCT2_X86 -# error You have to compile this file with AVX2 enabled, when targeting x86! -# endif + #ifdef OPENRCT2_X86 + #error You have to compile this file with AVX2 enabled, when targeting x86! + #endif void MaskAvx2( int32_t width, int32_t height, const uint8_t* RESTRICT maskSrc, const uint8_t* RESTRICT colourSrc, uint8_t* RESTRICT dst, diff --git a/src/openrct2/drawing/Drawing.Sprite.cpp b/src/openrct2/drawing/Drawing.Sprite.cpp index 3449239987..27358fe3e8 100644 --- a/src/openrct2/drawing/Drawing.Sprite.cpp +++ b/src/openrct2/drawing/Drawing.Sprite.cpp @@ -116,6 +116,191 @@ static inline uint32_t rctc_to_rct2_index(uint32_t image) } // clang-format on +static void OverrideElementOffsets(size_t index, G1Element& element) +{ + switch (index) + { + case 25285: + element.x_offset -= 1; + break; + case 25286: + case 25317: + case 25318: + case 25323: + case 25324: + case 25325: + case 25326: + case 25455: + case 25456: + case 25457: + case 25458: + case 25459: + case 25460: + case 25461: + case 25462: + case 25463: + case 25464: + case 25465: + case 25466: + case 25467: + case 25468: + case 25469: + case 25470: + case 25471: + case 25472: + case 25473: + case 25474: + case 25475: + case 25476: + case 25521: + case 25522: + case 25523: + case 25524: + case 25525: + case 25526: + case 25527: + case 25528: + case 25529: + case 25530: + case 25531: + case 25532: + case 25533: + case 25534: + case 25659: + case 25660: + case 25661: + case 25662: + case 25663: + case 25664: + case 25665: + case 25666: + case 25667: + case 25668: + case 25669: + case 25670: + case 25671: + case 25672: + case 25673: + case 25674: + case 25675: + case 25676: + case 25677: + case 25678: + case 25679: + case 25680: + case 25681: + case 25682: + case 25683: + case 25684: + case 25685: + case 25686: + case 25687: + case 25688: + case 25689: + case 25690: + case 25719: + case 25721: + case 25723: + case 25725: + case 25727: + case 25728: + case 25730: + case 25732: + case 25733: + case 25735: + case 25737: + case 25738: + case 25740: + case 25742: + case 25743: + case 25745: + case 25747: + case 25748: + case 25781: + case 25782: + case 25783: + case 25784: + case 25785: + case 25786: + case 25787: + case 25788: + case 25789: + case 25790: + case 25791: + case 25792: + case 25793: + case 25794: + case 25795: + case 25796: + case 25797: + case 25798: + case 25799: + case 25800: + case 25801: + case 25803: + case 25804: + case 25805: + case 25806: + case 25807: + case 25808: + case 25809: + case 25810: + case 25811: + case 25812: + case 25813: + case 25814: + case 25815: + case 25816: + case 25817: + case 25818: + case 25819: + case 25820: + case 25821: + case 25822: + case 25823: + case 25824: + case 25825: + case 25826: + case 25827: + case 25828: + case 25829: + case 25830: + case 25831: + case 25832: + case 25833: + case 25834: + case 25835: + case 25836: + case 25837: + case 25838: + case 25839: + case 25840: + case 25841: + case 25842: + case 25843: + case 25844: + case 25845: + case 25846: + case 25847: + case 25848: + case 25849: + case 25850: + case 25851: + case 25852: + element.y_offset += 1; + break; + case 25307: + case 25315: + case 25319: + element.x_offset -= 1; + element.y_offset += 1; + break; + case 25802: + element.y_offset += 2; + break; + } +} + static void ReadAndConvertGxDat(IStream* stream, size_t count, bool is_rctc, G1Element* elements) { auto g1Elements32 = std::make_unique(count); @@ -289,7 +474,15 @@ bool GfxLoadG1(const IPlatformEnvironment& env) // Fix entry data offsets for (uint32_t i = 0; i < _g1.header.num_entries; i++) { - _g1.elements[i].offset += reinterpret_cast(_g1.data.get()); + if (_g1.elements[i].offset == nullptr) + { + _g1.elements[i].offset = _g1.data.get(); + } + else + { + _g1.elements[i].offset += reinterpret_cast(_g1.data.get()); + } + OverrideElementOffsets(i, _g1.elements[i]); } return true; } @@ -368,7 +561,14 @@ bool GfxLoadG2() // Fix entry data offsets for (uint32_t i = 0; i < _g2.header.num_entries; i++) { - _g2.elements[i].offset += reinterpret_cast(_g2.data.get()); + if (_g2.elements[i].offset == nullptr) + { + _g2.elements[i].offset = _g2.data.get(); + } + else + { + _g2.elements[i].offset += reinterpret_cast(_g2.data.get()); + } } return true; } @@ -425,7 +625,14 @@ bool GfxLoadCsg() // Fix entry data offsets for (uint32_t i = 0; i < _csg.header.num_entries; i++) { - _csg.elements[i].offset += reinterpret_cast(_csg.data.get()); + if (_csg.elements[i].offset == nullptr) + { + _csg.elements[i].offset = _csg.data.get(); + } + else + { + _csg.elements[i].offset += reinterpret_cast(_csg.data.get()); + } // RCT1 used zoomed offsets that counted from the beginning of the file, rather than from the current sprite. if (_csg.elements[i].flags & G1_FLAG_HAS_ZOOM_SPRITE) { diff --git a/src/openrct2/drawing/Drawing.String.cpp b/src/openrct2/drawing/Drawing.String.cpp index 74db073471..d8a5616aad 100644 --- a/src/openrct2/drawing/Drawing.String.cpp +++ b/src/openrct2/drawing/Drawing.String.cpp @@ -674,15 +674,15 @@ static void TTFProcessStringLiteral(DrawPixelInfo& dpi, std::string_view text, T // This error suppression abomination is here to suppress https://github.com/OpenRCT2/OpenRCT2/issues/17371. // Additionally, we have to suppress the error for the error suppression... :'-( // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105937 is fixed in GCC13 -# if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -# endif + #if defined(__GNUC__) && !defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #endif auto len = it.GetIndex() - ttfRunIndex.value(); TTFDrawStringRawTTF(dpi, text.substr(ttfRunIndex.value(), len), info); -# if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -# endif + #if defined(__GNUC__) && !defined(__clang__) + #pragma GCC diagnostic pop + #endif ttfRunIndex = std::nullopt; } diff --git a/src/openrct2/drawing/Image.cpp b/src/openrct2/drawing/Image.cpp index dab2c01e27..0044c0357f 100644 --- a/src/openrct2/drawing/Image.cpp +++ b/src/openrct2/drawing/Image.cpp @@ -31,11 +31,11 @@ static uint32_t _allocatedImageCount; #ifdef DEBUG_LEVEL_1 static std::list _allocatedLists; -// MSVC's compiler doesn't support the [[maybe_unused]] attribute for unused static functions. Until this has been resolved, we -// need to explicitly tell the compiler to temporarily disable the warning. -// See discussion at https://github.com/OpenRCT2/OpenRCT2/pull/7617 -# pragma warning(push) -# pragma warning(disable : 4505) // unreferenced local function has been removed + // MSVC's compiler doesn't support the [[maybe_unused]] attribute for unused static functions. Until this has been resolved, + // we need to explicitly tell the compiler to temporarily disable the warning. See discussion at + // https://github.com/OpenRCT2/OpenRCT2/pull/7617 + #pragma warning(push) + #pragma warning(disable : 4505) // unreferenced local function has been removed [[maybe_unused]] static bool AllocatedListContains(uint32_t baseImageId, uint32_t count) { @@ -46,7 +46,7 @@ static std::list _allocatedLists; return contains; } -# pragma warning(pop) + #pragma warning(pop) static bool AllocatedListRemove(uint32_t baseImageId, uint32_t count) { diff --git a/src/openrct2/drawing/SSE41Drawing.cpp b/src/openrct2/drawing/SSE41Drawing.cpp index 3177f81919..732506eb61 100644 --- a/src/openrct2/drawing/SSE41Drawing.cpp +++ b/src/openrct2/drawing/SSE41Drawing.cpp @@ -12,7 +12,7 @@ #ifdef __SSE4_1__ -# include + #include void MaskSse4_1( int32_t width, int32_t height, const uint8_t* RESTRICT maskSrc, const uint8_t* RESTRICT colourSrc, uint8_t* RESTRICT dst, @@ -57,9 +57,9 @@ void MaskSse4_1( #else -# ifdef OPENRCT2_X86 -# error You have to compile this file with SSE4.1 enabled, when targeting x86! -# endif + #ifdef OPENRCT2_X86 + #error You have to compile this file with SSE4.1 enabled, when targeting x86! + #endif void MaskSse4_1( int32_t width, int32_t height, const uint8_t* RESTRICT maskSrc, const uint8_t* RESTRICT colourSrc, uint8_t* RESTRICT dst, diff --git a/src/openrct2/drawing/TTF.cpp b/src/openrct2/drawing/TTF.cpp index 6b35dcd8e4..9e81a40d0f 100644 --- a/src/openrct2/drawing/TTF.cpp +++ b/src/openrct2/drawing/TTF.cpp @@ -9,24 +9,24 @@ #ifndef NO_TTF -# include "../Diagnostic.h" + #include "../Diagnostic.h" -# include -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wdocumentation" -# include -# include FT_FREETYPE_H -# pragma clang diagnostic pop + #include + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation" + #include + #include FT_FREETYPE_H + #pragma clang diagnostic pop -# include "../OpenRCT2.h" -# include "../core/Numerics.hpp" -# include "../core/String.hpp" -# include "../drawing/Font.h" -# include "../localisation/LocalisationService.h" -# include "../platform/Platform.h" -# include "../util/Util.h" -# include "DrawingLock.hpp" -# include "TTF.h" + #include "../OpenRCT2.h" + #include "../core/Numerics.hpp" + #include "../core/String.hpp" + #include "../drawing/Font.h" + #include "../localisation/LocalisationService.h" + #include "../platform/Platform.h" + #include "../util/Util.h" + #include "DrawingLock.hpp" + #include "TTF.h" using namespace OpenRCT2; @@ -360,7 +360,7 @@ void TTFFreeSurface(TTFSurface* surface) #else -# include "TTF.h" + #include "TTF.h" bool TTFInitialise() { diff --git a/src/openrct2/drawing/X8DrawingEngine.cpp b/src/openrct2/drawing/X8DrawingEngine.cpp index 57d7e6fc26..0e27671018 100644 --- a/src/openrct2/drawing/X8DrawingEngine.cpp +++ b/src/openrct2/drawing/X8DrawingEngine.cpp @@ -112,8 +112,8 @@ void X8WeatherDrawer::Restore(DrawPixelInfo& dpi) } #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" #endif X8DrawingEngine::X8DrawingEngine([[maybe_unused]] const std::shared_ptr& uiContext) @@ -453,7 +453,7 @@ void X8DrawingEngine::DrawDirtyBlocks(uint32_t x, uint32_t y, uint32_t columns, } #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif X8DrawingContext::X8DrawingContext(X8DrawingEngine* engine) diff --git a/src/openrct2/drawing/X8DrawingEngine.h b/src/openrct2/drawing/X8DrawingEngine.h index 4a3ea69ee3..f8fb04d495 100644 --- a/src/openrct2/drawing/X8DrawingEngine.h +++ b/src/openrct2/drawing/X8DrawingEngine.h @@ -61,8 +61,8 @@ namespace OpenRCT2 }; #ifdef __WARN_SUGGEST_FINAL_TYPES__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif class X8DrawingEngine : public IDrawingEngine { @@ -86,13 +86,13 @@ namespace OpenRCT2 explicit X8DrawingEngine(const std::shared_ptr& uiContext); #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" -# pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif ~X8DrawingEngine() override; #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif void Initialise() override; @@ -124,7 +124,7 @@ namespace OpenRCT2 void DrawDirtyBlocks(uint32_t x, uint32_t y, uint32_t columns, uint32_t rows); }; #ifdef __WARN_SUGGEST_FINAL_TYPES__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif class X8DrawingContext final : public IDrawingContext diff --git a/src/openrct2/entity/EntityRegistry.cpp b/src/openrct2/entity/EntityRegistry.cpp index b3a5f76991..4d7e883689 100644 --- a/src/openrct2/entity/EntityRegistry.cpp +++ b/src/openrct2/entity/EntityRegistry.cpp @@ -481,6 +481,16 @@ void EntityBase::SetLocation(const CoordsXYZ& newLocation) SpatialIndex |= kSpatialIndexDirtyMask; } +static void EntitySetCoordinates(const CoordsXYZ& entityPos, EntityBase* entity) +{ + auto screenCoords = Translate3DTo2DWithZ(GetCurrentRotation(), entityPos); + + entity->SpriteData.SpriteRect = ScreenRect( + screenCoords - ScreenCoordsXY{ entity->SpriteData.Width, entity->SpriteData.HeightMin }, + screenCoords + ScreenCoordsXY{ entity->SpriteData.Width, entity->SpriteData.HeightMax }); + entity->SetLocation(entityPos); +} + void EntityBase::MoveTo(const CoordsXYZ& newLocation) { if (x != kLocationNull) @@ -506,16 +516,6 @@ void EntityBase::MoveTo(const CoordsXYZ& newLocation) } } -void EntitySetCoordinates(const CoordsXYZ& entityPos, EntityBase* entity) -{ - auto screenCoords = Translate3DTo2DWithZ(GetCurrentRotation(), entityPos); - - entity->SpriteData.SpriteRect = ScreenRect( - screenCoords - ScreenCoordsXY{ entity->SpriteData.Width, entity->SpriteData.HeightMin }, - screenCoords + ScreenCoordsXY{ entity->SpriteData.Width, entity->SpriteData.HeightMax }); - entity->SetLocation(entityPos); -} - /** * Frees any dynamically attached memory to the entity, such as peep name. */ diff --git a/src/openrct2/entity/EntityRegistry.h b/src/openrct2/entity/EntityRegistry.h index b33230e710..e3330c4cc4 100644 --- a/src/openrct2/entity/EntityRegistry.h +++ b/src/openrct2/entity/EntityRegistry.h @@ -12,6 +12,7 @@ #include "EntityBase.h" #include +#include namespace OpenRCT2 { @@ -67,7 +68,6 @@ void ResetAllEntities(); void ResetEntitySpatialIndices(); void UpdateAllMiscEntities(); void UpdateMoneyEffect(); -void EntitySetCoordinates(const CoordsXYZ& entityPos, EntityBase* entity); void EntityRemove(EntityBase* entity); uint16_t RemoveFloatingEntities(); void UpdateEntitiesSpatialIndex(); diff --git a/src/openrct2/entity/EntityTweener.cpp b/src/openrct2/entity/EntityTweener.cpp index 52bc453237..acd5e38ccf 100644 --- a/src/openrct2/entity/EntityTweener.cpp +++ b/src/openrct2/entity/EntityTweener.cpp @@ -101,8 +101,6 @@ void EntityTweener::Tween(float alpha) static_cast(std::round(posB.y * alpha + posA.y * inv)), static_cast(std::round(posB.z * alpha + posA.z * inv)) }); } - - UpdateEntitiesSpatialIndex(); } void EntityTweener::Restore() @@ -113,9 +111,7 @@ void EntityTweener::Restore() if (ent == nullptr) continue; - ent->Invalidate(); - EntitySetCoordinates(PostPos[i], ent); - ent->Invalidate(); + ent->MoveTo(PostPos[i]); } } diff --git a/src/openrct2/entity/Guest.cpp b/src/openrct2/entity/Guest.cpp index 8950d68c9c..2aaa2d58ed 100644 --- a/src/openrct2/entity/Guest.cpp +++ b/src/openrct2/entity/Guest.cpp @@ -50,7 +50,6 @@ #include "../scripting/HookEngine.h" #include "../scripting/ScriptEngine.h" #include "../sprites.h" -#include "../util/Math.hpp" #include "../windows/Intent.h" #include "../world/Climate.h" #include "../world/Footpath.h" @@ -71,8 +70,11 @@ #include #include #include +#include +#include using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; // Locations of the spiral slide platform that a peep walks from the entrance of the ride to the // entrance of the slide. Up to 4 waypoints for each 4 sides that an ride entrance can be located @@ -440,7 +442,7 @@ static void PeepRideIsTooIntense(Guest* peep, Ride& ride, bool peepAtRide); static void PeepResetRideHeading(Guest* peep); static void PeepTriedToEnterFullQueue(Guest* peep, Ride& ride); static int16_t PeepCalculateRideSatisfaction(Guest* peep, const Ride& ride); -static void PeepUpdateFavouriteRide(Guest* peep, const Ride& ride); +static void GuestUpdateFavouriteRide(Guest& peep, const Ride& ride, const uint8_t satisfaction); static int16_t PeepCalculateRideValueSatisfaction(Guest* peep, const Ride& ride); static int16_t PeepCalculateRideIntensityNauseaSatisfaction(Guest* peep, const Ride& ride); static void PeepUpdateRideNauseaGrowth(Guest* peep, const Ride& ride); @@ -452,6 +454,7 @@ static void PeepUpdateHunger(Guest* peep); static void PeepDecideWhetherToLeavePark(Guest* peep); static void PeepLeavePark(Guest* peep); static void PeepHeadForNearestRideWithFlag(Guest* peep, bool considerOnlyCloseRides, RtdFlag rtdFlag); +static void GuestHeadForNearestRideWithSpecialType(Guest& guest, bool considerOnlyCloseRides, RtdSpecialType specialType); bool Loc690FD0(Peep* peep, RideId* rideToView, uint8_t* rideSeatToView, TileElement* tileElement); template<> @@ -1122,10 +1125,10 @@ void Guest::Tick128UpdateGuest(uint32_t index) PeepHeadForNearestRideWithFlag(this, false, RtdFlag::sellsDrinks); break; case PeepThoughtType::Toilet: - PeepHeadForNearestRideWithFlag(this, false, RtdFlag::isToilet); + GuestHeadForNearestRideWithSpecialType(*this, false, RtdSpecialType::toilet); break; case PeepThoughtType::RunningOut: - PeepHeadForNearestRideWithFlag(this, false, RtdFlag::isCashMachine); + GuestHeadForNearestRideWithSpecialType(*this, false, RtdSpecialType::cashMachine); break; default: break; @@ -1145,7 +1148,7 @@ void Guest::Tick128UpdateGuest(uint32_t index) if (Nausea >= 200) { thought_type = PeepThoughtType::VerySick; - PeepHeadForNearestRideWithFlag(this, true, RtdFlag::isFirstAid); + GuestHeadForNearestRideWithSpecialType(*this, true, RtdSpecialType::firstAid); } InsertNewThought(thought_type); } @@ -1591,7 +1594,7 @@ bool Guest::DecideAndBuyItem(Ride& ride, const ShopItem shopItem, money64 price) if (Happiness >= 180) itemValue /= 2; } - if (itemValue > (static_cast(ScenarioRand() & 0x07)) && !(GetGameState().Cheats.IgnorePrice)) + if (itemValue > (static_cast(ScenarioRand() & 0x07)) && !(GetGameState().Cheats.ignorePrice)) { // "I'm not paying that much for x" InsertNewThought(shopItemDescriptor.TooMuchThought, ride.id); @@ -1761,7 +1764,7 @@ void Guest::OnEnterRide(Ride& ride) GuestNumRides++; SetHasRidden(ride); - PeepUpdateFavouriteRide(this, ride); + GuestUpdateFavouriteRide(*this, ride, satisfaction); HappinessTarget = std::clamp(HappinessTarget + satisfaction, 0, kPeepMaxHappiness); PeepUpdateRideNauseaGrowth(this, ride); } @@ -1903,8 +1906,8 @@ OpenRCT2::BitSet Guest::FindRidesToGoOn() { // Take nearby rides into consideration constexpr auto radius = 10 * 32; - int32_t cx = Floor2(x, 32); - int32_t cy = Floor2(y, 32); + int32_t cx = floor2(x, 32); + int32_t cy = floor2(y, 32); for (int32_t tileX = cx - radius; tileX <= cx + radius; tileX += kCoordsXYStep) { for (int32_t tileY = cy - radius; tileY <= cy + radius; tileY += kCoordsXYStep) @@ -2066,7 +2069,7 @@ bool Guest::ShouldGoOnRide(Ride& ride, StationIndex entranceNum, bool atQueue, b // excitement check and will only do a basic intensity check when they arrive at the ride itself. if (ride.id == GuestHeadingToRideId) { - if (ride.ratings.intensity > RIDE_RATING(10, 00) && !GetGameState().Cheats.IgnoreRideIntensity) + if (ride.ratings.intensity > RIDE_RATING(10, 00) && !GetGameState().Cheats.ignoreRideIntensity) { PeepRideIsTooIntense(this, ride, peepAtRide); return false; @@ -2093,7 +2096,7 @@ bool Guest::ShouldGoOnRide(Ride& ride, StationIndex entranceNum, bool atQueue, b // ride intensity check and get me on a sheltered ride! if (!isPrecipitating || !ShouldRideWhileRaining(ride)) { - if (!GetGameState().Cheats.IgnoreRideIntensity) + if (!GetGameState().Cheats.ignoreRideIntensity) { // Intensity calculations. Even though the max intensity can go up to 15, it's capped // at 10.0 (before happiness calculations). A full happiness bar will increase the max @@ -2159,7 +2162,7 @@ bool Guest::ShouldGoOnRide(Ride& ride, StationIndex entranceNum, bool atQueue, b return false; } - if (!GetGameState().Cheats.IgnoreRideIntensity) + if (!GetGameState().Cheats.ignoreRideIntensity) { if (ride.max_positive_vertical_g > FIXED_2DP(5, 00) || ride.max_negative_vertical_g < FIXED_2DP(-4, 00) || ride.max_lateral_g > FIXED_2DP(4, 00)) @@ -2182,7 +2185,7 @@ bool Guest::ShouldGoOnRide(Ride& ride, StationIndex entranceNum, bool atQueue, b // Peeps won't pay more than twice the value of the ride. ridePrice = RideGetPrice(ride); - if ((ridePrice > (value * 2)) && !(gameState.Cheats.IgnorePrice)) + if ((ridePrice > (value * 2)) && !(gameState.Cheats.ignorePrice)) { if (peepAtRide) { @@ -2240,7 +2243,7 @@ bool Guest::ShouldGoToShop(Ride& ride, bool peepAtShop) } const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType == RtdSpecialType::toilet) { if (Toilet < 70) { @@ -2250,7 +2253,7 @@ bool Guest::ShouldGoToShop(Ride& ride, bool peepAtShop) // The amount that peeps are willing to pay to use the Toilets scales with their toilet stat. // It effectively has a minimum of $0.10 (due to the check above) and a maximum of $0.60. - if ((RideGetPrice(ride) * 40 > Toilet) && !GetGameState().Cheats.IgnorePrice) + if ((RideGetPrice(ride) * 40 > Toilet) && !GetGameState().Cheats.ignorePrice) { if (peepAtShop) { @@ -2266,7 +2269,7 @@ bool Guest::ShouldGoToShop(Ride& ride, bool peepAtShop) } } - if (rtd.HasFlag(RtdFlag::isFirstAid)) + if (rtd.specialType == RtdSpecialType::firstAid) { if (Nausea < 128) { @@ -2457,19 +2460,19 @@ static void PeepRideIsTooIntense(Guest* peep, Ride& ride, bool peepAtRide) * * rct2: 0x00691C6E */ -static Vehicle* PeepChooseCarFromRide(Peep* peep, const Ride& ride, std::vector& car_array) +static Vehicle* PeepChooseCarFromRide(Peep* peep, const Ride& ride, std::span carArray) { uint8_t chosen_car = ScenarioRand(); if (ride.GetRideTypeDescriptor().HasFlag(RtdFlag::hasGForces) && ((chosen_car & 0xC) != 0xC)) { - chosen_car = (ScenarioRand() & 1) ? 0 : static_cast(car_array.size()) - 1; + chosen_car = (ScenarioRand() & 1) ? 0 : static_cast(carArray.size()) - 1; } else { - chosen_car = (chosen_car * static_cast(car_array.size())) >> 8; + chosen_car = (chosen_car * static_cast(carArray.size())) >> 8; } - peep->CurrentCar = car_array[chosen_car]; + peep->CurrentCar = carArray[chosen_car]; Vehicle* vehicle = GetEntity(ride.vehicles[peep->CurrentTrain]); if (vehicle == nullptr) @@ -2550,7 +2553,8 @@ void Guest::GoToRideEntrance(const Ride& ride) RemoveFromQueue(); } -bool Guest::FindVehicleToEnter(const Ride& ride, std::vector& car_array) +static bool FindVehicleToEnter( + Guest& guest, const Ride& ride, sfl::static_vector& car_array) { uint8_t chosen_train = RideStation::kNoTrain; @@ -2576,14 +2580,14 @@ bool Guest::FindVehicleToEnter(const Ride& ride, std::vector& car_array } else { - chosen_train = ride.GetStation(CurrentRideStation).TrainAtStation; + chosen_train = ride.GetStation(guest.CurrentRideStation).TrainAtStation; } if (chosen_train >= OpenRCT2::Limits::kMaxTrainsPerRide) { return false; } - CurrentTrain = chosen_train; + guest.CurrentTrain = chosen_train; int32_t i = 0; @@ -2657,7 +2661,7 @@ static bool PeepCheckRidePriceAtEntrance(Guest* peep, const Ride& ride, money64 auto value = ride.value; if (value != RIDE_VALUE_UNDEFINED) { - if (((value * 2) < ridePrice) && !(GetGameState().Cheats.IgnorePrice)) + if (((value * 2) < ridePrice) && !(GetGameState().Cheats.ignorePrice)) { peep->InsertNewThought(PeepThoughtType::BadValue, peep->CurrentRide); PeepUpdateRideAtEntranceTryLeave(peep); @@ -2703,24 +2707,24 @@ static int16_t PeepCalculateRideSatisfaction(Guest* peep, const Ride& ride) /** * Check to see if the specified ride should become the peep's favourite. - * For this, a "ride rating" is calculated based on the excitement of the ride and the peep's current happiness. - * As this value cannot exceed 255, the happier the peep is, the more irrelevant the ride's excitement becomes. + * For this, a "ride rating" is calculated based on the excitement of the ride and the satisfaction of the ride. + * As this value cannot exceed 255, the more satisfied the peep is, the more irrelevant the ride's excitement becomes. * Due to the minimum happiness requirement, an excitement rating of more than 3.8 has no further effect. * * If the ride rating is higher than any ride the peep has already been on and the happiness criteria is met, * the ride becomes the peep's favourite. (This doesn't happen right away, but will be updated once the peep * exits the ride.) */ -static void PeepUpdateFavouriteRide(Guest* peep, const Ride& ride) +static void GuestUpdateFavouriteRide(Guest& peep, const Ride& ride, uint8_t satisfaction) { - peep->PeepFlags &= ~PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; - uint8_t peepRideRating = std::clamp((ride.ratings.excitement / 4) + peep->Happiness, 0, kPeepMaxHappiness); - if (peepRideRating >= peep->FavouriteRideRating) + peep.PeepFlags &= ~PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; + uint8_t peepRideRating = std::clamp((ride.ratings.excitement / 4) + satisfaction, 0, kPeepMaxHappiness); + if (peepRideRating >= peep.FavouriteRideRating) { - if (peep->Happiness >= 160 && peep->HappinessTarget >= 160) + if (peep.Happiness >= 160 && peep.HappinessTarget >= 160) { - peep->FavouriteRideRating = peepRideRating; - peep->PeepFlags |= PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; + peep.FavouriteRideRating = peepRideRating; + peep.PeepFlags |= PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE; } } } @@ -2873,7 +2877,7 @@ static bool PeepShouldGoOnRideAgain(Guest* peep, const Ride& ride) return false; if (!RideHasRatings(ride)) return false; - if (ride.ratings.intensity > RIDE_RATING(10, 00) && !GetGameState().Cheats.IgnoreRideIntensity) + if (ride.ratings.intensity > RIDE_RATING(10, 00) && !GetGameState().Cheats.ignoreRideIntensity) return false; if (peep->Happiness < 180) return false; @@ -2918,7 +2922,7 @@ static bool PeepReallyLikedRide(Guest* peep, const Ride& ride) return false; if (!RideHasRatings(ride)) return false; - if (ride.ratings.intensity > RIDE_RATING(10, 00) && !GetGameState().Cheats.IgnoreRideIntensity) + if (ride.ratings.intensity > RIDE_RATING(10, 00) && !GetGameState().Cheats.ignoreRideIntensity) return false; return true; } @@ -3037,7 +3041,7 @@ static PeepThoughtType PeepAssessSurroundings(int16_t centre_x, int16_t centre_y if (nearby_music == 1 && num_rubbish < 20) return PeepThoughtType::Music; - if (num_rubbish < 2 && !GetGameState().Cheats.DisableLittering) + if (num_rubbish < 2 && !GetGameState().Cheats.disableLittering) // if disable littering cheat is enabled, peeps will not have the "clean and tidy park" thought return PeepThoughtType::VeryClean; @@ -3178,8 +3182,8 @@ static void PeepHeadForNearestRide(Guest* peep, bool considerOnlyCloseRides, T p { // Take nearby rides into consideration constexpr auto searchRadius = 10 * 32; - int32_t cx = Floor2(peep->x, 32); - int32_t cy = Floor2(peep->y, 32); + int32_t cx = floor2(peep->x, 32); + int32_t cy = floor2(peep->y, 32); for (auto x = cx - searchRadius; x <= cx + searchRadius; x += kCoordsXYStep) { for (auto y = cy - searchRadius; y <= cy + searchRadius; y += kCoordsXYStep) @@ -3251,12 +3255,19 @@ static void PeepHeadForNearestRide(Guest* peep, bool considerOnlyCloseRides, T p static void PeepHeadForNearestRideWithFlag(Guest* peep, bool considerOnlyCloseRides, RtdFlag rtdFlag) { - if ((rtdFlag == RtdFlag::isToilet) && peep->HasFoodOrDrink()) + PeepHeadForNearestRide( + peep, considerOnlyCloseRides, [rtdFlag](const Ride& ride) { return ride.GetRideTypeDescriptor().HasFlag(rtdFlag); }); +} + +static void GuestHeadForNearestRideWithSpecialType(Guest& guest, bool considerOnlyCloseRides, RtdSpecialType specialType) +{ + if ((specialType == RtdSpecialType::toilet) && guest.HasFoodOrDrink()) { return; } - PeepHeadForNearestRide( - peep, considerOnlyCloseRides, [rtdFlag](const Ride& ride) { return ride.GetRideTypeDescriptor().HasFlag(rtdFlag); }); + PeepHeadForNearestRide(&guest, considerOnlyCloseRides, [specialType](const Ride& ride) { + return ride.GetRideTypeDescriptor().specialType == specialType; + }); } /** @@ -3277,10 +3288,10 @@ void Guest::StopPurchaseThought(ride_type_t rideType) if (!rtd.HasFlag(RtdFlag::sellsDrinks)) { thoughtType = PeepThoughtType::RunningOut; - if (!rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType != RtdSpecialType::cashMachine) { thoughtType = PeepThoughtType::Toilet; - if (!rtd.HasFlag(RtdFlag::isToilet)) + if (rtd.specialType != RtdSpecialType::toilet) { return; } @@ -3365,7 +3376,7 @@ void Guest::UpdateBuying() } const auto& rtd = GetRideTypeDescriptor(ride->type); - if (rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType == RtdSpecialType::cashMachine) { if (CurrentRide != PreviousRide) { @@ -3388,7 +3399,7 @@ void Guest::UpdateBuying() if (CurrentRide != PreviousRide) { const auto& rtd = GetRideTypeDescriptor(ride->type); - if (rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType == RtdSpecialType::cashMachine) { item_bought = PeepShouldUseCashMachine(this, CurrentRide); if (!item_bought) @@ -3489,7 +3500,7 @@ void Guest::UpdateRideAtEntrance() } } - std::vector carArray; + sfl::static_vector carArray; if (ride->GetRideTypeDescriptor().HasFlag(RtdFlag::noVehicles)) { @@ -3498,7 +3509,7 @@ void Guest::UpdateRideAtEntrance() } else { - if (!FindVehicleToEnter(*ride, carArray)) + if (!FindVehicleToEnter(*this, *ride, carArray)) return; } @@ -3907,7 +3918,7 @@ void Guest::UpdateRideFreeVehicleEnterRide(Ride& ride) } const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isSpiralSlide)) + if (rtd.specialType == RtdSpecialType::spiralSlide) { SwitchToSpecialSprite(1); } @@ -4697,7 +4708,7 @@ void Guest::UpdateRideApproachSpiralSlide() Var37 = (directionTemp * 4) | (Var37 & 0x30) | waypoint; CoordsXY targetLoc = ride->GetStation(CurrentRideStation).Start; - assert(rtd.HasFlag(RtdFlag::isSpiralSlide)); + assert(rtd.specialType == RtdSpecialType::spiralSlide); targetLoc += SpiralSlideWalkingPath[Var37]; SetDestination(targetLoc); @@ -4711,7 +4722,7 @@ void Guest::UpdateRideApproachSpiralSlide() CoordsXY targetLoc = ride->GetStation(CurrentRideStation).Start; - assert(rtd.HasFlag(RtdFlag::isSpiralSlide)); + assert(rtd.specialType == RtdSpecialType::spiralSlide); targetLoc += SpiralSlideWalkingPath[Var37]; SetDestination(targetLoc); @@ -4745,7 +4756,7 @@ void Guest::UpdateRideOnSpiralSlide() return; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isSpiralSlide)) + if (rtd.specialType != RtdSpecialType::spiralSlide) return; auto destination = GetDestination(); @@ -4850,7 +4861,7 @@ void Guest::UpdateRideLeaveSpiralSlide() CoordsXY targetLoc = ride->GetStation(CurrentRideStation).Start; [[maybe_unused]] const auto& rtd = ride->GetRideTypeDescriptor(); - assert(rtd.HasFlag(RtdFlag::isSpiralSlide)); + assert(rtd.specialType == RtdSpecialType::spiralSlide); targetLoc += SpiralSlideWalkingPath[Var37]; SetDestination(targetLoc); @@ -5110,7 +5121,7 @@ void Guest::UpdateRideShopInteract() const int16_t tileCentreY = NextLoc.y + 16; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isFirstAid)) + if (rtd.specialType == RtdSpecialType::firstAid) { if (Nausea <= 35) { @@ -6210,7 +6221,7 @@ static PathElement* FindBreakableElement(const CoordsXYZ& loc) */ static void PeepUpdateWalkingBreakScenery(Guest* peep) { - if (GetGameState().Cheats.DisableVandalism) + if (GetGameState().Cheats.disableVandalism) return; if (!(peep->PeepFlags & PEEP_FLAGS_ANGRY)) @@ -7134,7 +7145,7 @@ Guest* Guest::Generate(const CoordsXYZ& coords) peep->SpecialSprite = 0; peep->AnimationImageIdOffset = 0; peep->WalkingAnimationFrameNum = 0; - peep->AnimationType = PeepAnimationType::None; + peep->AnimationType = PeepAnimationType::Walking; peep->PeepFlags = 0; peep->FavouriteRide = RideId::GetNull(); peep->FavouriteRideRating = 0; diff --git a/src/openrct2/entity/Guest.h b/src/openrct2/entity/Guest.h index 915d4f8316..4c67dd79fa 100644 --- a/src/openrct2/entity/Guest.h +++ b/src/openrct2/entity/Guest.h @@ -423,7 +423,6 @@ private: void GivePassingPeepsIceCream(Guest* passingPeep); Ride* FindBestRideToGoOn(); OpenRCT2::BitSet FindRidesToGoOn(); - bool FindVehicleToEnter(const Ride& ride, std::vector& car_array); void GoToRideEntrance(const Ride& ride); }; diff --git a/src/openrct2/entity/Litter.cpp b/src/openrct2/entity/Litter.cpp index 3a8d38fe33..12177c7516 100644 --- a/src/openrct2/entity/Litter.cpp +++ b/src/openrct2/entity/Litter.cpp @@ -13,6 +13,8 @@ #include "EntityList.h" #include "EntityRegistry.h" +#include + using namespace OpenRCT2; template<> @@ -52,7 +54,7 @@ static bool IsLocationLitterable(const CoordsXYZ& mapPos) void Litter::Create(const CoordsXYZD& litterPos, Type type) { auto& gameState = GetGameState(); - if (gameState.Cheats.DisableLittering) + if (gameState.Cheats.disableLittering) return; auto offsetLitterPos = litterPos @@ -101,7 +103,9 @@ void Litter::Create(const CoordsXYZD& litterPos, Type type) */ void Litter::RemoveAt(const CoordsXYZ& litterPos) { - std::vector removals; + // There can be a lot of litter entities on the same tile, avoid heap allocations + // by having the first 512 stored in a small_vector which is on the stack. + sfl::small_vector removals; for (auto litter : EntityTileList(litterPos)) { if (abs(litter->z - litterPos.z) <= 16) diff --git a/src/openrct2/entity/MoneyEffect.h b/src/openrct2/entity/MoneyEffect.h index 1888d8f1d9..a083dbfd68 100644 --- a/src/openrct2/entity/MoneyEffect.h +++ b/src/openrct2/entity/MoneyEffect.h @@ -13,6 +13,8 @@ #include "../localisation/StringIdType.h" #include "EntityBase.h" +#include + class DataSerialiser; struct CoordsXYZ; struct PaintSession; diff --git a/src/openrct2/entity/Peep.cpp b/src/openrct2/entity/Peep.cpp index a3806d5077..c9e12c506d 100644 --- a/src/openrct2/entity/Peep.cpp +++ b/src/openrct2/entity/Peep.cpp @@ -80,7 +80,7 @@ static std::shared_ptr _crowdSoundChannel = nullptr; static void GuestReleaseBalloon(Guest* peep, int16_t spawn_height); static PeepAnimationType PeepSpecialSpriteToAnimationGroupMap[] = { - PeepAnimationType::None, + PeepAnimationType::Walking, PeepAnimationType::HoldMat, PeepAnimationType::StaffMower, }; @@ -332,7 +332,7 @@ PeepAnimationType Peep::GetAnimationType() Guard::Assert( EnumValue(Action) >= std::size(PeepActionToAnimationGroupMap) && Action < PeepActionType::Idle, "Invalid peep action %u", EnumValue(Action)); - return PeepAnimationType::None; + return PeepAnimationType::Walking; } /* @@ -625,7 +625,7 @@ void Peep::PickupAbort(int32_t old_x) Action = PeepActionType::Walking; SpecialSprite = 0; AnimationImageIdOffset = 0; - AnimationType = PeepAnimationType::None; + AnimationType = PeepAnimationType::Walking; PathCheckOptimisation = 0; } @@ -674,7 +674,7 @@ GameActions::Result Peep::Place(const TileCoordsXYZ& location, bool apply) Action = PeepActionType::Walking; SpecialSprite = 0; AnimationImageIdOffset = 0; - AnimationType = PeepAnimationType::None; + AnimationType = PeepAnimationType::Walking; PathCheckOptimisation = 0; EntityTweener::Get().Reset(); auto* guest = As(); @@ -1141,7 +1141,7 @@ void PeepProblemWarningsUpdate() break; } ride = GetRide(peep->GuestHeadingToRideId); - if (ride != nullptr && !ride->GetRideTypeDescriptor().HasFlag(RtdFlag::isToilet)) + if (ride != nullptr && ride->GetRideTypeDescriptor().specialType != RtdSpecialType::toilet) toiletCounter++; break; @@ -2911,7 +2911,7 @@ void Peep::Paint(PaintSession& session, int32_t imageDirection) const return; } - if (baseImageId >= kPeepSpriteUmbrellaStateNoneId && baseImageId < (kPeepSpriteUmbrellaStateSittingIdleId + 4)) + if (baseImageId >= kPeepSpriteUmbrellaStateWalkingId && baseImageId < (kPeepSpriteUmbrellaStateSittingIdleId + 4)) { imageId = ImageId(baseImageId + 32, guest->UmbrellaColour); PaintAddImageAsChild(session, imageId, offset, bb); diff --git a/src/openrct2/entity/Peep.h b/src/openrct2/entity/Peep.h index 517961c5ca..90d191df08 100644 --- a/src/openrct2/entity/Peep.h +++ b/src/openrct2/entity/Peep.h @@ -18,6 +18,7 @@ #include #include +#include #include constexpr uint8_t kPeepMinEnergy = 32; @@ -153,7 +154,7 @@ enum class PeepActionType : uint8_t enum class PeepAnimationType : uint8_t { - None = 0, + Walking = 0, CheckTime = 1, WatchRide = 2, EatFood = 3, diff --git a/src/openrct2/entity/Staff.cpp b/src/openrct2/entity/Staff.cpp index 5e5a6f82fb..89069e04f1 100644 --- a/src/openrct2/entity/Staff.cpp +++ b/src/openrct2/entity/Staff.cpp @@ -24,6 +24,7 @@ #include "../management/Finance.h" #include "../network/network.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/PathAdditionEntry.h" diff --git a/src/openrct2/interface/FontFamilies.h b/src/openrct2/interface/FontFamilies.h index cf22871f51..3932f9999f 100644 --- a/src/openrct2/interface/FontFamilies.h +++ b/src/openrct2/interface/FontFamilies.h @@ -15,7 +15,7 @@ constexpr std::nullptr_t kFamilyOpenRCT2Sprite = nullptr; #ifndef NO_TTF -# include + #include struct TTFFontSetDescriptor; @@ -27,10 +27,10 @@ extern TTFontFamily const TTFFamilyJapanese; extern TTFontFamily const TTFFamilyKorean; extern TTFontFamily const TTFFamilySansSerif; -# define FAMILY(x) x + #define FAMILY(x) x #else // NO_TTF -# define FAMILY(x) kFamilyOpenRCT2Sprite + #define FAMILY(x) kFamilyOpenRCT2Sprite #endif // NO_TTF diff --git a/src/openrct2/interface/InteractiveConsole.cpp b/src/openrct2/interface/InteractiveConsole.cpp index 67b5ed1930..c37be28bc8 100644 --- a/src/openrct2/interface/InteractiveConsole.cpp +++ b/src/openrct2/interface/InteractiveConsole.cpp @@ -74,7 +74,7 @@ #include #ifndef NO_TTF -# include "../drawing/TTF.h" + #include "../drawing/TTF.h" #endif using namespace OpenRCT2; @@ -209,7 +209,7 @@ static int32_t ConsoleCommandRides(InteractiveConsole& console, const arguments_ auto res = SetOperatingSetting(RideId::FromUnderlying(ride_index), RideSetSetting::RideType, type); if (res == kMoney64Undefined) { - if (!GetGameState().Cheats.AllowArbitraryRideTypeChanges) + if (!GetGameState().Cheats.allowArbitraryRideTypeChanges) { console.WriteFormatLine( "That didn't work. Try enabling the 'Allow arbitrary ride type changes' cheat"); @@ -718,15 +718,15 @@ static int32_t ConsoleCommandGet(InteractiveConsole& console, const arguments_t& } else if (argv[0] == "cheat_sandbox_mode") { - console.WriteFormatLine("cheat_sandbox_mode %d", GetGameState().Cheats.SandboxMode); + console.WriteFormatLine("cheat_sandbox_mode %d", GetGameState().Cheats.sandboxMode); } else if (argv[0] == "cheat_disable_clearance_checks") { - console.WriteFormatLine("cheat_disable_clearance_checks %d", GetGameState().Cheats.DisableClearanceChecks); + console.WriteFormatLine("cheat_disable_clearance_checks %d", GetGameState().Cheats.disableClearanceChecks); } else if (argv[0] == "cheat_disable_support_limits") { - console.WriteFormatLine("cheat_disable_support_limits %d", GetGameState().Cheats.DisableSupportLimits); + console.WriteFormatLine("cheat_disable_support_limits %d", GetGameState().Cheats.disableSupportLimits); } else if (argv[0] == "current_rotation") { @@ -1109,7 +1109,7 @@ static int32_t ConsoleCommandSet(InteractiveConsole& console, const arguments_t& } else if (argv[0] == "cheat_sandbox_mode" && InvalidArguments(&invalidArgs, int_valid[0])) { - if (GetGameState().Cheats.SandboxMode != (int_val[0] != 0)) + if (GetGameState().Cheats.sandboxMode != (int_val[0] != 0)) { auto cheatSetAction = CheatSetAction(CheatType::SandboxMode, int_val[0] != 0); cheatSetAction.SetCallback([&console](const GameAction*, const GameActions::Result* res) { @@ -1127,7 +1127,7 @@ static int32_t ConsoleCommandSet(InteractiveConsole& console, const arguments_t& } else if (argv[0] == "cheat_disable_clearance_checks" && InvalidArguments(&invalidArgs, int_valid[0])) { - if (GetGameState().Cheats.DisableClearanceChecks != (int_val[0] != 0)) + if (GetGameState().Cheats.disableClearanceChecks != (int_val[0] != 0)) { auto cheatSetAction = CheatSetAction(CheatType::DisableClearanceChecks, int_val[0] != 0); cheatSetAction.SetCallback([&console](const GameAction*, const GameActions::Result* res) { @@ -1145,7 +1145,7 @@ static int32_t ConsoleCommandSet(InteractiveConsole& console, const arguments_t& } else if (argv[0] == "cheat_disable_support_limits" && InvalidArguments(&invalidArgs, int_valid[0])) { - if (GetGameState().Cheats.DisableSupportLimits != (int_val[0] != 0)) + if (GetGameState().Cheats.disableSupportLimits != (int_val[0] != 0)) { auto cheatSetAction = CheatSetAction(CheatType::DisableSupportLimits, int_val[0] != 0); cheatSetAction.SetCallback([&console](const GameAction*, const GameActions::Result* res) { diff --git a/src/openrct2/interface/StdInOutConsole.cpp b/src/openrct2/interface/StdInOutConsole.cpp index 2909940bad..5db10847d3 100644 --- a/src/openrct2/interface/StdInOutConsole.cpp +++ b/src/openrct2/interface/StdInOutConsole.cpp @@ -19,7 +19,7 @@ // Ignore isatty warning on WIN32 #ifdef _MSC_VER -# pragma warning(disable : 4996) + #pragma warning(disable : 4996) #endif void StdInOutConsole::Start() diff --git a/src/openrct2/interface/Viewport.cpp b/src/openrct2/interface/Viewport.cpp index 067b939d35..1c388ce69d 100644 --- a/src/openrct2/interface/Viewport.cpp +++ b/src/openrct2/interface/Viewport.cpp @@ -18,6 +18,7 @@ #include "../config/Config.h" #include "../core/Guard.hpp" #include "../core/JobPool.h" +#include "../core/Numerics.hpp" #include "../drawing/Drawing.h" #include "../drawing/IDrawingEngine.h" #include "../entity/EntityList.h" @@ -35,7 +36,6 @@ #include "../ride/Vehicle.h" #include "../ui/UiContext.h" #include "../ui/WindowManager.h" -#include "../util/Math.hpp" #include "../world/Climate.h" #include "../world/Map.h" #include "../world/tile_element/LargeSceneryElement.h" @@ -51,6 +51,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; enum : uint8_t { @@ -1013,7 +1014,7 @@ static void ViewportPaint(const Viewport* viewport, DrawPixelInfo& dpi) const int32_t columnWidth = worldDpi.zoom_level.ApplyInversedTo(kCoordsXYStep); const int32_t rightBorder = worldDpi.x + worldDpi.width; - const int32_t alignedX = Floor2(worldDpi.x, columnWidth); + const int32_t alignedX = floor2(worldDpi.x, columnWidth); // Generate and sort columns. for (int32_t x = alignedX; x < rightBorder; x += columnWidth) diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index cbc7a730f4..300ac9a1db 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -94,8 +94,7 @@ std::list>::iterator WindowGetIterator(const WindowB void WindowVisitEach(std::function func) { - auto windowList = g_window_list; - for (auto& w : windowList) + for (auto& w : g_window_list) { if (w->flags & WF_DEAD) continue; @@ -142,7 +141,8 @@ void WindowUpdateAllViewports() */ void WindowUpdateAll() { - WindowFlushDead(); + // Remove all windows in g_window_list that have the WF_DEAD flag + g_window_list.remove_if([](auto&& w) -> bool { return w->flags & WF_DEAD; }); // Periodic update happens every second so 40 ticks. if (gCurrentRealTimeTicks >= gWindowUpdateTicks) @@ -238,12 +238,6 @@ void WindowClose(WindowBase& w) w.flags |= WF_DEAD; } -void WindowFlushDead() -{ - // Remove all windows in g_window_list that have the WF_DEAD flag - g_window_list.remove_if([](auto&& w) -> bool { return w->flags & WF_DEAD; }); -} - template static void WindowCloseByCondition(TPred pred, uint32_t flags = WindowCloseFlags::None) { diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 7595214fe3..f9d38390b7 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -445,7 +445,7 @@ extern Tool gCurrentToolId; extern WidgetRef gCurrentToolWidget; using modal_callback = void (*)(int32_t result); -using close_callback = void (*)(); +using CloseCallback = void (*)(); constexpr int8_t kWindowLimitMin = 4; constexpr int8_t kWindowLimitMax = 64; @@ -475,7 +475,6 @@ WindowBase* WindowBringToFrontByClassWithFlags(WindowClass cls, uint16_t flags); WindowBase* WindowBringToFrontByNumber(WindowClass cls, rct_windownumber number); void WindowClose(WindowBase& window); -void WindowFlushDead(); void WindowCloseByClass(WindowClass cls); void WindowCloseByNumber(WindowClass cls, rct_windownumber number); void WindowCloseByNumber(WindowClass cls, EntityId number); diff --git a/src/openrct2/interface/Window_internal.h b/src/openrct2/interface/Window_internal.h index 7c204501ad..85db10a6bf 100644 --- a/src/openrct2/interface/Window_internal.h +++ b/src/openrct2/interface/Window_internal.h @@ -22,9 +22,9 @@ struct ResearchItem; struct RCTObjectEntry; #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" -# pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic ignored "-Wsuggest-final-types" #endif /** @@ -169,7 +169,7 @@ struct WindowBase }; #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif // rct2: 0x01420078 diff --git a/src/openrct2/interface/ZoomLevel.cpp b/src/openrct2/interface/ZoomLevel.cpp index e7ded72fb1..1c52b517ea 100644 --- a/src/openrct2/interface/ZoomLevel.cpp +++ b/src/openrct2/interface/ZoomLevel.cpp @@ -1,5 +1,5 @@ /***************************************************************************** - * Copyright (c) 2020 OpenRCT2 developers + * Copyright (c) 2014-2024 OpenRCT2 developers * * For a complete list of all authors, please refer to contributors.md * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 diff --git a/src/openrct2/libopenrct2.vcxproj b/src/openrct2/libopenrct2.vcxproj index 7323e94289..36a6b77798 100644 --- a/src/openrct2/libopenrct2.vcxproj +++ b/src/openrct2/libopenrct2.vcxproj @@ -203,7 +203,6 @@ - @@ -380,7 +379,7 @@ - + @@ -397,6 +396,7 @@ + @@ -435,6 +435,7 @@ + @@ -597,8 +598,6 @@ - - @@ -916,6 +915,7 @@ + @@ -1133,4 +1133,4 @@ - + \ No newline at end of file diff --git a/src/openrct2/localisation/Language.cpp b/src/openrct2/localisation/Language.cpp index cc4bff6696..ccd9649785 100644 --- a/src/openrct2/localisation/Language.cpp +++ b/src/openrct2/localisation/Language.cpp @@ -39,6 +39,7 @@ const LanguageDescriptor LanguagesDescriptors[LANGUAGE_COUNT] = { "es-ES", "Spanish", u8"Español", LANGUAGE_UNDEFINED, kFamilyOpenRCT2Sprite, false }, // LANGUAGE_SPANISH { "fr-FR", "French", u8"Français", LANGUAGE_UNDEFINED, kFamilyOpenRCT2Sprite, false }, // LANGUAGE_FRENCH { "fr-CA", "French (CA)", u8"Français (CA)", LANGUAGE_FRENCH, kFamilyOpenRCT2Sprite, false }, // LANGUAGE_FRENCH_CA + { "gl-ES", "Galician", "Galego", LANGUAGE_UNDEFINED, kFamilyOpenRCT2Sprite, false }, // LANGUAGE_GALICIAN { "it-IT", "Italian", "Italiano", LANGUAGE_UNDEFINED, kFamilyOpenRCT2Sprite, false }, // LANGUAGE_ITALIAN { "ja-JP", "Japanese", "Japanese", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilyJapanese), false }, // LANGUAGE_JAPANESE { "ko-KR", "Korean", "Korean", LANGUAGE_UNDEFINED, FAMILY(&TTFFamilyKorean), false }, // LANGUAGE_KOREAN diff --git a/src/openrct2/localisation/Language.h b/src/openrct2/localisation/Language.h index 505133bd48..7930999302 100644 --- a/src/openrct2/localisation/Language.h +++ b/src/openrct2/localisation/Language.h @@ -31,6 +31,7 @@ enum LANGUAGE_SPANISH, LANGUAGE_FRENCH, LANGUAGE_FRENCH_CA, + LANGUAGE_GALICIAN, LANGUAGE_ITALIAN, LANGUAGE_JAPANESE, LANGUAGE_KOREAN, diff --git a/src/openrct2/management/Award.cpp b/src/openrct2/management/Award.cpp index 4220040320..e692c8299c 100644 --- a/src/openrct2/management/Award.cpp +++ b/src/openrct2/management/Award.cpp @@ -374,7 +374,7 @@ static bool AwardIsDeservedBestToilets([[maybe_unused]] int32_t activeAwardTypes const auto& rideManager = GetRideManager(); auto numToilets = static_cast(std::count_if(rideManager.begin(), rideManager.end(), [](const Ride& ride) { const auto& rtd = ride.GetRideTypeDescriptor(); - return rtd.HasFlag(RtdFlag::isToilet) && ride.status == RideStatus::Open; + return rtd.specialType == RtdSpecialType::toilet && ride.status == RideStatus::Open; })); // At least 4 open toilets diff --git a/src/openrct2/management/Marketing.cpp b/src/openrct2/management/Marketing.cpp index 849f3ea48c..a22e23e140 100644 --- a/src/openrct2/management/Marketing.cpp +++ b/src/openrct2/management/Marketing.cpp @@ -113,7 +113,7 @@ void MarketingUpdate() auto& gameState = GetGameState(); - if (gameState.Cheats.NeverendingMarketing) + if (gameState.Cheats.neverendingMarketing) return; for (auto it = gameState.MarketingCampaigns.begin(); it != gameState.MarketingCampaigns.end();) diff --git a/src/openrct2/management/Research.cpp b/src/openrct2/management/Research.cpp index fc15197db2..2e7c592256 100644 --- a/src/openrct2/management/Research.cpp +++ b/src/openrct2/management/Research.cpp @@ -25,6 +25,7 @@ #include "../localisation/Localisation.Date.h" #include "../localisation/StringIds.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/RideObject.h" #include "../object/SceneryGroupEntry.h" @@ -639,7 +640,7 @@ bool SceneryGroupIsInvented(int32_t sgIndex) return true; } - if (GetGameState().Cheats.IgnoreResearchStatus) + if (GetGameState().Cheats.ignoreResearchStatus) { return true; } diff --git a/src/openrct2/management/Research.h b/src/openrct2/management/Research.h index f956581365..aeca6429e8 100644 --- a/src/openrct2/management/Research.h +++ b/src/openrct2/management/Research.h @@ -10,10 +10,8 @@ #pragma once #include "../localisation/StringIdType.h" -#include "../object/ObjectLimits.h" #include "../object/ObjectTypes.h" #include "../ride/RideTypes.h" -#include "../util/Util.h" #include diff --git a/src/openrct2/network/DiscordService.cpp b/src/openrct2/network/DiscordService.cpp index 9599712e50..9699710362 100644 --- a/src/openrct2/network/DiscordService.cpp +++ b/src/openrct2/network/DiscordService.cpp @@ -8,21 +8,21 @@ *****************************************************************************/ #ifdef __ENABLE_DISCORD__ -# include "DiscordService.h" + #include "DiscordService.h" -# include "../Context.h" -# include "../Diagnostic.h" -# include "../GameState.h" -# include "../OpenRCT2.h" -# include "../core/Console.hpp" -# include "../core/String.hpp" -# include "../core/UTF8.h" -# include "../localisation/Formatting.h" -# include "../world/Park.h" -# include "network.h" + #include "../Context.h" + #include "../Diagnostic.h" + #include "../GameState.h" + #include "../OpenRCT2.h" + #include "../core/Console.hpp" + #include "../core/String.hpp" + #include "../core/UTF8.h" + #include "../localisation/Formatting.h" + #include "../world/Park.h" + #include "network.h" -# include -# include + #include + #include using namespace OpenRCT2; diff --git a/src/openrct2/network/DiscordService.h b/src/openrct2/network/DiscordService.h index ab496b4055..7ba3ab9e0d 100644 --- a/src/openrct2/network/DiscordService.h +++ b/src/openrct2/network/DiscordService.h @@ -11,9 +11,9 @@ #ifdef __ENABLE_DISCORD__ -# include "../core/Timer.hpp" + #include "../core/Timer.hpp" -# include + #include class DiscordService final { diff --git a/src/openrct2/network/NetworkAction.cpp b/src/openrct2/network/NetworkAction.cpp index 10142a6cad..5d9c8f2093 100644 --- a/src/openrct2/network/NetworkAction.cpp +++ b/src/openrct2/network/NetworkAction.cpp @@ -9,12 +9,12 @@ #ifndef DISABLE_NETWORK -# include "NetworkAction.h" + #include "NetworkAction.h" -# include "../Game.h" -# include "../localisation/StringIds.h" + #include "../Game.h" + #include "../localisation/StringIds.h" -# include + #include NetworkPermission NetworkActions::FindCommand(GameCommand command) { diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 0c9016e54a..881a2c5c0f 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -49,7 +49,7 @@ using namespace OpenRCT2; // It is used for making sure only compatible builds get connected, even within // single OpenRCT2 version. -constexpr uint8_t kNetworkStreamVersion = 0; +constexpr uint8_t kNetworkStreamVersion = 6; const std::string kNetworkStreamID = std::string(OPENRCT2_VERSION) + "-" + std::to_string(kNetworkStreamVersion); @@ -66,45 +66,45 @@ static constexpr uint32_t kChunkSize = 1024 * 63; // This limit is per connection, the current value was determined by tests with fuzzing. static constexpr uint32_t kMaxPacketsPerUpdate = 100; -# include "../Cheats.h" -# include "../ParkImporter.h" -# include "../Version.h" -# include "../actions/GameAction.h" -# include "../config/Config.h" -# include "../core/Console.hpp" -# include "../core/FileStream.h" -# include "../core/MemoryStream.h" -# include "../core/Path.hpp" -# include "../core/String.hpp" -# include "../interface/Chat.h" -# include "../interface/Window.h" -# include "../localisation/Localisation.Date.h" -# include "../object/ObjectManager.h" -# include "../object/ObjectRepository.h" -# include "../scenario/Scenario.h" -# include "../util/Util.h" -# include "../world/Park.h" -# include "NetworkAction.h" -# include "NetworkConnection.h" -# include "NetworkGroup.h" -# include "NetworkKey.h" -# include "NetworkPacket.h" -# include "NetworkPlayer.h" -# include "NetworkServerAdvertiser.h" -# include "NetworkUser.h" -# include "Socket.h" + #include "../Cheats.h" + #include "../ParkImporter.h" + #include "../Version.h" + #include "../actions/GameAction.h" + #include "../config/Config.h" + #include "../core/Console.hpp" + #include "../core/FileStream.h" + #include "../core/MemoryStream.h" + #include "../core/Path.hpp" + #include "../core/String.hpp" + #include "../interface/Chat.h" + #include "../interface/Window.h" + #include "../localisation/Localisation.Date.h" + #include "../object/ObjectManager.h" + #include "../object/ObjectRepository.h" + #include "../scenario/Scenario.h" + #include "../util/Util.h" + #include "../world/Park.h" + #include "NetworkAction.h" + #include "NetworkConnection.h" + #include "NetworkGroup.h" + #include "NetworkKey.h" + #include "NetworkPacket.h" + #include "NetworkPlayer.h" + #include "NetworkServerAdvertiser.h" + #include "NetworkUser.h" + #include "Socket.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include using namespace OpenRCT2; @@ -209,10 +209,10 @@ void NetworkBase::Close() _pendingPlayerLists.clear(); _pendingPlayerInfo.clear(); -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING auto& scriptEngine = GetContext().GetScriptEngine(); scriptEngine.RemoveNetworkPlugins(); -# endif + #endif GfxInvalidateScreen(); @@ -1350,7 +1350,7 @@ void NetworkBase::ServerSendObjectsList( void NetworkBase::ServerSendScripts(NetworkConnection& connection) { -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING using namespace OpenRCT2::Scripting; auto& scriptEngine = GetContext().GetScriptEngine(); @@ -1393,11 +1393,11 @@ void NetworkBase::ServerSendScripts(NetworkConnection& connection) } Guard::Assert(dataOffset == pluginData.GetLength()); -# else + #else NetworkPacket packetScriptHeader(NetworkCommand::ScriptsHeader); packetScriptHeader << static_cast(0u); packetScriptHeader << static_cast(0u); -# endif + #endif } void NetworkBase::Client_Send_HEARTBEAT(NetworkConnection& connection) const @@ -1676,7 +1676,7 @@ json_t NetworkBase::GetServerInfoAsJson() const void NetworkBase::ServerSendGameInfo(NetworkConnection& connection) { NetworkPacket packet(NetworkCommand::GameInfo); -# ifndef DISABLE_HTTP + #ifndef DISABLE_HTTP json_t jsonObj = GetServerInfoAsJson(); // Provider details @@ -1692,7 +1692,7 @@ void NetworkBase::ServerSendGameInfo(NetworkConnection& connection) packet << _serverState.gamestateSnapshotsEnabled; packet << IsServerPlayerInvisible; -# endif + #endif connection.QueuePacket(std::move(packet)); } @@ -1819,7 +1819,7 @@ void NetworkBase::ProcessPending() static bool ProcessPlayerAuthenticatePluginHooks( const NetworkConnection& connection, std::string_view name, std::string_view publicKeyHash) { -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING using namespace OpenRCT2::Scripting; auto& hookEngine = GetContext()->GetScriptEngine().GetHookEngine(); @@ -1844,13 +1844,13 @@ static bool ProcessPlayerAuthenticatePluginHooks( return false; } } -# endif + #endif return true; } static void ProcessPlayerJoinedPluginHooks(uint8_t playerId) { -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING using namespace OpenRCT2::Scripting; auto& hookEngine = GetContext()->GetScriptEngine().GetHookEngine(); @@ -1866,12 +1866,12 @@ static void ProcessPlayerJoinedPluginHooks(uint8_t playerId) // Call the subscriptions hookEngine.Call(OpenRCT2::Scripting::HOOK_TYPE::NETWORK_JOIN, e, false); } -# endif + #endif } static void ProcessPlayerLeftPluginHooks(uint8_t playerId) { -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING using namespace OpenRCT2::Scripting; auto& hookEngine = GetContext()->GetScriptEngine().GetHookEngine(); @@ -1887,7 +1887,7 @@ static void ProcessPlayerLeftPluginHooks(uint8_t playerId) // Call the subscriptions hookEngine.Call(OpenRCT2::Scripting::HOOK_TYPE::NETWORK_LEAVE, e, false); } -# endif + #endif } void NetworkBase::ProcessPlayerList() @@ -2467,22 +2467,22 @@ void NetworkBase::Client_Handle_SCRIPTS_HEADER(NetworkConnection& connection, Ne uint32_t dataSize{}; packet >> numScripts >> dataSize; -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING _serverScriptsData.data.Clear(); _serverScriptsData.pluginCount = numScripts; _serverScriptsData.dataSize = dataSize; -# else + #else if (numScripts > 0) { connection.SetLastDisconnectReason("The client requires plugin support."); Close(); } -# endif + #endif } void NetworkBase::Client_Handle_SCRIPTS_DATA(NetworkConnection& connection, NetworkPacket& packet) { -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING uint32_t dataSize{}; packet >> dataSize; Guard::Assert(dataSize > 0); @@ -2511,10 +2511,10 @@ void NetworkBase::Client_Handle_SCRIPTS_DATA(NetworkConnection& connection, Netw // Empty the current buffer. _serverScriptsData = {}; } -# else + #else connection.SetLastDisconnectReason("The client requires plugin support."); Close(); -# endif + #endif } void NetworkBase::Client_Handle_GAMESTATE(NetworkConnection& connection, NetworkPacket& packet) @@ -2896,7 +2896,7 @@ void NetworkBase::Client_Handle_CHAT([[maybe_unused]] NetworkConnection& connect static bool ProcessChatMessagePluginHooks(uint8_t playerId, std::string& text) { -# ifdef ENABLE_SCRIPTING + #ifdef ENABLE_SCRIPTING auto& hookEngine = GetContext()->GetScriptEngine().GetHookEngine(); if (hookEngine.HasSubscriptions(OpenRCT2::Scripting::HOOK_TYPE::NETWORK_CHAT)) { @@ -2926,7 +2926,7 @@ static bool ProcessChatMessagePluginHooks(uint8_t playerId, std::string& text) return false; } } -# endif + #endif return true; } diff --git a/src/openrct2/network/NetworkConnection.cpp b/src/openrct2/network/NetworkConnection.cpp index d1cbd98f6f..a2fc31fed8 100644 --- a/src/openrct2/network/NetworkConnection.cpp +++ b/src/openrct2/network/NetworkConnection.cpp @@ -9,21 +9,21 @@ #ifndef DISABLE_NETWORK -# include "NetworkConnection.h" + #include "NetworkConnection.h" -# include "../core/String.hpp" -# include "../localisation/Formatting.h" -# include "../platform/Platform.h" -# include "Socket.h" -# include "network.h" + #include "../core/String.hpp" + #include "../localisation/Formatting.h" + #include "../platform/Platform.h" + #include "Socket.h" + #include "network.h" using namespace OpenRCT2; static constexpr size_t kNetworkDisconnectReasonBufSize = 256; static constexpr size_t kNetworkBufferSize = 1024 * 64; // 64 KiB, maximum packet size. -# ifndef DEBUG + #ifndef DEBUG static constexpr size_t kNetworkNoDataTimeout = 20; // Seconds. -# endif + #endif NetworkConnection::NetworkConnection() noexcept { @@ -181,13 +181,13 @@ void NetworkConnection::ResetLastPacketTime() noexcept bool NetworkConnection::ReceivedPacketRecently() const noexcept { -# ifndef DEBUG + #ifndef DEBUG constexpr auto kTimeoutMs = kNetworkNoDataTimeout * 1000; if (Platform::GetTicks() > _lastPacketTime + kTimeoutMs) { return false; } -# endif + #endif return true; } diff --git a/src/openrct2/network/NetworkConnection.h b/src/openrct2/network/NetworkConnection.h index ad65de39af..c5fb549b53 100644 --- a/src/openrct2/network/NetworkConnection.h +++ b/src/openrct2/network/NetworkConnection.h @@ -11,15 +11,15 @@ #ifndef DISABLE_NETWORK -# include "NetworkKey.h" -# include "NetworkPacket.h" -# include "NetworkTypes.h" -# include "Socket.h" + #include "NetworkKey.h" + #include "NetworkPacket.h" + #include "NetworkTypes.h" + #include "Socket.h" -# include -# include -# include -# include + #include + #include + #include + #include class NetworkPlayer; struct ObjectRepositoryItem; diff --git a/src/openrct2/network/NetworkGroup.cpp b/src/openrct2/network/NetworkGroup.cpp index ed6ec8fde9..3d579431f1 100644 --- a/src/openrct2/network/NetworkGroup.cpp +++ b/src/openrct2/network/NetworkGroup.cpp @@ -9,11 +9,11 @@ #ifndef DISABLE_NETWORK -# include "NetworkGroup.h" + #include "NetworkGroup.h" -# include "../openrct2/core/Json.hpp" -# include "NetworkAction.h" -# include "NetworkTypes.h" + #include "../openrct2/core/Json.hpp" + #include "NetworkAction.h" + #include "NetworkTypes.h" using namespace OpenRCT2; diff --git a/src/openrct2/network/NetworkKey.cpp b/src/openrct2/network/NetworkKey.cpp index 2ead9e479d..ce83211dcc 100644 --- a/src/openrct2/network/NetworkKey.cpp +++ b/src/openrct2/network/NetworkKey.cpp @@ -9,15 +9,15 @@ #ifndef DISABLE_NETWORK -# include "NetworkKey.h" + #include "NetworkKey.h" -# include "../Diagnostic.h" -# include "../core/Crypt.h" -# include "../core/Guard.hpp" -# include "../core/IStream.hpp" -# include "../core/String.hpp" + #include "../Diagnostic.h" + #include "../core/Crypt.h" + #include "../core/Guard.hpp" + #include "../core/IStream.hpp" + #include "../core/String.hpp" -# include + #include using namespace OpenRCT2; diff --git a/src/openrct2/network/NetworkKey.h b/src/openrct2/network/NetworkKey.h index 36e8507ec8..f59d01fc52 100644 --- a/src/openrct2/network/NetworkKey.h +++ b/src/openrct2/network/NetworkKey.h @@ -11,9 +11,9 @@ #ifndef DISABLE_NETWORK -# include -# include -# include + #include + #include + #include namespace OpenRCT2 { diff --git a/src/openrct2/network/NetworkPacket.cpp b/src/openrct2/network/NetworkPacket.cpp index 580f8c328c..45c901ffc0 100644 --- a/src/openrct2/network/NetworkPacket.cpp +++ b/src/openrct2/network/NetworkPacket.cpp @@ -9,11 +9,11 @@ #ifndef DISABLE_NETWORK -# include "NetworkPacket.h" + #include "NetworkPacket.h" -# include "NetworkTypes.h" + #include "NetworkTypes.h" -# include + #include NetworkPacket::NetworkPacket(NetworkCommand id) noexcept : Header{ 0, id } diff --git a/src/openrct2/network/NetworkPlayer.cpp b/src/openrct2/network/NetworkPlayer.cpp index 9bc4915d75..61ebe7e876 100644 --- a/src/openrct2/network/NetworkPlayer.cpp +++ b/src/openrct2/network/NetworkPlayer.cpp @@ -9,11 +9,11 @@ #ifndef DISABLE_NETWORK -# include "NetworkPlayer.h" + #include "NetworkPlayer.h" -# include "../core/Money.hpp" -# include "../interface/Window.h" -# include "NetworkPacket.h" + #include "../core/Money.hpp" + #include "../interface/Window.h" + #include "NetworkPacket.h" void NetworkPlayer::SetName(std::string_view name) { diff --git a/src/openrct2/network/NetworkServerAdvertiser.cpp b/src/openrct2/network/NetworkServerAdvertiser.cpp index e45bfa333f..d04ade1c52 100644 --- a/src/openrct2/network/NetworkServerAdvertiser.cpp +++ b/src/openrct2/network/NetworkServerAdvertiser.cpp @@ -9,30 +9,30 @@ #ifndef DISABLE_NETWORK -# include "NetworkServerAdvertiser.h" + #include "NetworkServerAdvertiser.h" -# include "../Diagnostic.h" -# include "../GameState.h" -# include "../config/Config.h" -# include "../core/Console.hpp" -# include "../core/Guard.hpp" -# include "../core/Http.h" -# include "../core/Json.hpp" -# include "../core/String.hpp" -# include "../entity/Guest.h" -# include "../localisation/Localisation.Date.h" -# include "../management/Finance.h" -# include "../platform/Platform.h" -# include "../world/Map.h" -# include "../world/Park.h" -# include "Socket.h" -# include "network.h" + #include "../Diagnostic.h" + #include "../GameState.h" + #include "../config/Config.h" + #include "../core/Console.hpp" + #include "../core/Guard.hpp" + #include "../core/Http.h" + #include "../core/Json.hpp" + #include "../core/String.hpp" + #include "../entity/Guest.h" + #include "../localisation/Localisation.Date.h" + #include "../management/Finance.h" + #include "../platform/Platform.h" + #include "../world/Map.h" + #include "../world/Park.h" + #include "Socket.h" + #include "network.h" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include using namespace OpenRCT2; @@ -44,10 +44,10 @@ enum class MasterServerStatus InternalError = 500 }; -# ifndef DISABLE_HTTP + #ifndef DISABLE_HTTP constexpr int32_t kMasterServerRegisterTime = 120 * 1000; // 2 minutes constexpr int32_t kMasterServerHeartbeatTime = 60 * 1000; // 1 minute -# endif + #endif class NetworkServerAdvertiser final : public INetworkServerAdvertiser { @@ -59,7 +59,7 @@ private: ADVERTISE_STATUS _status = ADVERTISE_STATUS::UNREGISTERED; -# ifndef DISABLE_HTTP + #ifndef DISABLE_HTTP uint32_t _lastAdvertiseTime = 0; uint32_t _lastHeartbeatTime = 0; @@ -71,16 +71,16 @@ private: // See https://github.com/OpenRCT2/OpenRCT2/issues/6277 and 4953 bool _forceIPv4 = false; -# endif + #endif public: explicit NetworkServerAdvertiser(uint16_t port) { _port = port; _lanListener = CreateUdpSocket(); -# ifndef DISABLE_HTTP + #ifndef DISABLE_HTTP _key = GenerateAdvertiseKey(); -# endif + #endif } ADVERTISE_STATUS GetStatus() const override @@ -91,12 +91,12 @@ public: void Update() override { UpdateLAN(); -# ifndef DISABLE_HTTP + #ifndef DISABLE_HTTP if (Config::Get().network.Advertise) { UpdateWAN(); } -# endif + #endif } private: @@ -140,7 +140,7 @@ private: return root; } -# ifndef DISABLE_HTTP + #ifndef DISABLE_HTTP void UpdateWAN() { switch (_status) @@ -351,7 +351,7 @@ private: } return result; } -# endif + #endif }; std::unique_ptr CreateServerAdvertiser(uint16_t port) diff --git a/src/openrct2/network/NetworkUser.cpp b/src/openrct2/network/NetworkUser.cpp index e769f94f52..a2ad556f39 100644 --- a/src/openrct2/network/NetworkUser.cpp +++ b/src/openrct2/network/NetworkUser.cpp @@ -9,18 +9,18 @@ #ifndef DISABLE_NETWORK -# include "NetworkUser.h" + #include "NetworkUser.h" -# include "../Context.h" -# include "../PlatformEnvironment.h" -# include "../core/Console.hpp" -# include "../core/File.h" -# include "../core/Guard.hpp" -# include "../core/Json.hpp" -# include "../core/Path.hpp" -# include "../core/String.hpp" + #include "../Context.h" + #include "../PlatformEnvironment.h" + #include "../core/Console.hpp" + #include "../core/File.h" + #include "../core/Guard.hpp" + #include "../core/Json.hpp" + #include "../core/Path.hpp" + #include "../core/String.hpp" -# include + #include using namespace OpenRCT2; diff --git a/src/openrct2/network/ServerList.cpp b/src/openrct2/network/ServerList.cpp index 5ee748bad0..5d35cfba2a 100644 --- a/src/openrct2/network/ServerList.cpp +++ b/src/openrct2/network/ServerList.cpp @@ -9,27 +9,27 @@ #ifndef DISABLE_NETWORK -# include "ServerList.h" + #include "ServerList.h" -# include "../Context.h" -# include "../Diagnostic.h" -# include "../PlatformEnvironment.h" -# include "../config/Config.h" -# include "../core/File.h" -# include "../core/FileStream.h" -# include "../core/Guard.hpp" -# include "../core/Http.h" -# include "../core/Json.hpp" -# include "../core/Memory.hpp" -# include "../core/Path.hpp" -# include "../core/String.hpp" -# include "../localisation/Language.h" -# include "../platform/Platform.h" -# include "Socket.h" -# include "network.h" + #include "../Context.h" + #include "../Diagnostic.h" + #include "../PlatformEnvironment.h" + #include "../config/Config.h" + #include "../core/File.h" + #include "../core/FileStream.h" + #include "../core/Guard.hpp" + #include "../core/Http.h" + #include "../core/Json.hpp" + #include "../core/Memory.hpp" + #include "../core/Path.hpp" + #include "../core/String.hpp" + #include "../localisation/Language.h" + #include "../platform/Platform.h" + #include "Socket.h" + #include "network.h" -# include -# include + #include + #include using namespace OpenRCT2; @@ -354,9 +354,9 @@ std::future> ServerList::FetchLocalServerListAsync( std::future> ServerList::FetchOnlineServerListAsync() const { -# ifdef DISABLE_HTTP + #ifdef DISABLE_HTTP return {}; -# else + #else auto p = std::make_shared>>(); auto f = p->get_future(); @@ -423,7 +423,7 @@ std::future> ServerList::FetchOnlineServerListAsync } }); return f; -# endif + #endif } uint32_t ServerList::GetTotalPlayerCount() const diff --git a/src/openrct2/network/Socket.cpp b/src/openrct2/network/Socket.cpp index 56a1f7db1b..68567f6c71 100644 --- a/src/openrct2/network/Socket.cpp +++ b/src/openrct2/network/Socket.cpp @@ -9,15 +9,15 @@ #ifndef DISABLE_NETWORK -# include "../Diagnostic.h" + #include "../Diagnostic.h" -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include // clang-format off // MSVC: include here otherwise PI gets defined twice @@ -71,12 +71,12 @@ #endif // _WIN32 // clang-format on -# include "Socket.h" + #include "Socket.h" constexpr auto kConnectTimeout = std::chrono::milliseconds(3000); -// RAII WSA initialisation needed for Windows -# ifdef _WIN32 + // RAII WSA initialisation needed for Windows + #ifdef _WIN32 class WSA { private: @@ -120,12 +120,12 @@ static bool InitialiseWSA() static WSA wsa; return wsa.Initialise(); } -# else + #else static bool InitialiseWSA() { return true; } -# endif + #endif class SocketException : public std::runtime_error { @@ -198,13 +198,13 @@ protected: static bool SetNonBlocking(SOCKET socket, bool on) { -# ifdef _WIN32 + #ifdef _WIN32 u_long nonBlocking = on; return ioctlsocket(socket, FIONBIO, &nonBlocking) == 0; -# else + #else int32_t flags = fcntl(socket, F_GETFL, 0); return fcntl(socket, F_SETFL, on ? (flags | O_NONBLOCK) : (flags & ~O_NONBLOCK)) == 0; -# endif + #endif } static bool SetOption(SOCKET socket, int32_t a, int32_t b, bool value) @@ -471,10 +471,10 @@ public: fd_set writeFD; FD_ZERO(&writeFD); -# pragma warning(push) -# pragma warning(disable : 4548) // expression before comma has no effect; expected expression with side-effect + #pragma warning(push) + #pragma warning(disable : 4548) // expression before comma has no effect; expected expression with side-effect FD_SET(_socket, &writeFD); -# pragma warning(pop) + #pragma warning(pop) timeval timeout{}; timeout.tv_sec = 0; timeout.tv_usec = 0; @@ -591,7 +591,7 @@ public: if (readBytes == SOCKET_ERROR) { *sizeReceived = 0; -# ifndef _WIN32 + #ifndef _WIN32 // Removing the check for EAGAIN and instead relying on the values being the same allows turning on of // -Wlogical-op warning. // This is not true on Windows, see: @@ -602,7 +602,7 @@ public: EWOULDBLOCK == EAGAIN, "Portability note: your system has different values for EWOULDBLOCK " "and EAGAIN, please extend the condition below"); -# endif // _WIN32 + #endif // _WIN32 if (LAST_SOCKET_ERROR() != EWOULDBLOCK) { return NetworkReadPacket::Disconnected; @@ -876,7 +876,7 @@ std::unique_ptr CreateUdpSocket() return std::make_unique(); } -# ifdef _WIN32 + #ifdef _WIN32 static std::vector GetNetworkInterfaces() { InitialiseWSA(); @@ -913,12 +913,12 @@ static std::vector GetNetworkInterfaces() interfaces.shrink_to_fit(); return interfaces; } -# endif + #endif std::vector> GetBroadcastAddresses() { std::vector> baddresses; -# ifdef _WIN32 + #ifdef _WIN32 auto interfaces = GetNetworkInterfaces(); for (const auto& ifo : interfaces) { @@ -935,7 +935,7 @@ std::vector> GetBroadcastAddresses() baddresses.push_back(std::make_unique( reinterpret_cast(&address), static_cast(sizeof(sockaddr)))); } -# else + #else int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == -1) { @@ -966,12 +966,12 @@ std::vector> GetBroadcastAddresses() } } p += sizeof(ifreq); -# if defined(AF_LINK) && !defined(SUNOS) + #if defined(AF_LINK) && !defined(SUNOS) p += req->ifr_addr.sa_len - sizeof(struct sockaddr); -# endif + #endif } close(sock); -# endif + #endif return baddresses; } diff --git a/src/openrct2/object/ImageTable.cpp b/src/openrct2/object/ImageTable.cpp index 184a18b96f..2fc66ba645 100644 --- a/src/openrct2/object/ImageTable.cpp +++ b/src/openrct2/object/ImageTable.cpp @@ -92,9 +92,12 @@ std::vector> ImageTable::ParseImages( } else if (String::StartsWith(s, "$CSG")) { - auto range = ParseRange(s.substr(4)); - if (!range.empty()) + auto rangeStart = s.find('['); + auto rangeEnd = s.find(']'); + if (rangeStart != std::string::npos && rangeEnd != std::string::npos) { + auto rangeString = s.substr(rangeStart, rangeEnd - rangeStart + 1); + auto range = ParseRange(rangeString); if (IsCsgLoaded()) { for (auto i : range) @@ -118,9 +121,12 @@ std::vector> ImageTable::ParseImages( } else if (String::StartsWith(s, "$G1")) { - auto range = ParseRange(s.substr(3)); - if (!range.empty()) + auto rangeStart = s.find('['); + auto rangeEnd = s.find(']'); + if (rangeStart != std::string::npos && rangeEnd != std::string::npos) { + auto rangeString = s.substr(rangeStart, rangeEnd - rangeStart + 1); + auto range = ParseRange(rangeString); for (auto i : range) { result.push_back(std::make_unique( @@ -132,10 +138,11 @@ std::vector> ImageTable::ParseImages( { auto name = s.substr(14); auto rangeStart = name.find('['); - if (rangeStart != std::string::npos) + auto rangeEnd = name.find(']'); + if (rangeStart != std::string::npos && rangeEnd != std::string::npos) { - auto rangeString = name.substr(rangeStart); - auto range = ParseRange(name.substr(rangeStart)); + auto rangeString = name.substr(rangeStart, rangeEnd - rangeStart + 1); + auto range = ParseRange(rangeString); name = name.substr(0, rangeStart); result = LoadObjectImages(context, name, range); } @@ -144,10 +151,11 @@ std::vector> ImageTable::ParseImages( { auto name = s.substr(5); auto rangeStart = name.find('['); - if (rangeStart != std::string::npos) + auto rangeEnd = name.find(']'); + if (rangeStart != std::string::npos && rangeEnd != std::string::npos) { - auto rangeString = name.substr(rangeStart); - auto range = ParseRange(name.substr(rangeStart)); + auto rangeString = name.substr(rangeStart, rangeEnd - rangeStart + 1); + auto range = ParseRange(rangeString); name = name.substr(0, rangeStart); result = LoadImageArchiveImages(context, name, range); } @@ -224,7 +232,14 @@ std::vector> ImageTable::LoadImageArc // Fix entry data offsets for (uint32_t i = 0; i < gxData->header.num_entries; i++) { - gxData->elements[i].offset += reinterpret_cast(gxData->data.get()); + if (gxData->elements[i].offset == nullptr) + { + gxData->elements[i].offset = gxData->data.get(); + } + else + { + gxData->elements[i].offset += reinterpret_cast(gxData->data.get()); + } } if (range.size() > 0) diff --git a/src/openrct2/object/Object.cpp b/src/openrct2/object/Object.cpp index d3b0be75d9..f453a144af 100644 --- a/src/openrct2/object/Object.cpp +++ b/src/openrct2/object/Object.cpp @@ -193,8 +193,8 @@ void Object::SetSourceGames(const std::vector& sourceGames) } #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" #endif std::string Object::GetName() const @@ -426,5 +426,5 @@ ObjectVersion VersionTuple(std::string_view version) } #ifdef __WARN_SUGGEST_FINAL_METHODS__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif diff --git a/src/openrct2/object/Object.h b/src/openrct2/object/Object.h index ed2005bac9..9049357407 100644 --- a/src/openrct2/object/Object.h +++ b/src/openrct2/object/Object.h @@ -179,9 +179,9 @@ struct IReadObjectContext }; #ifdef __WARN_SUGGEST_FINAL_TYPES__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wsuggest-final-types" -# pragma GCC diagnostic ignored "-Wsuggest-final-methods" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsuggest-final-types" + #pragma GCC diagnostic ignored "-Wsuggest-final-methods" #endif class Object { @@ -336,7 +336,7 @@ public: void UnloadImages(); }; #ifdef __WARN_SUGGEST_FINAL_TYPES__ -# pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif int32_t ObjectCalculateChecksum(const RCTObjectEntry* entry, const void* data, size_t dataLength); diff --git a/src/openrct2/object/ObjectList.cpp b/src/openrct2/object/ObjectList.cpp index 27ebb3c8d9..858cdbbac0 100644 --- a/src/openrct2/object/ObjectList.cpp +++ b/src/openrct2/object/ObjectList.cpp @@ -170,12 +170,27 @@ void ObjectList::SetObject(ObjectType type, ObjectEntryIndex index, std::string_ SetObject(index, entry); } -ObjectEntryIndex ObjectList::Find(ObjectType type, std::string_view identifier) +ObjectEntryIndex ObjectList::Find(ObjectType type, std::string_view identifier) const { auto& subList = GetList(type); for (size_t i = 0; i < subList.size(); i++) { - if (subList[i].Identifier == identifier) + if (subList[i].Generation == ObjectGeneration::JSON && subList[i].Identifier == identifier) + { + return static_cast(i); + } + } + return OBJECT_ENTRY_INDEX_NULL; +} + +// Intended to be used to find non-custom legacy objects. For internal use only. +ObjectEntryIndex ObjectList::FindLegacy(ObjectType type, std::string_view identifier) const +{ + auto& subList = GetList(type); + for (size_t i = 0; i < subList.size(); i++) + { + if (subList[i].Generation == ObjectGeneration::DAT && subList[i].Entry.GetName() == identifier + && subList[i].Entry.GetSourceGame() != ObjectSourceGame::Custom) { return static_cast(i); } diff --git a/src/openrct2/object/ObjectList.h b/src/openrct2/object/ObjectList.h index 3cc725cf10..476c694e4e 100644 --- a/src/openrct2/object/ObjectList.h +++ b/src/openrct2/object/ObjectList.h @@ -25,7 +25,8 @@ public: const ObjectEntryDescriptor& GetObject(ObjectType type, ObjectEntryIndex index) const; void SetObject(ObjectEntryIndex index, const ObjectEntryDescriptor& entry); void SetObject(ObjectType type, ObjectEntryIndex index, std::string_view identifier); - ObjectEntryIndex Find(ObjectType type, std::string_view identifier); + ObjectEntryIndex Find(ObjectType type, std::string_view identifier) const; + ObjectEntryIndex FindLegacy(ObjectType type, std::string_view identifier) const; struct const_iterator { diff --git a/src/openrct2/object/RideObject.cpp b/src/openrct2/object/RideObject.cpp index 11b734f86a..3b4696cd1c 100644 --- a/src/openrct2/object/RideObject.cpp +++ b/src/openrct2/object/RideObject.cpp @@ -37,6 +37,7 @@ using namespace OpenRCT2; using namespace OpenRCT2::Entity::Yaw; +using namespace OpenRCT2::Numerics; /* * The number of sprites in the sprite group is the specified precision multiplied by this number. General rule is any slope or @@ -878,7 +879,7 @@ CarEntry RideObject::ReadJsonCar([[maybe_unused]] IReadObjectContext* context, j auto numRotationFrames = Json::GetNumber(jRotationCount[SpriteGroupNames[i]], 0); if (numRotationFrames != 0) { - if (!IsPowerOf2(numRotationFrames)) + if (!std::has_single_bit(numRotationFrames)) { context->LogError(ObjectError::InvalidProperty, "spriteGroups values must be powers of 2"); continue; diff --git a/src/openrct2/paint/Paint.cpp b/src/openrct2/paint/Paint.cpp index b52aa7a68e..4b466ffab0 100644 --- a/src/openrct2/paint/Paint.cpp +++ b/src/openrct2/paint/Paint.cpp @@ -13,15 +13,15 @@ #include "../config/Config.h" #include "../core/Guard.hpp" #include "../core/Money.hpp" +#include "../core/Numerics.hpp" #include "../drawing/Drawing.h" #include "../interface/Viewport.h" #include "../localisation/Currency.h" #include "../localisation/Formatting.h" #include "../localisation/LocalisationService.h" #include "../paint/Painter.h" +#include "../platform/Memory.h" #include "../profiling/Profiling.h" -#include "../util/Math.hpp" -#include "../util/Prefetch.h" #include "Boundbox.h" #include "Paint.Entity.h" #include "tile_element/Paint.TileElement.h" @@ -31,6 +31,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; // Globals for paint clipping uint8_t gClipHeight = 128; // Default to middle value @@ -56,6 +57,7 @@ static constexpr uint8_t BoundBoxDebugColours[] = { bool gShowDirtyVisuals; bool gPaintBoundingBoxes; bool gPaintBlockedTiles; +bool gPaintStableSort; static void PaintAttachedPS(DrawPixelInfo& dpi, PaintStruct* ps, uint32_t viewFlags); static void PaintPSImageWithBoundingBoxes(PaintSession& session, PaintStruct* ps, ImageId imageId, int32_t x, int32_t y); @@ -220,7 +222,7 @@ template void PaintSessionGenerateRotate(PaintSession& session) { // Optimised modified version of ViewportPosToMapPos - ScreenCoordsXY screenCoord = { Floor2(session.DPI.WorldX(), 32), Floor2((session.DPI.WorldY() - 16), 32) }; + ScreenCoordsXY screenCoord = { floor2(session.DPI.WorldX(), 32), floor2((session.DPI.WorldY() - 16), 32) }; CoordsXY mapTile = { screenCoord.y - screenCoord.x / 2, screenCoord.y + screenCoord.x / 2 }; mapTile = mapTile.Rotate(direction); @@ -402,13 +404,14 @@ static std::pair PaintStructsGetNextPending(PaintStr // Re-orders all nodes after the specified child node and marks the child node as traversed. The resulting // order of the children is the depth based on rotation and dimensions of the bounding box. template -static void PaintStructsSortQuadrant(PaintStruct* parent, PaintStruct* child) +static void PaintStructsSortQuadrantLegacy(PaintStruct* parent, PaintStruct* child) { // Mark visited. child->SortFlags &= ~PaintSortFlags::PendingVisit; // Compare all the children below the first child and move them up in the list if they intersect. const PaintStructBoundBox& initialBBox = child->Bounds; + for (;;) { auto* ps = child; @@ -442,7 +445,78 @@ static void PaintStructsSortQuadrant(PaintStruct* parent, PaintStruct* child) } } +// Re-orders all nodes after the specified child node and marks the child node as traversed. The resulting +// order of the children is the depth based on rotation and dimensions of the bounding box. template +static void PaintStructsSortQuadrantStable(PaintStruct* parent, PaintStruct* child) +{ + // Mark visited. + child->SortFlags &= ~PaintSortFlags::PendingVisit; + + // Compare all the children below the first child and move them up in the list if they intersect. + const PaintStructBoundBox& initialBBox = child->Bounds; + + // Create a temporary list to collect sorted nodes in stable order. + PaintStruct* sortedHead = nullptr; + PaintStruct* sortedTail = nullptr; + + // Traverse the list and reorder based on intersection. + for (;;) + { + PaintStruct* next = child->NextQuadrantEntry; + + if (next != nullptr) + { + PREFETCH(&next->Bounds); + } + + // Stop if at the end of the list or outside the quadrant range. + if (next == nullptr || next->SortFlags & PaintSortFlags::OutsideQuadrant) + { + break; + } + + // Ignore nodes that are not neighbors. + if (!(next->SortFlags & PaintSortFlags::Neighbour)) + { + child = next; + continue; + } + + // Detach the current node from the list if it intersects. + if (CheckBoundingBox(initialBBox, next->Bounds)) + { + child->NextQuadrantEntry = next->NextQuadrantEntry; + + if (sortedHead == nullptr) + { + sortedHead = next; + sortedTail = next; + next->NextQuadrantEntry = nullptr; + } + else + { + sortedTail->NextQuadrantEntry = next; + sortedTail = next; + next->NextQuadrantEntry = nullptr; + } + } + else + { + child = next; + } + } + + // Merge the sorted list back into the main list after parent. + if (sortedHead != nullptr) + { + PaintStruct* originalNext = parent->NextQuadrantEntry; + parent->NextQuadrantEntry = sortedHead; + sortedTail->NextQuadrantEntry = originalNext; + } +} + +template static PaintStruct* PaintArrangeStructsHelperRotation(PaintStruct* psQuadrantEntry, uint16_t quadrantIndex, uint8_t flag) { // We keep track of the first node in the quadrant so the next call with a higher quadrant index @@ -463,7 +537,15 @@ static PaintStruct* PaintArrangeStructsHelperRotation(PaintStruct* psQuadrantEnt break; } - PaintStructsSortQuadrant(parent, child); + if constexpr (TStableSort) + { + PaintStructsSortQuadrantStable(parent, child); + } + else + { + PaintStructsSortQuadrantLegacy(parent, child); + } + ps = parent; } @@ -495,7 +577,7 @@ static void PaintStructsLinkQuadrants(PaintSessionCore& session, PaintStruct& ps } while (++quadrantIndex <= session.QuadrantFrontIndex); } -template +template static void PaintSessionArrangeImpl(PaintSessionCore& session) { uint32_t quadrantIndex = session.QuadrantBackIndex; @@ -510,12 +592,13 @@ static void PaintSessionArrangeImpl(PaintSessionCore& session) PaintStruct psHead{}; PaintStructsLinkQuadrants(session, psHead); - PaintStruct* psNextQuadrant = PaintArrangeStructsHelperRotation( + PaintStruct* psNextQuadrant = PaintArrangeStructsHelperRotation( &psHead, session.QuadrantBackIndex, PaintSortFlags::Neighbour); while (++quadrantIndex < session.QuadrantFrontIndex) { - psNextQuadrant = PaintArrangeStructsHelperRotation(psNextQuadrant, quadrantIndex, PaintSortFlags::None); + psNextQuadrant = PaintArrangeStructsHelperRotation( + psNextQuadrant, quadrantIndex, PaintSortFlags::None); } session.PaintHead = psHead.NextQuadrantEntry; @@ -523,11 +606,18 @@ static void PaintSessionArrangeImpl(PaintSessionCore& session) using PaintArrangeWithRotation = void (*)(PaintSessionCore& session); -constexpr std::array _paintArrangeFuncs = { - PaintSessionArrangeImpl<0>, - PaintSessionArrangeImpl<1>, - PaintSessionArrangeImpl<2>, - PaintSessionArrangeImpl<3>, +constexpr std::array _paintArrangeFuncsLegacy = { + PaintSessionArrangeImpl, + PaintSessionArrangeImpl, + PaintSessionArrangeImpl, + PaintSessionArrangeImpl, +}; + +constexpr std::array _paintArrangeFuncsStable = { + PaintSessionArrangeImpl, + PaintSessionArrangeImpl, + PaintSessionArrangeImpl, + PaintSessionArrangeImpl, }; /** @@ -537,7 +627,11 @@ constexpr std::array _paintArrangeFuncs = { void PaintSessionArrange(PaintSessionCore& session) { PROFILED_FUNCTION(); - return _paintArrangeFuncs[session.CurrentRotation](session); + if (gPaintStableSort) + { + return _paintArrangeFuncsStable[session.CurrentRotation](session); + } + return _paintArrangeFuncsLegacy[session.CurrentRotation](session); } static void PaintDrawStruct(PaintSession& session, PaintStruct* ps) @@ -547,12 +641,12 @@ static void PaintDrawStruct(PaintSession& session, PaintStruct* ps) { if (session.DPI.zoom_level >= ZoomLevel{ 1 }) { - screenPos.x = Floor2(screenPos.x, 2); - screenPos.y = Floor2(screenPos.y, 2); + screenPos.x = floor2(screenPos.x, 2); + screenPos.y = floor2(screenPos.y, 2); if (session.DPI.zoom_level >= ZoomLevel{ 2 }) { - screenPos.x = Floor2(screenPos.x, 4); - screenPos.y = Floor2(screenPos.y, 4); + screenPos.x = floor2(screenPos.x, 4); + screenPos.y = floor2(screenPos.y, 4); } } } diff --git a/src/openrct2/paint/Paint.h b/src/openrct2/paint/Paint.h index 250c6b834a..a52b751a71 100644 --- a/src/openrct2/paint/Paint.h +++ b/src/openrct2/paint/Paint.h @@ -284,6 +284,7 @@ extern bool gShowDirtyVisuals; extern bool gPaintBoundingBoxes; extern bool gPaintBlockedTiles; extern bool gPaintWidePathsAsGhost; +extern bool gPaintStableSort; PaintStruct* PaintAddImageAsParent( PaintSession& session, const ImageId image_id, const CoordsXYZ& offset, const BoundBoxXYZ& boundBox); diff --git a/src/openrct2/paint/VirtualFloor.cpp b/src/openrct2/paint/VirtualFloor.cpp index 2eb7285a92..5122c58823 100644 --- a/src/openrct2/paint/VirtualFloor.cpp +++ b/src/openrct2/paint/VirtualFloor.cpp @@ -247,7 +247,7 @@ static void VirtualFloorGetTileProperties( *tileOwned = MapIsLocationOwned({ loc, height }); - if (GetGameState().Cheats.SandboxMode) + if (GetGameState().Cheats.sandboxMode) *tileOwned = true; // Iterate through the map elements of the current tile to find: diff --git a/src/openrct2/paint/support/MetalSupports.cpp b/src/openrct2/paint/support/MetalSupports.cpp index a49be52f02..da0ef6a1f1 100644 --- a/src/openrct2/paint/support/MetalSupports.cpp +++ b/src/openrct2/paint/support/MetalSupports.cpp @@ -18,6 +18,7 @@ #include "../Paint.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; constexpr auto kMetalSupportSkip = 9 * 4 * 2; @@ -385,7 +386,7 @@ static bool MetalASupportsPaintSetup( // Work out if a small support segment required to bring support to normal // size (aka floor2(x, 16)) - int16_t heightDiff = Floor2(height + 16, 16); + int16_t heightDiff = floor2(height + 16, 16); if (heightDiff > si) { heightDiff = si; @@ -598,7 +599,7 @@ static bool MetalBSupportsPaintSetup( baseHeight = supportSegments[segment].height + 6; } - int16_t heightDiff = Floor2(baseHeight + 16, 16); + int16_t heightDiff = floor2(baseHeight + 16, 16); if (heightDiff > si) { heightDiff = si; @@ -782,7 +783,7 @@ bool PathPoleSupportsPaintSetup( // si = height // dx = baseHeight - int16_t heightDiff = Floor2(baseHeight + 16, 16); + int16_t heightDiff = floor2(baseHeight + 16, 16); if (heightDiff > height) { heightDiff = height; diff --git a/src/openrct2/paint/support/WoodenSupports.cpp b/src/openrct2/paint/support/WoodenSupports.cpp index e6fac7d1e6..534347d3ee 100644 --- a/src/openrct2/paint/support/WoodenSupports.cpp +++ b/src/openrct2/paint/support/WoodenSupports.cpp @@ -21,6 +21,7 @@ #include using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; constexpr auto kNumWoodenSupportTypes = 2; constexpr auto kNumWoodenSupportSubTypes = 6; @@ -421,7 +422,7 @@ static inline bool WoodenSupportsPaintSetupCommon( imageTemplate = ImageId().WithTransparency(FilterPaletteID::PaletteDarken1); } - baseHeight = Ceil2(session.Support.height, 16); + baseHeight = ceil2(session.Support.height, 16); int16_t supportLength = height - baseHeight; if (supportLength < 0) diff --git a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp index 1e03888826..74ee372203 100644 --- a/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp +++ b/src/openrct2/paint/tile_element/Paint.LargeScenery.cpp @@ -34,6 +34,7 @@ #include "Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; // clang-format off static constexpr BoundBoxXY LargeSceneryBoundBoxes[] = { @@ -77,7 +78,7 @@ static void PaintLargeScenerySupports( WoodenBSupportsPaintSetupRotated( session, WoodenSupportType::Truss, WoodenSupportSubType::NeSw, direction, supportHeight, imageTemplate, transitionType); - int32_t clearanceHeight = Ceil2(tileElement.GetClearanceZ() + 15, 16); + int32_t clearanceHeight = ceil2(tileElement.GetClearanceZ() + 15, 16); if (tile.allowSupportsAbove) { PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, clearanceHeight, 0x20); diff --git a/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp b/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp index 00cb9be4a4..c00913a02f 100644 --- a/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp +++ b/src/openrct2/paint/tile_element/Paint.SmallScenery.cpp @@ -26,6 +26,7 @@ #include "Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; static constexpr CoordsXY lengths[] = { { 12, 26 }, @@ -74,7 +75,7 @@ static void SetSupportHeights( { height += sceneryEntry.height; - PaintUtilSetGeneralSupportHeight(session, Ceil2(height, 8)); + PaintUtilSetGeneralSupportHeight(session, ceil2(height, 8)); if (sceneryEntry.HasFlag(SMALL_SCENERY_FLAG_BUILD_DIRECTLY_ONTOP)) { if (sceneryEntry.HasFlag(SMALL_SCENERY_FLAG_FULL_TILE)) diff --git a/src/openrct2/paint/tile_element/Paint.Surface.cpp b/src/openrct2/paint/tile_element/Paint.Surface.cpp index 81937e7172..37343a9c91 100644 --- a/src/openrct2/paint/tile_element/Paint.Surface.cpp +++ b/src/openrct2/paint/tile_element/Paint.Surface.cpp @@ -1111,7 +1111,7 @@ void PaintSurface(PaintSession& session, uint8_t direction, uint16_t height, con auto& gameState = GetGameState(); // Draw Peep Spawns - if (((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || gameState.Cheats.SandboxMode) + if (((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || gameState.Cheats.sandboxMode) && session.ViewFlags & VIEWPORT_FLAG_LAND_OWNERSHIP) { const CoordsXY& pos = session.MapPosition; diff --git a/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp index 1f851fb61e..024eb5261f 100644 --- a/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/ClassicWoodenRollerCoaster.cpp @@ -22,12 +22,10 @@ #include "../../tile_element/Segment.h" #include "../../track/Segment.h" #include "../../track/Support.h" -#include "WoodenRollerCoaster.h" +#include "WoodenRollerCoaster.hpp" using namespace OpenRCT2; -static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; - enum { SPR_CLASSIC_WOODEN_RC_BRAKE_0 = SPR_CSG_BEGIN + 64985, @@ -137,19 +135,19 @@ enum SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_FRONT_0 = SPR_CSG_BEGIN + 65313, SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65314, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_0 = SPR_CSG_BEGIN + 65315, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_1 = SPR_CSG_BEGIN + 65316, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_2 = SPR_CSG_BEGIN + 65317, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_3 = SPR_CSG_BEGIN + 65318, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_FRONT_0 = SPR_CSG_BEGIN + 65319, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_FRONT_2 = SPR_CSG_BEGIN + 65320, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 65315, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 65316, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 65317, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 65318, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_0 = SPR_CSG_BEGIN + 65319, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65320, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_0 = SPR_CSG_BEGIN + 65321, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_1 = SPR_CSG_BEGIN + 65322, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_2 = SPR_CSG_BEGIN + 65323, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_3 = SPR_CSG_BEGIN + 65324, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_FRONT_0 = SPR_CSG_BEGIN + 65325, - SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_FRONT_2 = SPR_CSG_BEGIN + 65326, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 65321, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 65322, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 65323, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 65324, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_0 = SPR_CSG_BEGIN + 65325, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65326, SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 65327, SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 65328, @@ -179,378 +177,511 @@ enum SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_FRONT_0 = SPR_CSG_BEGIN + 65349, SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_FRONT_2 = SPR_CSG_BEGIN + 65350, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_0 = SPR_CSG_BEGIN + 65399, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_1 = SPR_CSG_BEGIN + 65400, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_2 = SPR_CSG_BEGIN + 65401, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_4 = SPR_CSG_BEGIN + 65402, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_0 = SPR_CSG_BEGIN + 65415, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_1 = SPR_CSG_BEGIN + 65416, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_2 = SPR_CSG_BEGIN + 65417, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_4 = SPR_CSG_BEGIN + 65418, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_0 = SPR_CSG_BEGIN + 65403, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_1 = SPR_CSG_BEGIN + 65404, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_2 = SPR_CSG_BEGIN + 65405, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_4 = SPR_CSG_BEGIN + 65406, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_0 = SPR_CSG_BEGIN + 65407, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_1 = SPR_CSG_BEGIN + 65408, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_2 = SPR_CSG_BEGIN + 65409, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_4 = SPR_CSG_BEGIN + 65410, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_0 = SPR_CSG_BEGIN + 65419, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_1 = SPR_CSG_BEGIN + 65420, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_2 = SPR_CSG_BEGIN + 65421, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_4 = SPR_CSG_BEGIN + 65422, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_0 = SPR_CSG_BEGIN + 65411, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_1 = SPR_CSG_BEGIN + 65412, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_2 = SPR_CSG_BEGIN + 65413, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_4 = SPR_CSG_BEGIN + 65414, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_0 = SPR_CSG_BEGIN + 65399 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_1 = SPR_CSG_BEGIN + 65400 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_2 = SPR_CSG_BEGIN + 65401 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_4 = SPR_CSG_BEGIN + 65402 + 24, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_0 = SPR_CSG_BEGIN + 65403 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_1 = SPR_CSG_BEGIN + 65404 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_2 = SPR_CSG_BEGIN + 65405 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_4 = SPR_CSG_BEGIN + 65406 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_0 = SPR_CSG_BEGIN + 65439, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_1 = SPR_CSG_BEGIN + 65440, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_2 = SPR_CSG_BEGIN + 65441, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_4 = SPR_CSG_BEGIN + 65442, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_0 = SPR_CSG_BEGIN + 65407 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_1 = SPR_CSG_BEGIN + 65408 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_2 = SPR_CSG_BEGIN + 65409 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_4 = SPR_CSG_BEGIN + 65410 + 24, - - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_0 = SPR_CSG_BEGIN + 65411 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_1 = SPR_CSG_BEGIN + 65412 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_2 = SPR_CSG_BEGIN + 65413 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_4 = SPR_CSG_BEGIN + 65414 + 24, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_0 = SPR_CSG_BEGIN + 65443, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_1 = SPR_CSG_BEGIN + 65444, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_2 = SPR_CSG_BEGIN + 65445, - SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_4 = SPR_CSG_BEGIN + 65446, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_0 = SPR_CSG_BEGIN + 65399, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_0 = SPR_CSG_BEGIN + 65400, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_0 = SPR_CSG_BEGIN + 65401, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_0 = SPR_CSG_BEGIN + 65402, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_1 = SPR_CSG_BEGIN + 65403, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_1 = SPR_CSG_BEGIN + 65404, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_1 = SPR_CSG_BEGIN + 65405, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_1 = SPR_CSG_BEGIN + 65406, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_2 = SPR_CSG_BEGIN + 65407, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_2 = SPR_CSG_BEGIN + 65408, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_2 = SPR_CSG_BEGIN + 65409, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_2 = SPR_CSG_BEGIN + 65410, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_3 = SPR_CSG_BEGIN + 65411, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_3 = SPR_CSG_BEGIN + 65412, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_3 = SPR_CSG_BEGIN + 65413, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_3 = SPR_CSG_BEGIN + 65414, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_0 = SPR_CSG_BEGIN + 65415, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_0 = SPR_CSG_BEGIN + 65416, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_0 = SPR_CSG_BEGIN + 65417, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_0 = SPR_CSG_BEGIN + 65418, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_2 = SPR_CSG_BEGIN + 65419, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_2 = SPR_CSG_BEGIN + 65420, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_2 = SPR_CSG_BEGIN + 65421, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_2 = SPR_CSG_BEGIN + 65422, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_0 = SPR_CSG_BEGIN + 65423, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_0 = SPR_CSG_BEGIN + 65424, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_0 = SPR_CSG_BEGIN + 65425, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_0 = SPR_CSG_BEGIN + 65426, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_1 = SPR_CSG_BEGIN + 65427, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_1 = SPR_CSG_BEGIN + 65428, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_1 = SPR_CSG_BEGIN + 65429, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_1 = SPR_CSG_BEGIN + 65430, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_2 = SPR_CSG_BEGIN + 65431, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_2 = SPR_CSG_BEGIN + 65432, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_2 = SPR_CSG_BEGIN + 65433, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_2 = SPR_CSG_BEGIN + 65434, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_3 = SPR_CSG_BEGIN + 65435, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_3 = SPR_CSG_BEGIN + 65436, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_3 = SPR_CSG_BEGIN + 65437, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_3 = SPR_CSG_BEGIN + 65438, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_1 = SPR_CSG_BEGIN + 65439, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_1 = SPR_CSG_BEGIN + 65440, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_1 = SPR_CSG_BEGIN + 65441, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_1 = SPR_CSG_BEGIN + 65442, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_3 = SPR_CSG_BEGIN + 65443, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_3 = SPR_CSG_BEGIN + 65444, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_3 = SPR_CSG_BEGIN + 65445, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_3 = SPR_CSG_BEGIN + 65446, }; -static void ClassicWoodenRCTrackFlatToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) +static constexpr std::array kFlatToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_SW_NE, + }, + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_NW_SE, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_NW_SE, + }, + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_NE_SW, + }, + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_SE_NW, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_SE_NW, + }, +} }; -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 26, 0, 5 }, { 1, 32, 9 }) }, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 26, 0, 5 }, { 1, 32, 9 }) }, - } } - }; - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} +static constexpr std::array kFlatToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_SW_NE, + }, + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_NW_SE, + }, + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_NE_SW, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_NE_SW, + }, + { + SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_SE_NW, + }, +} }; -static void ClassicWoodenRCTrackFlatToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - } }, +static constexpr std::array kLeftBankImages = { { + { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_SW_NE }, + { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_NW_SE }, + { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_NE_SW }, + { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_SE_NW }, +} }; - { { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 26, 5 }, { 32, 1, 9 }) }, - } }, +static constexpr std::array kUp25ToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_SW_NE, + }, + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_NW_SE, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_FRONT_NW_SE, + }, + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_NE_SW, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_FRONT_NE_SW, + }, + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_SE_NW, + }, +} }; + +static constexpr std::array kUp25ToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_SW_NE, + }, + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_NW_SE, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_FRONT_NW_SE, + }, + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_NE_SW, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_FRONT_NE_SW, + }, + { + SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_SE_NW, + }, +} }; + +static constexpr std::array kLeftBankToUp25Images = { { + { + SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_SW_NE, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_NW_SE, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_FRONT_NW_SE, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_NE_SW, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_FRONT_NE_SW, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_SE_NW, + }, +} }; +static constexpr std::array kRightBankToUp25Images = { { + { + SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_SW_NE, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_NW_SE, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_FRONT_NW_SE, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_NE_SW, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_FRONT_NE_SW, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_SE_NW, + }, +} }; + +static constexpr std::array kDiagFlatToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_3, + }, +} }; + +static constexpr std::array kDiagFlatToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_3, + }, +} }; + +static constexpr std::array kDiagLeftBankTo25DegUpImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_3, + }, +} }; + +static constexpr std::array kDiagRightBankTo25DegUpImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_3, + }, +} }; + +static constexpr std::array kDiagUp25ToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_3, + }, +} }; + +static constexpr std::array kDiagLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_3, + }, +} }; + +static constexpr std::array kDiagUp25ToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_FRONT_0, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_1, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_FRONT_2, + }, + { + SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_3, + }, +} }; + +static constexpr std::array, 4> kLeftEighthBankToDiagImages = { { + { { { - { - { SPR_CLASSIC_WOODEN_RC_FLAT_TO_RIGHT_BANK_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - }, - } - }; - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_0, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_1, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_1, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_2, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_3, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_0, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_1, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_1, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_2, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_3, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_0, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_1, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_1, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_2, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_3, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_0, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_1, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_1, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_2, + }, + { + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_3, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_3, + }, + } }, +} }; + +static constexpr std::array, 4> kRightEighthBankToDiagImages = { { + { { + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_0, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_1, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_2, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_0, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_1, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_2, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_0, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_1, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_2, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_0, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_0, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_1, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_2, + ImageIndexUndefined, + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_2, + }, + { + SPR_CLASSIC_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_3, + }, + } }, +} }; static void ClassicWoodenRCTrackLeftBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrackFlatToRightBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackRightBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrackFlatToLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - } }, - - { { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { - { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - }, - } - }; - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + WoodenRCTrackFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrackLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackLeftBankTo25DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_FRONT_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 26, 0, 5 }, { 1, 32, 9 }) }, - } }, - - { { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_FRONT_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 26, 5 }, { 32, 1, 9 }) }, - } }, - { - { - { SPR_CLASSIC_WOODEN_RC_LEFT_BANK_TO_25_UP_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - }, - } - }; - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); -} - -static void ClassicWoodenRCTrackRightBankTo25DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_FRONT_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 26, 0, 5 }, { 1, 32, 9 }) }, - } }, - - { { - { SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_FRONT_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 26, 5 }, { 32, 1, 9 }) }, - } }, - { - { - { SPR_CLASSIC_WOODEN_RC_RIGHT_BANK_TO_25_UP_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - }, - } - }; - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); -} - -static void ClassicWoodenRCTrack25DegUpToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_FRONT_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 26, 0, 5 }, { 1, 32, 9 }) }, - } }, - - { { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_FRONT_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 26, 5 }, { 32, 1, 9 }) }, - } }, - { - { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_LEFT_BANK_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - }, - } - }; - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 40); -} - -static void ClassicWoodenRCTrack25DegUpToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][1][2] = { - { { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_SW_NE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - {}, - } }, - { { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_FRONT_NW_SE, 0, { 0, 0, 0 }, BoundBoxXYZ({ 26, 0, 5 }, { 1, 32, 9 }) }, - } }, - - { { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 3, 0 }, { 32, 25, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_FRONT_NE_SW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 26, 5 }, { 32, 1, 9 }) }, - } }, - { - { - { SPR_CLASSIC_WOODEN_RC_25_UP_TO_RIGHT_BANK_SE_NW, 0, { 0, 0, 0 }, BoundBoxXYZ({ 3, 0, 0 }, { 25, 32, 2 }) }, - {}, - }, - } - }; - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 40); + WoodenRCTrackFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackLeftBankTo25DegDown( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrack25DegUpToRightBank( - session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrack25DegUpToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackRightBankTo25DegDown( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrack25DegUpToLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrack25DegUpToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrack25DegDownToLeftBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrackRightBankTo25DegUp( - session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrack25DegDownToRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrackLeftBankTo25DegUp(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackBankedRightQuarterTurn5( @@ -967,374 +1098,58 @@ static void ClassicWoodenRCTrackLeftQuarterTurn3Bank( session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); } -static void ClassicWoodenRCTrackLeftEighthBankToDiag( +static void ClassicWoodenRCTrackDiagLeftBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - static constexpr SpriteBoundBox2 imageIds[4][5][2] = { - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 16, 2 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 16, 16, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_0_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 16, 0 }, { 16, 16, 2 }) }, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 32, 32, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 34, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 16, 32, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 16, 0 }, { 16, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 16, 27 }, { 16, 16, 0 }) }, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_1_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 18, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_1_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 27 }, { 16, 16, 0 }) }, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 32, 16, 2 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 16, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_2_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 16, 2 }) }, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 32, 32, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 27 }, { 16, 32, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 16, 16, 0 }) }, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_3_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 16, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_LEFT_BANKED_FRONT_3_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 27 }, { 16, 16, 0 }) }, - }, - }, - }; - - static constexpr int blockedSegments[5] = { - kSegmentsAll, kSegmentsAll, kSegmentsAll, kSegmentsAll, kSegmentsAll, - }; - - if (trackSequence == 0 && (direction == 0 || direction == 3)) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - - PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } -static void ClassicWoodenRCTrackRightEighthBankToDiag( +static void ClassicWoodenRCTrackDiagRightBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - static constexpr SpriteBoundBox2 imageIds[4][5][2] = { - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 32, 32, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 32, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 27 }, { 32, 16, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 16, 16, 0 }) }, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_0_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_0_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 27 }, { 16, 16, 0 }) }, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 32, 0 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 16, 16, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_1_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 16, 2 }) }, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 32, 32, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 34, 16, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 32, 16, 0 }) }, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 4, 4, 0 }, { 28, 28, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 4, 4, 27 }, { 28, 28, 0 }) }, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_2_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 16, 18, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_FRONT_2_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 27 }, { 16, 16, 0 }) }, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_1, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 32, 0 }) }, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_2, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 16, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_ORTHO_TO_DIAG_RIGHT_BANKED_3_SEQ_4, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 16, 0 }, { 16, 16, 2 }) }, - {}, - }, - }, - }; + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} - static constexpr int blockedSegments[5] = { - kSegmentsAll, kSegmentsAll, kSegmentsAll, kSegmentsAll, kSegmentsAll, - }; +static void ClassicWoodenRCTrackDiagDown25ToLeftBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} - if (trackSequence == 0 && (direction == 0 || direction == 3)) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } +static void ClassicWoodenRCTrackDiagDown25ToRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); +static void ClassicWoodenRCTrackDiagLeftBankToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagUp25ToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} - PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +static void ClassicWoodenRCTrackDiagRightBankToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagUp25ToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackLeftEighthBankToOrthogonal( @@ -1342,802 +1157,25 @@ static void ClassicWoodenRCTrackLeftEighthBankToOrthogonal( const TrackElement& trackElement, SupportType supportType) { trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; - ClassicWoodenRCTrackRightEighthBankToDiag( - session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackRightEighthBankToDiag( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } - static void ClassicWoodenRCTrackRightEighthBankToOrthogonal( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; - ClassicWoodenRCTrackLeftEighthBankToDiag( - session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiagFlatToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 27 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_1, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 27 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_LEFT_3, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} - -static void ClassicWoodenRCTrackDiagFlatToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 27 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_1, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 27 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_FLAT_TO_BANK_RIGHT_3, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} - -static void ClassicWoodenRCTrackDiagLeftBankToFlat( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - ClassicWoodenRCTrackDiagFlatToRightBank( - session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiagRightBankToFlat( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - ClassicWoodenRCTrackDiagFlatToLeftBank( - session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiagLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_0, 0, { -16, -16, 0 }, BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 27 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_1, 0, { -16, -16, 0 }, BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_2, 0, { -16, -16, 0 }, BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 27 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_3, 0, { -16, -16, 0 }, BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + WoodenRCTrackLeftEighthBankToDiag( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); } static void ClassicWoodenRCTrackDiagRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - ClassicWoodenRCTrackDiagLeftBank(session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiagLeftBankTo25DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_1, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_LEFT_BANK_TO_25_UP_3, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); -} - -static void ClassicWoodenRCTrackDiagRightBankTo25DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_1, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_UP_3, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); -} - -static void ClassicWoodenRCTrackDiag25DegUpToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_1, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_LEFT_BANK_3, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); -} - -static void ClassicWoodenRCTrackDiag25DegUpToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[4][4][2] = { - { - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_FRONT_0, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_1, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - }, - { - { - {}, - {}, - }, - { - {}, - {}, - }, - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 23, 2 }) }, - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_FRONT_2, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 35 }, { 32, 32, 0 }) }, - }, - { - {}, - {}, - }, - }, - { - { - { SPR_CLASSIC_WOODEN_RC_DIAG_25_UP_TO_RIGHT_BANK_3, - 0, - { -16, -16, 0 }, - BoundBoxXYZ({ -16, -16, 0 }, { 32, 32, 2 }) }, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - { - {}, - {}, - }, - }, - }; - - DrawSupportForSequenceA( - session, supportType.wooden, trackSequence, direction, height, session.SupportColours); - - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][0], height); - WoodenRCTrackPaintBb(session, &imageIds[direction][trackSequence][1], height); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); -} - -static void ClassicWoodenRCTrackDiagLeftBankTo25DegDown( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - ClassicWoodenRCTrackDiag25DegUpToRightBank( - session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiagRightBankTo25DegDown( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - ClassicWoodenRCTrackDiag25DegUpToLeftBank( - session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiag25DegDownToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - ClassicWoodenRCTrackDiagRightBankTo25DegUp( - session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -static void ClassicWoodenRCTrackDiag25DegDownToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - ClassicWoodenRCTrackDiagLeftBankTo25DegUp( - session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagLeftBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } // Stylistically, this coaster is _very_ similar to the regular Wooden Roller Coaster. @@ -2153,77 +1191,77 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRC(OpenRCT2::TrackElemTyp switch (trackType) { case TrackElemType::FlatToLeftBank: - return ClassicWoodenRCTrackFlatToLeftBank; + return WoodenRCTrackFlatToBank; case TrackElemType::FlatToRightBank: - return ClassicWoodenRCTrackFlatToRightBank; + return WoodenRCTrackFlatToBank; case TrackElemType::LeftBankToFlat: return ClassicWoodenRCTrackLeftBankToFlat; case TrackElemType::RightBankToFlat: return ClassicWoodenRCTrackRightBankToFlat; - case TrackElemType::BankedLeftQuarterTurn5Tiles: - return ClassicWoodenRCTrackBankedLeftQuarterTurn5; - case TrackElemType::BankedRightQuarterTurn5Tiles: - return ClassicWoodenRCTrackBankedRightQuarterTurn5; - case TrackElemType::LeftBankToUp25: - return ClassicWoodenRCTrackLeftBankTo25DegUp; - case TrackElemType::RightBankToUp25: - return ClassicWoodenRCTrackRightBankTo25DegUp; + case TrackElemType::LeftBank: + return WoodenRCTrackFlatToBank; + case TrackElemType::RightBank: + return ClassicWoodenRCTrackRightBank; case TrackElemType::Up25ToLeftBank: - return ClassicWoodenRCTrack25DegUpToLeftBank; + return WoodenRCTrack25DegUpToBank; case TrackElemType::Up25ToRightBank: - return ClassicWoodenRCTrack25DegUpToRightBank; + return WoodenRCTrack25DegUpToBank; case TrackElemType::LeftBankToDown25: return ClassicWoodenRCTrackLeftBankTo25DegDown; case TrackElemType::RightBankToDown25: return ClassicWoodenRCTrackRightBankTo25DegDown; + case TrackElemType::LeftBankToUp25: + return WoodenRCTrackBankTo25DegUp; + case TrackElemType::RightBankToUp25: + return WoodenRCTrackBankTo25DegUp; case TrackElemType::Down25ToLeftBank: return ClassicWoodenRCTrack25DegDownToLeftBank; case TrackElemType::Down25ToRightBank: return ClassicWoodenRCTrack25DegDownToRightBank; - case TrackElemType::LeftBank: - return ClassicWoodenRCTrackLeftBank; - case TrackElemType::RightBank: - return ClassicWoodenRCTrackRightBank; + case TrackElemType::BankedLeftQuarterTurn5Tiles: + return ClassicWoodenRCTrackBankedLeftQuarterTurn5; + case TrackElemType::BankedRightQuarterTurn5Tiles: + return ClassicWoodenRCTrackBankedRightQuarterTurn5; case TrackElemType::LeftBankedQuarterTurn3Tiles: return ClassicWoodenRCTrackLeftQuarterTurn3Bank; case TrackElemType::RightBankedQuarterTurn3Tiles: return ClassicWoodenRCTrackRightQuarterTurn3Bank; - case TrackElemType::LeftEighthBankToDiag: - return ClassicWoodenRCTrackLeftEighthBankToDiag; - case TrackElemType::RightEighthBankToDiag: - return ClassicWoodenRCTrackRightEighthBankToDiag; - case TrackElemType::LeftEighthBankToOrthogonal: - return ClassicWoodenRCTrackLeftEighthBankToOrthogonal; - case TrackElemType::RightEighthBankToOrthogonal: - return ClassicWoodenRCTrackRightEighthBankToOrthogonal; case TrackElemType::DiagFlatToLeftBank: - return ClassicWoodenRCTrackDiagFlatToLeftBank; + return WoodenRCTrackDiagFlatToBank; case TrackElemType::DiagFlatToRightBank: - return ClassicWoodenRCTrackDiagFlatToRightBank; + return WoodenRCTrackDiagFlatToBank; case TrackElemType::DiagLeftBankToFlat: return ClassicWoodenRCTrackDiagLeftBankToFlat; case TrackElemType::DiagRightBankToFlat: return ClassicWoodenRCTrackDiagRightBankToFlat; case TrackElemType::DiagLeftBankToUp25: - return ClassicWoodenRCTrackDiagLeftBankTo25DegUp; + return WoodenRCTrackDiagBankTo25DegUp; case TrackElemType::DiagRightBankToUp25: - return ClassicWoodenRCTrackDiagRightBankTo25DegUp; - case TrackElemType::DiagUp25ToLeftBank: - return ClassicWoodenRCTrackDiag25DegUpToLeftBank; - case TrackElemType::DiagUp25ToRightBank: - return ClassicWoodenRCTrackDiag25DegUpToRightBank; - case TrackElemType::DiagLeftBankToDown25: - return ClassicWoodenRCTrackDiagLeftBankTo25DegDown; - case TrackElemType::DiagRightBankToDown25: - return ClassicWoodenRCTrackDiagRightBankTo25DegDown; + return WoodenRCTrackDiagBankTo25DegUp; case TrackElemType::DiagDown25ToLeftBank: - return ClassicWoodenRCTrackDiag25DegDownToLeftBank; + return ClassicWoodenRCTrackDiagDown25ToLeftBank; case TrackElemType::DiagDown25ToRightBank: - return ClassicWoodenRCTrackDiag25DegDownToRightBank; + return ClassicWoodenRCTrackDiagDown25ToRightBank; + case TrackElemType::DiagUp25ToLeftBank: + return WoodenRCTrackDiagUp25ToBank; + case TrackElemType::DiagUp25ToRightBank: + return WoodenRCTrackDiagUp25ToBank; + case TrackElemType::DiagLeftBankToDown25: + return ClassicWoodenRCTrackDiagLeftBankToDown25; + case TrackElemType::DiagRightBankToDown25: + return ClassicWoodenRCTrackDiagRightBankToDown25; case TrackElemType::DiagLeftBank: - return ClassicWoodenRCTrackDiagLeftBank; + return WoodenRCTrackDiagLeftBank; case TrackElemType::DiagRightBank: return ClassicWoodenRCTrackDiagRightBank; + case TrackElemType::LeftEighthBankToDiag: + return WoodenRCTrackLeftEighthBankToDiag; + case TrackElemType::RightEighthBankToDiag: + return WoodenRCTrackRightEighthBankToDiag; + case TrackElemType::LeftEighthBankToOrthogonal: + return ClassicWoodenRCTrackLeftEighthBankToOrthogonal; + case TrackElemType::RightEighthBankToOrthogonal: + return ClassicWoodenRCTrackRightEighthBankToOrthogonal; default: return GetTrackPaintFunctionClassicWoodenRCFallback(trackType); } diff --git a/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp b/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp new file mode 100644 index 0000000000..4e79ec7c67 --- /dev/null +++ b/src/openrct2/paint/track/coaster/ClassicWoodenTwisterRollerCoaster.cpp @@ -0,0 +1,2208 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#include "../../../ride/Track.h" +#include "../../../ride/TrackPaint.h" +#include "../../../sprites.h" +#include "../../tile_element/Paint.Tunnel.h" +#include "../../tile_element/Segment.h" +#include "WoodenRollerCoaster.hpp" + +using namespace OpenRCT2; + +// static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; + +enum +{ + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 65447, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 65448, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 65449, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 65450, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 65451, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 65452, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 65453, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 65454, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_0 = SPR_CSG_BEGIN + 65455, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_1 = SPR_CSG_BEGIN + 65456, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_2 = SPR_CSG_BEGIN + 65457, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_3 = SPR_CSG_BEGIN + 65458, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 65459, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 65460, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 65461, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 65462, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 65463, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 65464, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 65465, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 65466, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_0 = SPR_CSG_BEGIN + 65467, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_1 = SPR_CSG_BEGIN + 65468, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_2 = SPR_CSG_BEGIN + 65469, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_3 = SPR_CSG_BEGIN + 65470, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_0 = SPR_CSG_BEGIN + 65471, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_1 = SPR_CSG_BEGIN + 65472, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_2 = SPR_CSG_BEGIN + 65473, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_3 = SPR_CSG_BEGIN + 65474, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_1 = SPR_CSG_BEGIN + 65475, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_3 = SPR_CSG_BEGIN + 65476, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65477, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_1 = SPR_CSG_BEGIN + 65478, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65479, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_1 = SPR_CSG_BEGIN + 65480, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_2 = SPR_CSG_BEGIN + 65481, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_1 = SPR_CSG_BEGIN + 65482, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_2 = SPR_CSG_BEGIN + 65483, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_1 = SPR_CSG_BEGIN + 65484, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_2 = SPR_CSG_BEGIN + 65485, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_0 = SPR_CSG_BEGIN + 65486, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_0 = SPR_CSG_BEGIN + 65585, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_0 = SPR_CSG_BEGIN + 65586, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_0 = SPR_CSG_BEGIN + 65587, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_0 = SPR_CSG_BEGIN + 65588, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_0 = SPR_CSG_BEGIN + 65589, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_1 = SPR_CSG_BEGIN + 65590, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_1 = SPR_CSG_BEGIN + 65591, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_1 = SPR_CSG_BEGIN + 65592, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_1 = SPR_CSG_BEGIN + 65593, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_1 = SPR_CSG_BEGIN + 65594, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_2 = SPR_CSG_BEGIN + 65595, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_2 = SPR_CSG_BEGIN + 65596, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_2 = SPR_CSG_BEGIN + 65597, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_2 = SPR_CSG_BEGIN + 65598, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_2 = SPR_CSG_BEGIN + 65599, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_3 = SPR_CSG_BEGIN + 65600, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_3 = SPR_CSG_BEGIN + 65601, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_3 = SPR_CSG_BEGIN + 65602, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_3 = SPR_CSG_BEGIN + 65603, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_3 = SPR_CSG_BEGIN + 65604, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_0_0 = SPR_CSG_BEGIN + 65605, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_1_0 = SPR_CSG_BEGIN + 65606, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_2_0 = SPR_CSG_BEGIN + 65607, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_3_0 = SPR_CSG_BEGIN + 65608, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_4_0 = SPR_CSG_BEGIN + 65609, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_0_2 = SPR_CSG_BEGIN + 65610, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_1_2 = SPR_CSG_BEGIN + 65611, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_2_2 = SPR_CSG_BEGIN + 65612, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_3_2 = SPR_CSG_BEGIN + 65613, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_4_2 = SPR_CSG_BEGIN + 65614, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_0 = SPR_CSG_BEGIN + 65615, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_0 = SPR_CSG_BEGIN + 65616, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_0 = SPR_CSG_BEGIN + 65617, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_0 = SPR_CSG_BEGIN + 65618, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_0 = SPR_CSG_BEGIN + 65619, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_1 = SPR_CSG_BEGIN + 65620, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_1 = SPR_CSG_BEGIN + 65621, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_1 = SPR_CSG_BEGIN + 65622, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_1 = SPR_CSG_BEGIN + 65623, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_1 = SPR_CSG_BEGIN + 65624, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_2 = SPR_CSG_BEGIN + 65625, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_2 = SPR_CSG_BEGIN + 65626, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_2 = SPR_CSG_BEGIN + 65627, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_2 = SPR_CSG_BEGIN + 65628, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_2 = SPR_CSG_BEGIN + 65629, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_3 = SPR_CSG_BEGIN + 65630, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_3 = SPR_CSG_BEGIN + 65631, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_3 = SPR_CSG_BEGIN + 65632, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_3 = SPR_CSG_BEGIN + 65633, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_3 = SPR_CSG_BEGIN + 65634, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_0 = SPR_CSG_BEGIN + 65635, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_0 = SPR_CSG_BEGIN + 65636, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_0 = SPR_CSG_BEGIN + 65637, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_0 = SPR_CSG_BEGIN + 65638, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_0 = SPR_CSG_BEGIN + 65639, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_2 = SPR_CSG_BEGIN + 65640, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_2 = SPR_CSG_BEGIN + 65641, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_2 = SPR_CSG_BEGIN + 65642, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_2 = SPR_CSG_BEGIN + 65643, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_2 = SPR_CSG_BEGIN + 65644, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_3 = SPR_CSG_BEGIN + 65645, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_3 = SPR_CSG_BEGIN + 65646, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_3 = SPR_CSG_BEGIN + 65647, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_3 = SPR_CSG_BEGIN + 65648, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_3 = SPR_CSG_BEGIN + 65649, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_0 = SPR_CSG_BEGIN + 65650, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_0 = SPR_CSG_BEGIN + 65651, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_0 = SPR_CSG_BEGIN + 65652, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_0 = SPR_CSG_BEGIN + 65653, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_0 = SPR_CSG_BEGIN + 65654, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_1 = SPR_CSG_BEGIN + 65655, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_1 = SPR_CSG_BEGIN + 65656, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_1 = SPR_CSG_BEGIN + 65657, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_1 = SPR_CSG_BEGIN + 65658, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_1 = SPR_CSG_BEGIN + 65659, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_2 = SPR_CSG_BEGIN + 65660, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_2 = SPR_CSG_BEGIN + 65661, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_2 = SPR_CSG_BEGIN + 65662, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_2 = SPR_CSG_BEGIN + 65663, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_2 = SPR_CSG_BEGIN + 65664, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_3 = SPR_CSG_BEGIN + 65665, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_3 = SPR_CSG_BEGIN + 65666, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_3 = SPR_CSG_BEGIN + 65667, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_3 = SPR_CSG_BEGIN + 65668, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_3 = SPR_CSG_BEGIN + 65669, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_1 = SPR_CSG_BEGIN + 65670, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_1 = SPR_CSG_BEGIN + 65671, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_1 = SPR_CSG_BEGIN + 65672, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_1 = SPR_CSG_BEGIN + 65673, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_1 = SPR_CSG_BEGIN + 65674, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_3 = SPR_CSG_BEGIN + 65849, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_3 = SPR_CSG_BEGIN + 65850, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_3 = SPR_CSG_BEGIN + 65851, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_0 = SPR_CSG_BEGIN + 65852, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_0 = SPR_CSG_BEGIN + 65853, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_0 = SPR_CSG_BEGIN + 65854, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_1 = SPR_CSG_BEGIN + 65855, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_1 = SPR_CSG_BEGIN + 65856, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_1 = SPR_CSG_BEGIN + 65857, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_2 = SPR_CSG_BEGIN + 65858, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_2 = SPR_CSG_BEGIN + 65859, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_2 = SPR_CSG_BEGIN + 65860, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_2_3 = SPR_CSG_BEGIN + 65861, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_1_3 = SPR_CSG_BEGIN + 65862, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_0_3 = SPR_CSG_BEGIN + 65863, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_2_1 = SPR_CSG_BEGIN + 65864, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_1_1 = SPR_CSG_BEGIN + 65865, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_0_1 = SPR_CSG_BEGIN + 65866, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_0 = SPR_CSG_BEGIN + 65867, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_0 = SPR_CSG_BEGIN + 65868, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_0 = SPR_CSG_BEGIN + 65869, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_1 = SPR_CSG_BEGIN + 65870, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_1 = SPR_CSG_BEGIN + 65871, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_1 = SPR_CSG_BEGIN + 65872, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_2 = SPR_CSG_BEGIN + 65873, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_2 = SPR_CSG_BEGIN + 65874, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_2 = SPR_CSG_BEGIN + 65875, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_3 = SPR_CSG_BEGIN + 65876, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_3 = SPR_CSG_BEGIN + 65877, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_3 = SPR_CSG_BEGIN + 65878, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_0 = SPR_CSG_BEGIN + 65879, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_0 = SPR_CSG_BEGIN + 65880, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_0 = SPR_CSG_BEGIN + 65881, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_2 = SPR_CSG_BEGIN + 65882, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_2 = SPR_CSG_BEGIN + 65883, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_2 = SPR_CSG_BEGIN + 65884, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_3 = SPR_CSG_BEGIN + 65885, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_3 = SPR_CSG_BEGIN + 65886, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_3 = SPR_CSG_BEGIN + 65887, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_0 = SPR_CSG_BEGIN + 65888, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_0 = SPR_CSG_BEGIN + 65889, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_0 = SPR_CSG_BEGIN + 65890, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_1 = SPR_CSG_BEGIN + 65891, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_1 = SPR_CSG_BEGIN + 65892, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_1 = SPR_CSG_BEGIN + 65893, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_2 = SPR_CSG_BEGIN + 65894, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_2 = SPR_CSG_BEGIN + 65895, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_2 = SPR_CSG_BEGIN + 65896, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_3 = SPR_CSG_BEGIN + 65897, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_3 = SPR_CSG_BEGIN + 65898, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_3 = SPR_CSG_BEGIN + 65899, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_1 = SPR_CSG_BEGIN + 65900, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_1 = SPR_CSG_BEGIN + 65901, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_1 = SPR_CSG_BEGIN + 65902, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_0 = SPR_CSG_BEGIN + 65955, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_0 = SPR_CSG_BEGIN + 65956, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_1 = SPR_CSG_BEGIN + 65957, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_1 = SPR_CSG_BEGIN + 65958, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_2 = SPR_CSG_BEGIN + 65959, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_2 = SPR_CSG_BEGIN + 65960, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_3 = SPR_CSG_BEGIN + 65961, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_3 = SPR_CSG_BEGIN + 65962, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_3 = SPR_CSG_BEGIN + 65963, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_3 = SPR_CSG_BEGIN + 65964, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_0 = SPR_CSG_BEGIN + 65965, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_0 = SPR_CSG_BEGIN + 65966, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_1 = SPR_CSG_BEGIN + 65967, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_1 = SPR_CSG_BEGIN + 65968, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_2 = SPR_CSG_BEGIN + 65969, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_2 = SPR_CSG_BEGIN + 65970, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_0 = SPR_CSG_BEGIN + 65971, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_0 = SPR_CSG_BEGIN + 65972, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1 = SPR_CSG_BEGIN + 65973, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_2 = SPR_CSG_BEGIN + 65974, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2 = SPR_CSG_BEGIN + 65975, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_3 = SPR_CSG_BEGIN + 65976, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_3 = SPR_CSG_BEGIN + 65977, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1 = SPR_CSG_BEGIN + 65978, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_1 = SPR_CSG_BEGIN + 65979, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2 = SPR_CSG_BEGIN + 65980, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_0 = SPR_CSG_BEGIN + 66049, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_1 = SPR_CSG_BEGIN + 66050, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_2 = SPR_CSG_BEGIN + 66051, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_3 = SPR_CSG_BEGIN + 66052, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_0 = SPR_CSG_BEGIN + 66053, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 66054, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 66055, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 66056, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 66057, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 66058, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_0 = SPR_CSG_BEGIN + 66059, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 66060, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 66061, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 66062, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 66063, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 66064, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_0 = SPR_CSG_BEGIN + 66065, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_2 = SPR_CSG_BEGIN + 66066, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_0 = SPR_CSG_BEGIN + 66067, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_1 = SPR_CSG_BEGIN + 66068, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_2 = SPR_CSG_BEGIN + 66069, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_3 = SPR_CSG_BEGIN + 66070, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_0 = SPR_CSG_BEGIN + 66071, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_2 = SPR_CSG_BEGIN + 66072, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_0 = SPR_CSG_BEGIN + 66073, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_1 = SPR_CSG_BEGIN + 66074, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_2 = SPR_CSG_BEGIN + 66075, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_3 = SPR_CSG_BEGIN + 66076, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_0 = SPR_CSG_BEGIN + 66077, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_2 = SPR_CSG_BEGIN + 66078, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_0 = SPR_CSG_BEGIN + 66079, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_1 = SPR_CSG_BEGIN + 66080, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_2 = SPR_CSG_BEGIN + 66081, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_3 = SPR_CSG_BEGIN + 66082, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_0 = SPR_CSG_BEGIN + 66083, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_2 = SPR_CSG_BEGIN + 66084, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_0 = SPR_CSG_BEGIN + 66085, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_1 = SPR_CSG_BEGIN + 66086, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_2 = SPR_CSG_BEGIN + 66087, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_3 = SPR_CSG_BEGIN + 66088, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_0 = SPR_CSG_BEGIN + 66089, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_2 = SPR_CSG_BEGIN + 66090, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_0 = SPR_CSG_BEGIN + 66139, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_0 = SPR_CSG_BEGIN + 66140, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_0 = SPR_CSG_BEGIN + 66141, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_0 = SPR_CSG_BEGIN + 66142, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_1 = SPR_CSG_BEGIN + 66143, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_1 = SPR_CSG_BEGIN + 66144, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_1 = SPR_CSG_BEGIN + 66145, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_1 = SPR_CSG_BEGIN + 66146, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_2 = SPR_CSG_BEGIN + 66147, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_2 = SPR_CSG_BEGIN + 66148, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_2 = SPR_CSG_BEGIN + 66149, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_2 = SPR_CSG_BEGIN + 66150, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_3 = SPR_CSG_BEGIN + 66151, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_3 = SPR_CSG_BEGIN + 66152, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_3 = SPR_CSG_BEGIN + 66153, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_3 = SPR_CSG_BEGIN + 66154, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_0 = SPR_CSG_BEGIN + 66155, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_0 = SPR_CSG_BEGIN + 66156, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_0 = SPR_CSG_BEGIN + 66157, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_0 = SPR_CSG_BEGIN + 66158, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_2 = SPR_CSG_BEGIN + 66159, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_2 = SPR_CSG_BEGIN + 66160, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_2 = SPR_CSG_BEGIN + 66161, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_2 = SPR_CSG_BEGIN + 66162, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_0 = SPR_CSG_BEGIN + 66163, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_0 = SPR_CSG_BEGIN + 66164, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_0 = SPR_CSG_BEGIN + 66165, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_0 = SPR_CSG_BEGIN + 66166, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_1 = SPR_CSG_BEGIN + 66167, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_1 = SPR_CSG_BEGIN + 66168, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_1 = SPR_CSG_BEGIN + 66169, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_1 = SPR_CSG_BEGIN + 66170, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_2 = SPR_CSG_BEGIN + 66171, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_2 = SPR_CSG_BEGIN + 66172, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_2 = SPR_CSG_BEGIN + 66173, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_2 = SPR_CSG_BEGIN + 66174, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_3 = SPR_CSG_BEGIN + 66175, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_3 = SPR_CSG_BEGIN + 66176, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_3 = SPR_CSG_BEGIN + 66177, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_3 = SPR_CSG_BEGIN + 66178, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_1 = SPR_CSG_BEGIN + 66179, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_1 = SPR_CSG_BEGIN + 66180, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_1 = SPR_CSG_BEGIN + 66181, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_1 = SPR_CSG_BEGIN + 66182, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_3 = SPR_CSG_BEGIN + 66183, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_3 = SPR_CSG_BEGIN + 66184, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_3 = SPR_CSG_BEGIN + 66185, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_3 = SPR_CSG_BEGIN + 66186, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66203, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66204, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66205, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66206, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66207, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66208, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66209, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66210, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66211, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66212, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66213, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66214, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66215, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66216, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66217, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66218, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66219, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66220, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66221, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66222, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_0 = SPR_CSG_BEGIN + 66223, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_1 = SPR_CSG_BEGIN + 66224, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_2 = SPR_CSG_BEGIN + 66225, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_3 = SPR_CSG_BEGIN + 66226, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_0 = SPR_CSG_BEGIN + 66227, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_1 = SPR_CSG_BEGIN + 66228, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_2 = SPR_CSG_BEGIN + 66229, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_3 = SPR_CSG_BEGIN + 66230, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_1 = SPR_CSG_BEGIN + 66231, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_3 = SPR_CSG_BEGIN + 66232, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66233, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_HANDRAIL_1 = SPR_CSG_BEGIN + 66234, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66235, + + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_HANDRAIL_1 = SPR_CSG_BEGIN + 66236, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66237, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_HANDRAIL_1 = SPR_CSG_BEGIN + 66238, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66239, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_HANDRAIL_1 = SPR_CSG_BEGIN + 66240, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66241, + + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66242, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66341, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66342, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66343, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66344, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_0 = SPR_CSG_BEGIN + 66345, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66346, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66347, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66348, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66349, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_1 = SPR_CSG_BEGIN + 66350, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66351, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66352, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66353, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66354, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_2 = SPR_CSG_BEGIN + 66355, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66356, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66357, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66358, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66359, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_3 = SPR_CSG_BEGIN + 66360, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66361, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66362, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66363, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66364, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_4_0 = SPR_CSG_BEGIN + 66365, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66366, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66367, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66368, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66369, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_4_2 = SPR_CSG_BEGIN + 66370, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66371, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66372, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66373, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66374, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0 = SPR_CSG_BEGIN + 66375, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66376, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66377, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66378, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66379, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1 = SPR_CSG_BEGIN + 66380, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66381, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66382, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66383, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66384, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2 = SPR_CSG_BEGIN + 66385, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66386, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66387, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66388, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66389, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3 = SPR_CSG_BEGIN + 66390, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66391, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66392, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66393, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66394, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_0 = SPR_CSG_BEGIN + 66395, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66396, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66397, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66398, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66399, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_2 = SPR_CSG_BEGIN + 66400, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3 = SPR_CSG_BEGIN + 66401, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66402, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66403, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66404, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66405, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0 = SPR_CSG_BEGIN + 66406, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66407, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66408, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66409, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66410, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1 = SPR_CSG_BEGIN + 66411, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66412, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66413, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66414, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66415, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2 = SPR_CSG_BEGIN + 66416, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66417, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66418, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66419, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66420, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_3 = SPR_CSG_BEGIN + 66421, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66422, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66423, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66424, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66425, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_1 = SPR_CSG_BEGIN + 66426, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66427, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66428, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66429, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66430, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66605, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66606, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66607, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66608, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66609, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66610, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66611, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66612, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66613, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66614, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66615, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66616, + + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66617, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66618, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66619, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66620, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66621, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66622, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66623, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66624, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66625, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66626, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66627, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66628, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66629, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66630, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66631, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66632, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66633, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66634, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66635, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66636, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66637, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66638, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66639, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66640, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66641, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66642, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66643, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66644, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66645, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66646, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66647, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66648, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66649, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66650, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66651, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66652, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66653, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66654, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66655, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66656, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66657, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66658, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66711, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66712, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66713, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66714, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66715, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66716, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66717, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66718, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66719, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66720, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66721, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66722, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66723, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66724, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66725, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66726, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66727, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66728, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66729, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66730, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66731, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66732, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66733, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66734, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66735, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66736, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66805, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66806, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66807, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66808, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66809, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66810, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66811, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66812, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66813, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66814, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66815, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66816, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66817, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66818, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66819, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66820, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66821, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66822, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66823, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66824, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66825, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66826, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66827, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66828, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_0 = SPR_CSG_BEGIN + 66829, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_1 = SPR_CSG_BEGIN + 66830, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_2 = SPR_CSG_BEGIN + 66831, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_3 = SPR_CSG_BEGIN + 66832, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66833, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66834, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_0 = SPR_CSG_BEGIN + 66835, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_1 = SPR_CSG_BEGIN + 66836, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_2 = SPR_CSG_BEGIN + 66837, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_3 = SPR_CSG_BEGIN + 66838, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66839, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66840, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_0 = SPR_CSG_BEGIN + 66841, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_1 = SPR_CSG_BEGIN + 66842, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_2 = SPR_CSG_BEGIN + 66843, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_3 = SPR_CSG_BEGIN + 66844, + + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0 = SPR_CSG_BEGIN + 66845, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2 = SPR_CSG_BEGIN + 66846, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66895, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66896, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66897, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66898, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66899, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66900, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66901, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66902, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66903, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66904, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66905, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66906, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66907, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66908, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66909, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66910, + + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66911, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66912, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66913, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66914, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66915, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66916, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66917, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66918, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0 = SPR_CSG_BEGIN + 66919, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0 = SPR_CSG_BEGIN + 66920, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0 = SPR_CSG_BEGIN + 66921, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0 = SPR_CSG_BEGIN + 66922, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66923, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66924, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66925, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66926, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2 = SPR_CSG_BEGIN + 66927, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2 = SPR_CSG_BEGIN + 66928, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2 = SPR_CSG_BEGIN + 66929, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2 = SPR_CSG_BEGIN + 66930, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66931, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66932, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66933, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66934, + + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_1 = SPR_CSG_BEGIN + 66935, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_1 = SPR_CSG_BEGIN + 66936, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_1 = SPR_CSG_BEGIN + 66937, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_1 = SPR_CSG_BEGIN + 66938, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_3 = SPR_CSG_BEGIN + 66939, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_3 = SPR_CSG_BEGIN + 66940, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_3 = SPR_CSG_BEGIN + 66941, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_3 = SPR_CSG_BEGIN + 66942, +}; + +static constexpr std::array kFlatToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_HANDRAIL_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_3, + }, +} }; + +static constexpr std::array kFlatToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_FLAT_TO_RIGHT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kLeftBankImages = { { + { SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_0, SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_0 }, + { SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_1, SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_1 }, + { SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_2, SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_2 }, + { SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_3, SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_HANDRAIL_3 }, +} }; + +static constexpr std::array kUp25ToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_LEFT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kUp25ToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_UP25_TO_RIGHT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kLeftBankToUp25Images = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_UP25_HANDRAIL_3, + }, +} }; + +static constexpr std::array kRightBankToUp25Images = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_UP25_HANDRAIL_3, + }, +} }; + +static constexpr std::array, 3> kBankedQuarterTurn3Images = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_3, + }, + } }, +} }; + +static constexpr std::array, 5> kBankedQuarterTurn5Images = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_3_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_3_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_3_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_4_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_FRONT_HANDRAIL_4_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_4_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_BANKED_QUARTER_TURN_5_HANDRAIL_4_3, + }, + } }, +} }; + +static constexpr std::array, 3> kLeftHalfBankedHelixUpSmallImages = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_3, + }, + } }, +} }; + +static constexpr std::array, 3> kRightHalfBankedHelixUpSmallImages = { + { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3, + }, + } }, + } +}; + +static constexpr std::array, 5> kLeftHalfBankedHelixUpLargeImages = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_3, + }, + } }, +} }; + +static constexpr std::array, 5> kRightHalfBankedHelixUpLargeImages = { + { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3, + }, + } }, + } +}; + +static constexpr std::array, 2> + kLeftBankToLeftQuarterTurn325DegUpImages = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_3, + }, + } }, + } }; + +static constexpr std::array, 2> + kRightBankToRightQuarterTurn325DegUpImages = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3, + }, + } }, + } }; + +static constexpr std::array kDiagFlatToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagFlatToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagLeftBankTo25DegUpImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagRightBankTo25DegUpImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagUp25ToLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagLeftBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_LEFT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagUp25ToRightBankImages = { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array, 4> kLeftEighthBankToDiagImages = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_3, + }, + } }, +} }; + +static constexpr std::array, 4> kRightEighthBankToDiagImages = { { + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_0, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_0, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_1, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_2, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_2, + }, + { + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_3, + SPR_CLASSIC_WOODEN_TWISTER_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3, + }, + } }, +} }; + +static void ClassicWoodenTwisterRCTrackLeftBankToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightBankToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackLeftBankTo25DegDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrack25DegUpToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightBankTo25DegDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrack25DegUpToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrack25DegDownToLeftBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrack25DegDownToRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightQuarterTurn3Bank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackLeftQuarterTurn3Bank( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackBankedLeftQuarterTurn5( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; + WoodenRCTrackBankedRightQuarterTurn5( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); +} +static void ClassicWoodenTwisterRCTrackLeftHalfBankedHelixDownSmall( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + if (trackSequence >= 4) + { + trackSequence -= 4; + direction = DirectionPrev(direction); + } + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackRightHalfBankedHelixUpSmall( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightHalfBankedHelixDownSmall( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + if (trackSequence >= 4) + { + trackSequence -= 4; + direction = DirectionNext(direction); + } + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackLeftHalfBankedHelixUpSmall( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackLeftHalfBankedHelixDownLarge( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + if (trackSequence >= 7) + { + trackSequence -= 7; + direction = DirectionPrev(direction); + } + trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; + WoodenRCTrackRightHalfBankedHelixUpLarge( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightHalfBankedHelixDownLarge( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + if (trackSequence >= 7) + { + trackSequence -= 7; + direction = DirectionNext(direction); + } + trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; + WoodenRCTrackLeftHalfBankedHelixUpLarge( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackLeftQuarterTurn325DegDownToLeftBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackRightBankToRightQuarterTurn325DegUp( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackRightQuarterTurn325DegDownToRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagLeftBankToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagRightBankToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagDown25ToLeftBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagDown25ToRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagLeftBankToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagUp25ToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagRightBankToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagUp25ToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackDiagRightBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagLeftBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void ClassicWoodenTwisterRCTrackLeftEighthBankToOrthogonal( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + WoodenRCTrackRightEighthBankToDiag( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} +static void ClassicWoodenTwisterRCTrackRightEighthBankToOrthogonal( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + WoodenRCTrackLeftEighthBankToDiag( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +// Stylistically, this coaster is _very_ similar to the regular Wooden Roller Coaster. +// The only difference is the degree of the banking. +// As such, all non-banked pieces are simply drawn as regular wooden roller coaster pieces. +TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::TrackElemType trackType) +{ + if (!IsCsgLoaded()) + { + return GetTrackPaintFunctionWoodenRC(trackType); + } + + switch (trackType) + { + case TrackElemType::FlatToLeftBank: + return WoodenRCTrackFlatToBank; + case TrackElemType::FlatToRightBank: + return WoodenRCTrackFlatToBank; + case TrackElemType::LeftBankToFlat: + return ClassicWoodenTwisterRCTrackLeftBankToFlat; + case TrackElemType::RightBankToFlat: + return ClassicWoodenTwisterRCTrackRightBankToFlat; + case TrackElemType::LeftBank: + return WoodenRCTrackFlatToBank; + case TrackElemType::RightBank: + return ClassicWoodenTwisterRCTrackRightBank; + case TrackElemType::Up25ToLeftBank: + return WoodenRCTrack25DegUpToBank; + case TrackElemType::Up25ToRightBank: + return WoodenRCTrack25DegUpToBank; + case TrackElemType::LeftBankToDown25: + return ClassicWoodenTwisterRCTrackLeftBankTo25DegDown; + case TrackElemType::RightBankToDown25: + return ClassicWoodenTwisterRCTrackRightBankTo25DegDown; + + case TrackElemType::LeftBankToUp25: + return WoodenRCTrackBankTo25DegUp; + case TrackElemType::RightBankToUp25: + return WoodenRCTrackBankTo25DegUp; + case TrackElemType::Down25ToLeftBank: + return ClassicWoodenTwisterRCTrack25DegDownToLeftBank; + case TrackElemType::Down25ToRightBank: + return ClassicWoodenTwisterRCTrack25DegDownToRightBank; + + case TrackElemType::LeftBankedQuarterTurn3Tiles: + return WoodenRCTrackLeftQuarterTurn3Bank; + case TrackElemType::RightBankedQuarterTurn3Tiles: + return ClassicWoodenTwisterRCTrackRightQuarterTurn3Bank; + + case TrackElemType::BankedLeftQuarterTurn5Tiles: + return ClassicWoodenTwisterRCTrackBankedLeftQuarterTurn5; + case TrackElemType::BankedRightQuarterTurn5Tiles: + return WoodenRCTrackBankedRightQuarterTurn5; + + case TrackElemType::LeftHalfBankedHelixUpSmall: + return WoodenRCTrackLeftHalfBankedHelixUpSmall; + case TrackElemType::RightHalfBankedHelixUpSmall: + return WoodenRCTrackRightHalfBankedHelixUpSmall; + case TrackElemType::LeftHalfBankedHelixDownSmall: + return ClassicWoodenTwisterRCTrackLeftHalfBankedHelixDownSmall; + case TrackElemType::RightHalfBankedHelixDownSmall: + return ClassicWoodenTwisterRCTrackRightHalfBankedHelixDownSmall; + + case TrackElemType::LeftHalfBankedHelixUpLarge: + return WoodenRCTrackLeftHalfBankedHelixUpLarge; + case TrackElemType::RightHalfBankedHelixUpLarge: + return WoodenRCTrackRightHalfBankedHelixUpLarge; + case TrackElemType::LeftHalfBankedHelixDownLarge: + return ClassicWoodenTwisterRCTrackLeftHalfBankedHelixDownLarge; + case TrackElemType::RightHalfBankedHelixDownLarge: + return ClassicWoodenTwisterRCTrackRightHalfBankedHelixDownLarge; + + case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: + return WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp; + case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: + return WoodenRCTrackRightBankToRightQuarterTurn325DegUp; + case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: + return ClassicWoodenTwisterRCTrackLeftQuarterTurn325DegDownToLeftBank; + case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: + return ClassicWoodenTwisterRCTrackRightQuarterTurn325DegDownToRightBank; + + case TrackElemType::DiagFlatToLeftBank: + return WoodenRCTrackDiagFlatToBank; + case TrackElemType::DiagFlatToRightBank: + return WoodenRCTrackDiagFlatToBank; + case TrackElemType::DiagLeftBankToFlat: + return ClassicWoodenTwisterRCTrackDiagLeftBankToFlat; + case TrackElemType::DiagRightBankToFlat: + return ClassicWoodenTwisterRCTrackDiagRightBankToFlat; + + case TrackElemType::DiagLeftBankToUp25: + return WoodenRCTrackDiagBankTo25DegUp; + case TrackElemType::DiagRightBankToUp25: + return WoodenRCTrackDiagBankTo25DegUp; + case TrackElemType::DiagDown25ToLeftBank: + return ClassicWoodenTwisterRCTrackDiagDown25ToLeftBank; + case TrackElemType::DiagDown25ToRightBank: + return ClassicWoodenTwisterRCTrackDiagDown25ToRightBank; + + case TrackElemType::DiagUp25ToLeftBank: + return WoodenRCTrackDiagUp25ToBank; + case TrackElemType::DiagUp25ToRightBank: + return WoodenRCTrackDiagUp25ToBank; + case TrackElemType::DiagLeftBankToDown25: + return ClassicWoodenTwisterRCTrackDiagLeftBankToDown25; + case TrackElemType::DiagRightBankToDown25: + return ClassicWoodenTwisterRCTrackDiagRightBankToDown25; + + case TrackElemType::DiagLeftBank: + return WoodenRCTrackDiagLeftBank; + case TrackElemType::DiagRightBank: + return ClassicWoodenTwisterRCTrackDiagRightBank; + + case TrackElemType::LeftEighthBankToDiag: + return WoodenRCTrackLeftEighthBankToDiag; + case TrackElemType::RightEighthBankToDiag: + return WoodenRCTrackRightEighthBankToDiag; + case TrackElemType::LeftEighthBankToOrthogonal: + return ClassicWoodenTwisterRCTrackLeftEighthBankToOrthogonal; + case TrackElemType::RightEighthBankToOrthogonal: + return ClassicWoodenTwisterRCTrackRightEighthBankToOrthogonal; + + default: + return GetTrackPaintFunctionWoodenRC(trackType); + } +} diff --git a/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp b/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp index 84f425a21f..a6d1f7a09a 100644 --- a/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp +++ b/src/openrct2/paint/track/coaster/LatticeTriangleTrack.cpp @@ -18421,6 +18421,18 @@ static void LatticeTriangleTrackDiagBrakes( PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); } +static void LatticeTriangleTrackDiagBooster( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + constexpr ImageIndex images[kNumOrthogonalDirections] = { SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_1, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_2, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_1, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_2 }; + + TrackPaintUtilDiagTilesPaintExtra(session, 3, height, direction, trackSequence, images, supportType.metal); +} + TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrack(OpenRCT2::TrackElemType trackType) { switch (trackType) @@ -18910,6 +18922,8 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrack(OpenRCT2::TrackEl case TrackElemType::DiagBlockBrakes: case TrackElemType::DiagBrakes: return LatticeTriangleTrackDiagBrakes; + case TrackElemType::DiagBooster: + return LatticeTriangleTrackDiagBooster; default: return nullptr; } diff --git a/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp b/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp index f2623d6649..fce98ceb48 100644 --- a/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp +++ b/src/openrct2/paint/track/coaster/LatticeTriangleTrackAlt.cpp @@ -194,6 +194,18 @@ static void LatticeTriangleTrackAltPoweredLift( PaintUtilSetGeneralSupportHeight(session, height + 56); } +static void LatticeTriangleTrackAltDiagBooster( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + constexpr ImageIndex images[kNumOrthogonalDirections] = { SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_1, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_2, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_3, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_4 }; + + TrackPaintUtilDiagTilesPaintExtra(session, 3, height, direction, trackSequence, images, supportType.metal); +} + TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrackAlt(TrackElemType trackType) { switch (trackType) @@ -210,6 +222,8 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionLatticeTriangleTrackAlt(TrackElemType return LatticeTriangleTrackAltBooster; case TrackElemType::PoweredLift: return LatticeTriangleTrackAltPoweredLift; + case TrackElemType::DiagBooster: + return LatticeTriangleTrackAltDiagBooster; default: return GetTrackPaintFunctionLatticeTriangleTrack(trackType); diff --git a/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp b/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp index 2d6a0d4c10..6a72094b3f 100644 --- a/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/StandUpRollerCoaster.cpp @@ -236,12 +236,12 @@ static void StandUpRCTrack60DegUp( case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25398), { 0, 6, height }, - { { 29, 10, height }, { 1, 10, 75 } }); + { { 0, 27, height }, { 32, 1, 98 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25390), { 0, 6, height }, - { { 29, 10, height }, { 1, 10, 75 } }); + { { 0, 27, height }, { 32, 1, 98 } }); break; case 3: PaintAddImageAsParentRotated( @@ -250,7 +250,7 @@ static void StandUpRCTrack60DegUp( } if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 32, height, session.SupportColours); + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 26, height, session.SupportColours); } } else @@ -264,12 +264,12 @@ static void StandUpRCTrack60DegUp( case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25244), { 0, 6, height }, - { { 29, 10, height }, { 1, 10, 75 } }); + { { 0, 27, height }, { 32, 1, 98 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25236), { 0, 6, height }, - { { 29, 10, height }, { 1, 10, 75 } }); + { { 0, 27, height }, { 32, 1, 98 } }); break; case 3: PaintAddImageAsParentRotated( @@ -278,7 +278,7 @@ static void StandUpRCTrack60DegUp( } if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 32, height, session.SupportColours); + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 26, height, session.SupportColours); } } if (direction == 0 || direction == 3) @@ -378,18 +378,18 @@ static void StandUpRCTrack25DegUpTo60DegUp( case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25411), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25402), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25409), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25392), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 3: PaintAddImageAsParentRotated( @@ -412,18 +412,18 @@ static void StandUpRCTrack25DegUpTo60DegUp( case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25277), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25248), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25275), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25238), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 3: PaintAddImageAsParentRotated( @@ -463,18 +463,18 @@ static void StandUpRCTrack60DegUpTo25DegUp( case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25412), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25408), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25410), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25394), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 3: PaintAddImageAsParentRotated( @@ -497,18 +497,18 @@ static void StandUpRCTrack60DegUpTo25DegUp( case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25278), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25254), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25276), { 0, 6, height }, - { { 0, 10, height }, { 32, 10, 43 } }); + { { 0, 27, height }, { 32, 1, 66 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25240), { 0, 6, height }, - { { 0, 4, height }, { 32, 2, 43 } }); + { { 0, 6, height }, { 32, 20, 3 } }); break; case 3: PaintAddImageAsParentRotated( @@ -849,24 +849,40 @@ static void StandUpRCTrackFlatToLeftBank( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25281), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25286), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25280), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25283), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); - } PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -882,24 +898,40 @@ static void StandUpRCTrackFlatToRightBank( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25279), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25284), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25282), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25285), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); - } PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -915,24 +947,40 @@ static void StandUpRCTrackLeftBankToFlat( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25282), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25285), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25279), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25284), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); - } PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -948,24 +996,40 @@ static void StandUpRCTrackRightBankToFlat( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25280), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25283), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25281), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25286), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); - } PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -983,29 +1047,36 @@ static void StandUpRCTrackBankedLeftQuarterTurn5( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25464), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25464), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25475), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25469), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25474), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25459), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25459), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -1028,17 +1099,17 @@ static void StandUpRCTrackBankedLeftQuarterTurn5( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25463), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25463), { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25468), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25468), { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25473), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25473), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 3: @@ -1062,7 +1133,7 @@ static void StandUpRCTrackBankedLeftQuarterTurn5( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25462), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25462), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; case 1: @@ -1072,12 +1143,12 @@ static void StandUpRCTrackBankedLeftQuarterTurn5( break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25472), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25472), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25457), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25457), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; } @@ -1099,17 +1170,17 @@ static void StandUpRCTrackBankedLeftQuarterTurn5( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25461), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25461), { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25466), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25466), { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 32, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25471), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25471), { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); break; case 3: @@ -1135,27 +1206,34 @@ static void StandUpRCTrackBankedLeftQuarterTurn5( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25460), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25465), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25470), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25470), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25476), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25455), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25455), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); switch (direction) { case 2: @@ -1197,24 +1275,40 @@ static void StandUpRCTrackLeftBankTo25DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25315), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25316), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25317), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25318), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); - } if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -1237,24 +1331,40 @@ static void StandUpRCTrackRightBankTo25DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25319), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25320), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25321), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25322), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); - } if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -1277,24 +1387,40 @@ static void StandUpRCTrack25DegUpToLeftBank( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25311), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25312), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25313), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25314), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); - } if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); @@ -1317,24 +1443,40 @@ static void StandUpRCTrack25DegUpToRightBank( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25307), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25308), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25309), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25310), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); - } if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); @@ -1389,24 +1531,40 @@ static void StandUpRCTrackLeftBank( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25323), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25324), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + } break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25325), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + } break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25326), { 0, 6, height }, { 32, 20, 3 }); + if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) + { + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + } break; } - if (TrackPaintUtilShouldPaintSupports(session.MapPosition)) - { - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); - } PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); @@ -2369,21 +2527,28 @@ static void StandUpRCTrackLeftVerticalLoop( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25477), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25485), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25484), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25492), { 0, 6, height }, { 32, 20, 7 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); @@ -2405,11 +2570,12 @@ static void StandUpRCTrackLeftVerticalLoop( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25478), { 0, 0, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 20, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 22, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25486), { 0, 14, height }, { 32, 2, 63 }); + session, direction, session.TrackColours.WithIndex(25486), { 0, 14, height }, + { { 0, 27, height }, { 32, 2, 63 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::Centre, 15, height, session.SupportColours); break; @@ -2423,7 +2589,7 @@ static void StandUpRCTrackLeftVerticalLoop( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25491), { 0, 6, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 16, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; } PaintUtilSetSegmentSupportHeight( @@ -2575,17 +2741,18 @@ static void StandUpRCTrackLeftVerticalLoop( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25491), { 0, 6, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 16, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25478), { 0, 0, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 20, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 22, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25486), { 0, 14, height }, { 32, 2, 63 }); + session, direction, session.TrackColours.WithIndex(25486), { 0, 14, height }, + { { 0, 27, height }, { 32, 2, 63 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::Centre, 15, height, session.SupportColours); break; @@ -2656,21 +2823,28 @@ static void StandUpRCTrackRightVerticalLoop( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25508), { 0, 6, height }, { 32, 20, 7 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25500), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25501), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25493), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); @@ -2684,7 +2858,7 @@ static void StandUpRCTrackRightVerticalLoop( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25507), { 0, 6, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 16, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -2694,7 +2868,8 @@ static void StandUpRCTrackRightVerticalLoop( break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25502), { 0, 14, height }, { 32, 2, 63 }); + session, direction, session.TrackColours.WithIndex(25502), { 0, 14, height }, + { { 0, 27, height }, { 32, 2, 63 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::Centre, 15, height, session.SupportColours); break; @@ -2702,7 +2877,7 @@ static void StandUpRCTrackRightVerticalLoop( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25494), { 0, 0, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 20, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 22, height, session.SupportColours); break; } PaintUtilSetGeneralSupportHeight(session, height + 72); @@ -2806,7 +2981,8 @@ static void StandUpRCTrackRightVerticalLoop( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25502), { 0, 14, height }, { 32, 2, 63 }); + session, direction, session.TrackColours.WithIndex(25502), { 0, 14, height }, + { { 0, 27, height }, { 32, 2, 63 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::Centre, 15, height, session.SupportColours); break; @@ -2814,13 +2990,13 @@ static void StandUpRCTrackRightVerticalLoop( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25494), { 0, 0, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 20, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 22, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25507), { 0, 6, height }, { 32, 26, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 16, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( @@ -2881,21 +3057,28 @@ static void StandUpRCTrackLeftQuarterTurn3( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25514), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25517), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25520), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25511), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -2949,21 +3132,28 @@ static void StandUpRCTrackLeftQuarterTurn3( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25512), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25515), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25518), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25509), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); switch (direction) { case 2: @@ -3007,29 +3197,36 @@ static void StandUpRCTrackLeftQuarterTurn3Bank( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25526), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25526), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25533), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25529), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25532), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25523), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25523), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -3057,7 +3254,7 @@ static void StandUpRCTrackLeftQuarterTurn3Bank( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25528), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25528), { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 1 } }); break; case 2: @@ -3088,27 +3285,34 @@ static void StandUpRCTrackLeftQuarterTurn3Bank( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25524), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25527), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25530), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25530), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25534), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25521), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25521), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); switch (direction) { case 2: @@ -3155,22 +3359,28 @@ static void StandUpRCTrackLeftQuarterTurn325DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25562), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 13, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25564), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25566), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25560), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; } - MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); } else { @@ -3179,22 +3389,28 @@ static void StandUpRCTrackLeftQuarterTurn325DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25546), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 13, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25548), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25550), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25544), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; } - MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); } if (direction == 0 || direction == 3) { @@ -3224,22 +3440,28 @@ static void StandUpRCTrackLeftQuarterTurn325DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25561), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25563), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25565), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25559), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; } - MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); } else { @@ -3248,22 +3470,28 @@ static void StandUpRCTrackLeftQuarterTurn325DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25545), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25547), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25549), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25543), { 6, 0, height }, { 20, 32, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; } - MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); } switch (direction) { @@ -3302,22 +3530,28 @@ static void StandUpRCTrackRightQuarterTurn325DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25551), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25553), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25555), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25557), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 13, height, session.SupportColours); break; } - MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); } else { @@ -3326,22 +3560,28 @@ static void StandUpRCTrackRightQuarterTurn325DegUp( case 0: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25535), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25537), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25539), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25541), { 0, 6, height }, { 32, 20, 3 }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 13, height, session.SupportColours); break; } - MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); } if (direction == 0 || direction == 3) { @@ -3378,7 +3618,7 @@ static void StandUpRCTrackRightQuarterTurn325DegUp( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25554), { 6, 0, height }, { 20, 32, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( @@ -3390,7 +3630,7 @@ static void StandUpRCTrackRightQuarterTurn325DegUp( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25558), { 6, 0, height }, { 20, 32, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; } } @@ -3408,7 +3648,7 @@ static void StandUpRCTrackRightQuarterTurn325DegUp( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25538), { 6, 0, height }, { 20, 32, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( @@ -3420,7 +3660,7 @@ static void StandUpRCTrackRightQuarterTurn325DegUp( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25542), { 6, 0, height }, { 20, 32, 3 }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; } } @@ -3509,18 +3749,19 @@ static void StandUpRCTrackHalfLoopUp( session, direction, session.TrackColours.WithIndex(25576), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::Centre, 20, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::Centre, 15, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25584), { 0, 14, height }, { 32, 2, 63 }); + session, direction, session.TrackColours.WithIndex(25584), { 0, 14, height }, + { { 0, 6, height + 68 }, { 32, 20, 3 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::Centre, 15, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25581), { 0, 6, height }, - { { 0, 20, height }, { 32, 2, 3 } }); + { { 0, 6, height + 68 }, { 32, 20, 3 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::Centre, 16, height, session.SupportColours); break; @@ -3635,9 +3876,7 @@ static void StandUpRCTrackLeftCorkscrewUp( { { 0, 6, height + 4 }, { 32, 20, 3 } }); break; } - - TrackPaintUtilLeftCorkscrewUpSupports(session, direction, height); - + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -3752,7 +3991,7 @@ static void StandUpRCTrackRightCorkscrewUp( { { 0, 6, height + 4 }, { 32, 20, 3 } }); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -3872,29 +4111,36 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25844), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25844), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25851), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25847), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25850), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25841), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -3917,7 +4163,7 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25843), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25843), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 1: @@ -3953,11 +4199,15 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25842), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25845), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( @@ -3966,14 +4216,17 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25852), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25839), { 0, 0, height }, { { 6, 0, height + 8 }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); switch (direction) { case 2: @@ -4000,27 +4253,34 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25841), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25844), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25844), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25851), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25847), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25850), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); switch (direction) { case 0: @@ -4053,7 +4313,7 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25843), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25843), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; case 2: @@ -4084,16 +4344,22 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25839), { 0, 0, height }, { { 0, 6, height + 8 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25842), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25845), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( @@ -4102,9 +4368,10 @@ static void StandUpRCTrackLeftHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25852), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); @@ -4134,29 +4401,36 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25825), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25825), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25828), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25831), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25834), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25834), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25838), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -4194,7 +4468,7 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25835), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25835), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; } @@ -4213,8 +4487,10 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25827), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25827), { 0, 0, height }, { { 6, 0, height + 8 }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -4223,19 +4499,24 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25837), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25833), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25836), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); switch (direction) { case 0: @@ -4262,27 +4543,34 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25828), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25831), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25834), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25834), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25838), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25825), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25825), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 2, height, session.SupportColours); switch (direction) { case 2: @@ -4320,7 +4608,7 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25835), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25835), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; case 3: @@ -4349,24 +4637,31 @@ static void StandUpRCTrackRightHalfBankedHelixUpSmall( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25837), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25833), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25836), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25827), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25827), { 0, 0, height }, { { 0, 6, height + 8 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); @@ -4426,29 +4721,36 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25812), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25812), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25823), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25817), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25822), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25807), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25807), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -4471,17 +4773,17 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25811), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25811), { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25816), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25816), { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25821), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25821), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 3: @@ -4505,22 +4807,22 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25810), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25810), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25815), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 1 } }); + { { 16, 16, height + 29 }, { 16, 16, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25820), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25820), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25805), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25805), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; } @@ -4542,13 +4844,13 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25809), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25809), { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25814), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 1 } }); + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25814), { 0, 0, height }, + { { 0, 0, height + 29 }, { 16, 32, 1 } }); break; case 2: PaintAddImageAsParentRotated( @@ -4578,11 +4880,15 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25808), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25813), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( @@ -4591,14 +4897,17 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25824), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25803), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25803), { 0, 0, height }, { { 6, 0, height + 8 }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); switch (direction) { case 2: @@ -4623,29 +4932,36 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25807), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25807), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25812), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25812), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25823), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25817), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25822), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); switch (direction) { case 0: @@ -4678,17 +4994,17 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25811), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25811), { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25816), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25816), { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 32, 1 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25821), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25821), { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); break; } @@ -4707,12 +5023,12 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25805), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25805), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25810), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25810), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 2: @@ -4722,7 +5038,7 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25820), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25820), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; } @@ -4748,12 +5064,12 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25809), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25809), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25814), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25814), { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 1 } }); break; case 3: @@ -4777,18 +5093,24 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25803), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25803), { 0, 0, height }, { { 0, 6, height + 8 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25808), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25813), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( @@ -4797,9 +5119,10 @@ static void StandUpRCTrackLeftHalfBankedHelixUpLarge( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25824), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); @@ -4829,29 +5152,36 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25781), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25781), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25786), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25791), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25796), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25796), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25802), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -4879,17 +5209,17 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25787), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25787), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25792), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 1 } }); + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25792), { 0, 0, height }, + { { 0, 0, height + 29 }, { 32, 16, 1 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25797), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25797), { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); break; } @@ -4908,22 +5238,22 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25783), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25783), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25788), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25788), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25793), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 1 } }); + { { 16, 16, height + 29 }, { 16, 16, 1 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25798), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25798), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; } @@ -4954,12 +5284,12 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25794), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 1 } }); + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25794), { 0, 0, height }, + { { 0, 0, height + 29 }, { 16, 32, 1 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25799), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25799), { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); break; } @@ -4978,8 +5308,10 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25785), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25785), { 0, 0, height }, { { 6, 0, height + 8 }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -4988,19 +5320,24 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25801), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25795), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25800), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); switch (direction) { case 0: @@ -5027,27 +5364,34 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25786), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25791), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25796), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25796), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25802), { 0, 0, height }, { { 27, 0, height }, { 1, 32, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25781), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25781), { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 1, height, session.SupportColours); switch (direction) { case 2: @@ -5075,17 +5419,17 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25787), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25787), { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25792), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 1 } }); + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25792), { 0, 0, height }, + { { 0, 0, height + 29 }, { 16, 32, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25797), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25797), { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); break; case 3: @@ -5109,22 +5453,22 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25788), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25788), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25793), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 1 } }); + { { 16, 16, height + 29 }, { 16, 16, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25798), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25798), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25783), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25783), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; } @@ -5151,12 +5495,12 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25794), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 1 } }); + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25794), { 0, 0, height }, + { { 0, 0, height + 29 }, { 32, 16, 1 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25799), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25799), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 3: @@ -5185,24 +5529,31 @@ static void StandUpRCTrackRightHalfBankedHelixUpLarge( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25801), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25795), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25800), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 11, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25785), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25785), { 0, 0, height }, { { 0, 6, height + 8 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 10, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); @@ -5670,24 +6021,31 @@ static void StandUpRCTrackLeftEighthBankToDiag( PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25675), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25679), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25683), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25687), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25687), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -5701,17 +6059,17 @@ static void StandUpRCTrackLeftEighthBankToDiag( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25676), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25676), { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25680), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25680), { 0, 0, height }, { { 0, 0, height + 27 }, { 34, 16, 0 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25684), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25684), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 3: @@ -5735,7 +6093,7 @@ static void StandUpRCTrackLeftEighthBankToDiag( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25677), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25677), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; case 1: @@ -5745,12 +6103,12 @@ static void StandUpRCTrackLeftEighthBankToDiag( break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25685), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25685), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25689), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25689), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; } @@ -5794,7 +6152,7 @@ static void StandUpRCTrackLeftEighthBankToDiag( break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25686), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25686), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); MetalASupportsPaintSetup( session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); @@ -5804,7 +6162,7 @@ static void StandUpRCTrackLeftEighthBankToDiag( session, direction, session.TrackColours.WithIndex(25690), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); break; } PaintUtilSetSegmentSupportHeight( @@ -5832,26 +6190,33 @@ static void StandUpRCTrackRightEighthBankToDiag( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25659), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25659), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25663), { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25667), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; case 3: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25671), { 0, 0, height }, { { 0, 27, height }, { 32, 1, 26 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); break; } - MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); if (direction == 0 || direction == 3) { PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); @@ -5870,17 +6235,17 @@ static void StandUpRCTrackRightEighthBankToDiag( break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25664), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25664), { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); break; case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25668), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25668), { 0, 0, height }, { { 0, 0, height + 27 }, { 34, 16, 0 } }); break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25672), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25672), { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); break; } @@ -5899,12 +6264,12 @@ static void StandUpRCTrackRightEighthBankToDiag( { case 0: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25661), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25661), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25665), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25665), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); break; case 2: @@ -5914,7 +6279,7 @@ static void StandUpRCTrackRightEighthBankToDiag( break; case 3: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25673), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25673), { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); break; } @@ -5947,14 +6312,14 @@ static void StandUpRCTrackRightEighthBankToDiag( session, direction, session.TrackColours.WithIndex(25662), { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(25666), { 0, 0, height }, + session, direction, session.TrackColours.WithIndex(SPR_G2_STANDUP_TRACK_25666), { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 1, height, session.SupportColours); break; case 2: PaintAddImageAsParentRotated( @@ -6019,38 +6384,17 @@ static void StandUpRCTrackDiagBrakes( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - TrackPaintUtilDiagTilesPaint( - session, 3, height, direction, trackSequence, StandupRCDiagBrakeImages, defaultDiagTileOffsets, defaultDiagBoundLengths, - nullptr); - - if (trackSequence == 3) - { - MetalASupportsPaintSetup( - session, supportType.metal, kDiagSupportPlacement[direction], 8, height, session.SupportColours); - } - - int32_t blockedSegments = BlockedSegments::kDiagStraightFlat[trackSequence]; - PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + TrackPaintUtilDiagTilesPaintExtra( + session, 3, height, direction, trackSequence, StandupRCDiagBrakeImages, supportType.metal); } static void StandUpRCTrackDiagBlockBrakes( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - TrackPaintUtilDiagTilesPaint( + TrackPaintUtilDiagTilesPaintExtra( session, 3, height, direction, trackSequence, StandupRCDiagBlockBrakeImages[trackElement.IsBrakeClosed()], - defaultDiagTileOffsets, defaultDiagBoundLengths, nullptr); - - if (trackSequence == 3) - { - MetalASupportsPaintSetup( - session, supportType.metal, kDiagSupportPlacement[direction], 8, height, session.SupportColours); - } - - int32_t blockedSegments = BlockedSegments::kDiagStraightFlat[trackSequence]; - PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + supportType.metal); } /** rct2: 0x008A7524 */ @@ -6165,7 +6509,7 @@ static void StandUpRCTrackDiag25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 8, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 9, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6190,7 +6534,7 @@ static void StandUpRCTrackDiag25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 8, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 9, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6334,7 +6678,7 @@ static void StandUpRCTrackDiag60DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 32, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 36, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6345,11 +6689,11 @@ static void StandUpRCTrackDiag60DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 32, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 36, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::BottomCorner, 36, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::BottomCorner, 34, height, session.SupportColours); break; } } @@ -6359,7 +6703,7 @@ static void StandUpRCTrackDiag60DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 32, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 36, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6370,11 +6714,11 @@ static void StandUpRCTrackDiag60DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 32, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 36, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::BottomCorner, 36, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::BottomCorner, 34, height, session.SupportColours); break; } } @@ -6503,7 +6847,7 @@ static void StandUpRCTrackDiagFlatTo25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6514,7 +6858,7 @@ static void StandUpRCTrackDiagFlatTo25DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -6528,7 +6872,7 @@ static void StandUpRCTrackDiagFlatTo25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6539,7 +6883,7 @@ static void StandUpRCTrackDiagFlatTo25DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -6841,7 +7185,7 @@ static void StandUpRCTrackDiag60DegUpTo25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 21, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 23, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6852,7 +7196,7 @@ static void StandUpRCTrackDiag60DegUpTo25DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 21, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 23, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -6866,7 +7210,7 @@ static void StandUpRCTrackDiag60DegUpTo25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 21, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 23, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -6877,7 +7221,7 @@ static void StandUpRCTrackDiag60DegUpTo25DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 21, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 23, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -7010,7 +7354,7 @@ static void StandUpRCTrackDiag25DegUpToFlat( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -7021,7 +7365,7 @@ static void StandUpRCTrackDiag25DegUpToFlat( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -7035,7 +7379,7 @@ static void StandUpRCTrackDiag25DegUpToFlat( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -7046,7 +7390,7 @@ static void StandUpRCTrackDiag25DegUpToFlat( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -8157,11 +8501,11 @@ static void StandUpRCTrackDiagFlatToLeftBank( session, direction, session.TrackColours.WithIndex(25724), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 2, height, session.SupportColours); break; case 2: MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); break; case 3: MetalASupportsPaintSetup( @@ -8252,14 +8596,14 @@ static void StandUpRCTrackDiagFlatToRightBank( { case 0: MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 3, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25729), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 1, height, session.SupportColours); break; case 2: MetalASupportsPaintSetup( @@ -8361,7 +8705,7 @@ static void StandUpRCTrackDiagLeftBankToFlat( session, direction, session.TrackColours.WithIndex(25731), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 1, height, session.SupportColours); break; case 2: MetalASupportsPaintSetup( @@ -8558,7 +8902,7 @@ static void StandUpRCTrackDiagLeftBankTo25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 1, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -8569,11 +8913,11 @@ static void StandUpRCTrackDiagLeftBankTo25DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 1, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::BottomCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::BottomCorner, 2, height, session.SupportColours); break; } PaintUtilSetSegmentSupportHeight( @@ -8660,7 +9004,7 @@ static void StandUpRCTrackDiagRightBankTo25DegUp( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 2, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -8671,11 +9015,11 @@ static void StandUpRCTrackDiagRightBankTo25DegUp( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 1, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::BottomCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::BottomCorner, 2, height, session.SupportColours); break; } PaintUtilSetSegmentSupportHeight( @@ -8762,7 +9106,7 @@ static void StandUpRCTrackDiag25DegUpToLeftBank( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -8773,11 +9117,11 @@ static void StandUpRCTrackDiag25DegUpToLeftBank( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 9, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::BottomCorner, 5, height, session.SupportColours); break; } PaintUtilSetSegmentSupportHeight( @@ -8864,7 +9208,7 @@ static void StandUpRCTrackDiag25DegUpToRightBank( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 10, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( @@ -8875,11 +9219,11 @@ static void StandUpRCTrackDiag25DegUpToRightBank( break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 8, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::BottomCorner, 5, height, session.SupportColours); break; } PaintUtilSetSegmentSupportHeight( @@ -8970,7 +9314,7 @@ static void StandUpRCTrackDiagLeftBankTo25DegDown( session, direction, session.TrackColours.WithIndex(25741), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); break; case 2: MetalBSupportsPaintSetup( @@ -9042,10 +9386,10 @@ static void StandUpRCTrackDiagRightBankTo25DegDown( { case 2: PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(16676), { -16, -16, height }, + session, direction, session.TrackColours.WithIndex(25733), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); PaintAddImageAsParentRotated( - session, direction, session.TrackColours.WithIndex(16680), { -16, -16, height }, + session, direction, session.TrackColours.WithIndex(25737), { -16, -16, height }, { { -16, -16, height + 35 }, { 32, 32, 0 } }); break; } @@ -9070,7 +9414,7 @@ static void StandUpRCTrackDiagRightBankTo25DegDown( session, direction, session.TrackColours.WithIndex(25736), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); break; case 2: MetalBSupportsPaintSetup( @@ -9173,11 +9517,11 @@ static void StandUpRCTrackDiag25DegDownToLeftBank( session, direction, session.TrackColours.WithIndex(25751), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); break; case 2: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 7, height, session.SupportColours); break; case 3: MetalBSupportsPaintSetup( @@ -9268,14 +9612,14 @@ static void StandUpRCTrackDiag25DegDownToRightBank( { case 0: MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 8, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25746), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalBSupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); break; case 2: MetalBSupportsPaintSetup( @@ -9374,11 +9718,11 @@ static void StandUpRCTrackDiagLeftBank( session, direction, session.TrackColours.WithIndex(25720), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 1, height, session.SupportColours); break; case 2: MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); break; case 3: MetalASupportsPaintSetup( @@ -9466,14 +9810,14 @@ static void StandUpRCTrackDiagRightBank( { case 0: MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); break; case 1: PaintAddImageAsParentRotated( session, direction, session.TrackColours.WithIndex(25722), { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); MetalASupportsPaintSetup( - session, supportType.metal, MetalSupportPlace::TopCorner, 0, height, session.SupportColours); + session, supportType.metal, MetalSupportPlace::TopCorner, 1, height, session.SupportColours); break; case 2: MetalASupportsPaintSetup( diff --git a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp index de70dc8eab..3bab58bd50 100644 --- a/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/TwisterRollerCoaster.cpp @@ -14582,6 +14582,4433 @@ static void TwisterRCTrackFlyerHalfLoopUp( } } +static void TwisterRCTrackLeftEighthToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 4)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 8)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 1)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 5)), + { 0, 0, height }, { { 0, 0, height }, { 34, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 9)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 13)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 2)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 6)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 10)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 14)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 3)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 2, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 7)), + { 0, 0, height }, { { 0, 16, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 11)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 2, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 15)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 24)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 28)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 17)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 21)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 25)), + { 0, 0, height }, { { 0, 0, height }, { 34, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 29)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 18)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 22)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 26)), + { 0, 0, height }, { { 4, 4, height }, { 28, 28, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 30)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 19)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 1, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 23)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 2, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 27)), + { 0, 0, height }, { { 0, 16, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 31)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 2, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 32)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 36)), + { 0, 0, height }, { { 16, 16, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 5, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 40)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 44)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 33)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 37)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 41)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 45)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 34)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 38)), + { 0, 0, height }, { { 0, 0, height }, { 34, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 42)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 46)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 35)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 39)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 43)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 10 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 47)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); + + if (direction == 1 || direction == 2) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 48)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 3, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 52)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 5, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 56)), + { 0, 0, height }, { { 16, 0, height }, { 16, 18, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 60)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 49)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 53)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 57)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 61)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 50)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 54)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 58)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 62)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 51)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 10 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 55)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 59)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 63)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 4, height, session.SupportColours); + if (direction == 0 || direction == 1) + { + PaintUtilPushTunnelRotated(session, direction + 1, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide), direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackRightEighthToOrthogonalUp25( + session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackLeftEighthToOrthogonalUp25( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftEighthToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackRightEighthToDiagUp25(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackLeftEighthToDiagUp25(session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagUp25ToLeftBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 4)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 0)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 1)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 3)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 2)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 10, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 10, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 10, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackDiagUp25ToRightBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 9)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 5)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 7)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 8)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 10, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 6)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 10, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 10, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedUp25ToUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 14)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 10)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 11)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 13)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 12)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 9, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 9, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 9, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagRightBankedUp25ToUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 19)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 15)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 17)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 18)), + { -16, -16, height }, { { -16, -16, height + 48 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 9, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 16)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 9, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 9, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagDown25ToLeftBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedUp25ToUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagDown25ToRightBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedUp25ToUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedDown25ToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25ToRightBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedDown25ToDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25ToLeftBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 23)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 20)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 22)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 21)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagRightBankedFlatToRightBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 27)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 24)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 26)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 25)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 31)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 28)), + { -16, -16, height }, { { -16, -16, height + 32 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 30)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 29)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 8, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 35)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 32)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 34)), + { -16, -16, height }, { { -16, -16, height + 32 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 8, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 33)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedFlatToLeftBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedFlatToRightBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedDown25ToLeftBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedFlatToRightBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedDown25ToRightBankedFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagUp25LeftBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 39)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 36)), + { -16, -16, height }, { { -16, -16, height + 42 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 38)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 37)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 11, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 11, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 11, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagUp25RightBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 43)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 40)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 42)), + { -16, -16, height }, { { -16, -16, height + 42 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 11, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 41)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 11, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 11, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagDown25LeftBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25RightBanked(session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagDown25RightBanked( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagUp25LeftBanked(session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagFlatToLeftBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 48)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 44)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 45)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 47)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 0, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 46)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagFlatToRightBankedUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 53)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 49)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 51)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 52)), + { -16, -16, height }, { { -16, -16, height + 34 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 50)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 4, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 0, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 4, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackDiagLeftBankedUp25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 58)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 54)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 55)), + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 57)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 56)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 6, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 6, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 6, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagRightBankedUp25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 63)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 59)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 61)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 62)), + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 3: + switch (direction) + { + case 0: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 6, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 60)), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 3 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 6, height, session.SupportColours); + break; + case 2: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 6, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + } +} + +static void TwisterRCTrackDiagFlatToLeftBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagRightBankedUp25ToFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagFlatToRightBankedDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagLeftBankedUp25ToFlat( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagLeftBankedDown25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagFlatToRightBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackDiagRightBankedDown25ToFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackDiagFlatToLeftBankedUp25( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftEighthBankToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 64)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height - 4, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 68)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 72)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 76)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 12, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 65)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 69)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 73)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 77)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 66)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 70)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 40, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 74)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 78)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 67)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 1, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 71)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 4, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 75)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 7, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 79)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 7, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthBankToDiagUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 80)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 12, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 84)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 88)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 6, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 92)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height - 4, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 81)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 85)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 89)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 93)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 82)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 86)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 90)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 40, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 94)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 83)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 7, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 87)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 7, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 91)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 4, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 95)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthBankToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 96)), + { 0, 0, height }, { { 0, 0, height + 40 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 5, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 100)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 7, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 104)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 9, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 108)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 97)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 101)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 105)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 109)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 98)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 102)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 106)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 110)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 99)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 103)), + { 0, 0, height }, { { 0, 31, height }, { 32, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 107)), + { 0, 0, height }, { { 0, 0, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 111)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + } + if (direction == 1 || direction == 2) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackRightEighthBankToOrthogonalUp25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 112)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::RightCorner, 9, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 116)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomCorner, 7, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 120)), + { 0, 0, height }, { { 0, 0, height + 40 }, { 32, 32, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::LeftCorner, 5, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 124)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopCorner, 8, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 113)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 117)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 121)), + { 0, 0, height }, { { 0, 0, height + 32 }, { 32, 32, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 125)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 114)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 118)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 122)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 126)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 115)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 8, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 119)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 123)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 127)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 9, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 1) + { + PaintUtilPushTunnelRotated(session, direction + 1, height + 8, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomRightSide), direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + } +} + +static void TwisterRCTrackLeftEighthBankToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackRightEighthBankToOrthogonalUp25( + session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthBankToDiagDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + uint8_t map[5] = { 4, 3, 1, 2, 0 }; + trackSequence = map[trackSequence]; + TwisterRCTrackLeftEighthBankToOrthogonalUp25( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftEighthBankToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackRightEighthBankToDiagUp25( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightEighthBankToOrthogonalDown25( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + TwisterRCTrackLeftEighthBankToDiagUp25( + session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftLargeCorkscrewUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 0)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 5)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 10)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 15)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 1)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 21, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 6)), + { 0, 0, height }, { { 0, 6, height + 48 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 19, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 11)), + { 0, 0, height }, { { 0, 6, height }, { 30, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 20, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 16, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 2)), + { 0, 0, height }, { { 0, 31, height }, { 48, 1, 64 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 7)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 12)), + { 0, 0, height }, { { 2, 2, height + 48 }, { 28, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 17)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 4: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 3)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 63, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 8)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 63, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 13)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 24, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 63, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 63, session.SupportColours); + break; + } + + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 5: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 4)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 9)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 14)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 19)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 3: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackRightLargeCorkscrewUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 20)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 25)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 30)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 35)), + { 0, 0, height }, { { 0, 6, height + 4 }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomRightSide, PaintSegment::centre, PaintSegment::rightCorner, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 16, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 26)), + { 0, 0, height }, { { 0, 6, height }, { 30, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 20, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 31)), + { 0, 0, height }, { { 0, 6, height + 48 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 19, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 36)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 21, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, + PaintSegment::bottomRightSide, PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 22)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 27)), + { 0, 0, height }, { { 2, 2, height + 48 }, { 28, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 32)), + { 0, 0, height }, { { 2, 2, height + 48 }, { 28, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 37)), + { 0, 0, height }, { { 0, 31, height }, { 48, 1, 64 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 4: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 23)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 63, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 28)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 24, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 63, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 33)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 63, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 38)), + { 0, 0, height }, { { 2, 2, height + 50 }, { 28, 28, 0 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 63, session.SupportColours); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 5: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 24)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 29)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 26, 28, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 34)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_CORKSCREW + 39)), + { 0, 0, height }, { { 2, 2, height + 40 }, { 28, 28, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomLeftSide, PaintSegment::bottomCorner, + PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 1: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackLeftLargeCorkscrewDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightLargeCorkscrewUp( + session, ride, 5 - trackSequence, (direction + 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightLargeCorkscrewDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftLargeCorkscrewUp( + session, ride, 5 - trackSequence, (direction - 1) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftMediumHalfLoopUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 5)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 10)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 15)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 1)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 6)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 0 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 40)), + { 0, 0, height }, { { 0, 31, height }, { 0, 32, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 11)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 41)), + { 0, 0, height }, { { 0, 32, height }, { 32, 0, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::topCorner), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 2)), + { 0, 0, height }, { { 0, 0, height + 2 }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 14, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 7)), + { 0, 0, height }, { { 29, 0, height }, { 1, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 16, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 12)), + { 0, 0, height }, { { 31, 0, height }, { 1, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 18, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 17)), + { 0, 0, height }, { { 0, 0, height }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 14, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::centre, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 3), + { 0, 0, height }, { { 2, 0, height }, { 1, 32, 160 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 8), + { 0, 0, height }, { { 0, 0, height + 140 }, { 32, 32, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 13), + { 0, 0, height }, { { 29, 0, height }, { 1, 32, 160 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 18), + { 0, 0, height }, { { 0, 0, height }, { 1, 32, 160 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::centre, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 4)), + { 0, 0, height }, { { 0, 2, height + 48 }, { 32, 32, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 9)), + { 0, 0, height }, { { 0, 2, height + 48 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 14)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 19)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topRightSide, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner), + direction), + 0xFFFF, 0); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 16, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackRightMediumHalfLoopUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 25)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 30)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 35)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 7, height, session.SupportColours); + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 26)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 42)), + { 0, 0, height }, { { 0, 32, height }, { 32, 0, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 31)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 43)), + { 0, 0, height }, { { 0, 31, height }, { 0, 32, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 36)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topRightSide, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 22)), + { 0, 0, height }, { { 0, 0, height }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 14, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 27)), + { 0, 0, height }, { { 30, 16, height }, { 0, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 18, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 32)), + { 0, 0, height }, { { 29, 0, height }, { 0, 32, 96 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 16, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 37)), + { 0, 0, height }, { { 0, 0, height + 2 }, { 32, 32, 0 } }); + MetalBSupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 14, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::centre, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 23), + { 0, 0, height }, { { 0, 0, height }, { 1, 32, 160 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 28), + { 0, 0, height }, { { 29, 16, height }, { 0, 16, 160 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 33), + { 0, 0, height }, { { 0, 0, height + 140 }, { 32, 32, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 38), + { 0, 0, height }, { { 2, 0, height }, { 1, 32, 160 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 144); + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 24)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 29)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 34)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 39)), + { 0, 0, height }, { { 0, 0, height + 48 }, { 32, 32, 1 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::topCorner), + direction), + 0xFFFF, 0); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 16, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + } +} + +static void TwisterRCTrackLeftMediumHalfLoopDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightMediumHalfLoopUp(session, ride, 4 - trackSequence, direction, height, trackElement, supportType); +} + +static void TwisterRCTrackRightMediumHalfLoopDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftMediumHalfLoopUp(session, ride, 4 - trackSequence, direction, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 0)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 1)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 32, 20, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 4)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 5)), { 0, 0, height }, + { { 0, 31, height }, { 40, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 8)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 14, height, session.SupportColours); + break; + } + + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 2)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 6)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 40, 20, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 9)), { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 13)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 3)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 40, 20, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 7)), { 0, 0, height }, + { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 10)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 11)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 14)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 15)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height + 42, session.SupportColours); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackRightZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 14, height, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 5, height, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 24)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 25)), + { 0, 0, height }, { { 0, 31, height }, { 40, 1, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 3, height, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 28)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 29)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 32, 20, 1 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 17)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 26)), + { 0, 0, height }, { { 0, 31, height }, { 44, 1, 32 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 30)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 19)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 22)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 23)), + { 0, 0, height }, { { 0, 6, height + 36 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 27)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 32, 20, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_ZERO_G_ROLL + 31)), + { 0, 0, height }, { { 0, 6, height + 32 }, { 40, 20, 1 } }); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::bottomRightSide, PaintSegment::rightCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::Centre, 0, height + 42, session.SupportColours); + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackLeftZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftZeroGRollUp(session, ride, 2 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightZeroGRollUp(session, ride, 2 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackLeftLargeZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 5)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 9)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 10)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 15)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 21, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 88); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 1)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 2)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 6)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 11)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 3)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 7)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 48 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 12)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 48 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 17)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 18)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::topLeftSide, PaintSegment::topCorner, + PaintSegment::bottomLeftSide, PaintSegment::centre, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 4)), + { 0, 0, height }, { { 0, 26, height }, { 32, 0, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 25, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 8)), + { 0, 0, height }, { { 0, 26, height }, { 32, 0, 20 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 32, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 13)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 14)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 36, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 19)), + { 0, 0, height }, { { 0, 18, height }, { 32, 1, 30 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 37, session.SupportColours); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackRightLargeZeroGRollUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 25)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 26)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 31)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 35)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + } + MetalASupportsPaintSetup(session, supportType.metal, MetalSupportPlace::Centre, 21, height, session.SupportColours); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::SlopeStart); + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 88); + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 21)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 27)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 64 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 32)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 36)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 3 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 37)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 96 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, PaintUtilRotateSegments(BlockedSegments::kStraightFlat, direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 72); + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 22)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 23)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 28)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 48 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 33)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 48 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 38)), + { 0, 0, height }, { { 0, 30, height }, { 32, 0, 64 } }); + break; + } + + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 3: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 24)), + { 0, 0, height }, { { 0, 18, height }, { 32, 1, 30 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomLeftSide, 0, height + 37, session.SupportColours); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 29)), + { 0, 0, height }, { { 0, 2, height }, { 32, 0, 32 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 30)), + { 0, 0, height }, { { 0, 6, height + 40 }, { 32, 20, 3 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopLeftSide, 0, height + 36, session.SupportColours); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 34)), + { 0, 0, height }, { { 0, 26, height }, { 32, 0, 20 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::TopRightSide, 0, height + 32, session.SupportColours); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 39)), + { 0, 0, height }, { { 0, 26, height }, { 40, 0, 32 } }); + MetalASupportsPaintSetup( + session, supportType.metal, MetalSupportPlace::BottomRightSide, 0, height + 25, session.SupportColours); + break; + } + switch (direction) + { + case 1: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 2: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + 40); + break; + } +} + +static void TwisterRCTrackLeftLargeZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackLeftLargeZeroGRollUp( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + +static void TwisterRCTrackRightLargeZeroGRollDown( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + TwisterRCTrackRightLargeZeroGRollUp( + session, ride, 3 - trackSequence, (direction + 2) & 3, height, trackElement, supportType); +} + TRACK_PAINT_FUNCTION GetTrackPaintFunctionTwisterRC(OpenRCT2::TrackElemType trackType) { switch (trackType) @@ -14968,6 +19395,141 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionTwisterRC(OpenRCT2::TrackElemType trac return TwisterRCTrackRightFlyerTwistUp; case TrackElemType::FlyerHalfLoopUninvertedUp: return TwisterRCTrackFlyerHalfLoopUp; + + // Large curved slopes + case TrackElemType::LeftEighthToDiagUp25: + return TwisterRCTrackLeftEighthToDiagUp25; + case TrackElemType::RightEighthToDiagUp25: + return TwisterRCTrackRightEighthToDiagUp25; + case TrackElemType::LeftEighthToDiagDown25: + return TwisterRCTrackLeftEighthToDiagDown25; + case TrackElemType::RightEighthToDiagDown25: + return TwisterRCTrackRightEighthToDiagDown25; + case TrackElemType::LeftEighthToOrthogonalUp25: + return TwisterRCTrackLeftEighthToOrthogonalUp25; + case TrackElemType::RightEighthToOrthogonalUp25: + return TwisterRCTrackRightEighthToOrthogonalUp25; + case TrackElemType::LeftEighthToOrthogonalDown25: + return TwisterRCTrackLeftEighthToOrthogonalDown25; + case TrackElemType::RightEighthToOrthogonalDown25: + return TwisterRCTrackRightEighthToOrthogonalDown25; + + // Diagonal unbanked to banked + case TrackElemType::DiagUp25ToLeftBankedUp25: + return TwisterRCTrackDiagUp25ToLeftBankedUp25; + case TrackElemType::DiagUp25ToRightBankedUp25: + return TwisterRCTrackDiagUp25ToRightBankedUp25; + case TrackElemType::DiagLeftBankedUp25ToUp25: + return TwisterRCTrackDiagLeftBankedUp25ToUp25; + case TrackElemType::DiagRightBankedUp25ToUp25: + return TwisterRCTrackDiagRightBankedUp25ToUp25; + case TrackElemType::DiagDown25ToLeftBankedDown25: + return TwisterRCTrackDiagDown25ToLeftBankedDown25; + case TrackElemType::DiagDown25ToRightBankedDown25: + return TwisterRCTrackDiagDown25ToRightBankedDown25; + case TrackElemType::DiagLeftBankedDown25ToDown25: + return TwisterRCTrackDiagLeftBankedDown25ToDown25; + case TrackElemType::DiagRightBankedDown25ToDown25: + return TwisterRCTrackDiagRightBankedDown25ToDown25; + case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + return TwisterRCTrackDiagLeftBankedFlatToLeftBankedUp25; + case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + return TwisterRCTrackDiagRightBankedFlatToRightBankedUp25; + case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + return TwisterRCTrackDiagLeftBankedUp25ToLeftBankedFlat; + case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + return TwisterRCTrackDiagRightBankedUp25ToRightBankedFlat; + case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + return TwisterRCTrackDiagLeftBankedFlatToLeftBankedDown25; + case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + return TwisterRCTrackDiagRightBankedFlatToRightBankedDown25; + case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + return TwisterRCTrackDiagLeftBankedDown25ToLeftBankedFlat; + case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + return TwisterRCTrackDiagRightBankedDown25ToRightBankedFlat; + case TrackElemType::DiagUp25LeftBanked: + return TwisterRCTrackDiagUp25LeftBanked; + case TrackElemType::DiagUp25RightBanked: + return TwisterRCTrackDiagUp25RightBanked; + case TrackElemType::DiagDown25LeftBanked: + return TwisterRCTrackDiagDown25LeftBanked; + case TrackElemType::DiagDown25RightBanked: + return TwisterRCTrackDiagDown25RightBanked; + case TrackElemType::DiagFlatToLeftBankedUp25: + return TwisterRCTrackDiagFlatToLeftBankedUp25; + case TrackElemType::DiagFlatToRightBankedUp25: + return TwisterRCTrackDiagFlatToRightBankedUp25; + case TrackElemType::DiagLeftBankedUp25ToFlat: + return TwisterRCTrackDiagLeftBankedUp25ToFlat; + case TrackElemType::DiagRightBankedUp25ToFlat: + return TwisterRCTrackDiagRightBankedUp25ToFlat; + case TrackElemType::DiagFlatToLeftBankedDown25: + return TwisterRCTrackDiagFlatToLeftBankedDown25; + case TrackElemType::DiagFlatToRightBankedDown25: + return TwisterRCTrackDiagFlatToRightBankedDown25; + case TrackElemType::DiagLeftBankedDown25ToFlat: + return TwisterRCTrackDiagLeftBankedDown25ToFlat; + case TrackElemType::DiagRightBankedDown25ToFlat: + return TwisterRCTrackDiagRightBankedDown25ToFlat; + + // Large banked curved slopes + case TrackElemType::LeftEighthBankToDiagUp25: + return TwisterRCTrackLeftEighthBankToDiagUp25; + case TrackElemType::RightEighthBankToDiagUp25: + return TwisterRCTrackRightEighthBankToDiagUp25; + case TrackElemType::LeftEighthBankToDiagDown25: + return TwisterRCTrackLeftEighthBankToDiagDown25; + case TrackElemType::RightEighthBankToDiagDown25: + return TwisterRCTrackRightEighthBankToDiagDown25; + case TrackElemType::LeftEighthBankToOrthogonalUp25: + return TwisterRCTrackLeftEighthBankToOrthogonalUp25; + case TrackElemType::RightEighthBankToOrthogonalUp25: + return TwisterRCTrackRightEighthBankToOrthogonalUp25; + case TrackElemType::LeftEighthBankToOrthogonalDown25: + return TwisterRCTrackLeftEighthBankToOrthogonalDown25; + case TrackElemType::RightEighthBankToOrthogonalDown25: + return TwisterRCTrackRightEighthBankToOrthogonalDown25; + + // Large corkscrews + case TrackElemType::LeftLargeCorkscrewUp: + return TwisterRCTrackLeftLargeCorkscrewUp; + case TrackElemType::RightLargeCorkscrewUp: + return TwisterRCTrackRightLargeCorkscrewUp; + case TrackElemType::LeftLargeCorkscrewDown: + return TwisterRCTrackLeftLargeCorkscrewDown; + case TrackElemType::RightLargeCorkscrewDown: + return TwisterRCTrackRightLargeCorkscrewDown; + + // Medium half loops + case TrackElemType::LeftMediumHalfLoopUp: + return TwisterRCTrackLeftMediumHalfLoopUp; + case TrackElemType::RightMediumHalfLoopUp: + return TwisterRCTrackRightMediumHalfLoopUp; + case TrackElemType::LeftMediumHalfLoopDown: + return TwisterRCTrackLeftMediumHalfLoopDown; + case TrackElemType::RightMediumHalfLoopDown: + return TwisterRCTrackRightMediumHalfLoopDown; + + // Zero g rolls + case TrackElemType::LeftZeroGRollUp: + return TwisterRCTrackLeftZeroGRollUp; + case TrackElemType::RightZeroGRollUp: + return TwisterRCTrackRightZeroGRollUp; + case TrackElemType::LeftZeroGRollDown: + return TwisterRCTrackLeftZeroGRollDown; + case TrackElemType::RightZeroGRollDown: + return TwisterRCTrackRightZeroGRollDown; + + // Large zero g rolls + case TrackElemType::LeftLargeZeroGRollUp: + return TwisterRCTrackLeftLargeZeroGRollUp; + case TrackElemType::RightLargeZeroGRollUp: + return TwisterRCTrackRightLargeZeroGRollUp; + case TrackElemType::LeftLargeZeroGRollDown: + return TwisterRCTrackLeftLargeZeroGRollDown; + case TrackElemType::RightLargeZeroGRollDown: + return TwisterRCTrackRightLargeZeroGRollDown; + default: return nullptr; } diff --git a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp index af2f92fb46..5d045ebb09 100644 --- a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp +++ b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.cpp @@ -7,7 +7,7 @@ * OpenRCT2 is licensed under the GNU General Public License version 3. *****************************************************************************/ -#include "WoodenRollerCoaster.h" +#include "WoodenRollerCoaster.hpp" #include "../../../config/Config.h" #include "../../../drawing/Drawing.h" @@ -29,7 +29,7 @@ using namespace OpenRCT2; -static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; +// static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; enum { @@ -194,6 +194,66 @@ enum SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_3 = 23662, SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_5 = 23663, SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_6 = 23664, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_0 = 23665, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_0 = 23666, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_0 = 23667, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_0 = 23668, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_0 = 23669, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_1 = 23670, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_1 = 23671, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_1 = 23672, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_1 = 23673, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_1 = 23674, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_2 = 23675, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_2 = 23676, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_2 = 23677, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_2 = 23678, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_2 = 23679, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_3 = 23680, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_3 = 23681, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_3 = 23682, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_3 = 23683, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_3 = 23684, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_0 = 23685, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_0 = 23686, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_0 = 23687, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_0 = 23688, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_0 = 23689, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_2 = 23690, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_2 = 23691, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_2 = 23692, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_2 = 23693, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_2 = 23694, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_3 = 23695, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_3 = 23696, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_3 = 23697, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_3 = 23698, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_3 = 23699, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_0 = 23700, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_0 = 23701, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_0 = 23702, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_0 = 23703, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_0 = 23704, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_1 = 23705, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_1 = 23706, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_1 = 23707, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_1 = 23708, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_1 = 23709, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_2 = 23710, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_2 = 23711, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_2 = 23712, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_2 = 23713, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_2 = 23714, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_3 = 23715, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_3 = 23716, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_3 = 23717, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_3 = 23718, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_3 = 23719, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_1 = 23720, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_1 = 23721, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_1 = 23722, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_1 = 23723, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_1 = 23724, SPR_WOODEN_RC_FLAT_CHAIN_SW_NE = 23749, SPR_WOODEN_RC_FLAT_CHAIN_NW_SE = 23750, @@ -208,64 +268,177 @@ enum SPR_WOODEN_RC_BLOCK_BRAKES_SW_NE_CLOSED = 23759, SPR_WOODEN_RC_BLOCK_BRAKES_NW_SE_CLOSED = 23760, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_0 = 23841, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_1 = 23842, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_2 = 23843, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_3 = 23844, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_4 = 23845, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_5 = 23846, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_6 = 23847, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_7 = 23848, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_8 = 23849, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_9 = 23850, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_10 = 23851, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_11 = 23852, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_12 = 23853, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_13 = 23854, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_14 = 23855, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_15 = 23856, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_16 = 23857, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_17 = 23858, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_18 = 23859, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_19 = 23860, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_20 = 23861, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_21 = 23862, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_22 = 23863, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_23 = 23864, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_24 = 23865, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_25 = 23866, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_26 = 23867, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_27 = 23868, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_28 = 23869, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_29 = 23870, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_30 = 23871, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_31 = 23872, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_32 = 23873, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_33 = 23874, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_34 = 23875, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_35 = 23876, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_36 = 23877, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_37 = 23878, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_38 = 23879, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_39 = 23880, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_40 = 23881, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_41 = 23882, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_42 = 23883, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_43 = 23884, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_44 = 23885, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_45 = 23886, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_46 = 23887, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_47 = 23888, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_48 = 23889, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_49 = 23890, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_50 = 23891, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_51 = 23892, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_52 = 23893, - SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_53 = 23894, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_3 = 23841, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_3 = 23842, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_3 = 23843, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_0 = 23844, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_0 = 23845, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_0 = 23846, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_1 = 23847, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_1 = 23848, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_1 = 23849, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_2 = 23850, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_2 = 23851, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_2 = 23852, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_2_3 = 23853, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_1_3 = 23854, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_0_3 = 23855, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_2_1 = 23856, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_1_1 = 23857, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_0_1 = 23858, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_0 = 23859, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_0 = 23860, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_0 = 23861, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_1 = 23862, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_1 = 23863, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_1 = 23864, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_2 = 23865, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_2 = 23866, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_2 = 23867, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_3 = 23868, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_3 = 23869, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_3 = 23870, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_0 = 23871, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_0 = 23872, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_0 = 23873, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_2 = 23874, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_2 = 23875, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_2 = 23876, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_3 = 23877, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_3 = 23878, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_3 = 23879, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_0 = 23880, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_0 = 23881, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_0 = 23882, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_1 = 23883, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_1 = 23884, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_1 = 23885, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_2 = 23886, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_2 = 23887, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_2 = 23888, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_3 = 23889, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_3 = 23890, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_3 = 23891, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_1 = 23892, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_1 = 23893, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_1 = 23894, + + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_0 = 23947, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_0 = 23948, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_1 = 23949, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_1 = 23950, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_2 = 23951, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_2 = 23952, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_3 = 23953, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_3 = 23954, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_3 = 23955, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_3 = 23956, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_0 = 23957, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_0 = 23958, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_1 = 23959, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_1 = 23960, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_2 = 23961, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_2 = 23962, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_0 = 23963, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_0 = 23964, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1 = 23965, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_2 = 23966, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2 = 23967, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_3 = 23968, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_3 = 23969, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1 = 23970, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_1 = 23971, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2 = 23972, SPR_WOODEN_RC_STATION_SW_NE = 23973, SPR_WOODEN_RC_STATION_NW_SE = 23974, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_0 = 24077, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_1 = 24078, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_2 = 24079, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_3 = 24080, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_0 = 24081, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_2 = 24082, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_0 = 24083, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_1 = 24084, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_2 = 24085, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_3 = 24086, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_0 = 24087, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_2 = 24088, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_0 = 24089, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_1 = 24090, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_2 = 24091, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_3 = 24092, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_0 = 24093, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_2 = 24094, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_0 = 24095, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_1 = 24096, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_2 = 24097, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_3 = 24098, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_0 = 24099, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_2 = 24100, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_0 = 24101, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_1 = 24102, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_2 = 24103, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_3 = 24104, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_0 = 24105, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_2 = 24106, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_0 = 24107, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_1 = 24108, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_2 = 24109, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_3 = 24110, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_0 = 24111, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_2 = 24112, + + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_0 = 24161, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_0 = 24162, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_0 = 24163, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_0 = 24164, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_1 = 24165, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_1 = 24166, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_1 = 24167, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_1 = 24168, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_2 = 24169, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_2 = 24170, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_2 = 24171, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_2 = 24172, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_3 = 24173, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_3 = 24174, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_3 = 24175, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_3 = 24176, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_0 = 24177, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_0 = 24178, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_0 = 24179, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_0 = 24180, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_2 = 24181, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_2 = 24182, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_2 = 24183, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_2 = 24184, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_0 = 24185, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_0 = 24186, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_0 = 24187, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_0 = 24188, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_1 = 24189, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_1 = 24190, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_1 = 24191, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_1 = 24192, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_2 = 24193, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_2 = 24194, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_2 = 24195, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_2 = 24196, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_3 = 24197, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_3 = 24198, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_3 = 24199, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_3 = 24200, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_1 = 24201, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_1 = 24202, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_1 = 24203, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_1 = 24204, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_3 = 24205, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_3 = 24206, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_3 = 24207, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_3 = 24208, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SW_NE = 24363, SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NW_SE = 24364, SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NE_SW = 24365, @@ -427,6 +600,66 @@ enum SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_3 = 24528, SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_5 = 24529, SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_6 = 24530, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0 = 24531, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0 = 24532, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0 = 24533, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0 = 24534, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0 = 24535, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1 = 24536, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1 = 24537, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1 = 24538, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1 = 24539, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1 = 24540, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2 = 24541, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2 = 24542, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2 = 24543, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2 = 24544, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2 = 24545, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3 = 24546, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3 = 24547, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3 = 24548, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3 = 24549, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3 = 24550, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_0 = 24551, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_0 = 24552, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_0 = 24553, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_0 = 24554, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_0 = 24555, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_2 = 24556, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_2 = 24557, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_2 = 24558, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_2 = 24559, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_2 = 24560, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3 = 24561, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3 = 24562, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3 = 24563, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3 = 24564, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3 = 24565, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0 = 24566, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0 = 24567, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0 = 24568, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0 = 24569, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0 = 24570, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1 = 24571, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1 = 24572, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1 = 24573, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1 = 24574, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1 = 24575, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2 = 24576, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2 = 24577, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2 = 24578, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2 = 24579, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2 = 24580, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_3 = 24581, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_3 = 24582, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_3 = 24583, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_3 = 24584, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_3 = 24585, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_1 = 24586, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_1 = 24587, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_1 = 24588, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_1 = 24589, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_1 = 24590, SPR_WOODEN_RC_FLAT_CHAIN_RAILS_SW_NE = 24615, SPR_WOODEN_RC_FLAT_CHAIN_RAILS_NW_SE = 24616, @@ -439,8 +672,176 @@ enum SPR_WOODEN_RC_BLOCK_BRAKES_RAILS_SW_NE = 24623, SPR_WOODEN_RC_BLOCK_BRAKES_RAILS_NW_SE = 24624, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_3 = 24707, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_3 = 24708, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_3 = 24709, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_0 = 24710, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_0 = 24711, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_0 = 24712, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_1 = 24713, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_1 = 24714, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_1 = 24715, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_2 = 24716, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_2 = 24717, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_2 = 24718, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_3 = 24719, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_3 = 24720, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_3 = 24721, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_1 = 24722, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_1 = 24723, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_1 = 24724, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0 = 24725, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0 = 24726, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0 = 24727, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1 = 24728, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1 = 24729, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1 = 24730, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2 = 24731, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2 = 24732, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2 = 24733, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3 = 24734, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3 = 24735, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3 = 24736, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_0 = 24737, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_0 = 24738, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_0 = 24739, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_2 = 24740, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_2 = 24741, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_2 = 24742, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3 = 24743, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3 = 24744, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3 = 24745, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0 = 24746, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0 = 24747, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0 = 24748, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1 = 24749, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1 = 24750, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1 = 24751, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2 = 24752, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2 = 24753, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2 = 24754, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_3 = 24755, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_3 = 24756, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_3 = 24757, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_1 = 24758, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_1 = 24759, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_1 = 24760, + + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0 = 24813, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0 = 24814, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1 = 24815, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1 = 24816, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2 = 24817, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2 = 24818, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3 = 24819, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3 = 24820, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3 = 24821, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3 = 24822, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0 = 24823, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0 = 24824, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1 = 24825, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1 = 24826, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2 = 24827, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2 = 24828, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_0 = 24829, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_0 = 24830, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1 = 24831, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_2 = 24832, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2 = 24833, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_3 = 24834, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_3 = 24835, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1 = 24836, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_1 = 24837, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2 = 24838, + SPR_WOODEN_RC_STATION_RAILS_SW_NE = 24839, SPR_WOODEN_RC_STATION_RAILS_NW_SE = 24840, + + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_0 = 24943, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_1 = 24944, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_2 = 24945, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_3 = 24946, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_0 = 24947, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_2 = 24948, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_0 = 24949, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_1 = 24950, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_2 = 24951, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_3 = 24952, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0 = 24953, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = 24954, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_0 = 24955, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_1 = 24956, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_2 = 24957, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_3 = 24958, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_0 = 24959, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_2 = 24960, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_0 = 24961, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_1 = 24962, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_2 = 24963, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_3 = 24964, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_0 = 24965, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_2 = 24966, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_0 = 24967, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_1 = 24968, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_2 = 24969, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_3 = 24970, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0 = 24971, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2 = 24972, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_0 = 24973, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_1 = 24974, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_2 = 24975, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_3 = 24976, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0 = 24977, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2 = 24978, + + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0 = 25027, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0 = 25028, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0 = 25029, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0 = 25030, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1 = 25031, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1 = 25032, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1 = 25033, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1 = 25034, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2 = 25035, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2 = 25036, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2 = 25037, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2 = 25038, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3 = 25039, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3 = 25040, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3 = 25041, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3 = 25042, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_0 = 25043, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_0 = 25044, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_0 = 25045, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_0 = 25046, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_2 = 25047, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_2 = 25048, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_2 = 25049, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_2 = 25050, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0 = 25051, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0 = 25052, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0 = 25053, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0 = 25054, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1 = 25055, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1 = 25056, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1 = 25057, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1 = 25058, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2 = 25059, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2 = 25060, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2 = 25061, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2 = 25062, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3 = 25063, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3 = 25064, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3 = 25065, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3 = 25066, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_1 = 25067, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_1 = 25068, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_1 = 25069, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_1 = 25070, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_3 = 25071, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_3 = 25072, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_3 = 25073, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_3 = 25074, }; static constexpr uint32_t _wooden_rc_block_brakes_image_ids[4][3] = { @@ -479,6 +880,1120 @@ static constexpr const uint32_t WoodenRCDiagBlockBrakeImages[2][kNumOrthogonalDi }, }; +static constexpr std::array kFlatToLeftBankImages = { { + { + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SW_NE, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SW_NE, + }, + { + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NW_SE, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NW_SE, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_NW_SE, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_NW_SE, + }, + { + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NE_SW, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NE_SW, + }, + { + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SE_NW, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SE_NW, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_SE_NW, + SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_SE_NW, + }, +} }; + +static constexpr std::array kFlatToRightBankImages = { { + { + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SW_NE, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SW_NE, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_SW_NE, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_SW_NE, + }, + { + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NW_SE, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NW_SE, + }, + { + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NE_SW, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NE_SW, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_NE_SW, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_NE_SW, + }, + { + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SE_NW, + SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SE_NW, + }, +} }; + +static constexpr std::array kLeftBankImages = { { + { SPR_WOODEN_RC_LEFT_BANK_SW_NE, SPR_WOODEN_RC_LEFT_BANK_RAILS_SW_NE }, + { SPR_WOODEN_RC_LEFT_BANK_NW_SE, SPR_WOODEN_RC_LEFT_BANK_RAILS_NW_SE }, + { SPR_WOODEN_RC_LEFT_BANK_NE_SW, SPR_WOODEN_RC_LEFT_BANK_RAILS_NE_SW }, + { SPR_WOODEN_RC_LEFT_BANK_SE_NW, SPR_WOODEN_RC_LEFT_BANK_RAILS_SE_NW }, +} }; + +static constexpr std::array kUp25ToLeftBankImages = { { + { + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SW_NE, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SW_NE, + }, + { + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NW_SE, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NW_SE, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NW_SE, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NW_SE, + }, + { + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NE_SW, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NE_SW, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NE_SW, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NE_SW, + }, + { + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SE_NW, + SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SE_NW, + }, +} }; + +static constexpr std::array kUp25ToRightBankImages = { { + { + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SW_NE, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SW_NE, + }, + { + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NW_SE, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NW_SE, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NW_SE, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NW_SE, + }, + { + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NE_SW, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NE_SW, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NE_SW, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NE_SW, + }, + { + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SE_NW, + SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SE_NW, + }, +} }; + +static constexpr std::array kLeftBankToUp25Images = { { + { + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_SW_NE, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_SW_NE, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_NW_SE, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_NW_SE, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_FRONT_NW_SE, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_FRONT_NW_SE, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_NE_SW, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_NE_SW, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_FRONT_NE_SW, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_FRONT_NE_SW, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_SE_NW, + SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_SE_NW, + }, +} }; +static constexpr std::array kRightBankToUp25Images = { { + { + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_SW_NE, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_SW_NE, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_NW_SE, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_NW_SE, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_FRONT_NW_SE, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_FRONT_NW_SE, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_NE_SW, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_NE_SW, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_FRONT_NE_SW, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_FRONT_NE_SW, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_SE_NW, + SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_SE_NW, + }, +} }; + +static constexpr std::array, 3> kBankedQuarterTurn3Images = { { + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_0_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_0_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_0_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_0_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_1_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_1_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_1_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_1_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_2_1, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_2_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_HANDRAIL_2_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_2_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_3_FRONT_HANDRAIL_2_3, + }, + } }, +} }; + +static constexpr std::array, 5> kBankedQuarterTurn5Images = { { + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_0, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_0, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_0, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_0, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_0, + }, + } }, + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_2, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_2, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_2, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_2, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_2, + }, + } }, + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_3, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_3, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_3, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_3, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_3, + }, + } }, + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_5, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_5, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_5, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_5, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_5, + }, + } }, + { { + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_6, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_6, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_6, + }, + { + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_6, + SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_6, + }, + } }, +} }; + +static constexpr std::array, 3> kLeftHalfBankedHelixUpSmallImages = { { + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_0_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_1_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_2_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_3, + }, + } }, +} }; + +static constexpr std::array, 3> kRightHalfBankedHelixUpSmallImages = { + { + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_0_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_0_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_1_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_1_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_2_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_FRONT_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_2_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_UP_SMALL_HANDRAIL_2_3, + }, + } }, + } +}; + +static constexpr std::array, 5> kLeftHalfBankedHelixUpLargeImages = { { + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_0_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_1_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_2_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_3_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_0, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_1, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_1, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_2, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2, + }, + { + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_4_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_3, + SPR_WOODEN_RC_LEFT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_3, + }, + } }, +} }; + +static constexpr std::array, 5> kRightHalfBankedHelixUpLargeImages = { + { + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_0_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_0_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_1_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_1_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_2_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_2_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_3_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_3_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_3_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_3_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_0, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_0, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_1, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_1, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_4_2, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_FRONT_HANDRAIL_4_2, + }, + { + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_4_3, + SPR_WOODEN_RC_RIGHT_HALF_BANKED_HELIX_LARGE_UP_HANDRAIL_4_3, + }, + } }, + } +}; + +static constexpr std::array, 2> + kLeftBankToLeftQuarterTurn325DegUpImages = { { + { { + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_0, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_1, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_1, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_2, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_0_3, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_3, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_0, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_1, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_2, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_1_3, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_3, + SPR_WOODEN_RC_LEFT_BANK_TO_LEFT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_3, + }, + } }, + } }; + +static constexpr std::array, 2> + kRightBankToRightQuarterTurn325DegUpImages = { { + { { + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_0, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_0, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_0, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_1, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_2, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_2, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_0_2, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_0_3, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_0, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_0, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_0, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_1, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_1, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_1, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_2, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_2, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_1_2, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_FRONT_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_1_3, + SPR_WOODEN_RC_RIGHT_BANK_TO_RIGHT_QUARTER_TURN_3_25_DEG_UP_HANDRAIL_1_3, + }, + } }, + } }; + +static constexpr std::array kDiagFlatToLeftBankImages = { { + { + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_0, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_0, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_0, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_1, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_1, + }, + { + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_2, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_2, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_2, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_3, + SPR_WOODEN_RC_DIAG_FLAT_TO_LEFT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagFlatToRightBankImages = { { + { + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_0, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_0, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_0, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_1, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_1, + }, + { + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_2, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_2, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_2, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_3, + SPR_WOODEN_RC_DIAG_FLAT_TO_RIGHT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagLeftBankTo25DegUpImages = { { + { + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_0, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_0, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_0, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0, + }, + { + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_1, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_1, + }, + { + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_2, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_2, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_2, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2, + }, + { + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_3, + SPR_WOODEN_RC_DIAG_LEFT_BANK_TO_25_DEG_UP_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagRightBankTo25DegUpImages = { { + { + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_0, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_0, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_0, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_0, + }, + { + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_1, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_1, + }, + { + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_2, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_2, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_2, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_FRONT_HANDRAIL_2, + }, + { + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_3, + SPR_WOODEN_RC_DIAG_RIGHT_BANK_TO_25_DEG_UP_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagUp25ToLeftBankImages = { { + { + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_0, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_0, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_0, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_1, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_1, + }, + { + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_2, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_2, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_2, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_3, + SPR_WOODEN_RC_DIAG_UP_25_TO_LEFT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array kDiagUp25ToRightBankImages = { { + { + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_0, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_0, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_0, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_0, + }, + { + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_1, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_1, + }, + { + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_2, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_2, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_2, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_FRONT_HANDRAIL_2, + }, + { + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_3, + SPR_WOODEN_RC_DIAG_UP_25_TO_RIGHT_BANK_HANDRAIL_3, + }, +} }; + +static constexpr std::array, 4> kLeftEighthBankToDiagImages = { { + { { + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_0, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_2, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_0_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_0_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_0, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_2, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_1_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_1_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_0, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_2, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_2_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_2_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_0, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_1, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_1, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_2, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2, + }, + { + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_3_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_3_3, + SPR_WOODEN_RC_LEFT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_3, + }, + } }, +} }; + +static constexpr std::array, 4> kRightEighthBankToDiagImages = { { + { { + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_0, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_1, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_1, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_0_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_0_2, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_0_3, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_0_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_0, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_1, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_1, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_1_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_1_2, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_1_3, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_1_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_0, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_1, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_1, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_2_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_2_2, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_2_3, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_2_3, + }, + } }, + { { + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_0, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_0, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_1, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_1, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_3_2, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_FRONT_HANDRAIL_3_2, + }, + { + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_3_3, + SPR_WOODEN_RC_RIGHT_EIGHTH_BANK_TO_DIAG_HANDRAIL_3_3, + }, + } }, +} }; + ImageId WoodenRCGetRailsColour(PaintSession& session) { return session.TrackColours; @@ -1523,111 +3038,13 @@ static void WoodenRCTrackLeftQuarterTurn5( session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); } -/** rct2: 0x008AC658 */ -template -static void WoodenRCTrackFlatToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][4] = { - { - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SW_NE, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SW_NE, - 0, - 0, - }, - { - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NW_SE, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NW_SE, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_NW_SE, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_NW_SE, - }, - { - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_NE_SW, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_NE_SW, - 0, - 0, - }, - { - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_SE_NW, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_SE_NW, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_FRONT_SE_NW, - SPR_WOODEN_RC_FLAT_TO_LEFT_BANK_RAILS_FRONT_SE_NW, - }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - if (direction == 1 || direction == 3) - { - WoodenRCTrackPaint( - session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height }, - { { 0, 26, height + 5 }, { 32, 1, 9 } }); - } - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours); - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} - -/** rct2: 0x008AC668 */ -template -static void WoodenRCTrackFlatToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][4] = { - { - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SW_NE, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SW_NE, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_SW_NE, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_SW_NE, - }, - { - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NW_SE, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NW_SE, - 0, - 0, - }, - { - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_NE_SW, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_NE_SW, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_FRONT_NE_SW, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_FRONT_NE_SW, - }, - { - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_SE_NW, - SPR_WOODEN_RC_FLAT_TO_RIGHT_BANK_RAILS_SE_NW, - 0, - 0, - }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - if (direction == 0 || direction == 2) - { - WoodenRCTrackPaint( - session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height }, - { { 0, 26, height + 5 }, { 32, 1, 9 } }); - } - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours); - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} - /** rct2: 0x008AC678 */ template static void WoodenRCTrackLeftBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrackFlatToRightBank( + WoodenRCTrackFlatToBank( session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } @@ -1637,597 +3054,21 @@ static void WoodenRCTrackRightBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrackFlatToLeftBank( + WoodenRCTrackFlatToBank( session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } -template -static void WoodenRCTrackBankedRightQuarterTurn5( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr SpriteBoundBox2 imageIds[2][4][7] = { - { - { - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_0, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 2, 0 }, { 32, 32, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_2, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_2, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 32, 16, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_3, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_3, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 16, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_5, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_5, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 32, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SW_SE_SEQ_6, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SW_SE_SEQ_6, - { 0, 0, 0 }, - BoundBoxXYZ({ 2, 0, 0 }, { 32, 32, 2 }), - }, - }, - { - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_0, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_0, - { 0, 0, 0 }, - BoundBoxXYZ({ 2, 0, 0 }, { 32, 32, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_2, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_2, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 32, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_3, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_3, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 16, 16, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_5, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_5, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 16, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NW_SW_SEQ_6, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NW_SW_SEQ_6, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 2, 0 }, { 32, 27, 2 }), - }, - }, - { - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_0, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 2, 0 }, { 32, 27, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_2, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_2, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 32, 16, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_3, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_3, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 16, 0 }, { 16, 16, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_5, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_5, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 32, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_NE_NW_SEQ_6, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_NE_NW_SEQ_6, - { 0, 0, 0 }, - BoundBoxXYZ({ 2, 0, 0 }, { 27, 32, 2 }), - }, - }, - { - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_0, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_0, - { 0, 0, 0 }, - BoundBoxXYZ({ 2, 0, 0 }, { 27, 32, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_2, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_2, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 16, 32, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_3, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_3, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 0 }, { 16, 16, 2 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_5, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_5, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 0 }, { 32, 16, 2 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_SE_NE_SEQ_6, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_SE_NE_SEQ_6, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 2, 0 }, { 32, 32, 2 }), - }, - }, - }, - { - { - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_0, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 2, 27 }, { 32, 32, 0 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_2, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_2, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 16, 27 }, { 32, 16, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_3, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_3, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 16, 16, 0 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_5, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_5, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 0, 27 }, { 16, 32, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_SW_SE_SEQ_6, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_SW_SE_SEQ_6, - { 0, 0, 0 }, - BoundBoxXYZ({ 2, 0, 27 }, { 32, 32, 0 }), - }, - }, - { - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - }, - { - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_0, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 2, 27 }, { 32, 27, 0 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_2, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_2, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 32, 16, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_3, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_3, - { 0, 0, 0 }, - BoundBoxXYZ({ 16, 16, 27 }, { 16, 16, 0 }), - }, - { - 0, - 0, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_5, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_5, - { 0, 0, 0 }, - BoundBoxXYZ({ 0, 0, 27 }, { 16, 32, 0 }), - }, - { - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_FRONT_NE_NW_SEQ_6, - SPR_WOODEN_RC_BANKED_QUARTER_TURN_5_RAILS_FRONT_NE_NW_SEQ_6, - { 0, 0, 0 }, - BoundBoxXYZ({ 2, 0, 27 }, { 27, 32, 0 }), - }, - }, - { - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - { 0, 0, { 0, 0, 0 }, BoundBoxXYZ({ 0, 0, 0 }, { 0, 0, 0 }) }, - }, - }, - }; - static WoodenSupportSubType supportSubType[kNumOrthogonalDirections][7] = { - { WoodenSupportSubType::NeSw, WoodenSupportSubType::Null, WoodenSupportSubType::Corner2, WoodenSupportSubType::Corner0, - WoodenSupportSubType::Null, WoodenSupportSubType::Corner2, WoodenSupportSubType::NwSe }, - { WoodenSupportSubType::NwSe, WoodenSupportSubType::Null, WoodenSupportSubType::Corner3, WoodenSupportSubType::Corner1, - WoodenSupportSubType::Null, WoodenSupportSubType::Corner3, WoodenSupportSubType::NeSw }, - { WoodenSupportSubType::NeSw, WoodenSupportSubType::Null, WoodenSupportSubType::Corner0, WoodenSupportSubType::Corner2, - WoodenSupportSubType::Null, WoodenSupportSubType::Corner0, WoodenSupportSubType::NwSe }, - { WoodenSupportSubType::NwSe, WoodenSupportSubType::Null, WoodenSupportSubType::Corner1, WoodenSupportSubType::Corner3, - WoodenSupportSubType::Null, WoodenSupportSubType::Corner1, WoodenSupportSubType::NeSw }, - }; - - WoodenRCTrackPaintBb(session, &imageIds[0][direction][trackSequence], height); - WoodenRCTrackPaintBb(session, &imageIds[1][direction][trackSequence], height); - TrackPaintUtilRightQuarterTurn5TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); - - if (supportSubType[direction][trackSequence] != WoodenSupportSubType::Null) - { - WoodenASupportsPaintSetup( - session, supportType.wooden, supportSubType[direction][trackSequence], height, session.SupportColours); - } - - int32_t blockedSegments = 0; - switch (trackSequence) - { - case 0: - blockedSegments = kSegmentsAll; - break; - case 1: - blockedSegments = EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide); - break; - case 2: - blockedSegments = EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide); - break; - case 3: - blockedSegments = EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::centre, - PaintSegment::topLeftSide, PaintSegment::topRightSide, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide); - break; - case 4: - blockedSegments = EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide); - break; - case 5: - blockedSegments = EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide); - break; - case 6: - blockedSegments = kSegmentsAll; - break; - } - PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments, direction), 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); -} - template static void WoodenRCTrackBankedLeftQuarterTurn5( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; - WoodenRCTrackBankedRightQuarterTurn5( - session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); + WoodenRCTrackBankedRightQuarterTurn5( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); } -/** rct2: 0x008AC6B8 */ -template -static void WoodenRCTrackLeftBankTo25DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][4] = { - { - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_SW_NE, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_SW_NE, - 0, - 0, - }, - { - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_NW_SE, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_NW_SE, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_FRONT_NW_SE, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_FRONT_NW_SE, - }, - { - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_NE_SW, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_NE_SW, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_FRONT_NE_SW, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_FRONT_NE_SW, - }, - { - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_SE_NW, - SPR_WOODEN_RC_LEFT_BANK_TO_25_DEG_RAILS_SE_NW, - 0, - 0, - }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - if (direction == 1 || direction == 2) - { - WoodenRCTrackPaint( - session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height }, - { { 0, 26, height + 5 }, { 32, 1, 9 } }); - } - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours, - WoodenSupportTransitionType::FlatToUp25Deg); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); -} - -/** rct2: 0x008AC6C8 */ -template -static void WoodenRCTrackRightBankTo25DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][4] = { - { - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_SW_NE, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_SW_NE, - 0, - 0, - }, - { - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_NW_SE, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_NW_SE, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_FRONT_NW_SE, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_FRONT_NW_SE, - }, - { - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_NE_SW, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_NE_SW, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_FRONT_NE_SW, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_FRONT_NE_SW, - }, - { - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_SE_NW, - SPR_WOODEN_RC_RIGHT_BANK_TO_25_DEG_RAILS_SE_NW, - 0, - 0, - }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - if (direction == 1 || direction == 2) - { - WoodenRCTrackPaint( - session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height }, - { { 0, 26, height + 5 }, { 32, 1, 9 } }); - } - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours, - WoodenSupportTransitionType::FlatToUp25Deg); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); -} - -/** rct2: 0x008AC6D8 */ -template -static void WoodenRCTrack25DegUpToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][4] = { - { - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SW_NE, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SW_NE, - 0, - 0, - }, - { - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NW_SE, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NW_SE, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NW_SE, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NW_SE, - }, - { - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_NE_SW, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_NE_SW, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_FRONT_NE_SW, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_FRONT_NE_SW, - }, - { - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_SE_NW, - SPR_WOODEN_RC_25_DEG_TO_LEFT_BANK_RAILS_SE_NW, - 0, - 0, - }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - if (direction == 1 || direction == 2) - { - WoodenRCTrackPaint( - session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height }, - { { 0, 26, height + 5 }, { 32, 1, 9 } }); - } - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours, - WoodenSupportTransitionType::Up25DegToFlat); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 40); -} - -/** rct2: 0x008AC6E8 */ -template -static void WoodenRCTrack25DegUpToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][4] = { - { - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SW_NE, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SW_NE, - 0, - 0, - }, - { - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NW_SE, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NW_SE, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NW_SE, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NW_SE, - }, - { - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_NE_SW, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_NE_SW, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_FRONT_NE_SW, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_FRONT_NE_SW, - }, - { - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_SE_NW, - SPR_WOODEN_RC_25_DEG_TO_RIGHT_BANK_RAILS_SE_NW, - 0, - 0, - }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - if (direction == 1 || direction == 2) - { - WoodenRCTrackPaint( - session, direction, imageIds[direction][2], imageIds[direction][3], { 0, 0, height }, - { { 0, 26, height + 5 }, { 32, 1, 9 } }); - } - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours, - WoodenSupportTransitionType::Up25DegToFlat); - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); - } - else - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 40); -} +/** rct2: */ /** rct2: 0x008AC6F8 */ template @@ -2235,7 +3076,7 @@ static void WoodenRCTrackLeftBankTo25DegDown( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrack25DegUpToRightBank( + WoodenRCTrack25DegUpToBank( session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } @@ -2245,7 +3086,7 @@ static void WoodenRCTrackRightBankTo25DegDown( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrack25DegUpToLeftBank( + WoodenRCTrack25DegUpToBank( session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } @@ -2255,8 +3096,8 @@ static void WoodenRCTrack25DegDownToLeftBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrackRightBankTo25DegUp( - session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } /** rct2: 0x008AC728 */ @@ -2265,31 +3106,8 @@ static void WoodenRCTrack25DegDownToRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrackLeftBankTo25DegUp( - session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); -} - -/** rct2: 0x008AC738 */ -template -static void WoodenRCTrackLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - static constexpr uint32_t imageIds[4][2] = { - { SPR_WOODEN_RC_LEFT_BANK_SW_NE, SPR_WOODEN_RC_LEFT_BANK_RAILS_SW_NE }, - { SPR_WOODEN_RC_LEFT_BANK_NW_SE, SPR_WOODEN_RC_LEFT_BANK_RAILS_NW_SE }, - { SPR_WOODEN_RC_LEFT_BANK_NE_SW, SPR_WOODEN_RC_LEFT_BANK_RAILS_NE_SW }, - { SPR_WOODEN_RC_LEFT_BANK_SE_NW, SPR_WOODEN_RC_LEFT_BANK_RAILS_SE_NW }, - }; - - WoodenRCTrackPaint( - session, direction, imageIds[direction][0], imageIds[direction][1], { 0, 0, height }, - { { 0, 3, height }, { 32, 25, 2 } }); - WoodenASupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours); - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + WoodenRCTrackBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } /** rct2: 0x008AC748 */ @@ -2298,7 +3116,8 @@ static void WoodenRCTrackRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - WoodenRCTrackLeftBank(session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackFlatToBank( + session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); } /** rct2: 0x008AC758 */ @@ -4360,227 +5179,6 @@ static void WoodenRCTrackRightQuarterTurn3( session, ride, trackSequence, (direction - 1) & 3, height, trackElement, supportType); } -/** rct2: 0x008AC808 */ -template -static void WoodenRCTrackLeftQuarterTurn3Bank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_5), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24712), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_8), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24715), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_17), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24724), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_11), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24718), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_2), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24709), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_14), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24721), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_4), - { 0, 0, height }, { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24711), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_7), - { 0, 0, height }, { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24714), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_16), - { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24723), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_10), - { 0, 0, height }, { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24717), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_1), - { 0, 0, height }, { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24708), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_13), - { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24720), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_3), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24710), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_6), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24713), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_15), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24722), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_9), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24716), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_0), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24707), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_12), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24719), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 3: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - /** rct2: 0x008AC818 */ template static void WoodenRCTrackRightQuarterTurn3Bank( @@ -4588,8 +5186,8 @@ static void WoodenRCTrackRightQuarterTurn3Bank( const TrackElement& trackElement, SupportType supportType) { trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; - WoodenRCTrackLeftQuarterTurn3Bank( - session, ride, trackSequence, (direction - 1) & 3, height, trackElement, supportType); + WoodenRCTrackLeftQuarterTurn3Bank( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); } /** rct2: 0x008AC828 */ @@ -4938,1063 +5536,6 @@ static void WoodenRCTrackRightQuarterTurn325DegDown( session, ride, trackSequence, (direction - 1) & 3, height, trackElement, supportType); } -/** rct2: 0x008ACAB8 */ -template -static void WoodenRCTrackLeftHalfBankedHelixUpSmall( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_41), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24748), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_44), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24751), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_53), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24760), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_47), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24754), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_38), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24745), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_50), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24757), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - } - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_40), - { 0, 0, height }, { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24747), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_43), - { 0, 0, height }, { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24750), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_52), - { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24759), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_46), - { 0, 0, height }, { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24753), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_37), - { 0, 0, height }, { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24744), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_49), - { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24756), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_39), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24746), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_42), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24749), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_51), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24758), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_45), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24752), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_36), - { 0, 0, height }, { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24743), { 0, 0, height }, - { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_48), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24755), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - case 3: - PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 4: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_38), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24745), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_50), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24757), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_41), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24748), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_44), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24751), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_53), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24760), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_47), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24754), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - switch (direction) - { - case 0: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 1: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 5: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 6: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_37), - { 0, 0, height }, { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24744), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_49), - { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24756), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_40), - { 0, 0, height }, { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24747), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_43), - { 0, 0, height }, { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24750), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_52), - { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24759), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_46), - { 0, 0, height }, { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24753), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 7: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_36), - { 0, 0, height }, { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24743), { 0, 0, height }, - { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_48), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24755), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_39), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24746), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_42), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24749), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_51), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24758), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_45), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24752), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, - PaintSegment::topLeftSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - -/** rct2: 0x008ACAC8 */ -template -static void WoodenRCTrackRightHalfBankedHelixUpSmall( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_18), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24725), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_30), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24737), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_21), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24728), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_24), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24731), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_33), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24740), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_27), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24734), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, - PaintSegment::topLeftSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_19), - { 0, 0, height }, { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24726), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_31), - { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24738), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_22), - { 0, 0, height }, { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24729), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_25), - { 0, 0, height }, { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24732), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_34), - { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24741), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_28), - { 0, 0, height }, { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24735), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_20), - { 0, 0, height }, { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24727), { 0, 0, height }, - { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_32), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24739), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_23), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24730), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_26), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24733), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_35), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24742), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_29), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24736), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - switch (direction) - { - case 0: - PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - case 1: - PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 4: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_21), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24728), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_24), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24731), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_33), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24740), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_27), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24734), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_18), - { 0, 0, height }, { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24725), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_30), - { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24737), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 3: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 5: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - } - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 6: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_22), - { 0, 0, height }, { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24729), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_25), - { 0, 0, height }, { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24732), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_34), - { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24741), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_28), - { 0, 0, height }, { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24735), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23860), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24726), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_31), - { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24738), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 7: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_23), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24730), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_26), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24733), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_35), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24742), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_29), - { 0, 0, height }, { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24736), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_20), - { 0, 0, height }, { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24727), { 0, 0, height }, - { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, - WoodenRCGetTrackColour(session).WithIndex(SPR_WOODEN_RC_SMALL_RIGHT_BANKED_TURN_32), - { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24739), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - /** rct2: 0x008ACAD8 */ template static void WoodenRCTrackLeftHalfBankedHelixDownSmall( @@ -6004,11 +5545,11 @@ static void WoodenRCTrackLeftHalfBankedHelixDownSmall( if (trackSequence >= 4) { trackSequence -= 4; - direction = (direction - 1) & 3; + direction = DirectionPrev(direction); } trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; - WoodenRCTrackRightHalfBankedHelixUpSmall( - session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); + WoodenRCTrackRightHalfBankedHelixUpSmall( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); } /** rct2: 0x008ACAE8 */ @@ -6020,1567 +5561,11 @@ static void WoodenRCTrackRightHalfBankedHelixDownSmall( if (trackSequence >= 4) { trackSequence -= 4; - direction = (direction + 1) & 3; + direction = DirectionNext(direction); } trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; - WoodenRCTrackLeftHalfBankedHelixUpSmall( - session, ride, trackSequence, (direction - 1) & 3, height, trackElement, supportType); -} - -/** rct2: 0x008ACAF8 */ -template -static void WoodenRCTrackLeftHalfBankedHelixUpLarge( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23704), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24570), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23709), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24575), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23724), { 0, 0, height }, - { { 0, 2, height + 27 }, { 32, 27, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24590), { 0, 0, height }, - { { 0, 2, height + 27 }, { 32, 27, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23714), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24580), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23699), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24565), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23719), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24585), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23703), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24569), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23708), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24574), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23723), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24589), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23713), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24579), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23698), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24564), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23718), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24584), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::topRightSide, PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23702), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24568), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23707), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24573), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23722), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24588), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23712), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24578), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23697), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24563), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23717), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24583), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::bottomCorner, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 4: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 5: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23701), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24567), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23706), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24572), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23721), { 0, 0, height }, - { { 0, 0, height + 33 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24587), { 0, 0, height }, - { { 0, 0, height + 33 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23711), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24577), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23696), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24562), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23716), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24582), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 6: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23700), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24566), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23705), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24571), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23720), { 0, 0, height }, - { { 2, 0, height + 33 }, { 27, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24586), { 0, 0, height }, - { { 2, 0, height + 33 }, { 27, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23710), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24576), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23695), { 0, 0, height }, - { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24561), { 0, 0, height }, - { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23715), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24581), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - case 3: - PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 7: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23699), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24565), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23719), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24585), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23704), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24570), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23709), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24575), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23724), { 0, 0, height }, - { { 2, 0, height + 27 }, { 27, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24590), { 0, 0, height }, - { { 2, 0, height + 27 }, { 27, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23714), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24580), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - } - switch (direction) - { - case 0: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 1: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 8: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 9: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23698), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24564), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23718), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24584), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23703), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24569), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23708), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24574), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23723), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24589), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23713), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24579), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 10: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23697), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24563), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23717), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24583), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23702), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24568), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23707), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24573), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23722), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24588), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23712), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24578), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 11: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 12: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23696), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24562), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23716), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24582), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23701), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24567), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23706), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24572), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23721), { 0, 0, height }, - { { 0, 0, height + 33 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24587), { 0, 0, height }, - { { 0, 0, height + 33 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23711), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24577), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 13: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23695), { 0, 0, height }, - { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24561), { 0, 0, height }, - { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23715), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24581), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23700), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24566), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23705), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24571), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23720), { 0, 0, height }, - { { 0, 2, height + 33 }, { 32, 27, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24586), { 0, 0, height }, - { { 0, 2, height + 33 }, { 32, 27, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23710), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24576), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, - PaintSegment::topLeftSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - -/** rct2: 0x008ACB08 */ -template -static void WoodenRCTrackRightHalfBankedHelixUpLarge( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23665), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24531), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23685), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24551), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23670), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24536), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23675), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24541), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23690), { 0, 0, height }, - { { 0, 2, height + 27 }, { 32, 27, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24556), { 0, 0, height }, - { { 0, 2, height + 27 }, { 32, 27, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23680), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24546), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, - PaintSegment::topLeftSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23666), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24532), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23686), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24552), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23671), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24537), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23676), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24542), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23691), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24557), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23681), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24547), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23667), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24533), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23687), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24553), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23672), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24538), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23677), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24543), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23692), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24558), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23682), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24548), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 4: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 5: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23668), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24534), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23688), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24554), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23673), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24539), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23678), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24544), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23693), { 0, 0, height }, - { { 0, 0, height + 33 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24559), { 0, 0, height }, - { { 0, 0, height + 33 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23683), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24549), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 6: - switch (direction) - { - case 0: - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23669), { 0, 0, height }, - { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24535), { 0, 0, height }, - { { 6, 0, height + 8 }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23689), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24555), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23674), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24540), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23679), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24545), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23694), { 0, 0, height }, - { { 2, 0, height + 33 }, { 27, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24560), { 0, 0, height }, - { { 2, 0, height + 33 }, { 27, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23684), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24550), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - } - switch (direction) - { - case 0: - PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - case 1: - PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 7: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23670), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24536), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23675), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24541), { 0, 0, height }, - { { 2, 0, height }, { 27, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23690), { 0, 0, height }, - { { 2, 0, height + 27 }, { 27, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24556), { 0, 0, height }, - { { 2, 0, height + 27 }, { 27, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23680), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24546), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23665), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24531), { 0, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23685), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24551), { 0, 0, height }, - { { 6, 0, height + 27 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 3: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, - PaintSegment::topRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 8: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 9: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23671), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24537), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23676), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24542), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23691), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24557), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23681), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24547), { 0, 0, height }, - { { 0, 0, height }, { 16, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23666), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24532), { 0, 0, height }, - { { 16, 0, height }, { 16, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23686), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24552), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 10: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23672), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24538), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23677), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24543), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23692), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24558), { 0, 0, height }, - { { 16, 16, height + 29 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23682), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24548), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23667), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24533), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23687), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24553), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::bottomCorner, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 11: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 12: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23673), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24539), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23678), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24544), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23693), { 0, 0, height }, - { { 0, 0, height + 33 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24559), { 0, 0, height }, - { { 0, 0, height + 33 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23683), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24549), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23668), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24534), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23688), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24554), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::topRightSide, PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 13: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23674), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24540), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23679), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24545), { 0, 0, height }, - { { 0, 2, height }, { 32, 27, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23694), { 0, 0, height }, - { { 0, 2, height + 33 }, { 32, 27, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24560), { 0, 0, height }, - { { 0, 2, height + 33 }, { 32, 27, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23684), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24550), { 0, 0, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23669), { 0, 0, height }, - { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24535), { 0, 0, height }, - { { 0, 6, height + 8 }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23689), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24555), { 0, 0, height }, - { { 0, 6, height + 27 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, - PaintSegment::bottomRightSide), - direction), - 48, 0x20); - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } + WoodenRCTrackLeftHalfBankedHelixUpSmall( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); } /** rct2: 0x008ACB18 */ @@ -7592,11 +5577,11 @@ static void WoodenRCTrackLeftHalfBankedHelixDownLarge( if (trackSequence >= 7) { trackSequence -= 7; - direction = (direction - 1) & 3; + direction = DirectionPrev(direction); } trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; - WoodenRCTrackRightHalfBankedHelixUpLarge( - session, ride, trackSequence, (direction + 1) & 3, height, trackElement, supportType); + WoodenRCTrackRightHalfBankedHelixUpLarge( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); } /** rct2: 0x008ACB28 */ @@ -7608,11 +5593,11 @@ static void WoodenRCTrackRightHalfBankedHelixDownLarge( if (trackSequence >= 7) { trackSequence -= 7; - direction = (direction + 1) & 3; + direction = DirectionNext(direction); } trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; - WoodenRCTrackLeftHalfBankedHelixUpLarge( - session, ride, trackSequence, (direction - 1) & 3, height, trackElement, supportType); + WoodenRCTrackLeftHalfBankedHelixUpLarge( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); } /** rct2: 0x008ACB98 */ @@ -9605,538 +7590,6 @@ static void WoodenRCTrackRightEighthToOrthogonal( session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); } -/** rct2: 0x008AC998 */ -template -static void WoodenRCTrackLeftEighthBankToDiag( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24185), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25051), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24189), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25055), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24201), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25067), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24193), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25059), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24197), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25063), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24205), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25071), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24186), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25052), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24190), { 0, 0, height }, - { { 0, 0, height }, { 34, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25056), { 0, 0, height }, - { { 0, 0, height }, { 34, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24202), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25068), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24194), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25060), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24198), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25064), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24206), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25072), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24187), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25053), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24191), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25057), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24203), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25069), { 0, 0, height }, - { { 16, 16, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24195), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25061), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24199), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25065), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24207), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25073), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 4: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24188), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25054), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24192), { 0, 0, height }, - { { 0, 16, height }, { 16, 18, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25058), { 0, 0, height }, - { { 0, 16, height }, { 16, 18, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24204), { 0, 0, height }, - { { 0, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25070), { 0, 0, height }, - { { 0, 16, height + 27 }, { 16, 16, 0 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24196), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25062), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24200), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25066), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24208), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25074), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 16, 0 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - -/** rct2: 0x008AC9A8 */ -template -static void WoodenRCTrackRightEighthBankToDiag( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24161), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25027), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24177), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25043), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24165), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25031), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24169), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25035), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24181), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25047), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24173), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25039), { 0, 0, height }, - { { 0, 0, height }, { 32, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24162), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25028), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24178), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25044), { 0, 0, height }, - { { 0, 16, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24166), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25032), { 0, 0, height }, - { { 0, 16, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24170), { 0, 0, height }, - { { 0, 0, height }, { 34, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25036), { 0, 0, height }, - { { 0, 0, height }, { 34, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24182), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25048), { 0, 0, height }, - { { 0, 0, height + 27 }, { 32, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24174), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25040), { 0, 0, height }, - { { 0, 0, height }, { 32, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24163), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25029), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24179), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25045), { 0, 0, height }, - { { 0, 0, height + 27 }, { 16, 16, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24167), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25033), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24171), { 0, 0, height }, - { { 4, 4, height }, { 28, 28, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25037), { 0, 0, height }, - { { 4, 4, height }, { 28, 28, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24183), { 0, 0, height }, - { { 4, 4, height + 27 }, { 28, 28, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25049), { 0, 0, height }, - { { 4, 4, height + 27 }, { 28, 28, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24175), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25041), { 0, 0, height }, - { { 0, 16, height }, { 16, 16, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 4: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24164), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25030), { 0, 0, height }, - { { 16, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24180), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25046), { 0, 0, height }, - { { 16, 0, height + 27 }, { 16, 16, 0 } }); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24168), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25034), { 0, 0, height }, - { { 0, 0, height }, { 16, 16, 2 } }); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24172), { 0, 0, height }, - { { 0, 16, height }, { 16, 18, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25038), { 0, 0, height }, - { { 0, 16, height }, { 16, 18, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24184), { 0, 0, height }, - { { 0, 16, height + 27 }, { 16, 16, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25050), { 0, 0, height }, - { { 0, 16, height + 27 }, { 16, 16, 0 } }); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24176), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(25042), { 0, 0, height }, - { { 16, 16, height }, { 16, 16, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - /** rct2: 0x008AC9B8 */ template static void WoodenRCTrackLeftEighthBankToOrthogonal( @@ -10144,8 +7597,8 @@ static void WoodenRCTrackLeftEighthBankToOrthogonal( const TrackElement& trackElement, SupportType supportType) { trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; - WoodenRCTrackRightEighthBankToDiag( - session, ride, trackSequence, (direction + 2) & 3, height, trackElement, supportType); + WoodenRCTrackRightEighthBankToDiag( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } /** rct2: 0x008AC9C8 */ @@ -10155,8 +7608,8 @@ static void WoodenRCTrackRightEighthBankToOrthogonal( const TrackElement& trackElement, SupportType supportType) { trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; - WoodenRCTrackLeftEighthBankToDiag( - session, ride, trackSequence, (direction + 3) & 3, height, trackElement, supportType); + WoodenRCTrackLeftEighthBankToDiag( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); } template @@ -12383,1232 +9836,62 @@ static void WoodenRCTrackDiag25DegDownToFlat( } } -/** rct2: 0x008ACA18 */ -template -static void WoodenRCTrackDiagFlatToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24080), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24946), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24077), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24943), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24081), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24947), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24079), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24945), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24082), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24948), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24078), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24944), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - -/** rct2: 0x008AC9F8 */ -template -static void WoodenRCTrackDiagFlatToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24086), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24952), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24083), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24949), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24087), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24953), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24085), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24951), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24088), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24954), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24084), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24950), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } -} - -/** rct2: 0x008ACA08 */ template static void WoodenRCTrackDiagLeftBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24084), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24950), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24085), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24951), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24088), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24954), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24083), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24949), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24087), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24953), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24086), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24952), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } -/** rct2: 0x008ACA28 */ template static void WoodenRCTrackDiagRightBankToFlat( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24078), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24944), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24079), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24945), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24082), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24948), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24077), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24943), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24081), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24947), { -16, -16, height }, - { { -16, -16, height + 27 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24080), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24946), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); - break; - } + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagFlatToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } -/** rct2: 0x008ACA58 */ -template -static void WoodenRCTrackDiagLeftBankTo25DegUp( +static void WoodenRCTrackDiagLeftBankToDown25( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24104), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24970), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24101), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24967), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24105), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24971), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24103), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24969), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24106), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24972), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24102), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24968), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - } + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagUp25ToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } -/** rct2: 0x008ACA68 */ -template -static void WoodenRCTrackDiagRightBankTo25DegUp( +static void WoodenRCTrackDiagRightBankToDown25( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24110), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24976), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24107), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24973), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24111), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24977), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24109), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24975), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24112), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24978), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24108), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24974), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - } + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagUp25ToBank( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } -/** rct2: 0x008ACA38 */ template -static void WoodenRCTrackDiag25DegUpToLeftBank( +static void WoodenRCTrackDiagDown25ToLeftBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24092), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24958), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24089), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24955), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24093), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24959), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner0, direction, height + 16, session.SupportColours); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - case 2: - switch (direction) - { - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24091), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24957), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24094), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24960), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner2, direction, height + 16, session.SupportColours); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24090), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24956), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - } + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } -/** rct2: 0x008ACA48 */ template -static void WoodenRCTrackDiag25DegUpToRightBank( +static void WoodenRCTrackDiagDown25ToRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24098), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24964), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24095), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24961), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24099), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24965), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner0, direction, height + 16, session.SupportColours); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - case 2: - switch (direction) - { - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24097), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24963), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24100), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24966), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner2, direction, height + 16, session.SupportColours); - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24096), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24962), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); - break; - } -} - -/** rct2: 0x008ACA78 */ -template -static void WoodenRCTrackDiagLeftBankTo25DegDown( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24096), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24962), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24097), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24963), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24100), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24966), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner0, direction, height + 16, session.SupportColours); - break; - case 2: - switch (direction) - { - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24095), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24961), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24099), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24965), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner2, direction, height + 16, session.SupportColours); - - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24098), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24964), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - break; - } - - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); -} - -/** rct2: 0x008ACA88 */ -template -static void WoodenRCTrackDiagRightBankTo25DegDown( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24090), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24956), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24091), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24957), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24094), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24960), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner0, direction, height + 16, session.SupportColours); - break; - case 2: - switch (direction) - { - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24089), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24955), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24093), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24959), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - break; - } - WoodenBSupportsPaintSetupRotated( - session, supportType.wooden, WoodenSupportSubType::Corner2, direction, height + 16, session.SupportColours); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24092), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24958), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - break; - } - - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 56); -} - -/** rct2: 0x008ACA98 */ -template -static void WoodenRCTrackDiag25DegDownToLeftBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24108), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24974), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24109), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24975), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24112), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24978), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24107), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24973), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24111), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24977), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24110), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24976), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - } -} - -/** rct2: 0x008ACAA8 */ -template -static void WoodenRCTrackDiag25DegDownToRightBank( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24102), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24968), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 1: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24103), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24969), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24106), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24972), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 2: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - switch (direction) - { - case 0: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24101), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24967), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24105), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24971), { -16, -16, height }, - { { -16, -16, height + 35 }, { 32, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(24104), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24970), { -16, -16, height }, - { { -16, -16, height }, { 32, 32, 2 } }); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - } + trackSequence = kMapReversedDiagonalStraight[trackSequence]; + return WoodenRCTrackDiagBankTo25DegUp( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); } /** rct2: 0x008AC9D8 */ @@ -13833,490 +10116,15 @@ static void WoodenRCTrackDiagRightBank( } } -/** rct2: 0x008ACB38 */ -template -static void WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23958), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24824), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23960), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24826), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23971), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24837), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23962), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24828), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23956), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24822), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23969), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24835), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - case 1: - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23957), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24823), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23959), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24825), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23970), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24836), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23961), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24827), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23972), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24838), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23955), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24821), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23968), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24834), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); - break; - case 3: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - } -} - -/** rct2: 0x008ACB48 */ -template -static void WoodenRCTrackRightBankToRightQuarterTurn325DegUp( - PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, - const TrackElement& trackElement, SupportType supportType) -{ - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23947), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24813), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23963), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24829), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23949), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24815), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23951), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24817), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23966), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24832), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23953), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24819), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - case 1: - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23948), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24814), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23964), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24830), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23950), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24816), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23965), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24831), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23952), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24818), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23967), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24833), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23954), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24820), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - switch (direction) - { - case 0: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); - break; - case 1: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - } -} - /** rct2: 0x008ACB58 */ template static void WoodenRCTrackLeftQuarterTurn325DegDownToLeftBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23950), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24816), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23965), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24831), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23952), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24818), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23967), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24833), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23954), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24820), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23948), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24814), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23964), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24830), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - case 1: - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, - PaintSegment::bottomLeftSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23949), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24815), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23951), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24817), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23966), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24832), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23953), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24819), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23947), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24813), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23963), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24829), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - } - switch (direction) - { - case 2: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 3: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - } + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackRightBankToRightQuarterTurn325DegUp( + session, ride, trackSequence, DirectionNext(direction), height, trackElement, supportType); } /** rct2: 0x008ACB68 */ @@ -14325,160 +10133,9 @@ static void WoodenRCTrackRightQuarterTurn325DegDownToRightBank( PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, const TrackElement& trackElement, SupportType supportType) { - switch (trackSequence) - { - case 0: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23955), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24821), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23968), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24834), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23957), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24823), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23959), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24825), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23970), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24836), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23961), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24827), { 0, 6, height }, - { { 0, 6, height }, { 32, 20, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23972), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24838), { 0, 6, height }, - { { 0, 6, height + 67 }, { 32, 20, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - if (direction == 0 || direction == 3) - { - PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - case 1: - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 2: - PaintUtilSetSegmentSupportHeight( - session, - PaintUtilRotateSegments( - EnumsToFlags( - PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, - PaintSegment::bottomRightSide), - direction), - 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 48); - break; - case 3: - switch (direction) - { - case 0: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23956), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24822), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23969), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24835), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); - break; - case 1: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23958), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24824), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); - break; - case 2: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23960), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24826), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23971), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24837), { 6, 0, height }, - { { 6, 0, height + 67 }, { 20, 32, 0 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); - break; - case 3: - PaintAddImageAsParentRotated( - session, direction, WoodenRCGetTrackColour(session).WithIndex(23962), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - PaintAddImageAsChildRotated( - session, direction, WoodenRCGetRailsColour(session).WithIndex(24828), { 6, 0, height }, - { { 6, 0, height }, { 20, 32, 2 } }); - WoodenASupportsPaintSetup( - session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); - break; - } - switch (direction) - { - case 0: - PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - case 1: - PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); - break; - } - PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); - PaintUtilSetGeneralSupportHeight(session, height + 64); - break; - } + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); } /** rct2: 0x008ACDF8 */ @@ -17668,9 +13325,9 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::RightQuarterTurn5Tiles: return WoodenRCTrackRightQuarterTurn5; case TrackElemType::FlatToLeftBank: - return WoodenRCTrackFlatToLeftBank; + return WoodenRCTrackFlatToBank; case TrackElemType::FlatToRightBank: - return WoodenRCTrackFlatToRightBank; + return WoodenRCTrackFlatToBank; case TrackElemType::LeftBankToFlat: return WoodenRCTrackLeftBankToFlat; case TrackElemType::RightBankToFlat: @@ -17678,15 +13335,15 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::BankedLeftQuarterTurn5Tiles: return WoodenRCTrackBankedLeftQuarterTurn5; case TrackElemType::BankedRightQuarterTurn5Tiles: - return WoodenRCTrackBankedRightQuarterTurn5; + return WoodenRCTrackBankedRightQuarterTurn5; case TrackElemType::LeftBankToUp25: - return WoodenRCTrackLeftBankTo25DegUp; + return WoodenRCTrackBankTo25DegUp; case TrackElemType::RightBankToUp25: - return WoodenRCTrackRightBankTo25DegUp; + return WoodenRCTrackBankTo25DegUp; case TrackElemType::Up25ToLeftBank: - return WoodenRCTrack25DegUpToLeftBank; + return WoodenRCTrack25DegUpToBank; case TrackElemType::Up25ToRightBank: - return WoodenRCTrack25DegUpToRightBank; + return WoodenRCTrack25DegUpToBank; case TrackElemType::LeftBankToDown25: return WoodenRCTrackLeftBankTo25DegDown; case TrackElemType::RightBankToDown25: @@ -17696,7 +13353,7 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::Down25ToRightBank: return WoodenRCTrack25DegDownToRightBank; case TrackElemType::LeftBank: - return WoodenRCTrackLeftBank; + return WoodenRCTrackFlatToBank; case TrackElemType::RightBank: return WoodenRCTrackRightBank; case TrackElemType::LeftQuarterTurn5TilesUp25: @@ -17720,7 +13377,7 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::RightQuarterTurn3Tiles: return WoodenRCTrackRightQuarterTurn3; case TrackElemType::LeftBankedQuarterTurn3Tiles: - return WoodenRCTrackLeftQuarterTurn3Bank; + return WoodenRCTrackLeftQuarterTurn3Bank; case TrackElemType::RightBankedQuarterTurn3Tiles: return WoodenRCTrackRightQuarterTurn3Bank; case TrackElemType::LeftQuarterTurn3TilesUp25: @@ -17732,17 +13389,17 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::RightQuarterTurn3TilesDown25: return WoodenRCTrackRightQuarterTurn325DegDown; case TrackElemType::LeftHalfBankedHelixUpSmall: - return WoodenRCTrackLeftHalfBankedHelixUpSmall; + return WoodenRCTrackLeftHalfBankedHelixUpSmall; case TrackElemType::RightHalfBankedHelixUpSmall: - return WoodenRCTrackRightHalfBankedHelixUpSmall; + return WoodenRCTrackRightHalfBankedHelixUpSmall; case TrackElemType::LeftHalfBankedHelixDownSmall: return WoodenRCTrackLeftHalfBankedHelixDownSmall; case TrackElemType::RightHalfBankedHelixDownSmall: return WoodenRCTrackRightHalfBankedHelixDownSmall; case TrackElemType::LeftHalfBankedHelixUpLarge: - return WoodenRCTrackLeftHalfBankedHelixUpLarge; + return WoodenRCTrackLeftHalfBankedHelixUpLarge; case TrackElemType::RightHalfBankedHelixUpLarge: - return WoodenRCTrackRightHalfBankedHelixUpLarge; + return WoodenRCTrackRightHalfBankedHelixUpLarge; case TrackElemType::LeftHalfBankedHelixDownLarge: return WoodenRCTrackLeftHalfBankedHelixDownLarge; case TrackElemType::RightHalfBankedHelixDownLarge: @@ -17786,9 +13443,9 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::RightEighthToOrthogonal: return WoodenRCTrackRightEighthToOrthogonal; case TrackElemType::LeftEighthBankToDiag: - return WoodenRCTrackLeftEighthBankToDiag; + return WoodenRCTrackLeftEighthBankToDiag; case TrackElemType::RightEighthBankToDiag: - return WoodenRCTrackRightEighthBankToDiag; + return WoodenRCTrackRightEighthBankToDiag; case TrackElemType::LeftEighthBankToOrthogonal: return WoodenRCTrackLeftEighthBankToOrthogonal; case TrackElemType::RightEighthBankToOrthogonal: @@ -17820,37 +13477,37 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionWoodenAndClassicWoodenRC(OpenRCT2::Tra case TrackElemType::DiagDown25ToFlat: return WoodenRCTrackDiag25DegDownToFlat; case TrackElemType::DiagFlatToLeftBank: - return WoodenRCTrackDiagFlatToLeftBank; + return WoodenRCTrackDiagFlatToBank; case TrackElemType::DiagFlatToRightBank: - return WoodenRCTrackDiagFlatToRightBank; + return WoodenRCTrackDiagFlatToBank; case TrackElemType::DiagLeftBankToFlat: return WoodenRCTrackDiagLeftBankToFlat; case TrackElemType::DiagRightBankToFlat: return WoodenRCTrackDiagRightBankToFlat; case TrackElemType::DiagLeftBankToUp25: - return WoodenRCTrackDiagLeftBankTo25DegUp; + return WoodenRCTrackDiagBankTo25DegUp; case TrackElemType::DiagRightBankToUp25: - return WoodenRCTrackDiagRightBankTo25DegUp; + return WoodenRCTrackDiagBankTo25DegUp; case TrackElemType::DiagUp25ToLeftBank: - return WoodenRCTrackDiag25DegUpToLeftBank; + return WoodenRCTrackDiagUp25ToBank; case TrackElemType::DiagUp25ToRightBank: - return WoodenRCTrackDiag25DegUpToRightBank; + return WoodenRCTrackDiagUp25ToBank; case TrackElemType::DiagLeftBankToDown25: - return WoodenRCTrackDiagLeftBankTo25DegDown; + return WoodenRCTrackDiagLeftBankToDown25; case TrackElemType::DiagRightBankToDown25: - return WoodenRCTrackDiagRightBankTo25DegDown; + return WoodenRCTrackDiagRightBankToDown25; case TrackElemType::DiagDown25ToLeftBank: - return WoodenRCTrackDiag25DegDownToLeftBank; + return WoodenRCTrackDiagDown25ToLeftBank; case TrackElemType::DiagDown25ToRightBank: - return WoodenRCTrackDiag25DegDownToRightBank; + return WoodenRCTrackDiagDown25ToRightBank; case TrackElemType::DiagLeftBank: return WoodenRCTrackDiagLeftBank; case TrackElemType::DiagRightBank: return WoodenRCTrackDiagRightBank; case TrackElemType::LeftBankToLeftQuarterTurn3TilesUp25: - return WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp; + return WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp; case TrackElemType::RightBankToRightQuarterTurn3TilesUp25: - return WoodenRCTrackRightBankToRightQuarterTurn325DegUp; + return WoodenRCTrackRightBankToRightQuarterTurn325DegUp; case TrackElemType::LeftQuarterTurn3TilesDown25ToLeftBank: return WoodenRCTrackLeftQuarterTurn325DegDownToLeftBank; case TrackElemType::RightQuarterTurn3TilesDown25ToRightBank: diff --git a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.h b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.h deleted file mode 100644 index 0347a3d74e..0000000000 --- a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.h +++ /dev/null @@ -1,85 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2024 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#pragma once - -#include "../../../drawing/ImageId.hpp" -#include "../../../ride/TrackPaint.h" -#include "../../../world/Location.hpp" -#include "../../Boundbox.h" -#include "../../Paint.h" -#include "../../support/WoodenSupports.h" -#include "../../tile_element/Segment.h" -#include "../../track/Segment.h" - -#include - -struct SpriteBoundBox2 -{ - ImageIndex ImageIdA; - ImageIndex ImageIdB; - CoordsXYZ offset; - ::BoundBoxXYZ BoundBox; -}; - -// Magic number 4 refers to the number of track blocks in a diagonal track element -static constexpr const WoodenSupportSubType WoodenRCDiagonalSupports[4][kNumOrthogonalDirections] = { - { WoodenSupportSubType::Null, WoodenSupportSubType::Null, WoodenSupportSubType::Null, - WoodenSupportSubType::Null }, // sequence 0 - { WoodenSupportSubType::Corner0, WoodenSupportSubType::Corner1, WoodenSupportSubType::Corner2, - WoodenSupportSubType::Corner3 }, // sequence 1 - { WoodenSupportSubType::Corner2, WoodenSupportSubType::Corner3, WoodenSupportSubType::Corner0, - WoodenSupportSubType::Corner1 }, // sequence 2 - { WoodenSupportSubType::Null, WoodenSupportSubType::Null, WoodenSupportSubType::Null, - WoodenSupportSubType::Null } // sequence 3 -}; - -template -ImageId WoodenRCGetTrackColour(const PaintSession& session) -{ - if (isClassic) - return session.TrackColours; - else - return session.SupportColours; -} - -ImageId WoodenRCGetRailsColour(PaintSession& session); - -template -PaintStruct* WoodenRCTrackPaint( - PaintSession& session, uint8_t direction, ImageIndex imageIdTrack, ImageIndex imageIdRails, const CoordsXYZ& offset, - const BoundBoxXYZ& boundBox) -{ - ImageId imageId = WoodenRCGetTrackColour(session).WithIndex(imageIdTrack); - ImageId railsImageId = WoodenRCGetRailsColour(session).WithIndex(imageIdRails); - - PaintAddImageAsParentRotated(session, direction, imageId, offset, boundBox); - return PaintAddImageAsChildRotated(session, direction, railsImageId, offset, boundBox); -} - -template -void WoodenRCTrackPaintBb(PaintSession& session, const SpriteBoundBox2* bb, int16_t height) -{ - if (bb->ImageIdA == 0) - return; - - ImageId imageId = WoodenRCGetTrackColour(session).WithIndex(bb->ImageIdA); - PaintAddImageAsParent( - session, imageId, { bb->offset.x, bb->offset.y, height + bb->offset.z }, - { { bb->BoundBox.offset.x, bb->BoundBox.offset.y, height + bb->BoundBox.offset.z }, bb->BoundBox.length }); - if (bb->ImageIdB != 0) - { - ImageId railsImageId = WoodenRCGetRailsColour(session).WithIndex(bb->ImageIdB); - PaintAddImageAsChild( - session, railsImageId, { bb->offset.x, bb->offset.y, height + bb->offset.z }, - { { bb->BoundBox.offset, height + bb->BoundBox.offset.z }, bb->BoundBox.length }); - } -} - -TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRCFallback(OpenRCT2::TrackElemType trackType); diff --git a/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp new file mode 100644 index 0000000000..4f0e197580 --- /dev/null +++ b/src/openrct2/paint/track/coaster/WoodenRollerCoaster.hpp @@ -0,0 +1,3572 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../../../drawing/ImageId.hpp" +#include "../../../ride/TrackPaint.h" +#include "../../../world/Location.hpp" +#include "../../Boundbox.h" +#include "../../Paint.h" +#include "../../support/WoodenSupports.h" +#include "../../support/WoodenSupports.hpp" +#include "../../tile_element/Segment.h" +#include "../../track/Segment.h" + +#include + +static constexpr TunnelGroup kTunnelGroup = TunnelGroup::Square; + +struct WoodenTrackSection +{ + ImageIndex track; + ImageIndex handrail = ImageIndexUndefined; + ImageIndex frontTrack = ImageIndexUndefined; + ImageIndex frontHandrail = ImageIndexUndefined; +}; + +struct SpriteBoundBox2 +{ + ImageIndex ImageIdA; + ImageIndex ImageIdB; + CoordsXYZ offset; + ::BoundBoxXYZ BoundBox; +}; + +// Magic number 4 refers to the number of track blocks in a diagonal track element +static constexpr const WoodenSupportSubType WoodenRCDiagonalSupports[4][kNumOrthogonalDirections] = { + { WoodenSupportSubType::Null, WoodenSupportSubType::Null, WoodenSupportSubType::Null, + WoodenSupportSubType::Null }, // sequence 0 + { WoodenSupportSubType::Corner0, WoodenSupportSubType::Corner1, WoodenSupportSubType::Corner2, + WoodenSupportSubType::Corner3 }, // sequence 1 + { WoodenSupportSubType::Corner2, WoodenSupportSubType::Corner3, WoodenSupportSubType::Corner0, + WoodenSupportSubType::Corner1 }, // sequence 2 + { WoodenSupportSubType::Null, WoodenSupportSubType::Null, WoodenSupportSubType::Null, + WoodenSupportSubType::Null } // sequence 3 +}; + +template +ImageId WoodenRCGetTrackColour(const PaintSession& session) +{ + if (isClassic) + return session.TrackColours; + else + return session.SupportColours; +} + +ImageId WoodenRCGetRailsColour(PaintSession& session); + +template +PaintStruct* WoodenRCTrackPaint( + PaintSession& session, uint8_t direction, ImageIndex imageIdTrack, ImageIndex imageIdRails, const CoordsXYZ& offset, + const BoundBoxXYZ& boundBox) +{ + if (isClassic) + { + const ImageId imageId = session.TrackColours.WithIndex(imageIdTrack); + + return PaintAddImageAsParentRotated(session, direction, imageId, offset, boundBox); + } + else + { + const ImageId imageId = session.SupportColours.WithIndex(imageIdTrack); + const ImageId railsImageId = WoodenRCGetRailsColour(session).WithIndex(imageIdRails); + + PaintAddImageAsParentRotated(session, direction, imageId, offset, boundBox); + return PaintAddImageAsChildRotated(session, direction, railsImageId, offset, boundBox); + } +} + +template +void WoodenRCTrackPaintBb(PaintSession& session, const SpriteBoundBox2* bb, int16_t height) +{ + if (bb->ImageIdA == 0) + return; + + ImageId imageId = WoodenRCGetTrackColour(session).WithIndex(bb->ImageIdA); + PaintAddImageAsParent( + session, imageId, { bb->offset.x, bb->offset.y, height + bb->offset.z }, + { { bb->BoundBox.offset.x, bb->BoundBox.offset.y, height + bb->BoundBox.offset.z }, bb->BoundBox.length }); + if (bb->ImageIdB != 0) + { + ImageId railsImageId = WoodenRCGetRailsColour(session).WithIndex(bb->ImageIdB); + PaintAddImageAsChild( + session, railsImageId, { bb->offset.x, bb->offset.y, height + bb->offset.z }, + { { bb->BoundBox.offset, height + bb->BoundBox.offset.z }, bb->BoundBox.length }); + } +} + +template imageIds> +static void WoodenRCTrackStraightBankTrack(PaintSession& session, uint8_t direction, int32_t height) +{ + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { 0, 0, height }, + { { 0, 3, height }, { 32, 25, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, { 0, 0, height }, + { { 0, 26, height + 5 }, { 32, 1, 9 } }); + } +} + +/** rct2: 0x008AC658, 0x008AC668, 0x008AC738 */ +template imageIds> +void WoodenRCTrackFlatToBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackStraightBankTrack(session, direction, height); + WoodenASupportsPaintSetupRotated( + session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours); + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +/** rct2: 0x008AC6D8, 0x008AC6E8 */ +template imageIds> +static void WoodenRCTrack25DegUpToBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackStraightBankTrack(session, direction, height); + WoodenASupportsPaintSetupRotated( + session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours, + WoodenSupportTransitionType::Up25DegToFlat); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height - 8, kTunnelGroup, TunnelSubType::Flat); + } + else + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::FlatTo25Deg); + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 40); +} + +/** rct2: 0x008AC6B8, 0x008AC6C8 */ +template imageIds> +static void WoodenRCTrackBankTo25DegUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + WoodenRCTrackStraightBankTrack(session, direction, height); + WoodenASupportsPaintSetupRotated( + session, supportType.wooden, WoodenSupportSubType::NeSw, direction, height, session.SupportColours, + WoodenSupportTransitionType::FlatToUp25Deg); + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + else + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::SlopeEnd); + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); +} + +/** rct2: 0x008AC808 */ +template, 3> imageIds> +static void WoodenRCTrackLeftQuarterTurn3Bank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + } + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + break; + } + } + + TrackPaintUtilLeftQuarterTurn3TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); + + static constexpr int blockedSegments[4] = { + kSegmentsAll, + kSegmentsAll, + EnumsToFlags(PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide), + kSegmentsAll, + }; + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +template, 5> imageIds> +static void WoodenRCTrackBankedRightQuarterTurn5( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 32, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 32, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 32, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 27, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 27, 2 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + break; + } + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + } + break; + case 5: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 16, 0, height + 27 }, { 16, 32, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 32, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + break; + } + break; + case 6: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 2, 0, height }, { 32, 32, 2 } }); + if (imageIds[4][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].frontTrack, imageIds[4][direction].frontHandrail, + { 0, 0, height }, { { 2, 0, height + 27 }, { 32, 32, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 2, 0, height }, { 27, 32, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 2, 0, height }, { 27, 32, 2 } }); + if (imageIds[4][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].frontTrack, imageIds[4][direction].frontHandrail, + { 0, 0, height }, { { 2, 0, height + 27 }, { 27, 32, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 2, 0, height }, { 32, 32, 2 } }); + break; + } + break; + } + + TrackPaintUtilRightQuarterTurn5TilesTunnel(session, kTunnelGroup, TunnelSubType::Flat, height, direction, trackSequence); + + static constexpr int blockedSegments[7] = { + kSegmentsAll, + EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::centre, + PaintSegment::topLeftSide, PaintSegment::topRightSide, PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + kSegmentsAll, + }; + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, PaintUtilRotateSegments(blockedSegments[trackSequence], direction), 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +/** rct2: 0x008ACAB8 */ +template, 3> imageIds> +static void WoodenRCTrackLeftHalfBankedHelixUpSmall( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 1: + switch (direction) + { + case 0: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 1: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 2: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 3: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height + 8 }, { 20, 32, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 3: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 4: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][3].track, imageIds[0][3].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[0][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][3].frontTrack, imageIds[0][3].frontHandrail, { 0, 0, height }, + { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][0].track, imageIds[0][0].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][1].track, imageIds[0][1].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[0][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][1].frontTrack, imageIds[0][1].frontHandrail, { 0, 0, height }, + { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][2].track, imageIds[0][2].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + case 1: + PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 5: + switch (direction) + { + case 0: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 1: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 2: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 3: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 6: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][3].track, imageIds[1][3].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[1][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][3].frontTrack, imageIds[1][3].frontHandrail, { 0, 0, height }, + { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][0].track, imageIds[1][0].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][1].track, imageIds[1][1].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[1][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][1].frontTrack, imageIds[1][1].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][2].track, imageIds[1][2].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 7: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][3].track, imageIds[2][3].handrail, { 0, 0, height }, + { { 0, 6, height + 8 }, { 32, 20, 2 } }); + if (imageIds[2][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][3].frontTrack, imageIds[2][3].frontHandrail, { 0, 0, height }, + { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][0].track, imageIds[2][0].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][1].track, imageIds[2][1].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[2][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][1].frontTrack, imageIds[2][1].frontHandrail, { 0, 0, height }, + { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][2].track, imageIds[2][2].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, + PaintSegment::topLeftSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + } +} + +/** rct2: 0x008ACAC8 */ +template, 3> imageIds> +static void WoodenRCTrackRightHalfBankedHelixUpSmall( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, + PaintSegment::topLeftSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 1: + switch (direction) + { + case 0: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 1: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 2: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 3: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height + 8 }, { 20, 32, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 1: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 4: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][1].track, imageIds[0][1].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][2].track, imageIds[0][2].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[0][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][2].frontTrack, imageIds[0][2].frontHandrail, { 0, 0, height }, + { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][3].track, imageIds[0][3].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][0].track, imageIds[0][0].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[0][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][0].frontTrack, imageIds[0][0].frontHandrail, { 0, 0, height }, + { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + case 3: + PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 5: + switch (direction) + { + case 0: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 1: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 2: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 3: + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + } + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 6: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][1].track, imageIds[1][1].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][2].track, imageIds[1][2].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[1][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][2].frontTrack, imageIds[1][2].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][3].track, imageIds[1][3].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][0].track, imageIds[1][0].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[1][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][0].frontTrack, imageIds[1][0].frontHandrail, { 0, 0, height }, + { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 7: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][1].track, imageIds[2][1].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][2].track, imageIds[2][2].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[2][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][2].frontTrack, imageIds[2][2].frontHandrail, { 0, 0, height }, + { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][3].track, imageIds[2][3].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][0].track, imageIds[2][0].handrail, { 0, 0, height }, + { { 0, 6, height + 8 }, { 32, 20, 2 } }); + if (imageIds[2][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][0].frontTrack, imageIds[2][0].frontHandrail, { 0, 0, height }, + { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + } +} + +/** rct2: 0x008ACAF8 */ +template, 5> imageIds> +static void WoodenRCTrackLeftHalfBankedHelixUpLarge( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 27, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 1: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 29 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::bottomCorner, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 4: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 5: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 33 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 16, 0, height + 27 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 6: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 2, 0, height }, { 27, 32, 2 } }); + if (imageIds[4][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].frontTrack, imageIds[4][direction].frontHandrail, + { 0, 0, height }, { { 2, 0, height + 33 }, { 27, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 6, 0, height + 8 }, { 20, 32, 2 } }); + if (imageIds[4][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].frontTrack, imageIds[4][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + } + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 3: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 7: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][3].track, imageIds[0][3].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[0][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][3].frontTrack, imageIds[0][3].frontHandrail, { 0, 0, height }, + { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][0].track, imageIds[0][0].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][1].track, imageIds[0][1].handrail, { 0, 0, height }, + { { 2, 0, height }, { 27, 32, 2 } }); + if (imageIds[0][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][1].frontTrack, imageIds[0][1].frontHandrail, { 0, 0, height }, + { { 2, 0, height + 27 }, { 27, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][2].track, imageIds[0][2].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + } + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + case 1: + PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 8: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 9: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][3].track, imageIds[1][3].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + if (imageIds[1][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][3].frontTrack, imageIds[1][3].frontHandrail, { 0, 0, height }, + { { 16, 0, height + 27 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][0].track, imageIds[1][0].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][1].track, imageIds[1][1].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + if (imageIds[1][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][1].frontTrack, imageIds[1][1].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 27 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][2].track, imageIds[1][2].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 10: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][3].track, imageIds[2][3].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][3].frontTrack, imageIds[2][3].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][0].track, imageIds[2][0].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][1].track, imageIds[2][1].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[2][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][1].frontTrack, imageIds[2][1].frontHandrail, { 0, 0, height }, + { { 16, 16, height + 29 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][2].track, imageIds[2][2].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 11: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 12: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][3].track, imageIds[3][3].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[3][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][3].frontTrack, imageIds[3][3].frontHandrail, { 0, 0, height }, + { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][0].track, imageIds[3][0].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][1].track, imageIds[3][1].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + if (imageIds[3][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][1].frontTrack, imageIds[3][1].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 33 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][2].track, imageIds[3][2].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 13: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[4][3].track, imageIds[4][3].handrail, { 0, 0, height }, + { { 0, 6, height + 8 }, { 32, 20, 2 } }); + if (imageIds[4][3].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][3].frontTrack, imageIds[4][3].frontHandrail, { 0, 0, height }, + { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[4][0].track, imageIds[4][0].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[4][1].track, imageIds[4][1].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 27, 2 } }); + if (imageIds[4][1].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][1].frontTrack, imageIds[4][1].frontHandrail, { 0, 0, height }, + { { 0, 2, height + 33 }, { 32, 27, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[4][2].track, imageIds[4][2].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, + PaintSegment::topLeftSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + } +} + +/** rct2: 0x008ACB08 */ +template, 5> imageIds> +static void WoodenRCTrackRightHalfBankedHelixUpLarge( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 27, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 2, height + 27 }, { 32, 27, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::bottomCorner, + PaintSegment::topLeftSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 1: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 29 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 4: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::topCorner, PaintSegment::topLeftSide, PaintSegment::topRightSide), direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 5: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 16, 0, height + 27 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 33 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 6: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 6, 0, height + 8 }, { 20, 32, 2 } }); + if (imageIds[4][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].frontTrack, imageIds[4][direction].frontHandrail, + { 0, 0, height }, { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 2, 0, height }, { 27, 32, 2 } }); + if (imageIds[4][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].frontTrack, imageIds[4][direction].frontHandrail, + { 0, 0, height }, { { 2, 0, height + 33 }, { 27, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[4][direction].track, imageIds[4][direction].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + } + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + case 1: + PaintUtilPushTunnelLeft(session, height + 8, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 7: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][1].track, imageIds[0][1].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][2].track, imageIds[0][2].handrail, { 0, 0, height }, + { { 2, 0, height }, { 27, 32, 2 } }); + if (imageIds[0][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][2].frontTrack, imageIds[0][2].frontHandrail, { 0, 0, height }, + { { 2, 0, height + 27 }, { 27, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][3].track, imageIds[0][3].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][0].track, imageIds[0][0].handrail, { 0, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[0][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][0].frontTrack, imageIds[0][0].frontHandrail, { 0, 0, height }, + { { 6, 0, height + 27 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + } + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + case 3: + PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::Flat); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::rightCorner, + PaintSegment::topRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 8: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 9: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][1].track, imageIds[1][1].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][2].track, imageIds[1][2].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + if (imageIds[1][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][2].frontTrack, imageIds[1][2].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 27 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][3].track, imageIds[1][3].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][0].track, imageIds[1][0].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 32, 2 } }); + if (imageIds[1][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][0].frontTrack, imageIds[1][0].frontHandrail, { 0, 0, height }, + { { 16, 0, height + 27 }, { 16, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide, PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 10: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][1].track, imageIds[2][1].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][2].track, imageIds[2][2].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[2][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][2].frontTrack, imageIds[2][2].frontHandrail, { 0, 0, height }, + { { 16, 16, height + 29 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][3].track, imageIds[2][3].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][0].track, imageIds[2][0].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][0].frontTrack, imageIds[2][0].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::bottomCorner, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::rightCorner, PaintSegment::centre, PaintSegment::topRightSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 11: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags(PaintSegment::rightCorner, PaintSegment::topRightSide, PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 12: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][1].track, imageIds[3][1].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][2].track, imageIds[3][2].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + if (imageIds[3][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][2].frontTrack, imageIds[3][2].frontHandrail, { 0, 0, height }, + { { 0, 0, height + 33 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][3].track, imageIds[3][3].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][0].track, imageIds[3][0].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[3][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][0].frontTrack, imageIds[3][0].frontHandrail, { 0, 0, height }, + { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::topRightSide, PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + case 13: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[4][1].track, imageIds[4][1].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[4][2].track, imageIds[4][2].handrail, { 0, 0, height }, + { { 0, 2, height }, { 32, 27, 2 } }); + if (imageIds[4][2].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][2].frontTrack, imageIds[4][2].frontHandrail, { 0, 0, height }, + { { 0, 2, height + 33 }, { 32, 27, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[4][3].track, imageIds[4][3].handrail, { 0, 0, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NeSw, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[4][0].track, imageIds[4][0].handrail, { 0, 0, height }, + { { 0, 6, height + 8 }, { 32, 20, 2 } }); + if (imageIds[4][0].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[4][0].frontTrack, imageIds[4][0].frontHandrail, { 0, 0, height }, + { { 0, 6, height + 27 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::NwSe, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height + 8, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::rightCorner, PaintSegment::bottomCorner, + PaintSegment::bottomRightSide), + direction), + 48, 0x20); + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::topCorner, PaintSegment::centre, PaintSegment::topLeftSide, PaintSegment::topRightSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); + break; + } +} + +/** rct2: 0x008ACB38 */ +template, 2> imageIds> +static void WoodenRCTrackLeftBankToLeftQuarterTurn325DegUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 6, height }, { { 0, 6, height + 67 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 6, height }, { { 0, 6, height + 67 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 1: + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::leftCorner, PaintSegment::centre, PaintSegment::topLeftSide, + PaintSegment::bottomLeftSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 6, 0, height }, { { 6, 0, height + 67 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 6, 0, height }, { { 6, 0, height + 67 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 6, 0, height }, { { 6, 0, height + 67 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + } + switch (direction) + { + case 2: + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); + break; + case 3: + PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); + break; + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + } +} + +/** rct2: 0x008ACB48 */ +template, 2> imageIds> +static void WoodenRCTrackRightBankToRightQuarterTurn325DegUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 6, height }, { { 0, 6, height + 67 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 6, height }, { { 0, 6, height + 67 }, { 32, 20, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 6, height }, + { { 0, 6, height }, { 32, 20, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + case 1: + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 2: + PaintUtilSetSegmentSupportHeight( + session, + PaintUtilRotateSegments( + EnumsToFlags( + PaintSegment::bottomCorner, PaintSegment::centre, PaintSegment::bottomLeftSide, + PaintSegment::bottomRightSide), + direction), + 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); + break; + case 3: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 6, 0, height }, { { 6, 0, height + 67 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner2, height, session.SupportColours); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 6, 0, height }, { { 6, 0, height + 67 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner3, height, session.SupportColours); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 6, 0, height }, { { 6, 0, height + 67 }, { 20, 32, 0 } }); + } + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner0, height, session.SupportColours); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 6, 0, height }, + { { 6, 0, height }, { 20, 32, 2 } }); + WoodenASupportsPaintSetup( + session, supportType.wooden, WoodenSupportSubType::Corner1, height, session.SupportColours); + break; + } + switch (direction) + { + case 0: + PaintUtilPushTunnelRight(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); + break; + case 1: + PaintUtilPushTunnelLeft(session, height, kTunnelGroup, TunnelSubType::SlopeEnd); + break; + } + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 64); + break; + } +} + +/** rct2: 0x008ACA18, 0x008AC9F8 */ +template imageIds> +static void WoodenRCTrackDiagFlatToBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + } + break; + } + break; + case 3: + switch (direction) + { + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + } + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +/** rct2: 0x008ACA58, 0x008ACA68 */ +template imageIds> +static void WoodenRCTrackDiagBankTo25DegUp( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 35 }, { 32, 32, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 35 }, { 32, 32, 0 } }); + } + break; + } + break; + case 3: + switch (direction) + { + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + } + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 48); +} + +/** rct2: 0x008ACA38, 0x008ACA48 */ +template imageIds> +static void WoodenRCTrackDiagUp25ToBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 35 }, { 32, 32, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 35 }, { 32, 32, 0 } }); + } + break; + } + break; + case 3: + switch (direction) + { + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + } + + DrawSupportForSequenceB( + session, supportType.wooden, trackSequence, direction, height + 16, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 56); +} + +/** rct2: 0x008AC9D8 */ +template imageIds> +static void WoodenRCTrackDiagLeftBank( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + if (imageIds[direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[direction].frontTrack, imageIds[direction].frontHandrail, + { -16, -16, height }, { { -16, -16, height + 27 }, { 32, 32, 0 } }); + } + break; + } + break; + case 3: + switch (direction) + { + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[direction].track, imageIds[direction].handrail, { -16, -16, height }, + { { -16, -16, height }, { 32, 32, 2 } }); + break; + } + break; + } + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +/** rct2: 0x008AC998 */ +template, 4> imageIds> +static void WoodenRCTrackLeftEighthBankToDiag( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 32, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 32, 0 } }); + } + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 34, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + break; + } + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 16, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + } + break; + case 4: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 18, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 16, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + } + break; + } + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +/** rct2: 0x008AC9A8 */ +template, 4> imageIds> +static void WoodenRCTrackRightEighthBankToDiag( + PaintSession& session, const Ride& ride, uint8_t trackSequence, uint8_t direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 32, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + if (imageIds[0][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].frontTrack, imageIds[0][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 32, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[0][direction].track, imageIds[0][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 32, 2 } }); + break; + } + if (direction == 0 || direction == 3) + { + PaintUtilPushTunnelRotated(session, direction, height, kTunnelGroup, TunnelSubType::Flat); + } + break; + case 1: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 32, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 32, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 34, 16, 2 } }); + if (imageIds[1][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].frontTrack, imageIds[1][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 32, 16, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[1][direction].track, imageIds[1][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 32, 16, 2 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 0, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 4, 4, height }, { 28, 28, 2 } }); + if (imageIds[2][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].frontTrack, imageIds[2][direction].frontHandrail, + { 0, 0, height }, { { 4, 4, height + 27 }, { 28, 28, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[2][direction].track, imageIds[2][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 16, 2 } }); + break; + } + break; + case 4: + switch (direction) + { + case 0: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 0, height }, { 16, 16, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 16, 0, height + 27 }, { 16, 16, 0 } }); + } + break; + case 1: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 0, height }, { 16, 16, 2 } }); + break; + case 2: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 0, 16, height }, { 16, 18, 2 } }); + if (imageIds[3][direction].frontTrack != ImageIndexUndefined) + { + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].frontTrack, imageIds[3][direction].frontHandrail, + { 0, 0, height }, { { 0, 16, height + 27 }, { 16, 16, 0 } }); + } + break; + case 3: + WoodenRCTrackPaint( + session, direction, imageIds[3][direction].track, imageIds[3][direction].handrail, { 0, 0, height }, + { { 16, 16, height }, { 16, 16, 2 } }); + break; + } + break; + } + + DrawSupportForSequenceA( + session, supportType.wooden, trackSequence, direction, height, session.SupportColours); + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + kDefaultGeneralSupportHeight); +} + +TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRCFallback(OpenRCT2::TrackElemType trackType); diff --git a/src/openrct2/paint/track/thrill/Enterprise.cpp b/src/openrct2/paint/track/thrill/Enterprise.cpp index f389b66080..e33d0dd6bd 100644 --- a/src/openrct2/paint/track/thrill/Enterprise.cpp +++ b/src/openrct2/paint/track/thrill/Enterprise.cpp @@ -22,6 +22,7 @@ #include "../../track/Segment.h" using namespace OpenRCT2; +using namespace OpenRCT2::Numerics; static void PaintEnterpriseRiders( PaintSession& session, const RideObjectEntry& rideEntry, Vehicle& vehicle, uint32_t imageOffset, const CoordsXYZ& offset, @@ -39,7 +40,7 @@ static void PaintEnterpriseRiders( break; auto frameOffset1 = ((imageOffset % 4) * 4 + (i * 4) % 15) & 0x0F; - auto frameOffset2 = Floor2(imageOffset, 4) * 4; + auto frameOffset2 = floor2(imageOffset, 4) * 4; auto imageTemplate = ImageId(0, vehicle.peep_tshirt_colours[i]); auto imageId = imageTemplate.WithIndex(baseImageIndex + 196 + frameOffset1 + frameOffset2); PaintAddImageAsChild(session, imageId, offset, bb); diff --git a/src/openrct2/paint/track/water/BoatHire.cpp b/src/openrct2/paint/track/water/BoatHire.cpp index 022b8dedb4..54e47278bc 100644 --- a/src/openrct2/paint/track/water/BoatHire.cpp +++ b/src/openrct2/paint/track/water/BoatHire.cpp @@ -12,6 +12,7 @@ #include "../../../ride/Ride.h" #include "../../../ride/Track.h" #include "../../../ride/TrackPaint.h" +#include "../../../sprites.h" #include "../../Paint.h" #include "../../tile_element/Segment.h" #include "../../track/Segment.h" @@ -94,21 +95,21 @@ static void PaintBoatHireTrackLeftQuarterTurn1Tile( { case 0: imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_BACK_SW_NW); - PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 0 } }); + PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 1 } }); imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_FRONT_SW_NW); PaintAddImageAsParent(session, imageId, offset, { { 28, 28, height + 2 }, { 3, 3, 3 } }); break; case 1: imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_BACK_NW_NE); - PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 0 } }); + PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 1 } }); imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_FRONT_NW_NE); PaintAddImageAsParent(session, imageId, offset, { { 28, 28, height + 2 }, { 3, 3, 3 } }); break; case 2: imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_BACK_NE_SE); - PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 0 } }); + PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 1 } }); imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_FRONT_NE_SE); PaintAddImageAsParent(session, imageId, offset, { { 28, 28, height + 2 }, { 3, 3, 3 } }); @@ -118,7 +119,7 @@ static void PaintBoatHireTrackLeftQuarterTurn1Tile( PaintAddImageAsParent(session, imageId, offset, { { 28, 28, height + 2 }, { 3, 3, 3 } }); imageId = session.TrackColours.WithIndex(SPR_BOAT_HIRE_FLAT_QUARTER_TURN_1_TILE_BACK_SE_SW); - PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 0 } }); + PaintAddImageAsParent(session, imageId, offset, { { 0, 0, height }, { 32, 32, 1 } }); break; } @@ -139,6 +140,1095 @@ static void PaintBoatHireTrackRightQuarterTurn1Tile( session, ride, trackSequence, (direction + 3) % 4, height, trackElement, supportType); } +static void PaintBoatHireTrackLeftQuarterTurn3Tiles( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 1)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 6)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 7)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 13)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 19)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + } + break; + case 1: + switch (direction) + { + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 8)), + { 0, 0, height }, { { 16, 16, height }, { 1, 1, 1 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 21)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 2)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 3)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 9)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 14)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 15)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 20)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + break; + } + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 4)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 5)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 10)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 11)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 16)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 17)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 22)), + { 0, 0, height }, { { 6, 0, height }, { 26, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 23)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 26, 32, 0 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + +static void PaintBoatHireTrackRightQuarterTurn3Tiles( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapLeftQuarterTurn3TilesToRightQuarterTurn3Tiles[trackSequence]; + PaintBoatHireTrackLeftQuarterTurn3Tiles( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void PaintBoatHireTrackLeftQuarterTurn5Tiles( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 1)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 10)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 11)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 20)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 21)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 30)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 31)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 2)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 3)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 12)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 13)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 22)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 23)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 32, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 32)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 33)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 32, 16, 0 } }); + break; + } + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 4)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 5)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 14)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 15)), + { 0, 0, height }, { { 16, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 24)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 25)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 34)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 35)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 32, 0 } }); + break; + } + break; + case 5: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 6)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 7)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 32, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 16)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 17)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 32, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 26)), + { 0, 0, height }, { { 0, 0, height }, { 16, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 27)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 32, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 36)), + { 0, 0, height }, { { 16, 0, height }, { 16, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 37)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 32, 0 } }); + break; + } + break; + case 6: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 8)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 9)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 18)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 19)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 28)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 29)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 38)), + { 0, 0, height }, { { 6, 0, height }, { 20, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 39)), + { 0, 0, height }, { { 6, 0, height + 15 }, { 20, 32, 0 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + +static void PaintBoatHireTrackRightQuarterTurn5Tiles( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = kMapLeftQuarterTurn5TilesToRightQuarterTurn5Tiles[trackSequence]; + PaintBoatHireTrackLeftQuarterTurn5Tiles( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void PaintBoatHireTrackLeftEighthToDiag( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 1)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 8)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 9)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 19)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 26)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 27)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 2)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 3)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 10)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 11)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 20)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 21)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 32, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 28)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 29)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 32, 16, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 4)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 5)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 12)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 13)), + { 0, 0, height }, { { 16, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 22)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 23)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 30)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 31)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + case 3: + switch (direction) + { + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 14)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 15)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 6)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsChildRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 7)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 16)), + { 0, 0, height }, { { 0, 16, height }, { 16, 18, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 17)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 24)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 25)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 32)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 33)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + +static void PaintBoatHireTrackRightEighthToDiag( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 34)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 35)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 42)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 43)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 50)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 51)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 60)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 61)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 36)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 37)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 32, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 44)), + { 0, 0, height }, { { 0, 16, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 45)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 32, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 52)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 53)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 62)), + { 0, 0, height }, { { 0, 0, height }, { 32, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 63)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 16, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 38)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 39)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 46)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 47)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 54)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 55)), + { 0, 0, height }, { { 16, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 64)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 65)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + case 3: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 56)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 57)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + case 4: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 40)), + { 0, 0, height }, { { 16, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 41)), + { 0, 0, height }, { { 16, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 48)), + { 0, 0, height }, { { 0, 0, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 49)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 16, 16, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 58)), + { 0, 0, height }, { { 0, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 59)), + { 0, 0, height }, { { 0, 16, height + 15 }, { 16, 16, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 66)), + { 0, 0, height }, { { 16, 16, height }, { 16, 16, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 67)), + { 0, 0, height }, { { 16, 16, height + 15 }, { 16, 16, 0 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + +static void PaintBoatHireTrackLeftEighthToOrthogonal( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + PaintBoatHireTrackRightEighthToDiag( + session, ride, trackSequence, DirectionReverse(direction), height, trackElement, supportType); +} + +static void PaintBoatHireTrackRightEighthToOrthogonal( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + trackSequence = mapLeftEighthTurnToOrthogonal[trackSequence]; + PaintBoatHireTrackLeftEighthToDiag( + session, ride, trackSequence, DirectionPrev(direction), height, trackElement, supportType); +} + +static void PaintBoatHireTrackDiagFlat( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 2), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 1 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 0), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 1), + { -16, -16, height }, { { -16, -16, height + 15 }, { 32, 32, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 0), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 1), + { -16, -16, height }, { { -16, -16, height + 15 }, { 32, 32, 0 } }); + break; + } + break; + case 3: + switch (direction) + { + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex(SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 2), + { -16, -16, height }, { { -16, -16, height }, { 32, 32, 1 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + +static void PaintBoatHireTrackSBendLeft( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 1)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 8)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 9)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 6)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 7)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 14)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 15)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 2)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 3)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 10)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 11)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 4)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 5)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 13)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 4)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 5)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 12)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 13)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 2)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 3)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 10)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 11)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + } + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 6)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 7)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 14)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 15)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 0)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 1)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 8)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 9)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + +static void PaintBoatHireTrackSBendRight( + PaintSession& session, const Ride& ride, uint8_t trackSequence, Direction direction, int32_t height, + const TrackElement& trackElement, SupportType supportType) +{ + switch (trackSequence) + { + case 0: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 17)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 24)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 25)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 22)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 01 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 23)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 30)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 31)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + case 1: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 19)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 26)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 27)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 20)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 21)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 28)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 29)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + } + break; + case 2: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 20)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 11 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 21)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 28)), + { 0, 0, height }, { { 0, 0, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 29)), + { 0, 0, height }, { { 0, 0, height + 15 }, { 32, 26, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 18)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 19)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 26)), + { 0, 0, height }, { { 0, 6, height }, { 32, 26, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 27)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 26, 0 } }); + break; + } + break; + case 3: + switch (direction) + { + case 0: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 22)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 23)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 1: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 30)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 31)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 2: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 16)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 17)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + case 3: + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 24)), + { 0, 0, height }, { { 0, 6, height }, { 32, 20, 1 } }); + PaintAddImageAsParentRotated( + session, direction, session.TrackColours.WithIndex((SPR_G2_BOAT_HIRE_TRACK_S_BEND + 25)), + { 0, 0, height }, { { 0, 6, height + 15 }, { 32, 20, 0 } }); + break; + } + break; + } + + PaintUtilSetSegmentSupportHeight(session, kSegmentsAll, 0xFFFF, 0); + PaintUtilSetGeneralSupportHeight(session, height + 16); +} + /** * rct2: 0x008B0D60 */ @@ -158,6 +1248,41 @@ TRACK_PAINT_FUNCTION GetTrackPaintFunctionBoatHire(OpenRCT2::TrackElemType track return PaintBoatHireTrackLeftQuarterTurn1Tile; case TrackElemType::RightQuarterTurn1Tile: return PaintBoatHireTrackRightQuarterTurn1Tile; + + // Added by OpenRCT2 + + // Small turns + case TrackElemType::LeftQuarterTurn3Tiles: + return PaintBoatHireTrackLeftQuarterTurn3Tiles; + case TrackElemType::RightQuarterTurn3Tiles: + return PaintBoatHireTrackRightQuarterTurn3Tiles; + + // Medium turns + case TrackElemType::LeftQuarterTurn5Tiles: + return PaintBoatHireTrackLeftQuarterTurn5Tiles; + case TrackElemType::RightQuarterTurn5Tiles: + return PaintBoatHireTrackRightQuarterTurn5Tiles; + + // Large turns + case TrackElemType::LeftEighthToDiag: + return PaintBoatHireTrackLeftEighthToDiag; + case TrackElemType::RightEighthToDiag: + return PaintBoatHireTrackRightEighthToDiag; + case TrackElemType::LeftEighthToOrthogonal: + return PaintBoatHireTrackLeftEighthToOrthogonal; + case TrackElemType::RightEighthToOrthogonal: + return PaintBoatHireTrackRightEighthToOrthogonal; + + // Diagonal + case TrackElemType::DiagFlat: + return PaintBoatHireTrackDiagFlat; + + // S bends + case TrackElemType::SBendLeft: + return PaintBoatHireTrackSBendLeft; + case TrackElemType::SBendRight: + return PaintBoatHireTrackSBendRight; + default: return nullptr; } diff --git a/src/openrct2/park/Legacy.cpp b/src/openrct2/park/Legacy.cpp index fa05855f0f..0105374d4c 100644 --- a/src/openrct2/park/Legacy.cpp +++ b/src/openrct2/park/Legacy.cpp @@ -2563,6 +2563,98 @@ bool TrackTypeMustBeMadeInvisible(ride_type_t rideType, OpenRCT2::TrackElemType break; } } + else if ( + (rideType == RIDE_TYPE_TWISTER_ROLLER_COASTER || rideType == RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER + || rideType == RIDE_TYPE_HYPER_TWISTER || rideType == RIDE_TYPE_FLYING_ROLLER_COASTER) + && parkFileVersion < kExtendedTwisterCoasterVersion) + { + switch (trackType) + { + case TrackElemType::LeftEighthToDiagUp25: + case TrackElemType::RightEighthToDiagUp25: + case TrackElemType::LeftEighthToDiagDown25: + case TrackElemType::RightEighthToDiagDown25: + case TrackElemType::LeftEighthToOrthogonalUp25: + case TrackElemType::RightEighthToOrthogonalUp25: + case TrackElemType::LeftEighthToOrthogonalDown25: + case TrackElemType::RightEighthToOrthogonalDown25: + case TrackElemType::DiagUp25ToLeftBankedUp25: + case TrackElemType::DiagUp25ToRightBankedUp25: + case TrackElemType::DiagLeftBankedUp25ToUp25: + case TrackElemType::DiagRightBankedUp25ToUp25: + case TrackElemType::DiagDown25ToLeftBankedDown25: + case TrackElemType::DiagDown25ToRightBankedDown25: + case TrackElemType::DiagLeftBankedDown25ToDown25: + case TrackElemType::DiagRightBankedDown25ToDown25: + case TrackElemType::DiagLeftBankedFlatToLeftBankedUp25: + case TrackElemType::DiagRightBankedFlatToRightBankedUp25: + case TrackElemType::DiagLeftBankedUp25ToLeftBankedFlat: + case TrackElemType::DiagRightBankedUp25ToRightBankedFlat: + case TrackElemType::DiagLeftBankedFlatToLeftBankedDown25: + case TrackElemType::DiagRightBankedFlatToRightBankedDown25: + case TrackElemType::DiagLeftBankedDown25ToLeftBankedFlat: + case TrackElemType::DiagRightBankedDown25ToRightBankedFlat: + case TrackElemType::DiagUp25LeftBanked: + case TrackElemType::DiagUp25RightBanked: + case TrackElemType::DiagDown25LeftBanked: + case TrackElemType::DiagDown25RightBanked: + case TrackElemType::DiagFlatToLeftBankedUp25: + case TrackElemType::DiagFlatToRightBankedUp25: + case TrackElemType::DiagLeftBankedUp25ToFlat: + case TrackElemType::DiagRightBankedUp25ToFlat: + case TrackElemType::DiagFlatToLeftBankedDown25: + case TrackElemType::DiagFlatToRightBankedDown25: + case TrackElemType::DiagLeftBankedDown25ToFlat: + case TrackElemType::DiagRightBankedDown25ToFlat: + case TrackElemType::LeftEighthBankToDiagUp25: + case TrackElemType::RightEighthBankToDiagUp25: + case TrackElemType::LeftEighthBankToDiagDown25: + case TrackElemType::RightEighthBankToDiagDown25: + case TrackElemType::LeftEighthBankToOrthogonalUp25: + case TrackElemType::RightEighthBankToOrthogonalUp25: + case TrackElemType::LeftEighthBankToOrthogonalDown25: + case TrackElemType::RightEighthBankToOrthogonalDown25: + case TrackElemType::LeftLargeCorkscrewUp: + case TrackElemType::RightLargeCorkscrewUp: + case TrackElemType::LeftLargeCorkscrewDown: + case TrackElemType::RightLargeCorkscrewDown: + case TrackElemType::LeftMediumHalfLoopUp: + case TrackElemType::RightMediumHalfLoopUp: + case TrackElemType::LeftMediumHalfLoopDown: + case TrackElemType::RightMediumHalfLoopDown: + case TrackElemType::LeftZeroGRollUp: + case TrackElemType::RightZeroGRollUp: + case TrackElemType::LeftZeroGRollDown: + case TrackElemType::RightZeroGRollDown: + case TrackElemType::LeftLargeZeroGRollUp: + case TrackElemType::RightLargeZeroGRollUp: + case TrackElemType::LeftLargeZeroGRollDown: + case TrackElemType::RightLargeZeroGRollDown: + return true; + default: + break; + } + } + else if (rideType == RIDE_TYPE_BOAT_HIRE && parkFileVersion < kExtendedBoatHireVersion) + { + switch (trackType) + { + case TrackElemType::LeftQuarterTurn3Tiles: + case TrackElemType::RightQuarterTurn3Tiles: + case TrackElemType::LeftQuarterTurn5Tiles: + case TrackElemType::RightQuarterTurn5Tiles: + case TrackElemType::LeftEighthToDiag: + case TrackElemType::RightEighthToDiag: + case TrackElemType::LeftEighthToOrthogonal: + case TrackElemType::RightEighthToOrthogonal: + case TrackElemType::DiagFlat: + case TrackElemType::SBendLeft: + case TrackElemType::SBendRight: + return true; + default: + break; + } + } return false; } diff --git a/src/openrct2/park/ParkFile.cpp b/src/openrct2/park/ParkFile.cpp index cf2c503ec6..716621e741 100644 --- a/src/openrct2/park/ParkFile.cpp +++ b/src/openrct2/park/ParkFile.cpp @@ -42,6 +42,7 @@ #include "../management/Finance.h" #include "../management/NewsItem.h" #include "../object/Object.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" #include "../peep/RideUseSystem.h" diff --git a/src/openrct2/park/ParkFile.h b/src/openrct2/park/ParkFile.h index 61c19360ed..1eb787d3f5 100644 --- a/src/openrct2/park/ParkFile.h +++ b/src/openrct2/park/ParkFile.h @@ -11,10 +11,10 @@ namespace OpenRCT2 struct GameState_t; // Current version that is saved. - constexpr uint32_t PARK_FILE_CURRENT_VERSION = 42; + constexpr uint32_t PARK_FILE_CURRENT_VERSION = 46; // The minimum version that is forwards compatible with the current version. - constexpr uint32_t PARK_FILE_MIN_VERSION = 42; + constexpr uint32_t PARK_FILE_MIN_VERSION = 45; // The minimum version that is backwards compatible with the current version. // If this is increased beyond 0, uncomment the checks in ParkFile.cpp and Context.cpp! @@ -33,6 +33,8 @@ namespace OpenRCT2 constexpr uint16_t kPeepNamesObjectsVersion = 39; constexpr uint16_t kWoodenRollerCoasterMediumLargeHalfLoopsVersion = 41; constexpr uint16_t kExtendedCorkscrewCoasterVersion = 42; + constexpr uint16_t kExtendedTwisterCoasterVersion = 43; + constexpr uint16_t kExtendedBoatHireVersion = 46; } // namespace OpenRCT2 class ParkFileExporter diff --git a/src/openrct2/peep/PeepAnimationData.cpp b/src/openrct2/peep/PeepAnimationData.cpp index 042f3baa99..5b6daeb00d 100644 --- a/src/openrct2/peep/PeepAnimationData.cpp +++ b/src/openrct2/peep/PeepAnimationData.cpp @@ -9,16 +9,114 @@ #include "PeepAnimationData.h" +#include "../drawing/Drawing.h" #include "PeepSpriteIds.h" +#include #include namespace OpenRCT2 { + // Adapted from CarEntry.cpp + static SpriteBounds inferMaxAnimationDimensions(const PeepAnimation& anim) + { + constexpr uint8_t kWidth = 200; + constexpr uint8_t kHeight = 200; + constexpr uint8_t kCentreX = kWidth / 2; + constexpr uint8_t kCentreY = kHeight / 2; + + uint8_t bitmap[kHeight][kWidth] = { 0 }; + + DrawPixelInfo dpi = { + .bits = reinterpret_cast(bitmap), + .x = -(kWidth / 2), + .y = -(kHeight / 2), + .width = kWidth, + .height = kHeight, + .pitch = 0, + .zoom_level = ZoomLevel{ 0 }, + }; + + const auto numImages = *(std::max_element(anim.frame_offsets.begin(), anim.frame_offsets.end())) + 1; + for (int32_t i = 0; i < numImages; ++i) + { + GfxDrawSpriteSoftware(dpi, ImageId(anim.base_image + i), { 0, 0 }); + } + + int32_t spriteWidth = -1; + for (int32_t i = kCentreX - 1; i != 0; --i) + { + for (int32_t j = 0; j < kWidth; j++) + { + if (bitmap[j][kCentreX - i] != 0) + { + spriteWidth = i; + break; + } + } + + if (spriteWidth != -1) + break; + + for (int32_t j = 0; j < kWidth; j++) + { + if (bitmap[j][kCentreX + i] != 0) + { + spriteWidth = i; + break; + } + } + + if (spriteWidth != -1) + break; + } + spriteWidth++; + + int32_t spriteHeightNegative = -1; + for (int32_t i = kCentreY - 1; i != 0; --i) + { + for (int32_t j = 0; j < kWidth; j++) + { + if (bitmap[kCentreY - i][j] != 0) + { + spriteHeightNegative = i; + break; + } + } + + if (spriteHeightNegative != -1) + break; + } + spriteHeightNegative++; + + int32_t spriteHeightPositive = -1; + for (int32_t i = kCentreY - 1; i != 0; --i) + { + for (int32_t j = 0; j < kWidth; j++) + { + if (bitmap[kCentreY + i][j] != 0) + { + spriteHeightPositive = i; + break; + } + } + + if (spriteHeightPositive != -1) + break; + } + spriteHeightPositive++; + + return { + .sprite_width = static_cast(spriteWidth), + .sprite_height_negative = static_cast(spriteHeightNegative), + .sprite_height_positive = static_cast(spriteHeightPositive), + }; + } + // clang-format off // Define animation sequences for Normal sprites - static constexpr std::array kPeepAnimationSequenceNormalNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceNormalWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceNormalCheckTime = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8 }; static constexpr std::array kPeepAnimationSequenceNormalWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceNormalEatFood = { 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 8, 9, 10 }; @@ -46,39 +144,39 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceNormalWithdrawMoney = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11, 12, 11, 12, 11, 12, 11, 12, 11, 11, 11, 11, 11, 13, 14, 15 }; // Define animation group for Normal sequences - static constexpr PeepAnimations kPeepAnimationsNormal = []() { + static PeepAnimations kPeepAnimationsNormal = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kPeepSpriteNormalStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceNormalNone }; - pag[PeepAnimationType::CheckTime] = { kPeepSpriteNormalStateCheckTimeId, { 8, 16, 5 }, kPeepAnimationSequenceNormalCheckTime }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteNormalStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceNormalWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteNormalStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceNormalEatFood }; - pag[PeepAnimationType::ShakeHead] = { kPeepSpriteNormalStateShakeHeadId, { 8, 16, 5 }, kPeepAnimationSequenceNormalShakeHead }; - pag[PeepAnimationType::EmptyPockets] = { kPeepSpriteNormalStateEmptyPocketsId, { 8, 16, 5 }, kPeepAnimationSequenceNormalEmptyPockets }; - pag[PeepAnimationType::HoldMat] = { kPeepSpriteNormalStateHoldMatId, { 9, 16, 5 }, kPeepAnimationSequenceNormalHoldMat }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteNormalStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceNormalSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteNormalStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceNormalSittingEatFood }; - pag[PeepAnimationType::SittingLookAroundLeft] = { kPeepSpriteNormalStateSittingLookAroundLeftId, { 9, 16, 6 }, kPeepAnimationSequenceNormalSittingLookAroundLeft }; - pag[PeepAnimationType::SittingLookAroundRight] = { kPeepSpriteNormalStateSittingLookAroundRightId, { 9, 16, 6 }, kPeepAnimationSequenceNormalSittingLookAroundRight }; - pag[PeepAnimationType::Hanging] = { kPeepSpriteNormalStateHangingId, { 8, 16, 5 }, kPeepAnimationSequenceNormalHanging }; - pag[PeepAnimationType::Wow] = { kPeepSpriteNormalStateWowId, { 12, 22, 5 }, kPeepAnimationSequenceNormalWow }; - pag[PeepAnimationType::ThrowUp] = { kPeepSpriteNormalStateThrowUpId, { 9, 16, 7 }, kPeepAnimationSequenceNormalThrowUp }; - pag[PeepAnimationType::Jump] = { kPeepSpriteNormalStateJumpId, { 10, 22, 5 }, kPeepAnimationSequenceNormalJump }; - pag[PeepAnimationType::Drowning] = { kPeepSpriteNormalStateDrowningId, { 9, 15, 6 }, kPeepAnimationSequenceNormalDrowning }; - pag[PeepAnimationType::Joy] = { kPeepSpriteNormalStateJoyId, { 11, 24, 6 }, kPeepAnimationSequenceNormalJoy }; - pag[PeepAnimationType::ReadMap] = { kPeepSpriteNormalStateReadMapId, { 11, 16, 5 }, kPeepAnimationSequenceNormalReadMap }; - pag[PeepAnimationType::Wave] = { kPeepSpriteNormalStateWaveId, { 11, 16, 5 }, kPeepAnimationSequenceNormalWave }; - pag[PeepAnimationType::Wave2] = { kPeepSpriteNormalStateWave2Id, { 11, 16, 5 }, kPeepAnimationSequenceNormalWave2 }; - pag[PeepAnimationType::TakePhoto] = { kPeepSpriteNormalStateTakePhotoId, { 8, 16, 5 }, kPeepAnimationSequenceNormalTakePhoto }; - pag[PeepAnimationType::Clap] = { kPeepSpriteNormalStateClapId, { 9, 17, 6 }, kPeepAnimationSequenceNormalClap }; - pag[PeepAnimationType::Disgust] = { kPeepSpriteNormalStateDisgustId, { 9, 16, 5 }, kPeepAnimationSequenceNormalDisgust }; - pag[PeepAnimationType::DrawPicture] = { kPeepSpriteNormalStateDrawPictureId, { 9, 22, 7 }, kPeepAnimationSequenceNormalDrawPicture }; - pag[PeepAnimationType::BeingWatched] = { kPeepSpriteNormalStateBeingWatchedId, { 9, 22, 7 }, kPeepAnimationSequenceNormalBeingWatched }; - pag[PeepAnimationType::WithdrawMoney] = { kPeepSpriteNormalStateWithdrawMoneyId, { 9, 22, 7 }, kPeepAnimationSequenceNormalWithdrawMoney }; + pag[PeepAnimationType::Walking] = { kPeepSpriteNormalStateWalkingId, kPeepAnimationSequenceNormalWalking }; + pag[PeepAnimationType::CheckTime] = { kPeepSpriteNormalStateCheckTimeId, kPeepAnimationSequenceNormalCheckTime }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteNormalStateWatchRideId, kPeepAnimationSequenceNormalWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteNormalStateEatFoodId, kPeepAnimationSequenceNormalEatFood }; + pag[PeepAnimationType::ShakeHead] = { kPeepSpriteNormalStateShakeHeadId, kPeepAnimationSequenceNormalShakeHead }; + pag[PeepAnimationType::EmptyPockets] = { kPeepSpriteNormalStateEmptyPocketsId, kPeepAnimationSequenceNormalEmptyPockets }; + pag[PeepAnimationType::HoldMat] = { kPeepSpriteNormalStateHoldMatId, kPeepAnimationSequenceNormalHoldMat }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteNormalStateSittingIdleId, kPeepAnimationSequenceNormalSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteNormalStateSittingEatFoodId, kPeepAnimationSequenceNormalSittingEatFood }; + pag[PeepAnimationType::SittingLookAroundLeft] = { kPeepSpriteNormalStateSittingLookAroundLeftId, kPeepAnimationSequenceNormalSittingLookAroundLeft }; + pag[PeepAnimationType::SittingLookAroundRight] = { kPeepSpriteNormalStateSittingLookAroundRightId, kPeepAnimationSequenceNormalSittingLookAroundRight }; + pag[PeepAnimationType::Hanging] = { kPeepSpriteNormalStateHangingId, kPeepAnimationSequenceNormalHanging }; + pag[PeepAnimationType::Wow] = { kPeepSpriteNormalStateWowId, kPeepAnimationSequenceNormalWow }; + pag[PeepAnimationType::ThrowUp] = { kPeepSpriteNormalStateThrowUpId, kPeepAnimationSequenceNormalThrowUp }; + pag[PeepAnimationType::Jump] = { kPeepSpriteNormalStateJumpId, kPeepAnimationSequenceNormalJump }; + pag[PeepAnimationType::Drowning] = { kPeepSpriteNormalStateDrowningId, kPeepAnimationSequenceNormalDrowning }; + pag[PeepAnimationType::Joy] = { kPeepSpriteNormalStateJoyId, kPeepAnimationSequenceNormalJoy }; + pag[PeepAnimationType::ReadMap] = { kPeepSpriteNormalStateReadMapId, kPeepAnimationSequenceNormalReadMap }; + pag[PeepAnimationType::Wave] = { kPeepSpriteNormalStateWaveId, kPeepAnimationSequenceNormalWave }; + pag[PeepAnimationType::Wave2] = { kPeepSpriteNormalStateWave2Id, kPeepAnimationSequenceNormalWave2 }; + pag[PeepAnimationType::TakePhoto] = { kPeepSpriteNormalStateTakePhotoId, kPeepAnimationSequenceNormalTakePhoto }; + pag[PeepAnimationType::Clap] = { kPeepSpriteNormalStateClapId, kPeepAnimationSequenceNormalClap }; + pag[PeepAnimationType::Disgust] = { kPeepSpriteNormalStateDisgustId, kPeepAnimationSequenceNormalDisgust }; + pag[PeepAnimationType::DrawPicture] = { kPeepSpriteNormalStateDrawPictureId, kPeepAnimationSequenceNormalDrawPicture }; + pag[PeepAnimationType::BeingWatched] = { kPeepSpriteNormalStateBeingWatchedId, kPeepAnimationSequenceNormalBeingWatched }; + pag[PeepAnimationType::WithdrawMoney] = { kPeepSpriteNormalStateWithdrawMoneyId, kPeepAnimationSequenceNormalWithdrawMoney }; return pag; }(); // Define animation sequences for Handyman sprites - static constexpr std::array kPeepAnimationSequenceHandymanNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceHandymanWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceHandymanWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceHandymanHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceHandymanStaffMower = { 0, 1, 2, 3, 4, 5 }; @@ -88,21 +186,21 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceHandymanStaffEmptyBin = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; // Define animation group for Handyman sequences - static constexpr PeepAnimations kPeepAnimationsHandyman = []() { + static PeepAnimations kPeepAnimationsHandyman = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kHandymanSpriteStateNoneId, { 12, 16, 6 }, kPeepAnimationSequenceHandymanNone }; - pag[PeepAnimationType::WatchRide] = { kHandymanSpriteStateWatchRideId, { 9, 16, 6 }, kPeepAnimationSequenceHandymanWatchRide }; - pag[PeepAnimationType::Hanging] = { kHandymanSpriteStateHangingId, { 15, 16, 5 }, kPeepAnimationSequenceHandymanHanging }; - pag[PeepAnimationType::StaffMower] = { kHandymanSpriteStateStaffMowerId, { 18, 16, 11 }, kPeepAnimationSequenceHandymanStaffMower }; - pag[PeepAnimationType::StaffSweep] = { kHandymanSpriteStateStaffSweepId, { 17, 16, 9 }, kPeepAnimationSequenceHandymanStaffSweep }; - pag[PeepAnimationType::Drowning] = { kHandymanSpriteStateDrowningId, { 9, 15, 6 }, kPeepAnimationSequenceHandymanDrowning }; - pag[PeepAnimationType::StaffWatering] = { kHandymanSpriteStateStaffWateringId, { 17, 16, 9 }, kPeepAnimationSequenceHandymanStaffWatering }; - pag[PeepAnimationType::StaffEmptyBin] = { kHandymanSpriteStateStaffEmptyBinId, { 17, 16, 9 }, kPeepAnimationSequenceHandymanStaffEmptyBin }; + pag[PeepAnimationType::Walking] = { kHandymanSpriteStateWalkingId, kPeepAnimationSequenceHandymanWalking }; + pag[PeepAnimationType::WatchRide] = { kHandymanSpriteStateWatchRideId, kPeepAnimationSequenceHandymanWatchRide }; + pag[PeepAnimationType::Hanging] = { kHandymanSpriteStateHangingId, kPeepAnimationSequenceHandymanHanging }; + pag[PeepAnimationType::StaffMower] = { kHandymanSpriteStateStaffMowerId, kPeepAnimationSequenceHandymanStaffMower }; + pag[PeepAnimationType::StaffSweep] = { kHandymanSpriteStateStaffSweepId, kPeepAnimationSequenceHandymanStaffSweep }; + pag[PeepAnimationType::Drowning] = { kHandymanSpriteStateDrowningId, kPeepAnimationSequenceHandymanDrowning }; + pag[PeepAnimationType::StaffWatering] = { kHandymanSpriteStateStaffWateringId, kPeepAnimationSequenceHandymanStaffWatering }; + pag[PeepAnimationType::StaffEmptyBin] = { kHandymanSpriteStateStaffEmptyBinId, kPeepAnimationSequenceHandymanStaffEmptyBin }; return pag; }(); // Define animation sequences for Mechanic sprites - static constexpr std::array kPeepAnimationSequenceMechanicNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceMechanicWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceMechanicWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceMechanicHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceMechanicDrowning = { 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 4, 5, 6, 7 }; @@ -115,40 +213,40 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceMechanicStaffFix3 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 16, 15, 14, 15, 16, 17, 16, 15, 14, 15, 16, 17, 16, 15, 14, 13, 12, 11, 11, 12, 13, 14, 15, 16, 17, 16, 15, 14, 15, 16, 17, 16, 15, 14, 15, 16, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 22, 21, 20, 21, 22, 21, 20, 21, 22, 20, 19, 18, 0, 0, 23, 24, 25, 26, 27, 28, 28, 26, 24, 0, 0, 0, 0, 0, 0 }; // Define animation group for Mechanic sequences - static constexpr PeepAnimations kPeepAnimationsMechanic = []() { + static PeepAnimations kPeepAnimationsMechanic = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kMechanicSpriteStateNoneId, { 10, 16, 5 }, kPeepAnimationSequenceMechanicNone }; - pag[PeepAnimationType::WatchRide] = { kMechanicSpriteStateWatchRideId, { 10, 16, 5 }, kPeepAnimationSequenceMechanicWatchRide }; - pag[PeepAnimationType::Hanging] = { kMechanicSpriteStateHangingId, { 10, 16, 5 }, kPeepAnimationSequenceMechanicHanging }; - pag[PeepAnimationType::Drowning] = { kMechanicSpriteStateDrowningId, { 9, 15, 6 }, kPeepAnimationSequenceMechanicDrowning }; - pag[PeepAnimationType::StaffAnswerCall] = { kMechanicSpriteStateStaffAnswerCallId, { 13, 22, 7 }, kPeepAnimationSequenceMechanicStaffAnswerCall }; - pag[PeepAnimationType::StaffAnswerCall2] = { kMechanicSpriteStateStaffAnswerCallId, { 13, 22, 7 }, kPeepAnimationSequenceMechanicStaffAnswerCall2 }; - pag[PeepAnimationType::StaffCheckBoard] = { kMechanicSpriteStateStaffCheckBoardId, { 13, 22, 7 }, kPeepAnimationSequenceMechanicStaffCheckBoard }; - pag[PeepAnimationType::StaffFix] = { kMechanicSpriteStateStaffFixId, { 13, 22, 7 }, kPeepAnimationSequenceMechanicStaffFix }; - pag[PeepAnimationType::StaffFix2] = { kMechanicSpriteStateStaffFixId, { 13, 22, 7 }, kPeepAnimationSequenceMechanicStaffFix2 }; - pag[PeepAnimationType::StaffFixGround] = { kMechanicSpriteStateStaffFixGroundId, { 19, 16, 16 }, kPeepAnimationSequenceMechanicStaffFixGround }; - pag[PeepAnimationType::StaffFix3] = { kMechanicSpriteStateStaffFixId, { 13, 22, 7 }, kPeepAnimationSequenceMechanicStaffFix3 }; + pag[PeepAnimationType::Walking] = { kMechanicSpriteStateWalkingId, kPeepAnimationSequenceMechanicWalking }; + pag[PeepAnimationType::WatchRide] = { kMechanicSpriteStateWatchRideId, kPeepAnimationSequenceMechanicWatchRide }; + pag[PeepAnimationType::Hanging] = { kMechanicSpriteStateHangingId, kPeepAnimationSequenceMechanicHanging }; + pag[PeepAnimationType::Drowning] = { kMechanicSpriteStateDrowningId, kPeepAnimationSequenceMechanicDrowning }; + pag[PeepAnimationType::StaffAnswerCall] = { kMechanicSpriteStateStaffAnswerCallId, kPeepAnimationSequenceMechanicStaffAnswerCall }; + pag[PeepAnimationType::StaffAnswerCall2] = { kMechanicSpriteStateStaffAnswerCallId, kPeepAnimationSequenceMechanicStaffAnswerCall2 }; + pag[PeepAnimationType::StaffCheckBoard] = { kMechanicSpriteStateStaffCheckBoardId, kPeepAnimationSequenceMechanicStaffCheckBoard }; + pag[PeepAnimationType::StaffFix] = { kMechanicSpriteStateStaffFixId, kPeepAnimationSequenceMechanicStaffFix }; + pag[PeepAnimationType::StaffFix2] = { kMechanicSpriteStateStaffFixId, kPeepAnimationSequenceMechanicStaffFix2 }; + pag[PeepAnimationType::StaffFixGround] = { kMechanicSpriteStateStaffFixGroundId, kPeepAnimationSequenceMechanicStaffFixGround }; + pag[PeepAnimationType::StaffFix3] = { kMechanicSpriteStateStaffFixId, kPeepAnimationSequenceMechanicStaffFix3 }; return pag; }(); // Define animation sequences for Security sprites - static constexpr std::array kPeepAnimationSequenceSecurityNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceSecurityWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceSecurityWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSecurityHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceSecurityDrowning = { 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 4, 5, 6 }; // Define animation group for Security sequences - static constexpr PeepAnimations kPeepAnimationsSecurity = []() { + static PeepAnimations kPeepAnimationsSecurity = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kSecuritySpriteStateNoneId, { 8, 18, 5 }, kPeepAnimationSequenceSecurityNone }; - pag[PeepAnimationType::WatchRide] = { kSecuritySpriteStateWatchRideId, { 8, 17, 5 }, kPeepAnimationSequenceSecurityWatchRide }; - pag[PeepAnimationType::Hanging] = { kSecuritySpriteStateHangingId, { 15, 19, 6 }, kPeepAnimationSequenceSecurityHanging }; - pag[PeepAnimationType::Drowning] = { kSecuritySpriteStateDrowningId, { 9, 15, 6 }, kPeepAnimationSequenceSecurityDrowning }; + pag[PeepAnimationType::Walking] = { kSecuritySpriteStateWalkingId, kPeepAnimationSequenceSecurityWalking }; + pag[PeepAnimationType::WatchRide] = { kSecuritySpriteStateWatchRideId, kPeepAnimationSequenceSecurityWatchRide }; + pag[PeepAnimationType::Hanging] = { kSecuritySpriteStateHangingId, kPeepAnimationSequenceSecurityHanging }; + pag[PeepAnimationType::Drowning] = { kSecuritySpriteStateDrowningId, kPeepAnimationSequenceSecurityDrowning }; return pag; }(); // Define animation sequences for EntertainerPanda sprites - static constexpr std::array kPeepAnimationSequenceEntertainerPandaNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerPandaWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerPandaWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerPandaEatFood = { 0, 1, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 1, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerPandaHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -157,20 +255,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerPandaWave2 = { 0, 1, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 1, 0 }; // Define animation group for EntertainerPanda sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerPanda = []() { + static PeepAnimations kPeepAnimationsEntertainerPanda = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpritePandaStateNoneId, { 13, 24, 8 }, kPeepAnimationSequenceEntertainerPandaNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpritePandaStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerPandaWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpritePandaStateWaveId, { 14, 24, 7 }, kPeepAnimationSequenceEntertainerPandaEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpritePandaStateHangingId, { 19, 30, 8 }, kPeepAnimationSequenceEntertainerPandaHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpritePandaStateDrowningId, { 13, 15, 6 }, kPeepAnimationSequenceEntertainerPandaDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpritePandaStateJoyId, { 14, 25, 8 }, kPeepAnimationSequenceEntertainerPandaJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpritePandaStateWaveId, { 14, 24, 7 }, kPeepAnimationSequenceEntertainerPandaWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpritePandaStateWalkingId, kPeepAnimationSequenceEntertainerPandaWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpritePandaStateWatchRideId, kPeepAnimationSequenceEntertainerPandaWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpritePandaStateWaveId, kPeepAnimationSequenceEntertainerPandaEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpritePandaStateHangingId, kPeepAnimationSequenceEntertainerPandaHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpritePandaStateDrowningId, kPeepAnimationSequenceEntertainerPandaDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpritePandaStateJoyId, kPeepAnimationSequenceEntertainerPandaJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpritePandaStateWaveId, kPeepAnimationSequenceEntertainerPandaWave2 }; return pag; }(); // Define animation sequences for EntertainerTiger sprites - static constexpr std::array kPeepAnimationSequenceEntertainerTigerNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerTigerWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerTigerWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerTigerEatFood = { 0, 1, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 1, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerTigerHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -179,20 +277,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerTigerWave2 = { 0, 1, 2, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 4, 5, 4, 3, 2, 1, 0 }; // Define animation group for EntertainerTiger sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerTiger = []() { + static PeepAnimations kPeepAnimationsEntertainerTiger = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteTigerStateNoneId, { 13, 24, 8 }, kPeepAnimationSequenceEntertainerTigerNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteTigerStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerTigerWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteTigerStateWaveId, { 16, 24, 8 }, kPeepAnimationSequenceEntertainerTigerEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteTigerStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerTigerHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteTigerStateDrowningId, { 13, 15, 6 }, kPeepAnimationSequenceEntertainerTigerDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteTigerStateJoyId, { 16, 28, 9 }, kPeepAnimationSequenceEntertainerTigerJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteTigerStateWaveId, { 16, 24, 8 }, kPeepAnimationSequenceEntertainerTigerWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteTigerStateWalkingId, kPeepAnimationSequenceEntertainerTigerWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteTigerStateWatchRideId, kPeepAnimationSequenceEntertainerTigerWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteTigerStateWaveId, kPeepAnimationSequenceEntertainerTigerEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteTigerStateHangingId, kPeepAnimationSequenceEntertainerTigerHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteTigerStateDrowningId, kPeepAnimationSequenceEntertainerTigerDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteTigerStateJoyId, kPeepAnimationSequenceEntertainerTigerJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteTigerStateWaveId, kPeepAnimationSequenceEntertainerTigerWave2 }; return pag; }(); // Define animation sequences for EntertainerElephant sprites - static constexpr std::array kPeepAnimationSequenceEntertainerElephantNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerElephantWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerElephantWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerElephantEatFood = { 0, 1, 2, 3, 4, 5, 6, 5, 4, 3, 4, 5, 6, 5, 4, 3, 4, 5, 6, 5, 4, 3, 2, 1, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerElephantHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -201,20 +299,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerElephantWave2 = { 0, 1, 2, 3, 4, 5, 6, 5, 4, 3, 4, 5, 6, 5, 4, 3, 4, 5, 6, 5, 4, 3, 2, 1, 0 }; // Define animation group for EntertainerElephant sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerElephant = []() { + static PeepAnimations kPeepAnimationsEntertainerElephant = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteElephantStateNoneId, { 13, 24, 8 }, kPeepAnimationSequenceEntertainerElephantNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteElephantStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerElephantWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteElephantStateWaveId, { 17, 24, 8 }, kPeepAnimationSequenceEntertainerElephantEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteElephantStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerElephantHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteElephantStateDrowningId, { 17, 15, 6 }, kPeepAnimationSequenceEntertainerElephantDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteElephantStateJoyId, { 18, 25, 9 }, kPeepAnimationSequenceEntertainerElephantJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteElephantStateWaveId, { 17, 24, 8 }, kPeepAnimationSequenceEntertainerElephantWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteElephantStateWalkingId, kPeepAnimationSequenceEntertainerElephantWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteElephantStateWatchRideId, kPeepAnimationSequenceEntertainerElephantWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteElephantStateWaveId, kPeepAnimationSequenceEntertainerElephantEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteElephantStateHangingId, kPeepAnimationSequenceEntertainerElephantHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteElephantStateDrowningId, kPeepAnimationSequenceEntertainerElephantDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteElephantStateJoyId, kPeepAnimationSequenceEntertainerElephantJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteElephantStateWaveId, kPeepAnimationSequenceEntertainerElephantWave2 }; return pag; }(); // Define animation sequences for EntertainerRoman sprites - static constexpr std::array kPeepAnimationSequenceEntertainerRomanNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerRomanWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerRomanWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerRomanEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 6, 5, 4, 3, 2, 1, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerRomanHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -223,20 +321,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerRomanWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 6, 5, 4, 3, 2, 1, 0 }; // Define animation group for EntertainerRoman sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerRoman = []() { + static PeepAnimations kPeepAnimationsEntertainerRoman = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteRomanStateNoneId, { 13, 24, 8 }, kPeepAnimationSequenceEntertainerRomanNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteRomanStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerRomanWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteRomanStateWaveId, { 17, 24, 8 }, kPeepAnimationSequenceEntertainerRomanEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteRomanStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerRomanHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteRomanStateDrowningId, { 17, 15, 6 }, kPeepAnimationSequenceEntertainerRomanDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteRomanStateJoyId, { 18, 25, 9 }, kPeepAnimationSequenceEntertainerRomanJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteRomanStateWaveId, { 17, 24, 8 }, kPeepAnimationSequenceEntertainerRomanWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteRomanStateWalkingId, kPeepAnimationSequenceEntertainerRomanWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteRomanStateWatchRideId, kPeepAnimationSequenceEntertainerRomanWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteRomanStateWaveId, kPeepAnimationSequenceEntertainerRomanEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteRomanStateHangingId, kPeepAnimationSequenceEntertainerRomanHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteRomanStateDrowningId, kPeepAnimationSequenceEntertainerRomanDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteRomanStateJoyId, kPeepAnimationSequenceEntertainerRomanJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteRomanStateWaveId, kPeepAnimationSequenceEntertainerRomanWave2 }; return pag; }(); // Define animation sequences for EntertainerGorilla sprites - static constexpr std::array kPeepAnimationSequenceEntertainerGorillaNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerGorillaWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerGorillaWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerGorillaEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 8, 9, 10, 9, 8, 7, 8, 9, 10, 9, 8, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerGorillaHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -245,20 +343,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerGorillaWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 8, 9, 10, 9, 8, 7, 8, 9, 10, 9, 8, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; // Define animation group for EntertainerGorilla sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerGorilla = []() { + static PeepAnimations kPeepAnimationsEntertainerGorilla = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteGorillaStateNoneId, { 13, 24, 8 }, kPeepAnimationSequenceEntertainerGorillaNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteGorillaStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerGorillaWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteGorillaStateWaveId, { 17, 24, 8 }, kPeepAnimationSequenceEntertainerGorillaEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteGorillaStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerGorillaHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteGorillaStateDrowningId, { 17, 15, 6 }, kPeepAnimationSequenceEntertainerGorillaDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteGorillaStateWaveId, { 18, 25, 9 }, kPeepAnimationSequenceEntertainerGorillaJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteGorillaStateWaveId, { 17, 24, 8 }, kPeepAnimationSequenceEntertainerGorillaWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteGorillaStateWalkingId, kPeepAnimationSequenceEntertainerGorillaWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteGorillaStateWatchRideId, kPeepAnimationSequenceEntertainerGorillaWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteGorillaStateWaveId, kPeepAnimationSequenceEntertainerGorillaEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteGorillaStateHangingId, kPeepAnimationSequenceEntertainerGorillaHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteGorillaStateDrowningId, kPeepAnimationSequenceEntertainerGorillaDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteGorillaStateWaveId, kPeepAnimationSequenceEntertainerGorillaJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteGorillaStateWaveId, kPeepAnimationSequenceEntertainerGorillaWave2 }; return pag; }(); // Define animation sequences for EntertainerSnowman sprites - static constexpr std::array kPeepAnimationSequenceEntertainerSnowmanNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerSnowmanWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerSnowmanWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerSnowmanEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 31, 31, 32, 33 }; static constexpr std::array kPeepAnimationSequenceEntertainerSnowmanHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -267,20 +365,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerSnowmanWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 31, 31, 32, 33 }; // Define animation group for EntertainerSnowman sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerSnowman = []() { + static PeepAnimations kPeepAnimationsEntertainerSnowman = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteSnowmanStateNoneId, { 13, 24, 8 }, kPeepAnimationSequenceEntertainerSnowmanNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteSnowmanStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerSnowmanWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteSnowmanStateWaveId, { 17, 28, 9 }, kPeepAnimationSequenceEntertainerSnowmanEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteSnowmanStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerSnowmanHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteSnowmanStateDrowningId, { 17, 15, 9 }, kPeepAnimationSequenceEntertainerSnowmanDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteSnowmanStateWaveId, { 18, 28, 9 }, kPeepAnimationSequenceEntertainerSnowmanJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteSnowmanStateWaveId, { 17, 28, 9 }, kPeepAnimationSequenceEntertainerSnowmanWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteSnowmanStateWalkingId, kPeepAnimationSequenceEntertainerSnowmanWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteSnowmanStateWatchRideId, kPeepAnimationSequenceEntertainerSnowmanWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteSnowmanStateWaveId, kPeepAnimationSequenceEntertainerSnowmanEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteSnowmanStateHangingId, kPeepAnimationSequenceEntertainerSnowmanHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteSnowmanStateDrowningId, kPeepAnimationSequenceEntertainerSnowmanDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteSnowmanStateWaveId, kPeepAnimationSequenceEntertainerSnowmanJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteSnowmanStateWaveId, kPeepAnimationSequenceEntertainerSnowmanWave2 }; return pag; }(); // Define animation sequences for EntertainerKnight sprites - static constexpr std::array kPeepAnimationSequenceEntertainerKnightNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerKnightWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerKnightWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerKnightEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 13, 14, 15, 16, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 24, 25, 26, 27 }; static constexpr std::array kPeepAnimationSequenceEntertainerKnightHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -289,20 +387,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerKnightWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 10, 11, 12, 12, 12, 12, 12, 13, 14, 15, 16, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 24, 25, 26, 27 }; // Define animation group for EntertainerKnight sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerKnight = []() { + static PeepAnimations kPeepAnimationsEntertainerKnight = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteKnightStateNoneId, { 16, 32, 8 }, kPeepAnimationSequenceEntertainerKnightNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteKnightStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerKnightWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteKnightStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerKnightEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteKnightStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerKnightHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteKnightStateDrowningId, { 21, 32, 9 }, kPeepAnimationSequenceEntertainerKnightDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteKnightStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerKnightJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteKnightStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerKnightWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteKnightStateWalkingId, kPeepAnimationSequenceEntertainerKnightWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteKnightStateWatchRideId, kPeepAnimationSequenceEntertainerKnightWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteKnightStateWaveId, kPeepAnimationSequenceEntertainerKnightEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteKnightStateHangingId, kPeepAnimationSequenceEntertainerKnightHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteKnightStateDrowningId, kPeepAnimationSequenceEntertainerKnightDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteKnightStateWaveId, kPeepAnimationSequenceEntertainerKnightJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteKnightStateWaveId, kPeepAnimationSequenceEntertainerKnightWave2 }; return pag; }(); // Define animation sequences for EntertainerAstronaut sprites - static constexpr std::array kPeepAnimationSequenceEntertainerAstronautNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerAstronautWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerAstronautWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerAstronautEatFood = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 9, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerAstronautHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -311,20 +409,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerAstronautWave2 = { 0, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 7, 8, 9, 0 }; // Define animation group for EntertainerAstronaut sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerAstronaut = []() { + static PeepAnimations kPeepAnimationsEntertainerAstronaut = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteAstronautStateNoneId, { 16, 32, 8 }, kPeepAnimationSequenceEntertainerAstronautNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteAstronautStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerAstronautWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteAstronautStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerAstronautEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteAstronautStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerAstronautHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteAstronautStateDrowningId, { 21, 32, 9 }, kPeepAnimationSequenceEntertainerAstronautDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteAstronautStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerAstronautJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteAstronautStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerAstronautWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteAstronautStateWalkingId, kPeepAnimationSequenceEntertainerAstronautWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteAstronautStateWatchRideId, kPeepAnimationSequenceEntertainerAstronautWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteAstronautStateWaveId, kPeepAnimationSequenceEntertainerAstronautEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteAstronautStateHangingId, kPeepAnimationSequenceEntertainerAstronautHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteAstronautStateDrowningId, kPeepAnimationSequenceEntertainerAstronautDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteAstronautStateWaveId, kPeepAnimationSequenceEntertainerAstronautJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteAstronautStateWaveId, kPeepAnimationSequenceEntertainerAstronautWave2 }; return pag; }(); // Define animation sequences for EntertainerBandit sprites - static constexpr std::array kPeepAnimationSequenceEntertainerBanditNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerBanditWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerBanditWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerBanditEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 12, 13, 13, 13, 13, 13, 14, 15, 16, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 21, 20, 19, 20, 21, 22, 21, 20, 19, 20, 21, 22, 21, 20, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41 }; static constexpr std::array kPeepAnimationSequenceEntertainerBanditHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -333,20 +431,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerBanditWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 8, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 12, 13, 13, 13, 13, 13, 14, 15, 16, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 21, 20, 19, 20, 21, 22, 21, 20, 19, 20, 21, 22, 21, 20, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41 }; // Define animation group for EntertainerBandit sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerBandit = []() { + static PeepAnimations kPeepAnimationsEntertainerBandit = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteBanditStateNoneId, { 16, 32, 8 }, kPeepAnimationSequenceEntertainerBanditNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteBanditStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerBanditWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteBanditStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerBanditEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteBanditStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerBanditHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteBanditStateDrowningId, { 21, 32, 9 }, kPeepAnimationSequenceEntertainerBanditDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteBanditStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerBanditJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteBanditStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerBanditWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteBanditStateWalkingId, kPeepAnimationSequenceEntertainerBanditWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteBanditStateWatchRideId, kPeepAnimationSequenceEntertainerBanditWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteBanditStateWaveId, kPeepAnimationSequenceEntertainerBanditEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteBanditStateHangingId, kPeepAnimationSequenceEntertainerBanditHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteBanditStateDrowningId, kPeepAnimationSequenceEntertainerBanditDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteBanditStateWaveId, kPeepAnimationSequenceEntertainerBanditJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteBanditStateWaveId, kPeepAnimationSequenceEntertainerBanditWave2 }; return pag; }(); // Define animation sequences for EntertainerSheriff sprites - static constexpr std::array kPeepAnimationSequenceEntertainerSheriffNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerSheriffWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerSheriffWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerSheriffEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 8, 9, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerSheriffHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -355,20 +453,20 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerSheriffWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 8, 9, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 10, 11, 12, 11, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; // Define animation group for EntertainerSheriff sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerSheriff = []() { + static PeepAnimations kPeepAnimationsEntertainerSheriff = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpriteSheriffStateNoneId, { 16, 32, 8 }, kPeepAnimationSequenceEntertainerSheriffNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteSheriffStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerSheriffWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpriteSheriffStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerSheriffEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpriteSheriffStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerSheriffHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpriteSheriffStateDrowningId, { 21, 32, 9 }, kPeepAnimationSequenceEntertainerSheriffDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpriteSheriffStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerSheriffJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpriteSheriffStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerSheriffWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpriteSheriffStateWalkingId, kPeepAnimationSequenceEntertainerSheriffWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpriteSheriffStateWatchRideId, kPeepAnimationSequenceEntertainerSheriffWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpriteSheriffStateWaveId, kPeepAnimationSequenceEntertainerSheriffEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpriteSheriffStateHangingId, kPeepAnimationSequenceEntertainerSheriffHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpriteSheriffStateDrowningId, kPeepAnimationSequenceEntertainerSheriffDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpriteSheriffStateWaveId, kPeepAnimationSequenceEntertainerSheriffJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpriteSheriffStateWaveId, kPeepAnimationSequenceEntertainerSheriffWave2 }; return pag; }(); // Define animation sequences for EntertainerPirate sprites - static constexpr std::array kPeepAnimationSequenceEntertainerPirateNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceEntertainerPirateWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceEntertainerPirateWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceEntertainerPirateEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 21, 21, 21, 21, 21, 22, 23, 23, 23, 23, 24, 25, 26, 27, 27, 27, 27, 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31 }; static constexpr std::array kPeepAnimationSequenceEntertainerPirateHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; @@ -377,379 +475,379 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceEntertainerPirateWave2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 18, 19, 20, 21, 21, 21, 21, 21, 21, 22, 23, 23, 23, 23, 24, 25, 26, 27, 27, 27, 27, 28, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31 }; // Define animation group for EntertainerPirate sequences - static constexpr PeepAnimations kPeepAnimationsEntertainerPirate = []() { + static PeepAnimations kPeepAnimationsEntertainerPirate = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kEntertainerSpritePirateStateNoneId, { 16, 32, 8 }, kPeepAnimationSequenceEntertainerPirateNone }; - pag[PeepAnimationType::WatchRide] = { kEntertainerSpritePirateStateWatchRideId, { 10, 23, 7 }, kPeepAnimationSequenceEntertainerPirateWatchRide }; - pag[PeepAnimationType::EatFood] = { kEntertainerSpritePirateStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerPirateEatFood }; - pag[PeepAnimationType::Hanging] = { kEntertainerSpritePirateStateHangingId, { 23, 30, 8 }, kPeepAnimationSequenceEntertainerPirateHanging }; - pag[PeepAnimationType::Drowning] = { kEntertainerSpritePirateStateDrowningId, { 21, 32, 9 }, kPeepAnimationSequenceEntertainerPirateDrowning }; - pag[PeepAnimationType::Joy] = { kEntertainerSpritePirateStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerPirateJoy }; - pag[PeepAnimationType::Wave2] = { kEntertainerSpritePirateStateWaveId, { 23, 30, 15 }, kPeepAnimationSequenceEntertainerPirateWave2 }; + pag[PeepAnimationType::Walking] = { kEntertainerSpritePirateStateWalkingId, kPeepAnimationSequenceEntertainerPirateWalking }; + pag[PeepAnimationType::WatchRide] = { kEntertainerSpritePirateStateWatchRideId, kPeepAnimationSequenceEntertainerPirateWatchRide }; + pag[PeepAnimationType::EatFood] = { kEntertainerSpritePirateStateWaveId, kPeepAnimationSequenceEntertainerPirateEatFood }; + pag[PeepAnimationType::Hanging] = { kEntertainerSpritePirateStateHangingId, kPeepAnimationSequenceEntertainerPirateHanging }; + pag[PeepAnimationType::Drowning] = { kEntertainerSpritePirateStateDrowningId, kPeepAnimationSequenceEntertainerPirateDrowning }; + pag[PeepAnimationType::Joy] = { kEntertainerSpritePirateStateWaveId, kPeepAnimationSequenceEntertainerPirateJoy }; + pag[PeepAnimationType::Wave2] = { kEntertainerSpritePirateStateWaveId, kPeepAnimationSequenceEntertainerPirateWave2 }; return pag; }(); // Define animation sequences for IceCream sprites - static constexpr std::array kPeepAnimationSequenceIceCreamNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + static constexpr std::array kPeepAnimationSequenceIceCreamWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceIceCreamWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceIceCreamEatFood = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceIceCreamSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceIceCreamSittingEatFood = { 0, 1, 2, 3, 4, 5 }; // Define animation group for IceCream sequences - static constexpr PeepAnimations kPeepAnimationsIceCream = []() { + static PeepAnimations kPeepAnimationsIceCream = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteIceCreamStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceIceCreamNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteIceCreamStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceIceCreamWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteIceCreamStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceIceCreamEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteIceCreamStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceIceCreamSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteIceCreamStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceIceCreamSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteIceCreamStateWalkingId, kPeepAnimationSequenceIceCreamWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteIceCreamStateWatchRideId, kPeepAnimationSequenceIceCreamWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteIceCreamStateEatFoodId, kPeepAnimationSequenceIceCreamEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteIceCreamStateSittingIdleId, kPeepAnimationSequenceIceCreamSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteIceCreamStateSittingEatFoodId, kPeepAnimationSequenceIceCreamSittingEatFood }; return pag; }(); // Define animation sequences for Chips sprites - static constexpr std::array kPeepAnimationSequenceChipsNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceChipsWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceChipsWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceChipsEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceChipsSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceChipsSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Chips sequences - static constexpr PeepAnimations kPeepAnimationsChips = []() { + static PeepAnimations kPeepAnimationsChips = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteChipsStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceChipsNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteChipsStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceChipsWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteChipsStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceChipsEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteChipsStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceChipsSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteChipsStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceChipsSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteChipsStateWalkingId, kPeepAnimationSequenceChipsWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteChipsStateWatchRideId, kPeepAnimationSequenceChipsWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteChipsStateEatFoodId, kPeepAnimationSequenceChipsEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteChipsStateSittingIdleId, kPeepAnimationSequenceChipsSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteChipsStateSittingEatFoodId, kPeepAnimationSequenceChipsSittingEatFood }; return pag; }(); // Define animation sequences for Burger sprites - static constexpr std::array kPeepAnimationSequenceBurgerNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceBurgerWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceBurgerWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceBurgerEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceBurgerSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceBurgerSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Burger sequences - static constexpr PeepAnimations kPeepAnimationsBurger = []() { + static PeepAnimations kPeepAnimationsBurger = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteBurgerStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceBurgerNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteBurgerStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceBurgerWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteBurgerStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceBurgerEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteBurgerStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceBurgerSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteBurgerStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceBurgerSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteBurgerStateWalkingId, kPeepAnimationSequenceBurgerWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteBurgerStateWatchRideId, kPeepAnimationSequenceBurgerWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteBurgerStateEatFoodId, kPeepAnimationSequenceBurgerEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteBurgerStateSittingIdleId, kPeepAnimationSequenceBurgerSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteBurgerStateSittingEatFoodId, kPeepAnimationSequenceBurgerSittingEatFood }; return pag; }(); // Define animation sequences for Drink sprites - static constexpr std::array kPeepAnimationSequenceDrinkNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceDrinkWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceDrinkWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceDrinkEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceDrinkSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceDrinkSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Drink sequences - static constexpr PeepAnimations kPeepAnimationsDrink = []() { + static PeepAnimations kPeepAnimationsDrink = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteDrinkStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceDrinkNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteDrinkStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceDrinkWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteDrinkStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceDrinkEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteDrinkStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceDrinkSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteDrinkStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceDrinkSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteDrinkStateWalkingId, kPeepAnimationSequenceDrinkWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteDrinkStateWatchRideId, kPeepAnimationSequenceDrinkWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteDrinkStateEatFoodId, kPeepAnimationSequenceDrinkEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteDrinkStateSittingIdleId, kPeepAnimationSequenceDrinkSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteDrinkStateSittingEatFoodId, kPeepAnimationSequenceDrinkSittingEatFood }; return pag; }(); // Define animation sequences for Balloon sprites - static constexpr std::array kPeepAnimationSequenceBalloonNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceBalloonWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceBalloonWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceBalloonSittingIdle = { 0 }; // Define animation group for Balloon sequences - static constexpr PeepAnimations kPeepAnimationsBalloon = []() { + static PeepAnimations kPeepAnimationsBalloon = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteBalloonStateNoneId, { 11, 28, 5 }, kPeepAnimationSequenceBalloonNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteBalloonStateWatchRideId, { 11, 28, 5 }, kPeepAnimationSequenceBalloonWatchRide }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteBalloonStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceBalloonSittingIdle }; + pag[PeepAnimationType::Walking] = { kPeepSpriteBalloonStateWalkingId, kPeepAnimationSequenceBalloonWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteBalloonStateWatchRideId, kPeepAnimationSequenceBalloonWatchRide }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteBalloonStateSittingIdleId, kPeepAnimationSequenceBalloonSittingIdle }; return pag; }(); // Define animation sequences for Candyfloss sprites - static constexpr std::array kPeepAnimationSequenceCandyflossNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceCandyflossWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceCandyflossWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceCandyflossEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceCandyflossSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceCandyflossSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Candyfloss sequences - static constexpr PeepAnimations kPeepAnimationsCandyfloss = []() { + static PeepAnimations kPeepAnimationsCandyfloss = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteCandyflossStateNoneId, { 11, 19, 5 }, kPeepAnimationSequenceCandyflossNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteCandyflossStateWatchRideId, { 11, 19, 5 }, kPeepAnimationSequenceCandyflossWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteCandyflossStateEatFoodId, { 11, 19, 5 }, kPeepAnimationSequenceCandyflossEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteCandyflossStateSittingIdleId, { 13, 16, 6 }, kPeepAnimationSequenceCandyflossSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteCandyflossStateSittingEatFoodId, { 13, 16, 6 }, kPeepAnimationSequenceCandyflossSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteCandyflossStateWalkingId, kPeepAnimationSequenceCandyflossWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteCandyflossStateWatchRideId, kPeepAnimationSequenceCandyflossWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteCandyflossStateEatFoodId, kPeepAnimationSequenceCandyflossEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteCandyflossStateSittingIdleId, kPeepAnimationSequenceCandyflossSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteCandyflossStateSittingEatFoodId, kPeepAnimationSequenceCandyflossSittingEatFood }; return pag; }(); // Define animation sequences for Umbrella sprites - static constexpr std::array kPeepAnimationSequenceUmbrellaNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceUmbrellaWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceUmbrellaWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceUmbrellaSittingIdle = { 0 }; // Define animation group for Umbrella sequences - static constexpr PeepAnimations kPeepAnimationsUmbrella = []() { + static PeepAnimations kPeepAnimationsUmbrella = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteUmbrellaStateNoneId, { 14, 21, 5 }, kPeepAnimationSequenceUmbrellaNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteUmbrellaStateWatchRideId, { 14, 21, 5 }, kPeepAnimationSequenceUmbrellaWatchRide }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteUmbrellaStateSittingIdleId, { 14, 19, 6 }, kPeepAnimationSequenceUmbrellaSittingIdle }; + pag[PeepAnimationType::Walking] = { kPeepSpriteUmbrellaStateWalkingId, kPeepAnimationSequenceUmbrellaWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteUmbrellaStateWatchRideId, kPeepAnimationSequenceUmbrellaWatchRide }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteUmbrellaStateSittingIdleId, kPeepAnimationSequenceUmbrellaSittingIdle }; return pag; }(); // Define animation sequences for Pizza sprites - static constexpr std::array kPeepAnimationSequencePizzaNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + static constexpr std::array kPeepAnimationSequencePizzaWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequencePizzaWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequencePizzaEatFood = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequencePizzaSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequencePizzaSittingEatFood = { 0, 1, 2, 3, 4, 5 }; // Define animation group for Pizza sequences - static constexpr PeepAnimations kPeepAnimationsPizza = []() { + static PeepAnimations kPeepAnimationsPizza = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpritePizzaStateNoneId, { 8, 16, 5 }, kPeepAnimationSequencePizzaNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpritePizzaStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequencePizzaWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpritePizzaStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequencePizzaEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpritePizzaStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequencePizzaSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpritePizzaStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequencePizzaSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpritePizzaStateWalkingId, kPeepAnimationSequencePizzaWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpritePizzaStateWatchRideId, kPeepAnimationSequencePizzaWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpritePizzaStateEatFoodId, kPeepAnimationSequencePizzaEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpritePizzaStateSittingIdleId, kPeepAnimationSequencePizzaSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpritePizzaStateSittingEatFoodId, kPeepAnimationSequencePizzaSittingEatFood }; return pag; }(); // Define animation sequences for SecurityAlt sprites - static constexpr std::array kPeepAnimationSequenceSecurityAltNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceSecurityAltWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceSecurityAltWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSecurityAltHanging = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceSecurityAltDrowning = { 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 4, 5, 6 }; // Define animation group for SecurityAlt sequences - static constexpr PeepAnimations kPeepAnimationsSecurityAlt = []() { + static PeepAnimations kPeepAnimationsSecurityAlt = []() { PeepAnimations pag; - pag[PeepAnimationType::None] = { kSecurityStaffSpriteAltStateNoneId, { 8, 18, 5 }, kPeepAnimationSequenceSecurityAltNone }; - pag[PeepAnimationType::WatchRide] = { kSecuritySpriteStateWatchRideId, { 8, 17, 5 }, kPeepAnimationSequenceSecurityAltWatchRide }; - pag[PeepAnimationType::Hanging] = { kSecuritySpriteStateHangingId, { 15, 19, 6 }, kPeepAnimationSequenceSecurityAltHanging }; - pag[PeepAnimationType::Drowning] = { kSecuritySpriteStateDrowningId, { 9, 15, 6 }, kPeepAnimationSequenceSecurityAltDrowning }; + pag[PeepAnimationType::Walking] = { kSecurityStaffSpriteAltStateWalkingId, kPeepAnimationSequenceSecurityAltWalking }; + pag[PeepAnimationType::WatchRide] = { kSecuritySpriteStateWatchRideId, kPeepAnimationSequenceSecurityAltWatchRide }; + pag[PeepAnimationType::Hanging] = { kSecuritySpriteStateHangingId, kPeepAnimationSequenceSecurityAltHanging }; + pag[PeepAnimationType::Drowning] = { kSecuritySpriteStateDrowningId, kPeepAnimationSequenceSecurityAltDrowning }; return pag; }(); // Define animation sequences for Popcorn sprites - static constexpr std::array kPeepAnimationSequencePopcornNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequencePopcornWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequencePopcornWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequencePopcornEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequencePopcornSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequencePopcornSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Popcorn sequences - static constexpr PeepAnimations kPeepAnimationsPopcorn = []() { + static PeepAnimations kPeepAnimationsPopcorn = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpritePopcornStateNoneId, { 11, 19, 5 }, kPeepAnimationSequencePopcornNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpritePopcornStateWatchRideId, { 11, 19, 5 }, kPeepAnimationSequencePopcornWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpritePopcornStateEatFoodId, { 11, 19, 5 }, kPeepAnimationSequencePopcornEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpritePopcornStateSittingIdleId, { 13, 16, 6 }, kPeepAnimationSequencePopcornSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpritePopcornStateSittingEatFoodId, { 13, 16, 6 }, kPeepAnimationSequencePopcornSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpritePopcornStateWalkingId, kPeepAnimationSequencePopcornWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpritePopcornStateWatchRideId, kPeepAnimationSequencePopcornWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpritePopcornStateEatFoodId, kPeepAnimationSequencePopcornEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpritePopcornStateSittingIdleId, kPeepAnimationSequencePopcornSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpritePopcornStateSittingEatFoodId, kPeepAnimationSequencePopcornSittingEatFood }; return pag; }(); // Define animation sequences for ArmsCrossed sprites - static constexpr std::array kPeepAnimationSequenceArmsCrossedNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceArmsCrossedWalking = { 0, 1, 2, 3, 4, 5 }; // Define animation group for ArmsCrossed sequences - static constexpr PeepAnimations kPeepAnimationsArmsCrossed = []() { + static PeepAnimations kPeepAnimationsArmsCrossed = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteArmsCrossedStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceArmsCrossedNone }; + pag[PeepAnimationType::Walking] = { kPeepSpriteArmsCrossedStateWalkingId, kPeepAnimationSequenceArmsCrossedWalking }; return pag; }(); // Define animation sequences for HeadDown sprites - static constexpr std::array kPeepAnimationSequenceHeadDownNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceHeadDownWalking = { 0, 1, 2, 3, 4, 5 }; // Define animation group for HeadDown sequences - static constexpr PeepAnimations kPeepAnimationsHeadDown = []() { + static PeepAnimations kPeepAnimationsHeadDown = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteHeadDownStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceHeadDownNone }; + pag[PeepAnimationType::Walking] = { kPeepSpriteHeadDownStateWalkingId, kPeepAnimationSequenceHeadDownWalking }; return pag; }(); // Define animation sequences for Nauseous sprites - static constexpr std::array kPeepAnimationSequenceNauseousNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceNauseousWalking = { 0, 1, 2, 3, 4, 5 }; // Define animation group for Nauseous sequences - static constexpr PeepAnimations kPeepAnimationsNauseous = []() { + static PeepAnimations kPeepAnimationsNauseous = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteNauseousStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceNauseousNone }; + pag[PeepAnimationType::Walking] = { kPeepSpriteNauseousStateWalkingId, kPeepAnimationSequenceNauseousWalking }; return pag; }(); // Define animation sequences for VeryNauseous sprites - static constexpr std::array kPeepAnimationSequenceVeryNauseousNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceVeryNauseousWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceVeryNauseousWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceVeryNauseousSittingIdle = { 0 }; // Define animation group for VeryNauseous sequences - static constexpr PeepAnimations kPeepAnimationsVeryNauseous = []() { + static PeepAnimations kPeepAnimationsVeryNauseous = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteVeryNauseousStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceVeryNauseousNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteVeryNauseousStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceVeryNauseousWatchRide }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteVeryNauseousStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceVeryNauseousSittingIdle }; + pag[PeepAnimationType::Walking] = { kPeepSpriteVeryNauseousStateWalkingId, kPeepAnimationSequenceVeryNauseousWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteVeryNauseousStateWatchRideId, kPeepAnimationSequenceVeryNauseousWatchRide }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteVeryNauseousStateSittingIdleId, kPeepAnimationSequenceVeryNauseousSittingIdle }; return pag; }(); // Define animation sequences for RequireToilet sprites - static constexpr std::array kPeepAnimationSequenceRequireToiletNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceRequireToiletWalking = { 0, 1, 2, 3, 4, 5 }; // Define animation group for RequireToilet sequences - static constexpr PeepAnimations kPeepAnimationsRequireToilet = []() { + static PeepAnimations kPeepAnimationsRequireToilet = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteRequireToiletStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceRequireToiletNone }; + pag[PeepAnimationType::Walking] = { kPeepSpriteRequireToiletStateWalkingId, kPeepAnimationSequenceRequireToiletWalking }; return pag; }(); // Define animation sequences for Hat sprites - static constexpr std::array kPeepAnimationSequenceHatNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceHatWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceHatWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceHatSittingIdle = { 0 }; // Define animation group for Hat sequences - static constexpr PeepAnimations kPeepAnimationsHat = []() { + static PeepAnimations kPeepAnimationsHat = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteHatStateNoneId, { 12, 32, 5 }, kPeepAnimationSequenceHatNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteHatStateWatchRideId, { 12, 32, 5 }, kPeepAnimationSequenceHatWatchRide }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteHatStateSittingIdleId, { 10, 20, 6 }, kPeepAnimationSequenceHatSittingIdle }; + pag[PeepAnimationType::Walking] = { kPeepSpriteHatStateWalkingId, kPeepAnimationSequenceHatWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteHatStateWatchRideId, kPeepAnimationSequenceHatWatchRide }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteHatStateSittingIdleId, kPeepAnimationSequenceHatSittingIdle }; return pag; }(); // Define animation sequences for HotDog sprites - static constexpr std::array kPeepAnimationSequenceHotDogNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceHotDogWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceHotDogWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceHotDogEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceHotDogSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceHotDogSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for HotDog sequences - static constexpr PeepAnimations kPeepAnimationsHotDog = []() { + static PeepAnimations kPeepAnimationsHotDog = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteHotDogStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceHotDogNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteHotDogStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceHotDogWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteHotDogStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceHotDogEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteHotDogStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceHotDogSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteHotDogStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceHotDogSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteHotDogStateWalkingId, kPeepAnimationSequenceHotDogWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteHotDogStateWatchRideId, kPeepAnimationSequenceHotDogWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteHotDogStateEatFoodId, kPeepAnimationSequenceHotDogEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteHotDogStateSittingIdleId, kPeepAnimationSequenceHotDogSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteHotDogStateSittingEatFoodId, kPeepAnimationSequenceHotDogSittingEatFood }; return pag; }(); // Define animation sequences for Tentacle sprites - static constexpr std::array kPeepAnimationSequenceTentacleNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }; + static constexpr std::array kPeepAnimationSequenceTentacleWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }; static constexpr std::array kPeepAnimationSequenceTentacleWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceTentacleEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; static constexpr std::array kPeepAnimationSequenceTentacleSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceTentacleSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; // Define animation group for Tentacle sequences - static constexpr PeepAnimations kPeepAnimationsTentacle = []() { + static PeepAnimations kPeepAnimationsTentacle = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteTentacleStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceTentacleNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteTentacleStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceTentacleWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteTentacleStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceTentacleEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteTentacleStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceTentacleSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteTentacleStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceTentacleSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteTentacleStateWalkingId, kPeepAnimationSequenceTentacleWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteTentacleStateWatchRideId, kPeepAnimationSequenceTentacleWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteTentacleStateEatFoodId, kPeepAnimationSequenceTentacleEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteTentacleStateSittingIdleId, kPeepAnimationSequenceTentacleSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteTentacleStateSittingEatFoodId, kPeepAnimationSequenceTentacleSittingEatFood }; return pag; }(); // Define animation sequences for ToffeeApple sprites - static constexpr std::array kPeepAnimationSequenceToffeeAppleNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + static constexpr std::array kPeepAnimationSequenceToffeeAppleWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceToffeeAppleWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceToffeeAppleEatFood = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceToffeeAppleSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceToffeeAppleSittingEatFood = { 0, 1, 2, 3, 4, 5 }; // Define animation group for ToffeeApple sequences - static constexpr PeepAnimations kPeepAnimationsToffeeApple = []() { + static PeepAnimations kPeepAnimationsToffeeApple = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteToffeeAppleStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceToffeeAppleNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteToffeeAppleStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceToffeeAppleWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteToffeeAppleStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceToffeeAppleEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteToffeeAppleStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceToffeeAppleSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteToffeeAppleStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceToffeeAppleSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteToffeeAppleStateWalkingId, kPeepAnimationSequenceToffeeAppleWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteToffeeAppleStateWatchRideId, kPeepAnimationSequenceToffeeAppleWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteToffeeAppleStateEatFoodId, kPeepAnimationSequenceToffeeAppleEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteToffeeAppleStateSittingIdleId, kPeepAnimationSequenceToffeeAppleSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteToffeeAppleStateSittingEatFoodId, kPeepAnimationSequenceToffeeAppleSittingEatFood }; return pag; }(); // Define animation sequences for Donut sprites - static constexpr std::array kPeepAnimationSequenceDonutNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceDonutWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceDonutWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceDonutEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceDonutSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceDonutSittingEatFood = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 4, 5 }; // Define animation group for Donut sequences - static constexpr PeepAnimations kPeepAnimationsDonut = []() { + static PeepAnimations kPeepAnimationsDonut = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteDonutStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceDonutNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteDonutStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceDonutWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteDonutStateEatFoodId, { 8, 16, 5 }, kPeepAnimationSequenceDonutEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteDonutStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceDonutSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteDonutStateSittingEatFoodId, { 9, 16, 6 }, kPeepAnimationSequenceDonutSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteDonutStateWalkingId, kPeepAnimationSequenceDonutWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteDonutStateWatchRideId, kPeepAnimationSequenceDonutWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteDonutStateEatFoodId, kPeepAnimationSequenceDonutEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteDonutStateSittingIdleId, kPeepAnimationSequenceDonutSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteDonutStateSittingEatFoodId, kPeepAnimationSequenceDonutSittingEatFood }; return pag; }(); // Define animation sequences for Coffee sprites - static constexpr std::array kPeepAnimationSequenceCoffeeNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceCoffeeWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceCoffeeWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceCoffeeEatFood = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 1 }; static constexpr std::array kPeepAnimationSequenceCoffeeSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceCoffeeSittingEatFood = { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 2, 1 }; // Define animation group for Coffee sequences - static constexpr PeepAnimations kPeepAnimationsCoffee = []() { + static PeepAnimations kPeepAnimationsCoffee = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteCoffeeStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceCoffeeNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteCoffeeStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceCoffeeWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteCoffeeStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceCoffeeEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteCoffeeStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceCoffeeSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteCoffeeStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceCoffeeSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteCoffeeStateWalkingId, kPeepAnimationSequenceCoffeeWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteCoffeeStateWatchRideId, kPeepAnimationSequenceCoffeeWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteCoffeeStateWatchRideId, kPeepAnimationSequenceCoffeeEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteCoffeeStateSittingIdleId, kPeepAnimationSequenceCoffeeSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteCoffeeStateSittingIdleId, kPeepAnimationSequenceCoffeeSittingEatFood }; return pag; }(); // Define animation sequences for Chicken sprites - static constexpr std::array kPeepAnimationSequenceChickenNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceChickenWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceChickenWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceChickenEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceChickenSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceChickenSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Chicken sequences - static constexpr PeepAnimations kPeepAnimationsChicken = []() { + static PeepAnimations kPeepAnimationsChicken = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteChickenStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceChickenNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteChickenStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceChickenWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteChickenStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceChickenEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteChickenStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceChickenSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteChickenStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceChickenSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteChickenStateWalkingId, kPeepAnimationSequenceChickenWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteChickenStateWatchRideId, kPeepAnimationSequenceChickenWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteChickenStateWatchRideId, kPeepAnimationSequenceChickenEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteChickenStateSittingIdleId, kPeepAnimationSequenceChickenSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteChickenStateSittingIdleId, kPeepAnimationSequenceChickenSittingEatFood }; return pag; }(); // Define animation sequences for Lemonade sprites - static constexpr std::array kPeepAnimationSequenceLemonadeNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceLemonadeWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceLemonadeWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceLemonadeEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceLemonadeSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceLemonadeSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Lemonade sequences - static constexpr PeepAnimations kPeepAnimationsLemonade = []() { + static PeepAnimations kPeepAnimationsLemonade = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteLemonadeStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceLemonadeNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteLemonadeStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceLemonadeWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteLemonadeStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceLemonadeEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteLemonadeStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceLemonadeSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteLemonadeStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceLemonadeSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteLemonadeStateWalkingId, kPeepAnimationSequenceLemonadeWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteLemonadeStateWatchRideId, kPeepAnimationSequenceLemonadeWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteLemonadeStateWatchRideId, kPeepAnimationSequenceLemonadeEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteLemonadeStateSittingIdleId, kPeepAnimationSequenceLemonadeSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteLemonadeStateSittingIdleId, kPeepAnimationSequenceLemonadeSittingEatFood }; return pag; }(); @@ -757,167 +855,167 @@ namespace OpenRCT2 static constexpr std::array kPeepAnimationSequenceWatchingWatchRide = { 0 }; // Define animation group for Watching sequences - static constexpr PeepAnimations kPeepAnimationsWatching = []() { + static PeepAnimations kPeepAnimationsWatching = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteWatchingStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceWatchingWatchRide }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteWatchingStateWatchRideId, kPeepAnimationSequenceWatchingWatchRide }; return pag; }(); // Define animation sequences for Pretzel sprites - static constexpr std::array kPeepAnimationSequencePretzelNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequencePretzelWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequencePretzelWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequencePretzelEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequencePretzelSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequencePretzelSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Pretzel sequences - static constexpr PeepAnimations kPeepAnimationsPretzel = []() { + static PeepAnimations kPeepAnimationsPretzel = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpritePretzelStateNoneId, { 8, 16, 5 }, kPeepAnimationSequencePretzelNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpritePretzelStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequencePretzelWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpritePretzelStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequencePretzelEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpritePretzelStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequencePretzelSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpritePretzelStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequencePretzelSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpritePretzelStateWalkingId, kPeepAnimationSequencePretzelWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpritePretzelStateWatchRideId, kPeepAnimationSequencePretzelWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpritePretzelStateWatchRideId, kPeepAnimationSequencePretzelEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpritePretzelStateSittingIdleId, kPeepAnimationSequencePretzelSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpritePretzelStateSittingIdleId, kPeepAnimationSequencePretzelSittingEatFood }; return pag; }(); // Define animation sequences for Sunglasses sprites - static constexpr std::array kPeepAnimationSequenceSunglassesNone = { 0, 1, 2, 3, 4, 5 }; + static constexpr std::array kPeepAnimationSequenceSunglassesWalking = { 0, 1, 2, 3, 4, 5 }; static constexpr std::array kPeepAnimationSequenceSunglassesWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSunglassesSittingIdle = { 0 }; // Define animation group for Sunglasses sequences - static constexpr PeepAnimations kPeepAnimationsSunglasses = []() { + static PeepAnimations kPeepAnimationsSunglasses = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteSunglassesStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceSunglassesNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteSunglassesStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSunglassesWatchRide }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSunglassesStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSunglassesSittingIdle }; + pag[PeepAnimationType::Walking] = { kPeepSpriteSunglassesStateWalkingId, kPeepAnimationSequenceSunglassesWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteSunglassesStateWatchRideId, kPeepAnimationSequenceSunglassesWatchRide }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSunglassesStateSittingIdleId, kPeepAnimationSequenceSunglassesSittingIdle }; return pag; }(); // Define animation sequences for SuJongkwa sprites - static constexpr std::array kPeepAnimationSequenceSuJongkwaNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceSuJongkwaWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceSuJongkwaWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSuJongkwaEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceSuJongkwaSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceSuJongkwaSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for SuJongkwa sequences - static constexpr PeepAnimations kPeepAnimationsSuJongkwa = []() { + static PeepAnimations kPeepAnimationsSuJongkwa = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteSuJongkwaStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceSuJongkwaNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteSuJongkwaStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSuJongkwaWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteSuJongkwaStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSuJongkwaEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSuJongkwaStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSuJongkwaSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSuJongkwaStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSuJongkwaSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteSuJongkwaStateWalkingId, kPeepAnimationSequenceSuJongkwaWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteSuJongkwaStateWatchRideId, kPeepAnimationSequenceSuJongkwaWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteSuJongkwaStateWatchRideId, kPeepAnimationSequenceSuJongkwaEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSuJongkwaStateSittingIdleId, kPeepAnimationSequenceSuJongkwaSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSuJongkwaStateSittingIdleId, kPeepAnimationSequenceSuJongkwaSittingEatFood }; return pag; }(); // Define animation sequences for Juice sprites - static constexpr std::array kPeepAnimationSequenceJuiceNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceJuiceWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceJuiceWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceJuiceEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceJuiceSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceJuiceSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Juice sequences - static constexpr PeepAnimations kPeepAnimationsJuice = []() { + static PeepAnimations kPeepAnimationsJuice = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteJuiceStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceJuiceNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteJuiceStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceJuiceWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteJuiceStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceJuiceEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteJuiceStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceJuiceSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteJuiceStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceJuiceSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteJuiceStateWalkingId, kPeepAnimationSequenceJuiceWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteJuiceStateWatchRideId, kPeepAnimationSequenceJuiceWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteJuiceStateWatchRideId, kPeepAnimationSequenceJuiceEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteJuiceStateSittingIdleId, kPeepAnimationSequenceJuiceSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteJuiceStateSittingIdleId, kPeepAnimationSequenceJuiceSittingEatFood }; return pag; }(); // Define animation sequences for FunnelCake sprites - static constexpr std::array kPeepAnimationSequenceFunnelCakeNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceFunnelCakeWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceFunnelCakeWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceFunnelCakeEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceFunnelCakeSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceFunnelCakeSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for FunnelCake sequences - static constexpr PeepAnimations kPeepAnimationsFunnelCake = []() { + static PeepAnimations kPeepAnimationsFunnelCake = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteFunnelCakeStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceFunnelCakeNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteFunnelCakeStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceFunnelCakeWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteFunnelCakeStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceFunnelCakeEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteFunnelCakeStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceFunnelCakeSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteFunnelCakeStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceFunnelCakeSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteFunnelCakeStateWalkingId, kPeepAnimationSequenceFunnelCakeWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteFunnelCakeStateWatchRideId, kPeepAnimationSequenceFunnelCakeWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteFunnelCakeStateWatchRideId, kPeepAnimationSequenceFunnelCakeEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteFunnelCakeStateSittingIdleId, kPeepAnimationSequenceFunnelCakeSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteFunnelCakeStateSittingIdleId, kPeepAnimationSequenceFunnelCakeSittingEatFood }; return pag; }(); // Define animation sequences for Noodles sprites - static constexpr std::array kPeepAnimationSequenceNoodlesNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceNoodlesWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceNoodlesWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceNoodlesEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceNoodlesSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceNoodlesSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Noodles sequences - static constexpr PeepAnimations kPeepAnimationsNoodles = []() { + static PeepAnimations kPeepAnimationsNoodles = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteNoodlesStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceNoodlesNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteNoodlesStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceNoodlesWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteNoodlesStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceNoodlesEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteNoodlesStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceNoodlesSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteNoodlesStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceNoodlesSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteNoodlesStateWalkingId, kPeepAnimationSequenceNoodlesWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteNoodlesStateWatchRideId, kPeepAnimationSequenceNoodlesWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteNoodlesStateWatchRideId, kPeepAnimationSequenceNoodlesEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteNoodlesStateSittingIdleId, kPeepAnimationSequenceNoodlesSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteNoodlesStateSittingIdleId, kPeepAnimationSequenceNoodlesSittingEatFood }; return pag; }(); // Define animation sequences for Sausage sprites - static constexpr std::array kPeepAnimationSequenceSausageNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceSausageWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceSausageWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSausageEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceSausageSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceSausageSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Sausage sequences - static constexpr PeepAnimations kPeepAnimationsSausage = []() { + static PeepAnimations kPeepAnimationsSausage = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteSausageStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceSausageNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteSausageStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSausageWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteSausageStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSausageEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSausageStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSausageSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSausageStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSausageSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteSausageStateWalkingId, kPeepAnimationSequenceSausageWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteSausageStateWatchRideId, kPeepAnimationSequenceSausageWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteSausageStateWatchRideId, kPeepAnimationSequenceSausageEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSausageStateSittingIdleId, kPeepAnimationSequenceSausageSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSausageStateSittingIdleId, kPeepAnimationSequenceSausageSittingEatFood }; return pag; }(); // Define animation sequences for Soup sprites - static constexpr std::array kPeepAnimationSequenceSoupNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceSoupWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceSoupWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSoupEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceSoupSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceSoupSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Soup sequences - static constexpr PeepAnimations kPeepAnimationsSoup = []() { + static PeepAnimations kPeepAnimationsSoup = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteSoupStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceSoupNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteSoupStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSoupWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteSoupStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSoupEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSoupStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSoupSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSoupStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSoupSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteSoupStateWalkingId, kPeepAnimationSequenceSoupWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteSoupStateWatchRideId, kPeepAnimationSequenceSoupWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteSoupStateWatchRideId, kPeepAnimationSequenceSoupEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSoupStateSittingIdleId, kPeepAnimationSequenceSoupSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSoupStateSittingIdleId, kPeepAnimationSequenceSoupSittingEatFood }; return pag; }(); // Define animation sequences for Sandwich sprites - static constexpr std::array kPeepAnimationSequenceSandwichNone = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; + static constexpr std::array kPeepAnimationSequenceSandwichWalking = { 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 }; static constexpr std::array kPeepAnimationSequenceSandwichWatchRide = { 0 }; static constexpr std::array kPeepAnimationSequenceSandwichEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; static constexpr std::array kPeepAnimationSequenceSandwichSittingIdle = { 0 }; static constexpr std::array kPeepAnimationSequenceSandwichSittingEatFood = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; // Define animation group for Sandwich sequences - static constexpr PeepAnimations kPeepAnimationsSandwich = []() { + static PeepAnimations kPeepAnimationsSandwich = []() { PeepAnimations pag = kPeepAnimationsNormal; - pag[PeepAnimationType::None] = { kPeepSpriteSandwichStateNoneId, { 8, 16, 5 }, kPeepAnimationSequenceSandwichNone }; - pag[PeepAnimationType::WatchRide] = { kPeepSpriteSandwichStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSandwichWatchRide }; - pag[PeepAnimationType::EatFood] = { kPeepSpriteSandwichStateWatchRideId, { 8, 16, 5 }, kPeepAnimationSequenceSandwichEatFood }; - pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSandwichStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSandwichSittingIdle }; - pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSandwichStateSittingIdleId, { 9, 16, 6 }, kPeepAnimationSequenceSandwichSittingEatFood }; + pag[PeepAnimationType::Walking] = { kPeepSpriteSandwichStateWalkingId, kPeepAnimationSequenceSandwichWalking }; + pag[PeepAnimationType::WatchRide] = { kPeepSpriteSandwichStateWatchRideId, kPeepAnimationSequenceSandwichWatchRide }; + pag[PeepAnimationType::EatFood] = { kPeepSpriteSandwichStateWatchRideId, kPeepAnimationSequenceSandwichEatFood }; + pag[PeepAnimationType::SittingIdle] = { kPeepSpriteSandwichStateSittingIdleId, kPeepAnimationSequenceSandwichSittingIdle }; + pag[PeepAnimationType::SittingEatFood] = { kPeepSpriteSandwichStateSittingIdleId, kPeepAnimationSequenceSandwichSittingEatFood }; return pag; }(); @@ -983,4 +1081,22 @@ namespace OpenRCT2 { return kPeepAnimationEntries[EnumValue(spriteType)][actionAnimationGroup].bounds; } + + void inferMaxPeepSpriteDimensions() + { + for (auto groupKey = EnumValue(PeepAnimationGroup::Normal); groupKey < EnumValue(PeepAnimationGroup::Count); groupKey++) + { + auto& group = kPeepAnimationEntries[groupKey]; + + for (auto type = EnumValue(PeepAnimationType::Walking); type <= EnumValue(PeepAnimationType::WithdrawMoney); type++) + { + auto& anim = group[PeepAnimationType(type)]; + if (anim.frame_offsets.empty()) + continue; + + anim.bounds = inferMaxAnimationDimensions(anim); + } + } + } + } // namespace OpenRCT2 diff --git a/src/openrct2/peep/PeepAnimationData.h b/src/openrct2/peep/PeepAnimationData.h index 3dadeb678d..7a826d92e5 100644 --- a/src/openrct2/peep/PeepAnimationData.h +++ b/src/openrct2/peep/PeepAnimationData.h @@ -17,8 +17,16 @@ namespace OpenRCT2 struct PeepAnimation { uint32_t base_image; - SpriteBounds bounds; std::span frame_offsets; + SpriteBounds bounds{}; + + constexpr PeepAnimation() = default; + + PeepAnimation(uint32_t baseImage, std::span frameOffsets) + : base_image(baseImage) + , frame_offsets(frameOffsets) + { + } }; struct PeepAnimations @@ -38,7 +46,9 @@ namespace OpenRCT2 }; const PeepAnimation& GetPeepAnimation( - PeepAnimationGroup spriteType, PeepAnimationType actionAnimationGroup = PeepAnimationType::None); + PeepAnimationGroup spriteType, PeepAnimationType actionAnimationGroup = PeepAnimationType::Walking); const SpriteBounds& GetSpriteBounds( - PeepAnimationGroup spriteType, PeepAnimationType actionAnimationGroup = PeepAnimationType::None); + PeepAnimationGroup spriteType, PeepAnimationType actionAnimationGroup = PeepAnimationType::Walking); + + void inferMaxPeepSpriteDimensions(); } // namespace OpenRCT2 diff --git a/src/openrct2/peep/PeepSpriteIds.h b/src/openrct2/peep/PeepSpriteIds.h index 7eacf53779..ca7f0ded4e 100644 --- a/src/openrct2/peep/PeepSpriteIds.h +++ b/src/openrct2/peep/PeepSpriteIds.h @@ -11,7 +11,7 @@ namespace OpenRCT2 { enum { - kPeepSpriteNormalStateNoneId = 6409, + kPeepSpriteNormalStateWalkingId = 6409, kPeepSpriteNormalStateCheckTimeId = 6585, kPeepSpriteNormalStateWatchRideId = 6621, kPeepSpriteNormalStateEatFoodId = 6653, @@ -38,7 +38,7 @@ namespace OpenRCT2 kPeepSpriteNormalStateBeingWatchedId = 7285, kPeepSpriteNormalStateWithdrawMoneyId = 7181, - kHandymanSpriteStateNoneId = 11261, + kHandymanSpriteStateWalkingId = 11261, kHandymanSpriteStateWatchRideId = 11285, kHandymanSpriteStateHangingId = 11289, kHandymanSpriteStateStaffMowerId = 11301, @@ -47,7 +47,7 @@ namespace OpenRCT2 kHandymanSpriteStateStaffWateringId = 11377, kHandymanSpriteStateStaffEmptyBinId = 11401, - kMechanicSpriteStateNoneId = 11441, + kMechanicSpriteStateWalkingId = 11441, kMechanicSpriteStateWatchRideId = 11465, kMechanicSpriteStateHangingId = 11469, kMechanicSpriteStateDrowningId = 11481, @@ -56,219 +56,219 @@ namespace OpenRCT2 kMechanicSpriteStateStaffFixId = 11669, kMechanicSpriteStateStaffFixGroundId = 11801, - kSecuritySpriteStateNoneId = 11881, + kSecuritySpriteStateWalkingId = 11881, kSecuritySpriteStateWatchRideId = 11905, kSecuritySpriteStateHangingId = 11909, kSecuritySpriteStateDrowningId = 11921, - kEntertainerSpritePandaStateNoneId = 11973, + kEntertainerSpritePandaStateWalkingId = 11973, kEntertainerSpritePandaStateWatchRideId = 11997, kEntertainerSpritePandaStateWaveId = 12041, kEntertainerSpritePandaStateHangingId = 12001, kEntertainerSpritePandaStateDrowningId = 12013, kEntertainerSpritePandaStateJoyId = 12065, - kEntertainerSpriteTigerStateNoneId = 12129, + kEntertainerSpriteTigerStateWalkingId = 12129, kEntertainerSpriteTigerStateWatchRideId = 12153, kEntertainerSpriteTigerStateWaveId = 12197, kEntertainerSpriteTigerStateHangingId = 12157, kEntertainerSpriteTigerStateDrowningId = 12169, kEntertainerSpriteTigerStateJoyId = 12221, - kEntertainerSpriteElephantStateNoneId = 12325, + kEntertainerSpriteElephantStateWalkingId = 12325, kEntertainerSpriteElephantStateWatchRideId = 12349, kEntertainerSpriteElephantStateWaveId = 12365, kEntertainerSpriteElephantStateHangingId = 12353, kEntertainerSpriteElephantStateDrowningId = 12393, kEntertainerSpriteElephantStateJoyId = 12433, - kEntertainerSpriteRomanStateNoneId = 13897, + kEntertainerSpriteRomanStateWalkingId = 13897, kEntertainerSpriteRomanStateWatchRideId = 13921, kEntertainerSpriteRomanStateWaveId = 13937, kEntertainerSpriteRomanStateHangingId = 13925, kEntertainerSpriteRomanStateDrowningId = 13969, kEntertainerSpriteRomanStateJoyId = 14029, - kEntertainerSpriteGorillaStateNoneId = 12549, + kEntertainerSpriteGorillaStateWalkingId = 12549, kEntertainerSpriteGorillaStateWatchRideId = 12545, kEntertainerSpriteGorillaStateWaveId = 12573, kEntertainerSpriteGorillaStateHangingId = 12665, kEntertainerSpriteGorillaStateDrowningId = 12617, - kEntertainerSpriteSnowmanStateNoneId = 12681, + kEntertainerSpriteSnowmanStateWalkingId = 12681, kEntertainerSpriteSnowmanStateWatchRideId = 12677, kEntertainerSpriteSnowmanStateWaveId = 12705, kEntertainerSpriteSnowmanStateHangingId = 12881, kEntertainerSpriteSnowmanStateDrowningId = 12841, - kEntertainerSpriteKnightStateNoneId = 12897, + kEntertainerSpriteKnightStateWalkingId = 12897, kEntertainerSpriteKnightStateWatchRideId = 12893, kEntertainerSpriteKnightStateWaveId = 12993, kEntertainerSpriteKnightStateHangingId = 12981, kEntertainerSpriteKnightStateDrowningId = 12921, - kEntertainerSpriteAstronautStateNoneId = 13769, + kEntertainerSpriteAstronautStateWalkingId = 13769, kEntertainerSpriteAstronautStateWatchRideId = 13765, kEntertainerSpriteAstronautStateWaveId = 13857, kEntertainerSpriteAstronautStateHangingId = 13845, kEntertainerSpriteAstronautStateDrowningId = 13793, - kEntertainerSpriteBanditStateNoneId = 13109, + kEntertainerSpriteBanditStateWalkingId = 13109, kEntertainerSpriteBanditStateWatchRideId = 13105, kEntertainerSpriteBanditStateWaveId = 13209, kEntertainerSpriteBanditStateHangingId = 13197, kEntertainerSpriteBanditStateDrowningId = 13133, - kEntertainerSpriteSheriffStateNoneId = 13613, + kEntertainerSpriteSheriffStateWalkingId = 13613, kEntertainerSpriteSheriffStateWatchRideId = 13609, kEntertainerSpriteSheriffStateWaveId = 13713, kEntertainerSpriteSheriffStateHangingId = 13701, kEntertainerSpriteSheriffStateDrowningId = 13637, - kEntertainerSpritePirateStateNoneId = 13381, + kEntertainerSpritePirateStateWalkingId = 13381, kEntertainerSpritePirateStateWatchRideId = 13377, kEntertainerSpritePirateStateWaveId = 13481, kEntertainerSpritePirateStateHangingId = 13469, kEntertainerSpritePirateStateDrowningId = 13405, - kPeepSpriteIceCreamStateNoneId = 7505, + kPeepSpriteIceCreamStateWalkingId = 7505, kPeepSpriteIceCreamStateWatchRideId = 7501, kPeepSpriteIceCreamStateEatFoodId = 7581, kPeepSpriteIceCreamStateSittingIdleId = 7553, kPeepSpriteIceCreamStateSittingEatFoodId = 7557, - kPeepSpriteChipsStateNoneId = 7609, + kPeepSpriteChipsStateWalkingId = 7609, kPeepSpriteChipsStateWatchRideId = 7605, kPeepSpriteChipsStateEatFoodId = 7733, kPeepSpriteChipsStateSittingIdleId = 7681, kPeepSpriteChipsStateSittingEatFoodId = 7685, - kPeepSpriteBurgerStateNoneId = 8385, + kPeepSpriteBurgerStateWalkingId = 8385, kPeepSpriteBurgerStateWatchRideId = 8381, kPeepSpriteBurgerStateEatFoodId = 8509, kPeepSpriteBurgerStateSittingIdleId = 8457, kPeepSpriteBurgerStateSittingEatFoodId = 8461, - kPeepSpriteDrinkStateNoneId = 8713, + kPeepSpriteDrinkStateWalkingId = 8713, kPeepSpriteDrinkStateWatchRideId = 8709, kPeepSpriteDrinkStateEatFoodId = 8837, kPeepSpriteDrinkStateSittingIdleId = 8785, kPeepSpriteDrinkStateSittingEatFoodId = 8789, - kPeepSpriteBalloonStateNoneId = 10785, + kPeepSpriteBalloonStateWalkingId = 10785, kPeepSpriteBalloonStateWatchRideId = 10781, kPeepSpriteBalloonStateSittingIdleId = 10809, - kPeepSpriteCandyflossStateNoneId = 10849, + kPeepSpriteCandyflossStateWalkingId = 10849, kPeepSpriteCandyflossStateWatchRideId = 10845, kPeepSpriteCandyflossStateEatFoodId = 10973, kPeepSpriteCandyflossStateSittingIdleId = 10921, kPeepSpriteCandyflossStateSittingEatFoodId = 10925, - kPeepSpriteUmbrellaStateNoneId = 11197, + kPeepSpriteUmbrellaStateWalkingId = 11197, kPeepSpriteUmbrellaStateWatchRideId = 11221, kPeepSpriteUmbrellaStateSittingIdleId = 11225, - kPeepSpritePizzaStateNoneId = 7785, + kPeepSpritePizzaStateWalkingId = 7785, kPeepSpritePizzaStateWatchRideId = 7781, kPeepSpritePizzaStateEatFoodId = 7861, kPeepSpritePizzaStateSittingIdleId = 7833, kPeepSpritePizzaStateSittingEatFoodId = 7837, - kSecurityStaffSpriteAltStateNoneId = 11949, + kSecurityStaffSpriteAltStateWalkingId = 11949, - kPeepSpritePopcornStateNoneId = 11025, + kPeepSpritePopcornStateWalkingId = 11025, kPeepSpritePopcornStateWatchRideId = 11021, kPeepSpritePopcornStateEatFoodId = 11149, kPeepSpritePopcornStateSittingIdleId = 11097, kPeepSpritePopcornStateSittingEatFoodId = 11101, - kPeepSpriteArmsCrossedStateNoneId = 6433, + kPeepSpriteArmsCrossedStateWalkingId = 6433, - kPeepSpriteHeadDownStateNoneId = 6457, + kPeepSpriteHeadDownStateWalkingId = 6457, - kPeepSpriteNauseousStateNoneId = 6481, + kPeepSpriteNauseousStateWalkingId = 6481, - kPeepSpriteVeryNauseousStateNoneId = 6505, + kPeepSpriteVeryNauseousStateWalkingId = 6505, kPeepSpriteVeryNauseousStateWatchRideId = 6529, kPeepSpriteVeryNauseousStateSittingIdleId = 6533, - kPeepSpriteRequireToiletStateNoneId = 6537, + kPeepSpriteRequireToiletStateWalkingId = 6537, - kPeepSpriteHatStateNoneId = 10721, + kPeepSpriteHatStateWalkingId = 10721, kPeepSpriteHatStateWatchRideId = 10717, kPeepSpriteHatStateSittingIdleId = 10745, - kPeepSpriteHotDogStateNoneId = 7889, + kPeepSpriteHotDogStateWalkingId = 7889, kPeepSpriteHotDogStateWatchRideId = 7885, kPeepSpriteHotDogStateEatFoodId = 8013, kPeepSpriteHotDogStateSittingIdleId = 7961, kPeepSpriteHotDogStateSittingEatFoodId = 7965, - kPeepSpriteTentacleStateNoneId = 8065, + kPeepSpriteTentacleStateWalkingId = 8065, kPeepSpriteTentacleStateWatchRideId = 8061, kPeepSpriteTentacleStateEatFoodId = 8285, kPeepSpriteTentacleStateSittingIdleId = 8185, kPeepSpriteTentacleStateSittingEatFoodId = 8189, - kPeepSpriteToffeeAppleStateNoneId = 7401, + kPeepSpriteToffeeAppleStateWalkingId = 7401, kPeepSpriteToffeeAppleStateWatchRideId = 7397, kPeepSpriteToffeeAppleStateEatFoodId = 7477, kPeepSpriteToffeeAppleStateSittingIdleId = 7449, kPeepSpriteToffeeAppleStateSittingEatFoodId = 7453, - kPeepSpriteDonutStateNoneId = 8561, + kPeepSpriteDonutStateWalkingId = 8561, kPeepSpriteDonutStateWatchRideId = 8557, kPeepSpriteDonutStateEatFoodId = 8661, kPeepSpriteDonutStateSittingIdleId = 8633, kPeepSpriteDonutStateSittingEatFoodId = 8637, - kPeepSpriteCoffeeStateNoneId = 8885, + kPeepSpriteCoffeeStateWalkingId = 8885, kPeepSpriteCoffeeStateWatchRideId = 8981, kPeepSpriteCoffeeStateSittingIdleId = 8957, - kPeepSpriteChickenStateNoneId = 9005, + kPeepSpriteChickenStateWalkingId = 9005, kPeepSpriteChickenStateWatchRideId = 9125, kPeepSpriteChickenStateSittingIdleId = 9077, - kPeepSpriteLemonadeStateNoneId = 9173, + kPeepSpriteLemonadeStateWalkingId = 9173, kPeepSpriteLemonadeStateWatchRideId = 9293, kPeepSpriteLemonadeStateSittingIdleId = 9245, kPeepSpriteWatchingStateWatchRideId = 7245, - kPeepSpritePretzelStateNoneId = 9341, + kPeepSpritePretzelStateWalkingId = 9341, kPeepSpritePretzelStateWatchRideId = 9461, kPeepSpritePretzelStateSittingIdleId = 9413, - kPeepSpriteSunglassesStateNoneId = 10685, + kPeepSpriteSunglassesStateWalkingId = 10685, kPeepSpriteSunglassesStateWatchRideId = 10713, kPeepSpriteSunglassesStateSittingIdleId = 10709, - kPeepSpriteSuJongkwaStateNoneId = 9509, + kPeepSpriteSuJongkwaStateWalkingId = 9509, kPeepSpriteSuJongkwaStateWatchRideId = 9629, kPeepSpriteSuJongkwaStateSittingIdleId = 9581, - kPeepSpriteJuiceStateNoneId = 9677, + kPeepSpriteJuiceStateWalkingId = 9677, kPeepSpriteJuiceStateWatchRideId = 9797, kPeepSpriteJuiceStateSittingIdleId = 9749, - kPeepSpriteFunnelCakeStateNoneId = 9845, + kPeepSpriteFunnelCakeStateWalkingId = 9845, kPeepSpriteFunnelCakeStateWatchRideId = 9965, kPeepSpriteFunnelCakeStateSittingIdleId = 9917, - kPeepSpriteNoodlesStateNoneId = 10013, + kPeepSpriteNoodlesStateWalkingId = 10013, kPeepSpriteNoodlesStateWatchRideId = 10133, kPeepSpriteNoodlesStateSittingIdleId = 10085, - kPeepSpriteSausageStateNoneId = 10181, + kPeepSpriteSausageStateWalkingId = 10181, kPeepSpriteSausageStateWatchRideId = 10301, kPeepSpriteSausageStateSittingIdleId = 10253, - kPeepSpriteSoupStateNoneId = 10349, + kPeepSpriteSoupStateWalkingId = 10349, kPeepSpriteSoupStateWatchRideId = 10469, kPeepSpriteSoupStateSittingIdleId = 10421, - kPeepSpriteSandwichStateNoneId = 10517, + kPeepSpriteSandwichStateWalkingId = 10517, kPeepSpriteSandwichStateWatchRideId = 10637, kPeepSpriteSandwichStateSittingIdleId = 10589, }; diff --git a/src/openrct2/platform/Crash.cpp b/src/openrct2/platform/Crash.cpp index 5e64f16e56..1bd6f7c836 100644 --- a/src/openrct2/platform/Crash.cpp +++ b/src/openrct2/platform/Crash.cpp @@ -10,54 +10,54 @@ #include "Crash.h" #ifdef USE_BREAKPAD -# include -# include -# include -# include + #include + #include + #include + #include -# if defined(_WIN32) -# include -# include -# include -# include -# else -# error Breakpad support not implemented yet for this platform -# endif + #if defined(_WIN32) + #include + #include + #include + #include + #else + #error Breakpad support not implemented yet for this platform + #endif -# include "../Context.h" -# include "../Game.h" -# include "../GameState.h" -# include "../OpenRCT2.h" -# include "../PlatformEnvironment.h" -# include "../Version.h" -# include "../config/Config.h" -# include "../core/Compression.h" -# include "../core/Console.hpp" -# include "../core/Guard.hpp" -# include "../core/Path.hpp" -# include "../core/SawyerCoding.h" -# include "../core/String.hpp" -# include "../drawing/IDrawingEngine.h" -# include "../interface/Screenshot.h" -# include "../localisation/Language.h" -# include "../object/ObjectManager.h" -# include "../park/ParkFile.h" -# include "../scenario/Scenario.h" -# include "Platform.h" + #include "../Context.h" + #include "../Game.h" + #include "../GameState.h" + #include "../OpenRCT2.h" + #include "../PlatformEnvironment.h" + #include "../Version.h" + #include "../config/Config.h" + #include "../core/Compression.h" + #include "../core/Console.hpp" + #include "../core/Guard.hpp" + #include "../core/Path.hpp" + #include "../core/SawyerCoding.h" + #include "../core/String.hpp" + #include "../drawing/IDrawingEngine.h" + #include "../interface/Screenshot.h" + #include "../localisation/Language.h" + #include "../object/ObjectManager.h" + #include "../park/ParkFile.h" + #include "../scenario/Scenario.h" + #include "Platform.h" -# define WSZ(x) L"" x + #define WSZ(x) L"" x -# ifdef OPENRCT2_COMMIT_SHA1_SHORT + #ifdef OPENRCT2_COMMIT_SHA1_SHORT static const wchar_t* _wszCommitSha1Short = WSZ(OPENRCT2_COMMIT_SHA1_SHORT); -# else + #else static const wchar_t* _wszCommitSha1Short = WSZ(""); -# endif + #endif // OPENRCT2_ARCHITECTURE is required to be defined in version.h static const wchar_t* _wszArchitecture = WSZ(OPENRCT2_ARCHITECTURE); static std::map _uploadFiles; -# define BACKTRACE_TOKEN "1a9becc5de031b0a24ecad5222d2b42820c3710863a0f1dba6ab378b02ca659a" + #define BACKTRACE_TOKEN "024ed66e0e296ab22777d1292e1d945d78584f350c92fc76c2af843a7db002c9" using namespace OpenRCT2; diff --git a/src/openrct2/platform/Memory.h b/src/openrct2/platform/Memory.h new file mode 100644 index 0000000000..37b2c9016f --- /dev/null +++ b/src/openrct2/platform/Memory.h @@ -0,0 +1,36 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#if defined(__amd64__) || defined(_M_AMD64) || defined(__i386__) || defined(_M_IX86) + // Don't bother checking for CPUID, prefetch is available since Pentium 4 + #include + // This cannot be expressed as `constexpr` function, exclude it from clang-tidy check + // NOLINTNEXTLINE(cppcoreguidelines-macro-usage) + #define PREFETCH(x) _mm_prefetch(reinterpret_cast(x), _MM_HINT_T0) + +#elif defined(_MSC_VER) && defined(_M_ARM64) + // ARM64 prefetch is available since ARMv8. + // MSVC's help (https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170) + // is incorrect and points to a different header (arm64_neon.h), which doesn't contain prefetch. + // Correct header info taken from + // https://github.com/microsoft/wdkmetadata/blob/1ac0dd0719f19196334de12cf2a6dec20316d440/generation/WDK/IdlHeaders/km/crt/intrin.h#L2 + // and + // https://github.com/microsoft/wdkmetadata/blob/1ac0dd0719f19196334de12cf2a6dec20316d440/generation/WDK/IdlHeaders/km/crt/intrin.h#L411 + #include + #define PREFETCH(x) __prefetch(x) + +#elif defined(__GNUC__) + // Let the compiler handle prefetch instruction + #define PREFETCH(x) __builtin_prefetch(x) + +#else + #define PREFETCH(x) +#endif diff --git a/src/openrct2/platform/Platform.Android.cpp b/src/openrct2/platform/Platform.Android.cpp index b011e4db98..9a48128ff1 100644 --- a/src/openrct2/platform/Platform.Android.cpp +++ b/src/openrct2/platform/Platform.Android.cpp @@ -9,15 +9,15 @@ #ifdef __ANDROID__ -# include "Platform.h" + #include "Platform.h" -# include "../Diagnostic.h" -# include "../core/Guard.hpp" -# include "../localisation/Language.h" + #include "../Diagnostic.h" + #include "../core/Guard.hpp" + #include "../localisation/Language.h" -# include -# include -# include + #include + #include + #include AndroidClassLoader::~AndroidClassLoader() { @@ -162,13 +162,13 @@ namespace OpenRCT2::Platform return {}; } -# ifndef NO_TTF + #ifndef NO_TTF std::string GetFontPath(const TTFFontDescriptor& font) { STUB(); return {}; } -# endif + #endif float GetDefaultScale() { diff --git a/src/openrct2/platform/Platform.Common.cpp b/src/openrct2/platform/Platform.Common.cpp index 02e7f389da..42d00311fc 100644 --- a/src/openrct2/platform/Platform.Common.cpp +++ b/src/openrct2/platform/Platform.Common.cpp @@ -10,19 +10,19 @@ #include "../Date.h" #ifdef _WIN32 -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include #endif #if defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) -# include -# define OpenRCT2_CPUID_GNUC_X86 + #include + #define OpenRCT2_CPUID_GNUC_X86 #elif defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_X64) || defined(_M_IX86)) // VS2008 -# include -# include -# define OpenRCT2_CPUID_MSVC_X86 + #include + #include + #define OpenRCT2_CPUID_MSVC_X86 #endif #include "../Context.h" @@ -149,15 +149,15 @@ namespace OpenRCT2::Platform #ifdef OPENRCT2_X86 static bool CPUIDX86(uint32_t* cpuid_outdata, int32_t eax) { -# if defined(OpenRCT2_CPUID_GNUC_X86) + #if defined(OpenRCT2_CPUID_GNUC_X86) int ret = __get_cpuid(eax, &cpuid_outdata[0], &cpuid_outdata[1], &cpuid_outdata[2], &cpuid_outdata[3]); return ret == 1; -# elif defined(OpenRCT2_CPUID_MSVC_X86) + #elif defined(OpenRCT2_CPUID_MSVC_X86) __cpuid(reinterpret_cast(cpuid_outdata), static_cast(eax)); return true; -# else + #else return false; -# endif + #endif } #endif // OPENRCT2_X86 @@ -181,9 +181,9 @@ namespace OpenRCT2::Platform // https://github.com/gcc-mirror/gcc/commit/132fa33ce998df69a9f793d63785785f4b93e6f1 // which causes it to ignore subleafs, but the new function is unavailable on // Ubuntu 18.04's toolchains. -# if defined(OpenRCT2_CPUID_GNUC_X86) && (!defined(__FreeBSD__) || (__FreeBSD__ > 10)) + #if defined(OpenRCT2_CPUID_GNUC_X86) && (!defined(__FreeBSD__) || (__FreeBSD__ > 10)) return __builtin_cpu_supports("avx2"); -# else + #else // AVX2 support is declared as the 5th bit of EBX with CPUID(EAX = 7, ECX = 0). uint32_t regs[4] = { 0 }; if (CPUIDX86(regs, 7)) @@ -198,7 +198,7 @@ namespace OpenRCT2::Platform } return avxCPUSupport; } -# endif + #endif #endif return false; } diff --git a/src/openrct2/platform/Platform.Linux.cpp b/src/openrct2/platform/Platform.Linux.cpp index 1cfcaf45d6..f58fa97a46 100644 --- a/src/openrct2/platform/Platform.Linux.cpp +++ b/src/openrct2/platform/Platform.Linux.cpp @@ -9,33 +9,33 @@ #if defined(__unix__) && !defined(__ANDROID__) && !defined(__APPLE__) -# include "../Diagnostic.h" + #include "../Diagnostic.h" -# include -# include -# include -# include -# include -# include -# include -# if defined(__FreeBSD__) || defined(__NetBSD__) -# include -# include -# include -# endif // __FreeBSD__ || __NetBSD__ -# if defined(__linux__) -// for PATH_MAX -# include -# endif // __linux__ -# ifndef NO_TTF -# include -# endif // NO_TTF + #include + #include + #include + #include + #include + #include + #include + #if defined(__FreeBSD__) || defined(__NetBSD__) + #include + #include + #include + #endif // __FreeBSD__ || __NetBSD__ + #if defined(__linux__) + // for PATH_MAX + #include + #endif // __linux__ + #ifndef NO_TTF + #include + #endif // NO_TTF -# include "../Date.h" -# include "../OpenRCT2.h" -# include "../core/Path.hpp" -# include "../localisation/Language.h" -# include "Platform.h" + #include "../Date.h" + #include "../OpenRCT2.h" + #include "../core/Path.hpp" + #include "../localisation/Language.h" + #include "Platform.h" namespace OpenRCT2::Platform { @@ -131,40 +131,40 @@ namespace OpenRCT2::Platform std::string GetCurrentExecutablePath() { char exePath[PATH_MAX] = { 0 }; -# ifdef __linux__ + #ifdef __linux__ auto bytesRead = readlink("/proc/self/exe", exePath, sizeof(exePath)); if (bytesRead == -1) { LOG_FATAL("failed to read /proc/self/exe"); } -# elif defined(__FreeBSD__) || defined(__NetBSD__) -# if defined(__FreeBSD__) + #elif defined(__FreeBSD__) || defined(__NetBSD__) + #if defined(__FreeBSD__) const int32_t mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1, }; -# else + #else const int32_t mib[] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME, }; -# endif + #endif auto exeLen = sizeof(exePath); if (sysctl(mib, 4, exePath, &exeLen, nullptr, 0) == -1) { LOG_FATAL("failed to get process path"); } -# elif defined(__OpenBSD__) + #elif defined(__OpenBSD__) // There is no way to get the path name of a running executable. // If you are not using the port or package, you may have to change this line! strlcpy(exePath, "/usr/local/bin/", sizeof(exePath)); -# else -# error "Platform does not support full path exe retrieval" -# endif + #else + #error "Platform does not support full path exe retrieval" + #endif return exePath; } @@ -259,12 +259,12 @@ namespace OpenRCT2::Platform MeasurementFormat GetLocaleMeasurementFormat() { -// LC_MEASUREMENT is GNU specific. -# ifdef LC_MEASUREMENT + // LC_MEASUREMENT is GNU specific. + #ifdef LC_MEASUREMENT const char* langstring = setlocale(LC_MEASUREMENT, ""); -# else + #else const char* langstring = setlocale(LC_ALL, ""); -# endif + #endif if (langstring != nullptr) { @@ -349,7 +349,7 @@ namespace OpenRCT2::Platform }; } -# ifndef NO_TTF + #ifndef NO_TTF std::string GetFontPath(const TTFFontDescriptor& font) { LOG_VERBOSE("Looking for font %s with FontConfig.", font.font_name); @@ -406,7 +406,7 @@ namespace OpenRCT2::Platform FcFini(); return path; } -# endif // NO_TTF + #endif // NO_TTF } // namespace OpenRCT2::Platform #endif diff --git a/src/openrct2/platform/Platform.Posix.cpp b/src/openrct2/platform/Platform.Posix.cpp index f56fc144bd..55a91fd8af 100644 --- a/src/openrct2/platform/Platform.Posix.cpp +++ b/src/openrct2/platform/Platform.Posix.cpp @@ -9,27 +9,27 @@ #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__FreeBSD__) -# include "Platform.h" + #include "Platform.h" -# include "../Date.h" -# include "../Diagnostic.h" -# include "../core/Memory.hpp" -# include "../core/Path.hpp" -# include "../core/String.hpp" + #include "../Date.h" + #include "../Diagnostic.h" + #include "../core/Memory.hpp" + #include "../core/Path.hpp" + #include "../core/String.hpp" -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include // The name of the mutex used to prevent multiple instances of the game from running static constexpr const utf8* SINGLE_INSTANCE_MUTEX_NAME = u8"openrct2.lock"; @@ -118,7 +118,7 @@ namespace OpenRCT2::Platform int32_t Execute(std::string_view command, std::string* output) { -# ifndef __EMSCRIPTEN__ + #ifndef __EMSCRIPTEN__ LOG_VERBOSE("executing \"%s\"...", std::string(command).c_str()); FILE* fpipe = popen(std::string(command).c_str(), "r"); if (fpipe == nullptr) @@ -160,10 +160,10 @@ namespace OpenRCT2::Platform // Return exit code return pclose(fpipe); -# else + #else LOG_WARNING("Emscripten cannot execute processes. The commandline was '%s'.", command.c_str()); return -1; -# endif // __EMSCRIPTEN__ + #endif // __EMSCRIPTEN__ } uint64_t GetLastModified(std::string_view path) @@ -279,12 +279,12 @@ namespace OpenRCT2::Platform TemperatureUnit GetLocaleTemperatureFormat() { -// LC_MEASUREMENT is GNU specific. -# ifdef LC_MEASUREMENT + // LC_MEASUREMENT is GNU specific. + #ifdef LC_MEASUREMENT const char* langstring = setlocale(LC_MEASUREMENT, ""); -# else + #else const char* langstring = setlocale(LC_ALL, ""); -# endif + #endif if (langstring != nullptr) { @@ -299,11 +299,11 @@ namespace OpenRCT2::Platform bool ProcessIsElevated() { -# ifndef __EMSCRIPTEN__ + #ifndef __EMSCRIPTEN__ return (geteuid() == 0); -# else + #else return false; -# endif // __EMSCRIPTEN__ + #endif // __EMSCRIPTEN__ } bool LockSingleInstance() diff --git a/src/openrct2/platform/Platform.Win32.cpp b/src/openrct2/platform/Platform.Win32.cpp index bf70e6598e..859ebfc669 100644 --- a/src/openrct2/platform/Platform.Win32.cpp +++ b/src/openrct2/platform/Platform.Win32.cpp @@ -9,48 +9,48 @@ #ifdef _WIN32 -// Windows.h needs to be included first -# ifndef WIN32_LEAN_AND_MEAN -# define WIN32_LEAN_AND_MEAN -# endif -# include "../Diagnostic.h" + // Windows.h needs to be included first + #ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #endif + #include "../Diagnostic.h" -# include -# include + #include + #include -// Then the rest -# include "../Version.h" + // Then the rest + #include "../Version.h" -# include -# include -# include -# include -# undef GetEnvironmentVariable + #include + #include + #include + #include + #undef GetEnvironmentVariable -# include "../Date.h" -# include "../OpenRCT2.h" -# include "../core/Path.hpp" -# include "../core/String.hpp" -# include "../localisation/Language.h" -# include "../localisation/Localisation.Date.h" -# include "Platform.h" + #include "../Date.h" + #include "../OpenRCT2.h" + #include "../core/Path.hpp" + #include "../core/String.hpp" + #include "../localisation/Language.h" + #include "../localisation/Localisation.Date.h" + #include "Platform.h" -# include -# include -# include + #include + #include + #include -// Native resource IDs -# include "../../../resources/resource.h" + // Native resource IDs + #include "../../../resources/resource.h" -// Enable visual styles -# pragma comment( \ + // Enable visual styles + #pragma comment( \ linker, \ "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") // The name of the mutex used to prevent multiple instances of the game from running static constexpr wchar_t SINGLE_INSTANCE_MUTEX_NAME[] = L"RollerCoaster Tycoon 2_GSKMUTEX"; -# define SOFTWARE_CLASSES L"Software\\Classes" -# define MUI_CACHE L"Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache" + #define SOFTWARE_CLASSES L"Software\\Classes" + #define MUI_CACHE L"Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache" namespace OpenRCT2::Platform { @@ -215,14 +215,14 @@ namespace OpenRCT2::Platform if (hModule != nullptr) { using RtlGetVersionPtr = long(WINAPI*)(PRTL_OSVERSIONINFOW); -# if defined(__GNUC__) && __GNUC__ >= 8 -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wcast-function-type" -# endif + #if defined(__GNUC__) && __GNUC__ >= 8 + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-function-type" + #endif auto fn = reinterpret_cast(GetProcAddress(hModule, "RtlGetVersion")); -# if defined(__GNUC__) && __GNUC__ >= 8 -# pragma GCC diagnostic pop -# endif + #if defined(__GNUC__) && __GNUC__ >= 8 + #pragma GCC diagnostic pop + #endif if (fn != nullptr) { RTL_OSVERSIONINFOW rovi{}; @@ -597,6 +597,7 @@ namespace OpenRCT2::Platform { L"es", LANGUAGE_SPANISH }, { L"fr", LANGUAGE_FRENCH }, { L"fr-CA", LANGUAGE_FRENCH_CA }, + { L"gl", LANGUAGE_GALICIAN }, { L"it", LANGUAGE_ITALIAN }, { L"ja", LANGUAGE_JAPANESE }, { L"ko", LANGUAGE_KOREAN }, diff --git a/src/openrct2/platform/Platform.h b/src/openrct2/platform/Platform.h index 5530eda866..dde5053f9b 100644 --- a/src/openrct2/platform/Platform.h +++ b/src/openrct2/platform/Platform.h @@ -17,18 +17,18 @@ #include #ifdef _WIN32 -# define PATH_SEPARATOR u8"\\" -# define PLATFORM_NEWLINE u8"\r\n" + #define PATH_SEPARATOR u8"\\" + #define PLATFORM_NEWLINE u8"\r\n" #else -# define PATH_SEPARATOR u8"/" -# define PLATFORM_NEWLINE u8"\n" + #define PATH_SEPARATOR u8"/" + #define PLATFORM_NEWLINE u8"\n" #endif #ifdef __ANDROID__ -# include + #include #endif // __ANDROID__ #ifndef MAX_PATH -# define MAX_PATH 260 + #define MAX_PATH 260 #endif enum class SPECIAL_FOLDER diff --git a/src/openrct2/profiling/ProfilingMacros.hpp b/src/openrct2/profiling/ProfilingMacros.hpp index de06c28045..3712be0e46 100644 --- a/src/openrct2/profiling/ProfilingMacros.hpp +++ b/src/openrct2/profiling/ProfilingMacros.hpp @@ -11,11 +11,11 @@ namespace OpenRCT2::Profiling { #if defined(__clang__) || defined(__GNUC__) -# define PROFILING_FUNC_NAME __PRETTY_FUNCTION__ + #define PROFILING_FUNC_NAME __PRETTY_FUNCTION__ #elif defined(_MSC_VER) -# define PROFILING_FUNC_NAME __FUNCSIG__ + #define PROFILING_FUNC_NAME __FUNCSIG__ #else -# error "Unsupported compiler" + #error "Unsupported compiler" #endif #define PROFILED_FUNCTION_NAME(func) \ @@ -30,10 +30,10 @@ namespace OpenRCT2::Profiling #if defined(__clang_major__) && __clang_major__ <= 5 // Clang 5 crashes using the profiler, we need to disable it. -# define PROFILED_FUNCTION() + #define PROFILED_FUNCTION() #else -# define PROFILED_FUNCTION() \ + #define PROFILED_FUNCTION() \ PROFILED_FUNCTION_NAME(PROFILING_FUNC_NAME) \ static auto& _profiling_func = ::OpenRCT2::Profiling::Detail::Storage::Data; \ ::OpenRCT2::Profiling::ScopedProfiling _profiling_scope(_profiling_func); diff --git a/src/openrct2/rct1/RCT1.h b/src/openrct2/rct1/RCT1.h index f02760cd8a..349d916890 100644 --- a/src/openrct2/rct1/RCT1.h +++ b/src/openrct2/rct1/RCT1.h @@ -523,12 +523,15 @@ namespace OpenRCT2::RCT1 EntertainerSnowman = 9, EntertainerKnight = 10, EntertainerAstronaut = 11, - + IceCream = 12, + Chips = 13, + Burger = 14, + Drink = 15, Balloon = 16, Candyfloss = 17, Umbrella = 18, - Pizza = 19, // Unsure - SecurityAlt = 20, // Unknown + Pizza = 19, + SecurityAlt = 20, Popcorn = 21, ArmsCrossed = 22, HeadDown = 23, @@ -536,9 +539,13 @@ namespace OpenRCT2::RCT1 VeryNauseous = 25, RequireToilet = 26, Hat = 27, - Burger = 28, + HotDog = 28, Tentacle = 29, - ToffeeApple = 30 + ToffeeApple = 30, + Doughnut = 31, + Coffee = 32, + Chicken = 33, + Lemonade = 34, }; struct Peep : RCT12EntityBase diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index c7058a5277..b928eabd46 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -45,6 +45,7 @@ #include "../management/Marketing.h" #include "../management/NewsItem.h" #include "../object/Object.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" @@ -1050,7 +1051,7 @@ namespace OpenRCT2::RCT1 dst->dropsPoweredLifts = src->NumDrops; dst->start_drop_height = src->StartDropHeight / 2; dst->highest_drop_height = src->HighestDropHeight / 2; - if (dst->type == RIDE_TYPE_MINI_GOLF) + if (src->Type == RideType::MiniatureGolf) dst->holes = src->NumInversions & kRCT12InversionAndHoleMask; else dst->inversions = src->NumInversions & kRCT12InversionAndHoleMask; @@ -1153,7 +1154,7 @@ namespace OpenRCT2::RCT1 } } - if (_gameVersion < FILE_VERSION_RCT1_LL && dst->type == RIDE_TYPE_MERRY_GO_ROUND) + if (_gameVersion < FILE_VERSION_RCT1_LL && src->Type == RideType::MerryGoRound) { // The merry-go-round in pre-LL versions was always yellow with red dst->vehicle_colours[0].Body = COLOUR_YELLOW; diff --git a/src/openrct2/rct1/T4Importer.cpp b/src/openrct2/rct1/T4Importer.cpp index 1b35758eaa..12703b1629 100644 --- a/src/openrct2/rct1/T4Importer.cpp +++ b/src/openrct2/rct1/T4Importer.cpp @@ -235,7 +235,7 @@ namespace OpenRCT2::RCT1 td->operation.operationSetting, GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex).OperatingSettings.MaxValue); const auto& rtd = GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { TD46MazeElement t4MazeElement{}; t4MazeElement.All = !0; diff --git a/src/openrct2/rct1/Tables.cpp b/src/openrct2/rct1/Tables.cpp index 23211ae6e4..234f136035 100644 --- a/src/openrct2/rct1/Tables.cpp +++ b/src/openrct2/rct1/Tables.cpp @@ -171,91 +171,91 @@ namespace OpenRCT2::RCT1 static uint8_t map[] = { - RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER,// RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER - RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER - RIDE_TYPE_SUSPENDED_SWINGING_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER - RIDE_TYPE_INVERTED_ROLLER_COASTER, // RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER - RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER - RIDE_TYPE_MINIATURE_RAILWAY, // RCT1_RIDE_TYPE_MINIATURE_RAILWAY - RIDE_TYPE_MONORAIL, // RCT1_RIDE_TYPE_MONORAIL - RIDE_TYPE_MINI_SUSPENDED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER - RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_BOAT_HIRE - RIDE_TYPE_WOODEN_WILD_MOUSE, // RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER - RIDE_TYPE_STEEPLECHASE, // RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER - RIDE_TYPE_CAR_RIDE, // RCT1_RIDE_TYPE_CAR_RIDE - RIDE_TYPE_LAUNCHED_FREEFALL, // RCT1_RIDE_TYPE_LAUNCHED_FREEFALL - RIDE_TYPE_BOBSLEIGH_COASTER, // RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER - RIDE_TYPE_OBSERVATION_TOWER, // RCT1_RIDE_TYPE_OBSERVATION_TOWER - RIDE_TYPE_LOOPING_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER - RIDE_TYPE_DINGHY_SLIDE, // RCT1_RIDE_TYPE_WATER_SLIDE - RIDE_TYPE_MINE_TRAIN_COASTER, // RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER - RIDE_TYPE_CHAIRLIFT, // RCT1_RIDE_TYPE_CHAIRLIFT - RIDE_TYPE_CORKSCREW_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER - RIDE_TYPE_MAZE, // RCT1_RIDE_TYPE_HEDGE_MAZE - RIDE_TYPE_SPIRAL_SLIDE, // RCT1_RIDE_TYPE_SPIRAL_SLIDE - RIDE_TYPE_GO_KARTS, // RCT1_RIDE_TYPE_GO_KARTS - RIDE_TYPE_LOG_FLUME, // RCT1_RIDE_TYPE_LOG_FLUME - RIDE_TYPE_RIVER_RAPIDS, // RCT1_RIDE_TYPE_RIVER_RAPIDS - RIDE_TYPE_DODGEMS, // RCT1_RIDE_TYPE_DODGEMS - RIDE_TYPE_SWINGING_SHIP, // RCT1_RIDE_TYPE_SWINGING_SHIP - RIDE_TYPE_SWINGING_INVERTER_SHIP, // RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_ICE_CREAM_STALL - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CHIPS_STALL - RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_DRINK_STALL - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CANDYFLOSS_STALL - RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BURGER_BAR - RIDE_TYPE_MERRY_GO_ROUND, // RCT1_RIDE_TYPE_MERRY_GO_ROUND - RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BALLOON_STALL - RIDE_TYPE_INFORMATION_KIOSK, // RCT1_RIDE_TYPE_INFORMATION_KIOSK - RIDE_TYPE_TOILETS, // RCT1_RIDE_TYPE_TOILETS - RIDE_TYPE_FERRIS_WHEEL, // RCT1_RIDE_TYPE_FERRIS_WHEEL - RIDE_TYPE_MOTION_SIMULATOR, // RCT1_RIDE_TYPE_MOTION_SIMULATOR - RIDE_TYPE_3D_CINEMA, // RCT1_RIDE_TYPE_3D_CINEMA - RIDE_TYPE_TOP_SPIN, // RCT1_RIDE_TYPE_TOP_SPIN - RIDE_TYPE_SPACE_RINGS, // RCT1_RIDE_TYPE_SPACE_RINGS - RIDE_TYPE_REVERSE_FREEFALL_COASTER, // RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER - RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_SOUVENIR_STALL - RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, // RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_PIZZA_STALL - RIDE_TYPE_TWIST, // RCT1_RIDE_TYPE_TWIST - RIDE_TYPE_HAUNTED_HOUSE, // RCT1_RIDE_TYPE_HAUNTED_HOUSE - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_POPCORN_STALL - RIDE_TYPE_CIRCUS, // RCT1_RIDE_TYPE_CIRCUS - RIDE_TYPE_GHOST_TRAIN, // RCT1_RIDE_TYPE_GHOST_TRAIN - RIDE_TYPE_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER - RIDE_TYPE_WOODEN_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER - RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER - RIDE_TYPE_STEEL_WILD_MOUSE, // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_HOT_DOG_STALL - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL - RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_HAT_STALL - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL - RIDE_TYPE_VIRGINIA_REEL, // RCT1_RIDE_TYPE_VIRGINIA_REEL - RIDE_TYPE_SPLASH_BOATS, // RCT1_RIDE_TYPE_RIVER_RIDE - RIDE_TYPE_MINI_HELICOPTERS, // RCT1_RIDE_TYPE_CYCLE_MONORAIL - RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, // RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER - RIDE_TYPE_SUSPENDED_MONORAIL, // RCT1_RIDE_TYPE_SUSPENDED_MONORAIL - RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_40 - RIDE_TYPE_REVERSER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER - RIDE_TYPE_HEARTLINE_TWISTER_COASTER, // RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER - RIDE_TYPE_MINI_GOLF, // RCT1_RIDE_TYPE_MINIATURE_GOLF - RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_44 - RIDE_TYPE_ROTO_DROP, // RCT1_RIDE_TYPE_ROTO_DROP - RIDE_TYPE_FLYING_SAUCERS, // RCT1_RIDE_TYPE_FLYING_SAUCERS - RIDE_TYPE_CROOKED_HOUSE, // RCT1_RIDE_TYPE_CROOKED_HOUSE - RIDE_TYPE_MONORAIL_CYCLES, // RCT1_RIDE_TYPE_CYCLE_RAILWAY - RIDE_TYPE_COMPACT_INVERTED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER - RIDE_TYPE_WATER_COASTER, // RCT1_RIDE_TYPE_WATER_COASTER - RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, // RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER - RIDE_TYPE_INVERTED_HAIRPIN_COASTER, // RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER - RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_JET_SKIS - RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_T_SHIRT_STALL - RIDE_TYPE_RIVER_RAFTS, // RCT1_RIDE_TYPE_RAFT_RIDE - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_DOUGHNUT_SHOP - RIDE_TYPE_ENTERPRISE, // RCT1_RIDE_TYPE_ENTERPRISE - RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_COFFEE_SHOP - RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL - RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL + RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_ROLLER_COASTER + RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, // RCT1_RIDE_TYPE_STAND_UP_STEEL_ROLLER_COASTER + RIDE_TYPE_SUSPENDED_SWINGING_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_ROLLER_COASTER + RIDE_TYPE_INVERTED_ROLLER_COASTER, // RCT1_RIDE_TYPE_INVERTED_ROLLER_COASTER + RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_MINI_ROLLER_COASTER + RIDE_TYPE_MINIATURE_RAILWAY, // RCT1_RIDE_TYPE_MINIATURE_RAILWAY + RIDE_TYPE_MONORAIL, // RCT1_RIDE_TYPE_MONORAIL + RIDE_TYPE_MINI_SUSPENDED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_SINGLE_RAIL_ROLLER_COASTER + RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_BOAT_HIRE + RIDE_TYPE_WOODEN_WILD_MOUSE, // RCT1_RIDE_TYPE_WOODEN_CRAZY_RODENT_ROLLER_COASTER + RIDE_TYPE_STEEPLECHASE, // RCT1_RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER + RIDE_TYPE_CAR_RIDE, // RCT1_RIDE_TYPE_CAR_RIDE + RIDE_TYPE_LAUNCHED_FREEFALL, // RCT1_RIDE_TYPE_LAUNCHED_FREEFALL + RIDE_TYPE_BOBSLEIGH_COASTER, // RCT1_RIDE_TYPE_BOBSLED_ROLLER_COASTER + RIDE_TYPE_OBSERVATION_TOWER, // RCT1_RIDE_TYPE_OBSERVATION_TOWER + RIDE_TYPE_LOOPING_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_ROLLER_COASTER + RIDE_TYPE_DINGHY_SLIDE, // RCT1_RIDE_TYPE_WATER_SLIDE + RIDE_TYPE_MINE_TRAIN_COASTER, // RCT1_RIDE_TYPE_MINE_TRAIN_ROLLER_COASTER + RIDE_TYPE_CHAIRLIFT, // RCT1_RIDE_TYPE_CHAIRLIFT + RIDE_TYPE_CORKSCREW_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_CORKSCREW_ROLLER_COASTER + RIDE_TYPE_MAZE, // RCT1_RIDE_TYPE_HEDGE_MAZE + RIDE_TYPE_SPIRAL_SLIDE, // RCT1_RIDE_TYPE_SPIRAL_SLIDE + RIDE_TYPE_GO_KARTS, // RCT1_RIDE_TYPE_GO_KARTS + RIDE_TYPE_LOG_FLUME, // RCT1_RIDE_TYPE_LOG_FLUME + RIDE_TYPE_RIVER_RAPIDS, // RCT1_RIDE_TYPE_RIVER_RAPIDS + RIDE_TYPE_DODGEMS, // RCT1_RIDE_TYPE_DODGEMS + RIDE_TYPE_SWINGING_SHIP, // RCT1_RIDE_TYPE_SWINGING_SHIP + RIDE_TYPE_SWINGING_INVERTER_SHIP, // RCT1_RIDE_TYPE_SWINGING_INVERTER_SHIP + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_ICE_CREAM_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CHIPS_STALL + RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_DRINK_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_CANDYFLOSS_STALL + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BURGER_BAR + RIDE_TYPE_MERRY_GO_ROUND, // RCT1_RIDE_TYPE_MERRY_GO_ROUND + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_BALLOON_STALL + RIDE_TYPE_INFORMATION_KIOSK, // RCT1_RIDE_TYPE_INFORMATION_KIOSK + RIDE_TYPE_TOILETS, // RCT1_RIDE_TYPE_TOILETS + RIDE_TYPE_FERRIS_WHEEL, // RCT1_RIDE_TYPE_FERRIS_WHEEL + RIDE_TYPE_MOTION_SIMULATOR, // RCT1_RIDE_TYPE_MOTION_SIMULATOR + RIDE_TYPE_3D_CINEMA, // RCT1_RIDE_TYPE_3D_CINEMA + RIDE_TYPE_TOP_SPIN, // RCT1_RIDE_TYPE_TOP_SPIN + RIDE_TYPE_SPACE_RINGS, // RCT1_RIDE_TYPE_SPACE_RINGS + RIDE_TYPE_REVERSE_FREEFALL_COASTER, // RCT1_RIDE_TYPE_REVERSE_FREEFALL_ROLLER_COASTER + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_SOUVENIR_STALL + RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER, // RCT1_RIDE_TYPE_VERTICAL_ROLLER_COASTER + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_PIZZA_STALL + RIDE_TYPE_TWIST, // RCT1_RIDE_TYPE_TWIST + RIDE_TYPE_HAUNTED_HOUSE, // RCT1_RIDE_TYPE_HAUNTED_HOUSE + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_POPCORN_STALL + RIDE_TYPE_CIRCUS, // RCT1_RIDE_TYPE_CIRCUS + RIDE_TYPE_GHOST_TRAIN, // RCT1_RIDE_TYPE_GHOST_TRAIN + RIDE_TYPE_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER + RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER + RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER + RIDE_TYPE_STEEL_WILD_MOUSE, // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_HOT_DOG_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_EXOTIC_SEA_FOOD_STALL + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_HAT_STALL + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_TOFFEE_APPLE_STALL + RIDE_TYPE_VIRGINIA_REEL, // RCT1_RIDE_TYPE_VIRGINIA_REEL + RIDE_TYPE_SPLASH_BOATS, // RCT1_RIDE_TYPE_RIVER_RIDE + RIDE_TYPE_MINI_HELICOPTERS, // RCT1_RIDE_TYPE_CYCLE_MONORAIL + RIDE_TYPE_LAY_DOWN_ROLLER_COASTER, // RCT1_RIDE_TYPE_FLYING_ROLLER_COASTER + RIDE_TYPE_SUSPENDED_MONORAIL, // RCT1_RIDE_TYPE_SUSPENDED_MONORAIL + RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_40 + RIDE_TYPE_REVERSER_ROLLER_COASTER, // RCT1_RIDE_TYPE_WOODEN_REVERSER_ROLLER_COASTER + RIDE_TYPE_HEARTLINE_TWISTER_COASTER, // RCT1_RIDE_TYPE_HEARTLINE_TWISTER_ROLLER_COASTER + RIDE_TYPE_MINI_GOLF, // RCT1_RIDE_TYPE_MINIATURE_GOLF + RIDE_TYPE_NULL, // RCT1_RIDE_TYPE_44 + RIDE_TYPE_ROTO_DROP, // RCT1_RIDE_TYPE_ROTO_DROP + RIDE_TYPE_FLYING_SAUCERS, // RCT1_RIDE_TYPE_FLYING_SAUCERS + RIDE_TYPE_CROOKED_HOUSE, // RCT1_RIDE_TYPE_CROOKED_HOUSE + RIDE_TYPE_MONORAIL_CYCLES, // RCT1_RIDE_TYPE_CYCLE_RAILWAY + RIDE_TYPE_COMPACT_INVERTED_COASTER, // RCT1_RIDE_TYPE_SUSPENDED_LOOPING_ROLLER_COASTER + RIDE_TYPE_WATER_COASTER, // RCT1_RIDE_TYPE_WATER_COASTER + RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER, // RCT1_RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER + RIDE_TYPE_INVERTED_HAIRPIN_COASTER, // RCT1_RIDE_TYPE_INVERTED_WILD_MOUSE_COASTER + RIDE_TYPE_BOAT_HIRE, // RCT1_RIDE_TYPE_JET_SKIS + RIDE_TYPE_SHOP, // RCT1_RIDE_TYPE_T_SHIRT_STALL + RIDE_TYPE_RIVER_RAFTS, // RCT1_RIDE_TYPE_RAFT_RIDE + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_DOUGHNUT_SHOP + RIDE_TYPE_ENTERPRISE, // RCT1_RIDE_TYPE_ENTERPRISE + RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_COFFEE_SHOP + RIDE_TYPE_FOOD_STALL, // RCT1_RIDE_TYPE_FRIED_CHICKEN_STALL + RIDE_TYPE_DRINK_STALL, // RCT1_RIDE_TYPE_LEMONADE_STALL }; const auto index = EnumValue(rideType); @@ -755,7 +755,7 @@ namespace OpenRCT2::RCT1 "rct2.ride.circus1", // RCT1_RIDE_TYPE_CIRCUS "rct1aa.ride.ghost_train_cars", // RCT1_RIDE_TYPE_GHOST_TRAIN "rct1aa.ride.twister_trains", // RCT1_RIDE_TYPE_STEEL_TWISTER_ROLLER_COASTER - "rct2.ride.mft", // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER + "rct1aa.ride.wooden_articulated_trains", // RCT1_RIDE_TYPE_WOODEN_TWISTER_ROLLER_COASTER "rct1aa.ride.side_friction_cars", // RCT1_RIDE_TYPE_WOODEN_SIDE_FRICTION_ROLLER_COASTER "rct1aa.ride.steel_wild_mouse_cars", // RCT1_RIDE_TYPE_STEEL_WILD_MOUSE_ROLLER_COASTER "rct2.ride.hotds", // RCT1_RIDE_TYPE_HOT_DOG_STALL @@ -856,7 +856,7 @@ namespace OpenRCT2::RCT1 "rct2.ride.circus1", // VehicleType::CircusTent "rct1aa.ride.ghost_train_cars", // VehicleType::GhostTrainCars "rct1aa.ride.twister_trains", // VehicleType::SteelTwisterRollerCoasterTrain - "rct2.ride.mft", // VehicleType::WoodenTwisterRollerCoasterTrain + "rct1aa.ride.wooden_articulated_trains", // VehicleType::WoodenTwisterRollerCoasterTrain "rct1aa.ride.side_friction_cars", // VehicleType::WoodenSideFrictionCars "rct1aa.ride.vintage_cars", // VehicleType::VintageCars "rct1aa.ride.steam_trains_covered", // VehicleType::SteamTrainCoveredCars diff --git a/src/openrct2/rct12/RCT12.h b/src/openrct2/rct12/RCT12.h index 98d169f7f4..347cb4f764 100644 --- a/src/openrct2/rct12/RCT12.h +++ b/src/openrct2/rct12/RCT12.h @@ -14,9 +14,11 @@ #include "../management/Research.h" #include "../object/Object.h" #include "../ride/RideTypes.h" +#include "../util/Util.h" #include "../world/tile_element/TileElementType.h" #include "Limits.h" +#include #include #include #include diff --git a/src/openrct2/rct12/ScenarioPatcher.cpp b/src/openrct2/rct12/ScenarioPatcher.cpp index 0f05fdcc6c..bb334a3072 100644 --- a/src/openrct2/rct12/ScenarioPatcher.cpp +++ b/src/openrct2/rct12/ScenarioPatcher.cpp @@ -12,6 +12,8 @@ #include "../Context.h" #include "../Game.h" #include "../PlatformEnvironment.h" +#include "../actions/FootpathPlaceAction.h" +#include "../actions/GameActionResult.h" #include "../core/File.h" #include "../core/Guard.hpp" #include "../core/Json.hpp" @@ -27,15 +29,17 @@ #include "../world/Location.hpp" #include "../world/Map.h" #include "../world/tile_element/EntranceElement.h" +#include "../world/tile_element/PathElement.h" +#include "../world/tile_element/Slope.h" #include "../world/tile_element/SurfaceElement.h" #include "../world/tile_element/TileElement.h" #include "../world/tile_element/TileElementType.h" #include "../world/tile_element/TrackElement.h" #ifdef DISABLE_NETWORK -# include + #include #else -# include "../core/Crypt.h" + #include "../core/Crypt.h" #endif #include @@ -74,6 +78,13 @@ static const std::string _ridesKey = "rides"; static const std::string _rideIdKey = "id"; static const std::string _operationKey = "operation"; +// Path fix keys +static const std::string _pathsKey = "paths"; +static const std::string _railingsKey = "railings"; +static const std::string _surfaceKey = "surface"; +static const std::string _directionKey = "slope_direction"; +static const std::string _isQueue = "queue"; + static u8string ToOwnershipJsonKey(int ownershipType) { switch (ownershipType) @@ -93,7 +104,33 @@ static u8string ToOwnershipJsonKey(int ownershipType) return {}; } -static std::vector getCoordinates(const json_t& parameters) +static void readCoordinate(std::vector& out, const json_t& coordinatesArray) +{ + if (coordinatesArray.size() != 2) + { + OpenRCT2::Guard::Assert(0, "Fix coordinates sub array should have 2 elements"); + return; + } + + out.emplace_back( + OpenRCT2::Json::GetNumber(coordinatesArray[0]), OpenRCT2::Json::GetNumber(coordinatesArray[1])); +} + +static void readCoordinate(std::vector& out, const json_t& coordinatesArray) +{ + if (coordinatesArray.size() != 3) + { + OpenRCT2::Guard::Assert(0, "Fix coordinates sub array should have 3 elements"); + return; + } + + out.emplace_back( + OpenRCT2::Json::GetNumber(coordinatesArray[0]), OpenRCT2::Json::GetNumber(coordinatesArray[1]), + OpenRCT2::Json::GetNumber(coordinatesArray[2])); +} + +template +static std::vector getCoordinates(const json_t& parameters) { if (!parameters.contains(_coordinatesKey)) { @@ -113,7 +150,7 @@ static std::vector getCoordinates(const json_t& parameters) return {}; } - std::vector parsedCoordinates; + std::vector parsedCoordinates; parsedCoordinates.reserve(coords.size()); for (size_t i = 0; i < coords.size(); ++i) { @@ -123,18 +160,52 @@ static std::vector getCoordinates(const json_t& parameters) return {}; } - auto coordinatesPair = OpenRCT2::Json::AsArray(coords[i]); - if (coordinatesPair.size() != 2) - { - OpenRCT2::Guard::Assert(0, "Fix coordinates sub array should have 2 elements"); - return {}; - } - parsedCoordinates.emplace_back( - OpenRCT2::Json::GetNumber(coordinatesPair[0]), OpenRCT2::Json::GetNumber(coordinatesPair[1])); + auto coordinatesArray = OpenRCT2::Json::AsArray(coords[i]); + readCoordinate(parsedCoordinates, coordinatesArray); } return parsedCoordinates; } +static Direction GetDirection(const json_t& parameters) +{ + if (!parameters.contains(_directionKey)) + { + return INVALID_DIRECTION; + } + else if (!parameters[_directionKey].is_number()) + { + OpenRCT2::Guard::Assert(0, "Fix direction must be a number"); + return INVALID_DIRECTION; + } + + Direction direction = OpenRCT2::Json::GetNumber(parameters[_directionKey]); + + if (direction > 3) + { + OpenRCT2::Guard::Assert(0, "Direction must be between 0 and 3"); + return INVALID_DIRECTION; + } + + return direction; +} + +static bool IsQueue(const json_t& parameters) +{ + if (!parameters.contains(_isQueue)) + { + return false; + } + else if (!parameters[_isQueue].is_boolean()) + { + OpenRCT2::Guard::Assert(0, "queue must be a boolean"); + return false; + } + else + { + return OpenRCT2::Json::GetBoolean(parameters[_isQueue]); + } +} + static void ApplyLandOwnershipFixes(const json_t& landOwnershipFixes, int ownershipType) { auto ownershipTypeKey = ToOwnershipJsonKey(ownershipType); @@ -517,6 +588,84 @@ static void ApplyRideFixes(const json_t& scenarioPatch) } } +static void ApplyPathFixes(const json_t& scenarioPatch) +{ + if (!scenarioPatch.contains(_pathsKey)) + { + return; + } + + if (!scenarioPatch[_pathsKey].is_array()) + { + OpenRCT2::Guard::Assert(0, "Path fixes should be an array of arrays"); + return; + } + + auto pathFixes = OpenRCT2::Json::AsArray(scenarioPatch[_pathsKey]); + if (pathFixes.empty()) + { + OpenRCT2::Guard::Assert(0, "Path fixes should not be an empty array"); + return; + } + + for (size_t i = 0; i < pathFixes.size(); ++i) + { + auto pathFix = pathFixes[i]; + + if (!pathFix.contains(_railingsKey)) + { + OpenRCT2::Guard::Assert(0, "Path fixes should have railings"); + return; + } + + if (!pathFix.contains(_surfaceKey)) + { + OpenRCT2::Guard::Assert(0, "Path fixes should have a surface"); + return; + } + + auto railings = OpenRCT2::Json::GetString(pathFix[_railingsKey]); + auto surface = OpenRCT2::Json::GetString(pathFix[_surfaceKey]); + + if (_dryRun) + { + continue; + } + + auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); + auto railingsObjIndex = objectManager.GetLoadedObjectEntryIndex(railings); + auto surfaceObjIndex = objectManager.GetLoadedObjectEntryIndex(surface); + + if (railingsObjIndex == OBJECT_ENTRY_INDEX_NULL) + { + OpenRCT2::Guard::Assert(0, "Railings object not found"); + return; + } + + if (surfaceObjIndex == OBJECT_ENTRY_INDEX_NULL) + { + OpenRCT2::Guard::Assert(0, "Surface object not found"); + return; + } + + auto coordinates = getCoordinates(pathFix); + Direction direction = GetDirection(pathFix); + PathConstructFlags constructionFlags = IsQueue(pathFix) ? OpenRCT2::PathConstructFlag::IsQueue : 0; + + for (auto coordinate : coordinates) + { + auto slope = direction != INVALID_DIRECTION ? direction + 4 : 0; + auto footpathPlaceAction = FootpathPlaceAction( + coordinate.ToCoordsXYZ(), slope, surfaceObjIndex, railingsObjIndex, direction, constructionFlags); + auto result = footpathPlaceAction.Execute(); + if (result.Error != OpenRCT2::GameActions::Status::Ok) + { + OpenRCT2::Guard::Assert(0, "Could not patch path"); + } + } + } +} + static u8string getScenarioSHA256(u8string_view scenarioPath) { auto env = OpenRCT2::GetContext()->GetPlatformEnvironment(); @@ -581,6 +730,7 @@ void OpenRCT2::RCT12::ApplyScenarioPatch(u8string_view scenarioPatchFile, u8stri ApplySurfaceFixes(scenarioPatch); RemoveTileElements(scenarioPatch); ApplyRideFixes(scenarioPatch); + ApplyPathFixes(scenarioPatch); } void OpenRCT2::RCT12::FetchAndApplyScenarioPatch(u8string_view scenarioPath) diff --git a/src/openrct2/rct2/S6Importer.cpp b/src/openrct2/rct2/S6Importer.cpp index 72ad05dd03..86642a1968 100644 --- a/src/openrct2/rct2/S6Importer.cpp +++ b/src/openrct2/rct2/S6Importer.cpp @@ -1382,7 +1382,7 @@ namespace OpenRCT2::RCT2 // This has to be done last, since the maze entry shares fields with the colour and sequence fields. const auto& rtd = GetRideTypeDescriptor(rideType); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { dst2->SetMazeEntry(src2->GetMazeEntry()); } diff --git a/src/openrct2/rct2/T6Exporter.cpp b/src/openrct2/rct2/T6Exporter.cpp index 25bcce1aef..c68106bbd3 100644 --- a/src/openrct2/rct2/T6Exporter.cpp +++ b/src/openrct2/rct2/T6Exporter.cpp @@ -51,6 +51,7 @@ namespace OpenRCT2::RCT2 bool T6Exporter::SaveTrack(OpenRCT2::IStream* stream) { + auto& rtd = GetRideTypeDescriptor(_trackDesign.trackAndVehicle.rtdIndex); auto td6rideType = OpenRCT2RideTypeToRCT2RideType(_trackDesign.trackAndVehicle.rtdIndex); OpenRCT2::MemoryStream tempStream; tempStream.WriteValue(td6rideType); @@ -81,7 +82,7 @@ namespace OpenRCT2::RCT2 tempStream.WriteValue(_trackDesign.statistics.maxNegativeVerticalG / kTD46GForcesMultiplier); tempStream.WriteValue(_trackDesign.statistics.maxLateralG / kTD46GForcesMultiplier); - if (td6rideType == RIDE_TYPE_MINI_GOLF) + if (rtd.specialType == RtdSpecialType::miniGolf) tempStream.WriteValue(_trackDesign.statistics.holes & kRCT12InversionAndHoleMask); else tempStream.WriteValue(_trackDesign.statistics.inversions & kRCT12InversionAndHoleMask); @@ -114,8 +115,7 @@ namespace OpenRCT2::RCT2 } tempStream.WriteValue(_trackDesign.operation.liftHillSpeed | (_trackDesign.operation.numCircuits << 5)); - const auto& rtd = GetRideTypeDescriptor(_trackDesign.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { for (const auto& mazeElement : _trackDesign.mazeElements) { diff --git a/src/openrct2/rct2/T6Importer.cpp b/src/openrct2/rct2/T6Importer.cpp index 5bc7ffa78e..605a3e3941 100644 --- a/src/openrct2/rct2/T6Importer.cpp +++ b/src/openrct2/rct2/T6Importer.cpp @@ -132,7 +132,7 @@ namespace OpenRCT2::RCT2 td->operation.operationSetting, GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex).OperatingSettings.MaxValue); const auto& rtd = GetRideTypeDescriptor(td->trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { TD46MazeElement t6MazeElement{}; t6MazeElement.All = !0; diff --git a/src/openrct2/ride/CarEntry.cpp b/src/openrct2/ride/CarEntry.cpp index 460c385491..0a23c5ce10 100644 --- a/src/openrct2/ride/CarEntry.cpp +++ b/src/openrct2/ride/CarEntry.cpp @@ -46,28 +46,34 @@ uint32_t CarEntry::SpriteOffset(SpriteGroupType spriteGroup, int32_t imageDirect */ void CarEntrySetImageMaxSizes(CarEntry& carEntry, int32_t numImages) { - uint8_t bitmap[200][200] = { 0 }; + constexpr uint8_t kWidth = 200; + constexpr uint8_t kHeight = 200; + constexpr uint8_t kCentreX = kWidth / 2; + constexpr uint8_t kCentreY = kHeight / 2; + + uint8_t bitmap[kHeight][kWidth] = { 0 }; DrawPixelInfo dpi = { - /*.bits = */ reinterpret_cast(bitmap), - /*.x = */ -100, - /*.y = */ -100, - /*.width = */ 200, - /*.height = */ 200, - /*.pitch = */ 0, - /*.zoom_level = */ ZoomLevel{ 0 }, + .bits = reinterpret_cast(bitmap), + .x = -(kWidth / 2), + .y = -(kHeight / 2), + .width = kWidth, + .height = kHeight, + .pitch = 0, + .zoom_level = ZoomLevel{ 0 }, }; for (int32_t i = 0; i < numImages; ++i) { GfxDrawSpriteSoftware(dpi, ImageId(carEntry.base_image_id + i), { 0, 0 }); } + int32_t spriteWidth = -1; - for (int32_t i = 99; i != 0; --i) + for (int32_t i = kCentreX - 1; i != 0; --i) { - for (int32_t j = 0; j < 200; j++) + for (int32_t j = 0; j < kWidth; j++) { - if (bitmap[j][100 - i] != 0) + if (bitmap[j][kCentreX - i] != 0) { spriteWidth = i; break; @@ -77,9 +83,9 @@ void CarEntrySetImageMaxSizes(CarEntry& carEntry, int32_t numImages) if (spriteWidth != -1) break; - for (int32_t j = 0; j < 200; j++) + for (int32_t j = 0; j < kWidth; j++) { - if (bitmap[j][100 + i] != 0) + if (bitmap[j][kCentreX + i] != 0) { spriteWidth = i; break; @@ -89,15 +95,14 @@ void CarEntrySetImageMaxSizes(CarEntry& carEntry, int32_t numImages) if (spriteWidth != -1) break; } - spriteWidth++; - int32_t spriteHeightNegative = -1; - for (int32_t i = 99; i != 0; --i) + int32_t spriteHeightNegative = -1; + for (int32_t i = kCentreY - 1; i != 0; --i) { - for (int32_t j = 0; j < 200; j++) + for (int32_t j = 0; j < kWidth; j++) { - if (bitmap[100 - i][j] != 0) + if (bitmap[kCentreY - i][j] != 0) { spriteHeightNegative = i; break; @@ -110,12 +115,11 @@ void CarEntrySetImageMaxSizes(CarEntry& carEntry, int32_t numImages) spriteHeightNegative++; int32_t spriteHeightPositive = -1; - - for (int32_t i = 99; i != 0; --i) + for (int32_t i = kCentreY - 1; i != 0; --i) { - for (int32_t j = 0; j < 200; j++) + for (int32_t j = 0; j < kWidth; j++) { - if (bitmap[100 + i][j] != 0) + if (bitmap[kCentreY + i][j] != 0) { spriteHeightPositive = i; break; diff --git a/src/openrct2/ride/Ride.cpp b/src/openrct2/ride/Ride.cpp index 9262504fb2..e8755a0230 100644 --- a/src/openrct2/ride/Ride.cpp +++ b/src/openrct2/ride/Ride.cpp @@ -25,7 +25,6 @@ #include "../audio/audio.h" #include "../config/Config.h" #include "../core/BitSet.hpp" -#include "../core/FixedVector.h" #include "../core/Guard.hpp" #include "../core/Numerics.hpp" #include "../entity/EntityRegistry.h" @@ -84,6 +83,7 @@ #include #include #include +#include using namespace OpenRCT2; using namespace OpenRCT2::TrackMetaData; @@ -298,11 +298,11 @@ size_t Ride::GetNumPrices() const { size_t result = 0; const auto& rtd = GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isCashMachine) || rtd.HasFlag(RtdFlag::isFirstAid)) + if (rtd.specialType == RtdSpecialType::cashMachine || rtd.specialType == RtdSpecialType::firstAid) { result = 0; } - else if (rtd.HasFlag(RtdFlag::isToilet)) + else if (rtd.specialType == RtdSpecialType::toilet) { result = 1; } @@ -795,7 +795,7 @@ bool Ride::FindTrackGap(const CoordsXYE& input, CoordsXYE* output) const return false; const auto& rtd = GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return false; WindowBase* w = WindowFindByClass(WindowClass::RideConstruction); @@ -1108,7 +1108,7 @@ void Ride::Update() // Update stations const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) for (StationIndex::UnderlyingType i = 0; i < OpenRCT2::Limits::kMaxStationsPerRide; i++) RideUpdateStation(*this, StationIndex::FromUnderlying(i)); @@ -1453,7 +1453,7 @@ static void RideBreakdownUpdate(Ride& ride) // continues. if ((ride.reliability == 0 || static_cast(ScenarioRand() & 0x2FFFFF) <= 1u + kRideInitialReliability - ride.reliability) - && !gameState.Cheats.DisableAllBreakdowns) + && !gameState.Cheats.disableAllBreakdowns) { int32_t breakdownReason = RideGetNewBreakdownProblem(ride); if (breakdownReason != -1) @@ -1511,7 +1511,7 @@ static int32_t RideGetNewBreakdownProblem(const Ride& ride) return -1; // If brakes failure is disabled, also take it out of the equation (see above comment why) - if (GetGameState().Cheats.DisableBrakesFailure) + if (GetGameState().Cheats.disableBrakesFailure) return -1; auto monthsOld = ride.GetAge(); @@ -2630,7 +2630,7 @@ static StationIndexWithMessage RideModeCheckStationPresent(const Ride& ride) if (!rtd.HasFlag(RtdFlag::hasTrack)) return { StationIndex::GetNull(), STR_NOT_YET_CONSTRUCTED }; - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return { StationIndex::GetNull(), STR_NOT_YET_CONSTRUCTED }; return { StationIndex::GetNull(), STR_REQUIRES_A_STATION_PLATFORM }; @@ -2793,7 +2793,7 @@ static bool RideCheckTrackContainsInversions(const CoordsXYE& input, CoordsXYE* if (ride != nullptr) { const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return true; } @@ -2854,7 +2854,7 @@ static bool RideCheckTrackContainsBanked(const CoordsXYE& input, CoordsXYE* outp return false; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) return true; WindowBase* w = WindowFindByClass(WindowClass::RideConstruction); @@ -3189,7 +3189,7 @@ static void RideSetStartFinishPoints(RideId rideIndex, const CoordsXYE& startEle return; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) RideSetMazeEntranceExitPoints(*ride); else if (ride->type == RIDE_TYPE_BOAT_HIRE) RideSetBoatHireReturnPoint(*ride, startElement); @@ -3974,7 +3974,7 @@ void Ride::ConstructMissingEntranceOrExit() const } const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { auto location = incompleteStation->GetStart(); WindowScrollToLocation(*w, location); @@ -4939,6 +4939,7 @@ OpenRCT2::BitSet RideEntryGetSupportedTrackPieces( { SpriteGroupType::SlopeFlat, SpritePrecision::Sprites8 }, // TrackGroup::diagBrakes { SpriteGroupType::SlopeFlat, SpritePrecision::Sprites8 }, // TrackGroup::diagBlockBrakes { SpriteGroupType::Slopes25, SpritePrecision::Sprites4 }, // TrackGroup::inclinedBrakes + { SpriteGroupType::SlopeFlat, SpritePrecision::Sprites8 }, // TrackGroup::diagBooster }; static_assert(std::size(trackPieceRequiredSprites) == EnumValue(TrackGroup::count)); @@ -5107,7 +5108,7 @@ void Ride::UpdateMaxVehicles() } int32_t newCarsPerTrain = std::max(proposed_num_cars_per_train, rideEntry->min_cars_in_train); maxCarsPerTrain = std::max(maxCarsPerTrain, static_cast(rideEntry->min_cars_in_train)); - if (!GetGameState().Cheats.DisableTrainLengthLimit) + if (!GetGameState().Cheats.disableTrainLengthLimit) { newCarsPerTrain = std::min(maxCarsPerTrain, newCarsPerTrain); } @@ -5196,7 +5197,7 @@ void Ride::UpdateMaxVehicles() maxNumTrains = rideEntry->cars_per_flat_ride; } - if (GetGameState().Cheats.DisableTrainLengthLimit) + if (GetGameState().Cheats.disableTrainLengthLimit) { maxNumTrains = OpenRCT2::Limits::kMaxTrainsPerRide; } @@ -5531,7 +5532,7 @@ int32_t RideGetEntryIndex(int32_t rideType, int32_t rideSubType) } // Can happen in select-by-track-type mode - if (!RideEntryIsInvented(rideEntryIndex) && !GetGameState().Cheats.IgnoreResearchStatus) + if (!RideEntryIsInvented(rideEntryIndex) && !GetGameState().Cheats.ignoreResearchStatus) { continue; } @@ -5760,7 +5761,7 @@ void Ride::FormatNameTo(Formatter& ft) const uint64_t Ride::GetAvailableModes() const { - if (GetGameState().Cheats.ShowAllOperatingModes) + if (GetGameState().Cheats.showAllOperatingModes) return AllRideModesAvailable; return GetRideTypeDescriptor().RideModes; @@ -5906,7 +5907,7 @@ ResultWithMessage Ride::ChangeStatusGetStartElement(StationIndex stationIndex, C { // Maze is strange, station start is 0... investigation required const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) return { false }; } @@ -5942,7 +5943,7 @@ ResultWithMessage Ride::ChangeStatusCheckTrackValidity(const CoordsXYE& trackEle } } - if (subtype != OBJECT_ENTRY_INDEX_NULL && !GetGameState().Cheats.EnableAllDrawableTrackPieces) + if (subtype != OBJECT_ENTRY_INDEX_NULL && !GetGameState().Cheats.enableAllDrawableTrackPieces) { const auto* rideEntry = GetRideEntryByIndex(subtype); if (rideEntry->flags & RIDE_ENTRY_FLAG_NO_INVERSIONS) diff --git a/src/openrct2/ride/Ride.h b/src/openrct2/ride/Ride.h index 882807edbb..3ed9704c67 100644 --- a/src/openrct2/ride/Ride.h +++ b/src/openrct2/ride/Ride.h @@ -620,6 +620,7 @@ enum RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER, RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER, RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER, + RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER, RIDE_TYPE_COUNT }; diff --git a/src/openrct2/ride/RideConstruction.cpp b/src/openrct2/ride/RideConstruction.cpp index d310e5c3f1..3f79d2bd15 100644 --- a/src/openrct2/ride/RideConstruction.cpp +++ b/src/openrct2/ride/RideConstruction.cpp @@ -18,7 +18,6 @@ #include "../actions/RideSetStatusAction.h" #include "../actions/RideSetVehicleAction.h" #include "../actions/TrackRemoveAction.h" -#include "../core/FixedVector.h" #include "../entity/EntityList.h" #include "../entity/EntityRegistry.h" #include "../entity/Staff.h" @@ -50,6 +49,7 @@ #include "Vehicle.h" #include +#include using namespace OpenRCT2; using namespace OpenRCT2::TrackMetaData; @@ -636,7 +636,7 @@ void RideConstructionSetDefaultNextPiece() _previousTrackPitchEnd = slope; _currentTrackHasLiftHill = tileElement->AsTrack()->HasChain() && ((slope != TrackPitch::Down25 && slope != TrackPitch::Down60) - || GetGameState().Cheats.EnableChainLiftOnAllTrack); + || GetGameState().Cheats.enableChainLiftOnAllTrack); break; } case RideConstructionState::Back: @@ -682,7 +682,7 @@ void RideConstructionSetDefaultNextPiece() // Set track slope and lift hill _currentTrackPitchEnd = slope; _previousTrackPitchEnd = slope; - if (!GetGameState().Cheats.EnableChainLiftOnAllTrack) + if (!GetGameState().Cheats.enableChainLiftOnAllTrack) { _currentTrackHasLiftHill = tileElement->AsTrack()->HasChain(); } @@ -960,7 +960,7 @@ bool RideModify(const CoordsXYE& input) ride_create_or_find_construction_window(rideIndex); const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { return ride_modify_maze(tileElement); } @@ -1147,7 +1147,7 @@ money64 SetOperatingSettingNested(RideId rideId, RideSetSetting setting, uint8_t void Ride::ValidateStations() { const auto& rtd = GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) { // find the stations of the ride to begin stepping over track elements from for (const auto& station : stations) @@ -1255,7 +1255,7 @@ void Ride::ValidateStations() } } // determine what entrances and exits exist - FixedVector locations; + sfl::static_vector locations; for (auto& station : stations) { if (!station.Entrance.IsNull()) diff --git a/src/openrct2/ride/RideData.cpp b/src/openrct2/ride/RideData.cpp index e503a233b4..bbba6640a4 100644 --- a/src/openrct2/ride/RideData.cpp +++ b/src/openrct2/ride/RideData.cpp @@ -36,6 +36,7 @@ #include "rtd/coaster/ClassicMiniRollerCoaster.h" #include "rtd/coaster/ClassicStandUpRollerCoaster.h" #include "rtd/coaster/ClassicWoodenRollerCoaster.h" +#include "rtd/coaster/ClassicWoodenTwisterRollerCoaster.h" #include "rtd/coaster/CompactInvertedCoaster.h" #include "rtd/coaster/CorkscrewRollerCoaster.h" #include "rtd/coaster/FlyingRollerCoaster.h" @@ -354,6 +355,7 @@ constexpr RideTypeDescriptor RideTypeDescriptors[RIDE_TYPE_COUNT] = { /* RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER */ ClassicWoodenRollerCoasterRTD, /* RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER */ ClassicStandUpRollerCoasterRTD, /* RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER */ LSMLaunchedRollerCoasterRTD, + /* RIDE_TYPE_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER */ ClassicWoodenTwisterRollerCoasterRTD, }; bool RideTypeDescriptor::HasFlag(RtdFlag flag) const @@ -406,7 +408,7 @@ void UpdateEnabledRideGroups(TrackDrawerDescriptor trackDrawerDescriptor) { trackDrawerDescriptor.Regular.GetAvailableTrackGroups(_enabledRideGroups); - if (!GetGameState().Cheats.EnableAllDrawableTrackPieces) + if (!GetGameState().Cheats.enableAllDrawableTrackPieces) { _enabledRideGroups &= ~_disabledRideGroups; } @@ -420,14 +422,14 @@ void UpdateDisabledRideGroups(const RideTrackGroups& res) void TrackDrawerEntry::GetAvailableTrackGroups(RideTrackGroups& res) const { res = enabledTrackGroups; - if (GetGameState().Cheats.EnableAllDrawableTrackPieces) + if (GetGameState().Cheats.enableAllDrawableTrackPieces) res |= extraTrackGroups; } bool TrackDrawerEntry::SupportsTrackGroup(const TrackGroup trackGroup) const { return enabledTrackGroups.get(EnumValue(trackGroup)) - || (GetGameState().Cheats.EnableAllDrawableTrackPieces && extraTrackGroups.get(EnumValue(trackGroup))); + || (GetGameState().Cheats.enableAllDrawableTrackPieces && extraTrackGroups.get(EnumValue(trackGroup))); } bool TrackDrawerDescriptor::HasCoveredPieces() const diff --git a/src/openrct2/ride/RideData.h b/src/openrct2/ride/RideData.h index f82759026c..ba133232ba 100644 --- a/src/openrct2/ride/RideData.h +++ b/src/openrct2/ride/RideData.h @@ -328,114 +328,126 @@ struct TrackDrawerDescriptor enum class RtdFlag : uint8_t { - hasTrackColourMain = 0, - hasTrackColourAdditional = 1, - hasTrackColourSupports = 2, + hasTrackColourMain, + hasTrackColourAdditional, + hasTrackColourSupports, // Set by flat rides, tower rides and shops/stalls. - hasSinglePieceStation = 3, + hasSinglePieceStation, - hasLeaveWhenAnotherVehicleArrivesAtStation = 4, - canSynchroniseWithAdjacentStations = 5, + hasLeaveWhenAnotherVehicleArrivesAtStation, + canSynchroniseWithAdjacentStations, // Used only by boat Hire and submarine ride - trackMustBeOnWater = 6, + trackMustBeOnWater, - hasGForces = 7, + hasGForces, // Used by rides that can't have gaps, like those with a vertical tower, // such as the observation tower. - cannotHaveGaps = 8, + cannotHaveGaps, - hasDataLogging = 9, - hasDrops = 10, + hasDataLogging, + hasDrops, + + noTestMode, - noTestMode = 11, // Set on rides with two varieties, like the u and o shapes of the dinghy slide // and the dry and submerged track of the water coaster. - - hasCoveredPieces = 12, + hasCoveredPieces, // Used only by maze, spiral slide and shops - noVehicles = 13, + noVehicles, - hasLoadOptions = 14, - hasLsmBehaviourOnFlat = 15, + hasLoadOptions, + hasLsmBehaviourOnFlat, // Set by flat rides where the vehicle is integral to the structure, like // Merry-go-round and swinging ships. (Contrast with rides like dodgems.) - vehicleIsIntegral = 16, + vehicleIsIntegral, - isShopOrFacility = 17, + isShopOrFacility, // If set, wall scenery can not share a tile with the ride's track - noWallsAroundTrack = 18, + noWallsAroundTrack, - isFlatRide = 19, + isFlatRide, // Whether or not guests will go on the ride again if they liked it // (this is usually applied to everything apart from transport rides). - guestsWillRideAgain = 20, + guestsWillRideAgain, // Used by Toilets and First Aid to mark that guest should go // inside the building (rather than 'buying' at the counter) - guestsShouldGoInsideFacility = 21, + guestsShouldGoInsideFacility, // Guests are "IN" (ride) rather than "ON" (ride) - describeAsInside = 22, + describeAsInside, - sellsFood = 23, - sellsDrinks = 24, - isToilet = 25, + sellsFood, + sellsDrinks, // Whether or not vehicle colours can be set - hasVehicleColours = 26, + hasVehicleColours, - checkForStalling = 27, - hasTrack = 28, + checkForStalling, + hasTrack, // Only set by lift - allowExtraTowerBases = 29, + allowExtraTowerBases, // Only set by reverser coaster - layeredVehiclePreview = 30, + layeredVehiclePreview, - supportsMultipleColourSchemes = 31, - allowDoorsOnTrack = 32, - hasMusicByDefault = 33, - allowMusic = 34, + supportsMultipleColourSchemes, + allowDoorsOnTrack, + hasMusicByDefault, + allowMusic, // Used by the Flying RC, Lay-down RC, Multi-dimension RC - hasInvertedVariant = 35, + hasInvertedVariant, - checkGForces = 36, - hasEntranceAndExit = 37, - allowMoreVehiclesThanStationFits = 38, - hasAirTime = 39, - singleSession = 40, - allowMultipleCircuits = 41, - allowCableLiftHill = 42, - showInTrackDesigner = 43, - isTransportRide = 44, - interestingToLookAt = 45, - slightlyInterestingToLookAt = 46, + checkGForces, + hasEntranceAndExit, + allowMoreVehiclesThanStationFits, + hasAirTime, + singleSession, + allowMultipleCircuits, + allowCableLiftHill, + showInTrackDesigner, + isTransportRide, + interestingToLookAt, + slightlyInterestingToLookAt, // This is only set on the Flying RC and its alternative type. - startConstructionInverted = 47, + startConstructionInverted, - listVehiclesSeparately = 48, - supportsLevelCrossings = 49, - isSuspended = 50, - hasLandscapeDoors = 51, - upInclineRequiresLift = 52, - guestsCanUseUmbrella = 53, - isCashMachine = 54, - hasOneStation = 55, - hasSeatRotation = 56, - isFirstAid = 57, - isMaze = 58, - isSpiralSlide = 59, - allowReversedTrains = 60, + listVehiclesSeparately, + supportsLevelCrossings, + isSuspended, + hasLandscapeDoors, + upInclineRequiresLift, + guestsCanUseUmbrella, + hasOneStation, + hasSeatRotation, + allowReversedTrains, +}; + +/** + * Some rides are so different from others that they need some special code. + * This replaces direct ride type checks. + * + * Note: only add to this list if behaviour cannot sufficiently be altered using flags. + */ +enum class RtdSpecialType +{ + none, + maze, + miniGolf, + spiralSlide, + toilet, + cashMachine, + firstAid, }; // Set on ride types that have a main colour, additional colour and support colour. @@ -468,7 +480,6 @@ struct RideTypeDescriptor RideLegacyBoosterSettings LegacyBoosterSettings{}; RideNaming Naming{}; RideNameConvention NameConvention{}; - const char* EnumName{}; uint8_t AvailableBreakdowns{}; /** rct2: 0x0097D218 */ RideHeights Heights{}; @@ -518,6 +529,7 @@ struct RideTypeDescriptor MusicTrackOffsetLengthFunc MusicTrackOffsetLength = OpenRCT2::RideAudio::RideMusicGetTrackOffsetLength_Default; UpdateRideApproachVehicleWaypointsFunction UpdateRideApproachVehicleWaypoints = UpdateRideApproachVehicleWaypointsDefault; + RtdSpecialType specialType = RtdSpecialType::none; bool HasFlag(RtdFlag flag) const; /** @deprecated */ @@ -601,7 +613,6 @@ constexpr RideTypeDescriptor DummyRTD = .LegacyBoosterSettings = {}, .Naming = { STR_UNKNOWN_RIDE, STR_RIDE_DESCRIPTION_UNKNOWN }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "(INVALID)", .AvailableBreakdowns = 0, .Heights = { 12, 64, 0, 0, }, .MaxMass = 255, diff --git a/src/openrct2/ride/RideRatings.cpp b/src/openrct2/ride/RideRatings.cpp index 2a0a4e2540..40105e0cee 100644 --- a/src/openrct2/ride/RideRatings.cpp +++ b/src/openrct2/ride/RideRatings.cpp @@ -526,7 +526,7 @@ static void ride_ratings_begin_proximity_loop(RideRatingUpdateState& state) } const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { state.State = RIDE_RATINGS_STATE_CALCULATE; return; @@ -1141,7 +1141,7 @@ static void RideRatingsCalculateValue(Ride& ride) + (((ride.ratings.nausea * ratingsMultipliers.nausea) * 32) >> 15); int32_t monthsOld = 0; - if (!GetGameState().Cheats.DisableRideValueAging) + if (!GetGameState().Cheats.disableRideValueAging) { monthsOld = ride.GetAge(); } @@ -1632,7 +1632,7 @@ static RatingTuple ride_ratings_get_turns_ratings(const Ride& ride) intensity += slopedTurnsRating.intensity; nausea += slopedTurnsRating.nausea; - auto inversions = (ride.type == RIDE_TYPE_MINI_GOLF) ? ride.holes : ride.inversions; + auto inversions = ride.GetRideTypeDescriptor().specialType == RtdSpecialType::miniGolf ? ride.holes : ride.inversions; RatingTuple inversionsRating = get_inversions_ratings(inversions); excitement += inversionsRating.excitement; intensity += inversionsRating.intensity; @@ -1769,7 +1769,7 @@ static int32_t ride_ratings_get_scenery_score(const Ride& ride) } const auto& rtd = ride.GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { location = ride.GetStation().Entrance.ToCoordsXY(); } diff --git a/src/openrct2/ride/RideStringIds.h b/src/openrct2/ride/RideStringIds.h index 928ab36163..ab02567a71 100644 --- a/src/openrct2/ride/RideStringIds.h +++ b/src/openrct2/ride/RideStringIds.h @@ -23,6 +23,7 @@ enum : StringId STR_RIDE_NAME_CLASSIC_MINI_ROLLER_COASTER = 6111, STR_RIDE_NAME_CLASSIC_STAND_UP_ROLLER_COASTER = 97, STR_RIDE_NAME_CLASSIC_WOODEN_ROLLER_COASTER = 96, + STR_RIDE_NAME_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER = 99, STR_RIDE_NAME_COMPACT_INVERTED_COASTER = 75, STR_RIDE_NAME_CORKSCREW_ROLLER_COASTER = 21, STR_RIDE_NAME_FLYING_ROLLER_COASTER = 59, @@ -66,6 +67,7 @@ enum : StringId STR_RIDE_DESCRIPTION_CLASSIC_MINI_COASTER = 6119, STR_RIDE_DESCRIPTION_CLASSIC_STAND_UP_ROLLER_COASTER = 607, STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_ROLLER_COASTER = 606, + STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER = 609, STR_RIDE_DESCRIPTION_COMPACT_INVERTED_COASTER = 585, STR_RIDE_DESCRIPTION_CORKSCREW_ROLLER_COASTER = 531, STR_RIDE_DESCRIPTION_FLYING_ROLLER_COASTER = 569, diff --git a/src/openrct2/ride/Track.cpp b/src/openrct2/ride/Track.cpp index 78fd353d65..0c080fef7d 100644 --- a/src/openrct2/ride/Track.cpp +++ b/src/openrct2/ride/Track.cpp @@ -599,7 +599,14 @@ bool TrackTypeIsBlockBrakes(OpenRCT2::TrackElemType trackType) bool TrackTypeIsBooster(OpenRCT2::TrackElemType trackType) { - return trackType == TrackElemType::Booster; + switch (trackType) + { + case TrackElemType::Booster: + case TrackElemType::DiagBooster: + return true; + default: + return false; + } } bool TrackElementIsCovered(OpenRCT2::TrackElemType trackElementType) diff --git a/src/openrct2/ride/Track.h b/src/openrct2/ride/Track.h index 9a37c76438..bc7a1a0fcc 100644 --- a/src/openrct2/ride/Track.h +++ b/src/openrct2/ride/Track.h @@ -146,6 +146,7 @@ enum class TrackGroup : uint8_t diagBrakes, diagBlockBrakes, inclinedBrakes, + diagBooster, count, }; @@ -600,8 +601,9 @@ namespace OpenRCT2 DiagBrakes = 337, DiagBlockBrakes = 338, Down25Brakes = 339, + DiagBooster = 340, - Count = 340, + Count = 341, None = 65535, }; } diff --git a/src/openrct2/ride/TrackData.cpp b/src/openrct2/ride/TrackData.cpp index 8b7db7a82a..1396e5aead 100644 --- a/src/openrct2/ride/TrackData.cpp +++ b/src/openrct2/ride/TrackData.cpp @@ -368,7 +368,8 @@ namespace OpenRCT2::TrackMetaData { 4, 1, 0,-48, -32, 64 }, // TrackElemType::RightEighthBankToOrthogonalDown25 { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBrakes { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBlockBrakes - { 0, 0, 16, 0, 0, 0 } // TrackElemType::Down25Brakes + { 0, 0, 16, 0, 0, 0 }, // TrackElemType::Down25Brakes + { 4, 4, 0, 0, -32, 32 }, // TrackElemType::DiagBooster }; static_assert(std::size(_trackCoordinates) == EnumValue(TrackElemType::Count)); @@ -713,6 +714,7 @@ namespace OpenRCT2::TrackMetaData 45, // TrackElemType::DiagBrakes 45, // TrackElemType::DiagBlockBrakes 33, // TrackElemType::Down25Brakes + 45, // TrackElemType::DiagBooster }; static_assert(std::size(TrackPieceLengths) == EnumValue(TrackElemType::Count)); @@ -1058,6 +1060,7 @@ namespace OpenRCT2::TrackMetaData { TrackElemType::DiagBrakes, TrackElemType::DiagBrakes }, // TrackElemType::DiagBrakes { TrackCurve::None, TrackCurve::None }, // TrackElemType::DiagBlockBrakes { TrackElemType::Down25Brakes, TrackElemType::Down25Brakes }, // TrackElemType::Down25Brakes + { TrackElemType::DiagBooster, TrackElemType::DiagBooster }, // TrackElemType::DiagBooster }; static_assert(std::size(gTrackCurveChain) == EnumValue(TrackElemType::Count)); @@ -1592,6 +1595,7 @@ namespace OpenRCT2::TrackMetaData TrackElemType::None, // TrackElemType::DiagBrakes TrackElemType::None, // TrackElemType::DiagBlockBrakes TrackElemType::None, // TrackElemType::Down25Brakes + TrackElemType::None, // TrackElemType::DiagBooster }; static_assert(std::size(AlternativeTrackTypes) == EnumValue(TrackElemType::Count)); @@ -1937,6 +1941,7 @@ namespace OpenRCT2::TrackMetaData 123456, // TrackElemType::DiagBrakes 123456, // TrackElemType::DiagBlockBrakes 109824, // TrackElemType::Down25Brakes + 123456, // TrackElemType::DiagBooster }; static_assert(std::size(TrackPricing) == EnumValue(TrackElemType::Count)); @@ -2282,6 +2287,7 @@ namespace OpenRCT2::TrackMetaData TrackElemType::DiagBrakes, TrackElemType::DiagBlockBrakes, TrackElemType::Down25Brakes, + TrackElemType::DiagBooster, }; static_assert(std::size(TrackElementMirrorMap) == EnumValue(TrackElemType::Count)); @@ -2627,6 +2633,7 @@ namespace OpenRCT2::TrackMetaData (1 << 0), // TrackElemType::DiagBrakes (1 << 0), // TrackElemType::DiagBlockBrakes (1 << 0), // TrackElemType::Down25Brakes + (1 << 0), // TrackElemType::DiagBooster }; static_assert(std::size(TrackHeightMarkerPositions) == EnumValue(TrackElemType::Count)); @@ -2975,6 +2982,7 @@ namespace OpenRCT2::TrackMetaData /* TrackElemType::DiagBrakes */ 0, /* TrackElemType::DiagBlockBrakes */ 0, /* TrackElemType::Down25Brakes */ TRACK_ELEM_FLAG_DOWN | TRACK_ELEM_FLAG_STARTS_AT_HALF_HEIGHT, + /* TrackElemType::DiagBooster */ 0, }; static_assert(std::size(TrackFlags) == EnumValue(TrackElemType::Count)); // clang-format on @@ -3324,6 +3332,7 @@ namespace OpenRCT2::TrackMetaData { TrackGroup::diagBrakes, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagBrakes { TrackGroup::diagBlockBrakes, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagBlockBrakes { TrackGroup::inclinedBrakes, TrackPitch::Down25, TrackPitch::Down25, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::Down25Brakes + { TrackGroup::diagBooster, TrackPitch::None, TrackPitch::None, TrackRoll::None, TrackRoll::None, 0 }, // TrackElemType::DiagBooster }; static_assert(std::size(TrackDefinitions) == EnumValue(TrackElemType::Count)); @@ -3386,7 +3395,7 @@ namespace OpenRCT2::TrackMetaData SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, SpinFunction::R9, SpinFunction::L9, - SpinFunction::R9, SpinFunction::None, SpinFunction::None, SpinFunction::None + SpinFunction::R9, SpinFunction::None, SpinFunction::None, SpinFunction::None, SpinFunction::None }; static_assert(std::size(TrackTypeToSpinFunction) == EnumValue(TrackElemType::Count)); @@ -4681,6 +4690,7 @@ namespace OpenRCT2::TrackMetaData STR_BRAKES, // TrackElemType::DiagBrakes STR_BLOCK_BRAKES, // TrackElemType::DiagBlockBrakes STR_BRAKES, // TrackElemType::Down25Brakes + STR_BOOSTER, // TrackElemType::DiagBooster }; static_assert(std::size(RideConfigurationStringIds) == EnumValue(TrackElemType::Count)); @@ -12597,7 +12607,8 @@ namespace OpenRCT2::TrackMetaData /* TrackElemType::DiagBlockBrakes */ { 4, { kDiagBlockBrakesSeq0, kDiagBlockBrakesSeq1, kDiagBlockBrakesSeq2, kDiagBlockBrakesSeq3 } }, /* TrackElemType::InclinedBrakes */ - { 1, { kDown25Seq0 } } + { 1, { kDown25Seq0 } }, + /* TrackElemType::DiagBooster */ { 4, { kDiagFlatSeq0, kDiagFlatSeq1, kDiagFlatSeq2, kDiagFlatSeq3 } }, }; static constexpr auto BuildDescriptorTable() diff --git a/src/openrct2/ride/TrackDesign.cpp b/src/openrct2/ride/TrackDesign.cpp index 817a86ec89..ed61e08155 100644 --- a/src/openrct2/ride/TrackDesign.cpp +++ b/src/openrct2/ride/TrackDesign.cpp @@ -46,6 +46,7 @@ #include "../object/FootpathSurfaceObject.h" #include "../object/LargeSceneryEntry.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/ObjectRepository.h" @@ -727,7 +728,7 @@ static std::optional TrackDesignPlaceSceneryElementGetEntry(c { result.Type = obj->GetObjectType(); result.Index = objectMgr.GetLoadedObjectEntryIndex(obj); - if (!GetGameState().Cheats.IgnoreResearchStatus) + if (!GetGameState().Cheats.ignoreResearchStatus) { objectUnavailable = !ResearchIsInvented(result.Type, result.Index); } @@ -906,7 +907,7 @@ static void TrackDesignMirrorMaze(TrackDesign& td) void TrackDesignMirror(TrackDesign& td) { const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { TrackDesignMirrorMaze(td); } @@ -1767,7 +1768,7 @@ static GameActions::Result TrackDesignPlaceVirtual( GameActions::Result trackPlaceRes; const auto& rtd = GetRideTypeDescriptor(td.trackAndVehicle.rtdIndex); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) { trackPlaceRes = TrackDesignPlaceMaze(tds, td, coords, ride); } @@ -1950,7 +1951,7 @@ static bool TrackDesignPlacePreview( { gameStateData.setFlag(TrackDesignGameStateFlag::VehicleUnavailable, true); } - else if (!RideEntryIsInvented(entry_index) && !GetGameState().Cheats.IgnoreResearchStatus) + else if (!RideEntryIsInvented(entry_index) && !GetGameState().Cheats.ignoreResearchStatus) { gameStateData.setFlag(TrackDesignGameStateFlag::VehicleUnavailable, true); } diff --git a/src/openrct2/ride/TrackDesign.h b/src/openrct2/ride/TrackDesign.h index e51b4c4d57..a754801c61 100644 --- a/src/openrct2/ride/TrackDesign.h +++ b/src/openrct2/ride/TrackDesign.h @@ -14,6 +14,7 @@ #include "../object/Object.h" #include "../ride/RideColour.h" #include "../ride/Track.h" +#include "../util/Util.h" #include "../world/Map.h" #include "RideRatings.h" #include "VehicleColour.h" diff --git a/src/openrct2/ride/TrackPaint.cpp b/src/openrct2/ride/TrackPaint.cpp index 587b6ade6c..f8e66b6bff 100644 --- a/src/openrct2/ride/TrackPaint.cpp +++ b/src/openrct2/ride/TrackPaint.cpp @@ -1972,10 +1972,12 @@ void PaintTrack(PaintSession& session, Direction direction, int32_t height, cons { uint8_t zOffset = 16; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isToilet) || rtd.HasFlag(RtdFlag::isFirstAid) || rtd.HasFlag(RtdFlag::isCashMachine)) + if (rtd.specialType == RtdSpecialType::toilet || rtd.specialType == RtdSpecialType::firstAid + || rtd.specialType == RtdSpecialType::cashMachine) zOffset = 23; - if (ride->type == RIDE_TYPE_INFORMATION_KIOSK) + const auto* originElement = ride->GetOriginElement(StationIndex::FromUnderlying(0)); + if (originElement != nullptr && originElement->GetTrackType() == TrackElemType::FlatTrack1x1B) LightFxAddKioskLights(session.MapPosition, height, zOffset); else if (RideTypeDescriptors[ride->type].HasFlag(RtdFlag::isShopOrFacility)) LightFxAddShopLights(session.MapPosition, trackElement.GetDirection(), height, zOffset); diff --git a/src/openrct2/ride/TrackPaint.h b/src/openrct2/ride/TrackPaint.h index 9fdfbb9f85..ebc5fe4fe3 100644 --- a/src/openrct2/ride/TrackPaint.h +++ b/src/openrct2/ride/TrackPaint.h @@ -639,3 +639,4 @@ namespace OpenRCT2::AlpineRC } TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenRC(OpenRCT2::TrackElemType trackType); TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicStandUpRC(OpenRCT2::TrackElemType trackType); +TRACK_PAINT_FUNCTION GetTrackPaintFunctionClassicWoodenTwisterRC(OpenRCT2::TrackElemType trackType); diff --git a/src/openrct2/ride/VehicleSubpositionData.cpp b/src/openrct2/ride/VehicleSubpositionData.cpp index e206fa8cde..fd979d5032 100644 --- a/src/openrct2/ride/VehicleSubpositionData.cpp +++ b/src/openrct2/ride/VehicleSubpositionData.cpp @@ -30078,9 +30078,10 @@ static constexpr const VehicleInfoList *TrackVehicleInfoListDefault[] = { &TrackVehicleInfoRightEighthBankToOrthogonalUp250, &TrackVehicleInfoRightEighthBankToOrthogonalUp251, &TrackVehicleInfoRightEighthBankToOrthogonalUp252, &TrackVehicleInfoRightEighthBankToOrthogonalUp253, // TrackElemType::RightEighthBankBankToOrthogonalUp25 &TrackVehicleInfoLeftEighthBankToOrthogonalDown250, &TrackVehicleInfoLeftEighthBankToOrthogonalDown251, &TrackVehicleInfoLeftEighthBankToOrthogonalDown252, &TrackVehicleInfoLeftEighthBankToOrthogonalDown253, // TrackElemType::LeftEighthBankBankToOrthogonalDown25 &TrackVehicleInfoRightEighthBankToOrthogonalDown250, &TrackVehicleInfoRightEighthBankToOrthogonalDown251, &TrackVehicleInfoRightEighthBankToOrthogonalDown252, &TrackVehicleInfoRightEighthBankToOrthogonalDown253, // TrackElemType::RightEighthBankBankToOrthogonalDown25 - &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBrakes - &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBlockBrakes - &TrackVehicleInfo_8C27B2, &TrackVehicleInfo_8C28D4, &TrackVehicleInfo_8C29F6, &TrackVehicleInfo_8C2B18, // SlopedBrakes + &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBrakes + &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBlockBrakes + &TrackVehicleInfo_8C27B2, &TrackVehicleInfo_8C28D4, &TrackVehicleInfo_8C29F6, &TrackVehicleInfo_8C2B18, // SlopedBrakes + &TrackVehicleInfo_9162E6, &TrackVehicleInfo_916408, &TrackVehicleInfo_91652A, &TrackVehicleInfo_91664C, // DiagBooster }; static_assert(std::size(TrackVehicleInfoListDefault) == VehicleTrackSubpositionSizeDefault); diff --git a/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h b/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h index b58156c4f3..32ab9e11d2 100644 --- a/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h +++ b/src/openrct2/ride/rtd/coaster/AirPoweredVerticalCoaster.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor AirPoweredVerticalCoasterRTD = .LegacyBoosterSettings = { 40, 40 }, .Naming = { STR_RIDE_NAME_AIR_POWERED_VERTICAL_COASTER, STR_RIDE_DESCRIPTION_AIR_POWERED_VERTICAL_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 32, 4, 7, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/coaster/AlpineCoaster.h b/src/openrct2/ride/rtd/coaster/AlpineCoaster.h index 60808acb0d..2682f74699 100644 --- a/src/openrct2/ride/rtd/coaster/AlpineCoaster.h +++ b/src/openrct2/ride/rtd/coaster/AlpineCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor AlpineCoasterRTD = .TrackSpeedSettings = { 10, 10 }, .Naming = { STR_RIDE_NAME_ALPINE_COASTER, STR_RIDE_DESCRIPTION_ALPINE_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_ALPINE_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = {18, 24, 3, 7}, .MaxMass = 4, diff --git a/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h b/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h index e0be886193..fd8b2c670a 100644 --- a/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h +++ b/src/openrct2/ride/rtd/coaster/BobsleighCoaster.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor BobsleighCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_BOBSLEIGH_COASTER, STR_RIDE_DESCRIPTION_BOBSLEIGH_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_BOBSLEIGH_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 19, 24, 5, 7, }, .MaxMass = 25, diff --git a/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h index 65a288f231..9724307f17 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicMiniRollerCoaster.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor ClassicMiniRollerCoasterRTD = .LegacyBoosterSettings = { 17, 16, 1 }, .Naming = { STR_RIDE_NAME_CLASSIC_MINI_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_MINI_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 15, 24, 4, 7, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h index ae0e34dc8e..6681a653ff 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicStandUpRollerCoaster.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor ClassicStandUpRollerCoasterRTD = .OperatingSettings = { 7, 27 }, .Naming = { STR_RIDE_NAME_CLASSIC_STAND_UP_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_STAND_UP_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CLASSIC_STAND_UP_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 30, 24, 9, 11, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h index fab16a757a..15cbf79853 100644 --- a/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ClassicWoodenRollerCoaster.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor ClassicWoodenRollerCoasterRTD = .Drawer = GetTrackPaintFunctionClassicWoodenRC, .supportType = WoodenSupportType::Truss, .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::waterSplash, TrackGroup::blockBrakes, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeSteepLong, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge}, - .extraTrackGroups = {}, + .extraTrackGroups = {TrackGroup::booster, TrackGroup::slopeCurveSteep}, }), .InvertedTrackPaintFunctions = {}, .Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt | @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor ClassicWoodenRollerCoasterRTD = .LegacyBoosterSettings = { 0, 68 }, .Naming = { STR_RIDE_NAME_CLASSIC_WOODEN_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 24, 24, 8, 11, }, .MaxMass = 19, diff --git a/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h new file mode 100644 index 0000000000..6e1101a056 --- /dev/null +++ b/src/openrct2/ride/rtd/coaster/ClassicWoodenTwisterRollerCoaster.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * Copyright (c) 2014-2024 OpenRCT2 developers + * + * For a complete list of all authors, please refer to contributors.md + * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 + * + * OpenRCT2 is licensed under the GNU General Public License version 3. + *****************************************************************************/ + +#pragma once + +#include "../../../sprites.h" +#include "../../RideData.h" +#include "../../ShopItem.h" +#include "../../Track.h" + +// clang-format off +constexpr RideTypeDescriptor ClassicWoodenTwisterRollerCoasterRTD = +{ + .Category = RIDE_CATEGORY_ROLLERCOASTER, + .StartTrackPiece = OpenRCT2::TrackElemType::EndStation, + .TrackPaintFunctions = TrackDrawerDescriptor({ + .Drawer = GetTrackPaintFunctionClassicWoodenTwisterRC, + .supportType = WoodenSupportType::Truss, + .enabledTrackGroups = { TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeSteepLong, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::slopeCurveSteep, TrackGroup::slopeCurveBanked }, + .extraTrackGroups = { TrackGroup::verticalLoop, TrackGroup::waterSplash, TrackGroup::booster, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge }, + }), + .InvertedTrackPaintFunctions = {}, + .Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt | + EnumsToFlags(RtdFlag::hasLeaveWhenAnotherVehicleArrivesAtStation, RtdFlag::checkGForces, + RtdFlag::allowMultipleCircuits, RtdFlag::allowReversedTrains), + .RideModes = EnumsToFlags(RideMode::ContinuousCircuit, RideMode::ContinuousCircuitBlockSectioned), + .DefaultMode = RideMode::ContinuousCircuit, + .BoosterSettings = { 0, 68 }, + .LegacyBoosterSettings = { 0, 68 }, + .Naming = { STR_RIDE_NAME_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CLASSIC_WOODEN_TWISTER_ROLLER_COASTER }, + .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, + .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), + .Heights = { 24, 24, 8, 11, }, + .MaxMass = 19, + .LiftData = { OpenRCT2::Audio::SoundId::LiftWood, 3, 5 }, + .RatingsMultipliers = { 52, 33, 4 }, + .UpkeepCosts = { 40, 20, 80, 10, 3, 10 }, + .BuildCosts = {37.50_GBP, 3.50_GBP, 50, }, + .DefaultPrices = { 20, 20 }, + .DefaultMusic = MUSIC_OBJECT_WILD_WEST, + .PhotoItem = ShopItem::Photo3, + .BonusValue = 105, + .ColourPresets = TRACK_COLOUR_PRESETS( + { COLOUR_BORDEAUX_RED, COLOUR_BLACK, COLOUR_WHITE }, + { COLOUR_BRIGHT_RED, COLOUR_BLACK, COLOUR_GREY }, + { COLOUR_YELLOW, COLOUR_DARK_BROWN, COLOUR_DARK_BROWN }, + { COLOUR_TEAL, COLOUR_BORDEAUX_RED, COLOUR_WHITE }, + { COLOUR_LIGHT_BLUE, COLOUR_BLACK, COLOUR_BLACK }, + ), + .ColourPreview = { SPR_RIDE_DESIGN_PREVIEW_WOODEN_ROLLER_COASTER_TRACK, SPR_RIDE_DESIGN_PREVIEW_WOODEN_ROLLER_COASTER_SUPPORTS }, + .ColourKey = RideColourKey::Ride, + .Name = "classic_wooden_twister_rc", + .RatingsData = + { + RatingsCalculationType::Normal, + { RIDE_RATING(3, 20), RIDE_RATING(2, 60), RIDE_RATING(2, 00) }, + 19, + -1, + false, + { + { RatingsModifierType::BonusLength, 6000, 873, 0, 0 }, + { RatingsModifierType::BonusSynchronisation, 0, RIDE_RATING(0, 40), RIDE_RATING(0, 05), 0 }, + { RatingsModifierType::BonusTrainLength, 0, 187245, 0, 0 }, + { RatingsModifierType::BonusMaxSpeed, 0, 44281, 88562, 35424 }, + { RatingsModifierType::BonusAverageSpeed, 0, 364088, 655360, 0 }, + { RatingsModifierType::BonusDuration, 150, 26214, 0, 0 }, + { RatingsModifierType::BonusGForces, 0, 40960, 34555, 49648 }, + { RatingsModifierType::BonusTurns, 0, 26749, 43458, 45749 }, + { RatingsModifierType::BonusDrops, 0, 40777, 46811, 49152 }, + { RatingsModifierType::BonusSheltered, 0, 16705, 30583, 35108 }, + { RatingsModifierType::BonusReversedTrains, 0, 2, 12, 22 }, + { RatingsModifierType::BonusProximity, 0, 22367, 0, 0 }, + { RatingsModifierType::BonusScenery, 0, 11155, 0, 0 }, + { RatingsModifierType::RequirementDropHeight, 12, 2, 2, 2 }, + { RatingsModifierType::RequirementMaxSpeed, 0xA0000, 2, 2, 2 }, + { RatingsModifierType::RequirementNegativeGs, FIXED_2DP(0, 10), 2, 2, 2 }, + { RatingsModifierType::RequirementLength, 0x1720000, 2, 2, 2 }, + { RatingsModifierType::RequirementNumDrops, 2, 2, 2, 2 }, + { RatingsModifierType::PenaltyLateralGs, 0, 40960, 34555, 49648 }, + }, + }, +}; +// clang-format on diff --git a/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h b/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h index 62c945bab2..493a6f8b2f 100644 --- a/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h +++ b/src/openrct2/ride/rtd/coaster/CompactInvertedCoaster.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor CompactInvertedCoasterRTD = .OperatingSettings = { 7, 27 }, .Naming = { STR_RIDE_NAME_COMPACT_INVERTED_COASTER, STR_RIDE_DESCRIPTION_COMPACT_INVERTED_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_COMPACT_INVERTED_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 27, 40, 29, 8, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h b/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h index dfc385ca61..f6605a4b7e 100644 --- a/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/CorkscrewRollerCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor CorkscrewRollerCoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_CORKSCREW_ROLLER_COASTER, STR_RIDE_DESCRIPTION_CORKSCREW_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CORKSCREW_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 28, 24, 8, 11, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h b/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h index 3a8ef02700..c3222863b0 100644 --- a/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/FlyingRollerCoaster.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor FlyingRollerCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionFlyingRC, .supportType = MetalSupportType::TubesInverted, - .enabledTrackGroups = {TrackGroup::straight, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::inlineTwistUninverted, TrackGroup::flyingHalfLoopUninvertedUp, TrackGroup::quarterLoopUninvertedUp, TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, + .enabledTrackGroups = {TrackGroup::straight, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::inlineTwistUninverted, TrackGroup::flyingHalfLoopUninvertedUp, TrackGroup::quarterLoopUninvertedUp, TrackGroup::flyingLargeHalfLoopUninvertedUp, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge}, .extraTrackGroups = {TrackGroup::booster, TrackGroup::slopeSteepLong, TrackGroup::flyingLargeHalfLoopUninvertedDown, TrackGroup::flyingHalfLoopUninvertedDown, TrackGroup::stationEnd, TrackGroup::verticalLoop, TrackGroup::poweredLift}, }), .InvertedTrackPaintFunctions = TrackDrawerDescriptor({ @@ -42,7 +42,6 @@ constexpr RideTypeDescriptor FlyingRollerCoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_FLYING_ROLLER_COASTER, STR_RIDE_DESCRIPTION_FLYING_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_FLYING_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 30, 24, 8, 11, }, .MaxMass = 35, @@ -118,7 +117,6 @@ constexpr RideTypeDescriptor FlyingRollerCoasterAltRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_3A, STR_RIDE_DESCRIPTION_UNKNOWN }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_FLYING_ROLLER_COASTER_ALT", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 30, 24, 8, 11, }, .MaxMass = 35, diff --git a/src/openrct2/ride/rtd/coaster/GigaCoaster.h b/src/openrct2/ride/rtd/coaster/GigaCoaster.h index fdb2ae56d1..c098e28bd7 100644 --- a/src/openrct2/ride/rtd/coaster/GigaCoaster.h +++ b/src/openrct2/ride/rtd/coaster/GigaCoaster.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor GigaCoasterRTD = .Drawer = GetTrackPaintFunctionLatticeTriangleTrack, .supportType = MetalSupportType::Tubes, .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::liftHillCable, TrackGroup::slopeCurveBanked, TrackGroup::slopeCurveLarge, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeVertical, TrackGroup::curveVertical}, - .extraTrackGroups = {TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge, TrackGroup::booster, TrackGroup::poweredLift}, + .extraTrackGroups = {TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge, TrackGroup::booster, TrackGroup::diagBooster, TrackGroup::poweredLift}, }), .InvertedTrackPaintFunctions = {}, .Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt | @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor GigaCoasterRTD = .LegacyBoosterSettings = { 17, 68, 4 }, .Naming = { STR_RIDE_NAME_GIGA_COASTER, STR_RIDE_DESCRIPTION_GIGA_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_GIGA_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 86, 24, 9, 11, }, .MaxMass = 31, diff --git a/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h b/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h index 653299e25d..020ddefb49 100644 --- a/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h +++ b/src/openrct2/ride/rtd/coaster/HeartlineTwisterCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor HeartlineTwisterCoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_HEARTLINE_TWISTER_COASTER, STR_RIDE_DESCRIPTION_HEARTLINE_TWISTER_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_HEARTLINE_TWISTER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 22, 24, 15, 9, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/HybridCoaster.h b/src/openrct2/ride/rtd/coaster/HybridCoaster.h index 7953ba25cd..2b3cb147b1 100644 --- a/src/openrct2/ride/rtd/coaster/HybridCoaster.h +++ b/src/openrct2/ride/rtd/coaster/HybridCoaster.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor HybridCoasterRTD = .LegacyBoosterSettings = { 15, 52 }, .Naming = { STR_RIDE_NAME_HYBRID_COASTER, STR_RIDE_DESCRIPTION_HYBRID_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_HYBRID_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 43, 24, 13, 13}, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/HyperTwister.h b/src/openrct2/ride/rtd/coaster/HyperTwister.h index f1d950cdfc..78497c07c7 100644 --- a/src/openrct2/ride/rtd/coaster/HyperTwister.h +++ b/src/openrct2/ride/rtd/coaster/HyperTwister.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor HyperTwisterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionTwisterRC, .supportType = MetalSupportType::Tubes, - .enabledTrackGroups = { TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, + .enabledTrackGroups = { TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge}, .extraTrackGroups = { TrackGroup::liftHillSteep, TrackGroup::brakeForDrop, TrackGroup::booster, TrackGroup::poweredLift }, }), .InvertedTrackPaintFunctions = {}, @@ -38,7 +38,6 @@ constexpr RideTypeDescriptor HyperTwisterRTD = .LegacyBoosterSettings = { 17, 68 }, .Naming = { STR_RIDE_NAME_HYPER_TWISTER, STR_RIDE_DESCRIPTION_HYPER_TWISTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station}, - .EnumName = "RIDE_TYPE_HYPER_TWISTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 61, 24, 8, 9, }, .MaxMass = 31, diff --git a/src/openrct2/ride/rtd/coaster/Hypercoaster.h b/src/openrct2/ride/rtd/coaster/Hypercoaster.h index 6e900c5df1..255fe8a4b3 100644 --- a/src/openrct2/ride/rtd/coaster/Hypercoaster.h +++ b/src/openrct2/ride/rtd/coaster/Hypercoaster.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor HypercoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_HYPERCOASTER, STR_RIDE_DESCRIPTION_HYPERCOASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_HYPERCOASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 55, 24, 8, 11, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h b/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h index 001953d5a6..6b800a7752 100644 --- a/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h +++ b/src/openrct2/ride/rtd/coaster/InvertedHairpinCoaster.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor InvertedHairpinCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_INVERTED_HAIRPIN_COASTER, STR_RIDE_DESCRIPTION_INVERTED_HAIRPIN_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_INVERTED_HAIRPIN_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 16, 24, 24, 7, }, .MaxMass = 4, diff --git a/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h b/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h index 44bc1cc819..16aa3bbdb4 100644 --- a/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h +++ b/src/openrct2/ride/rtd/coaster/InvertedImpulseCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor InvertedImpulseCoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_INVERTED_IMPULSE_COASTER, STR_RIDE_DESCRIPTION_INVERTED_IMPULSE_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_INVERTED_IMPULSE_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 45, 40, 29, 8, }, .MaxMass = 23, diff --git a/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h index f9dec13985..8905fc4930 100644 --- a/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/InvertedRollerCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor InvertedRollerCoasterRTD = .LegacyBoosterSettings = { 0, 38 }, .Naming = { STR_RIDE_NAME_INVERTED_ROLLER_COASTER, STR_RIDE_DESCRIPTION_INVERTED_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_INVERTED_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 42, 40, 29, 8, }, .MaxMass = 27, diff --git a/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h b/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h index f658415a03..3b37d59a9a 100644 --- a/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/JuniorRollerCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor JuniorRollerCoasterRTD = .LegacyBoosterSettings = { 17, 16, 1 }, .Naming = { STR_RIDE_NAME_JUNIOR_ROLLER_COASTER, STR_RIDE_DESCRIPTION_JUNIOR_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_JUNIOR_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 12, 24, 4, 7, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h index 43cb578e63..ced016c7c4 100644 --- a/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LIMLaunchedRollerCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor LIMLaunchedRollerCoasterRTD = .LegacyBoosterSettings = { 18, 52 }, .Naming = { STR_RIDE_NAME_LIM_LAUNCHED_ROLLER_COASTER, STR_RIDE_DESCRIPTION_LIM_LAUNCHED_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 35, 24, 5, 7, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h index 75c8103dbe..a884e6e28b 100644 --- a/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LSMLaunchedRollerCoaster.h @@ -22,7 +22,7 @@ constexpr RideTypeDescriptor LSMLaunchedRollerCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionLatticeTriangleTrackAlt, .supportType = MetalSupportType::Tubes, - .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeCurveBanked, TrackGroup::slopeCurveLarge, TrackGroup::slopeCurveLargeBanked, TrackGroup::booster, TrackGroup::poweredLift, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge }, + .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::flatRollBanking, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::slopeCurveBanked, TrackGroup::slopeCurveLarge, TrackGroup::slopeCurveLargeBanked, TrackGroup::booster, TrackGroup::diagBooster, TrackGroup::poweredLift, TrackGroup::slopeVertical, TrackGroup::curveVertical, TrackGroup::barrelRoll, TrackGroup::quarterLoop, TrackGroup::halfLoop, TrackGroup::halfLoopMedium, TrackGroup::halfLoopLarge, TrackGroup::verticalLoop, TrackGroup::corkscrew, TrackGroup::corkscrewLarge, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge }, .extraTrackGroups = {TrackGroup::liftHill, TrackGroup::liftHillCable}, }), .InvertedTrackPaintFunctions = {}, @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor LSMLaunchedRollerCoasterRTD = .LegacyBoosterSettings = { 17, 68, 2 }, .Naming = { STR_RIDE_NAME_LSM_LAUNCHED_ROLLER_COASTER, STR_RIDE_DESCRIPTION_LSM_LAUNCHED_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LSM_LAUNCHED_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 33, 24, 9, 11, }, .MaxMass = 31, diff --git a/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h index 69ad588bcd..bfa128e60d 100644 --- a/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LayDownRollerCoaster.h @@ -45,7 +45,6 @@ constexpr RideTypeDescriptor LayDownRollerCoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_LAY_DOWN_ROLLER_COASTER, STR_RIDE_DESCRIPTION_LAY_DOWN_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LAY_DOWN_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 26, 24, 8, 11, }, .MaxMass = 25, @@ -117,7 +116,6 @@ constexpr RideTypeDescriptor LayDownRollerCoasterAltRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_40, STR_RIDE_DESCRIPTION_UNKNOWN }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LAY_DOWN_ROLLER_COASTER_ALT", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 26, 24, 8, 11, }, .MaxMass = 25, diff --git a/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h b/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h index e31df2c416..f7d0ed27cb 100644 --- a/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/LoopingRollerCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor LoopingRollerCoasterRTD = .LegacyBoosterSettings = { 18, 18 }, .Naming = { STR_RIDE_NAME_LOOPING_ROLLER_COASTER, STR_RIDE_DESCRIPTION_LOOPING_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LOOPING_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 35, 24, 5, 7, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/MineRide.h b/src/openrct2/ride/rtd/coaster/MineRide.h index 8464c6d511..5418c4188b 100644 --- a/src/openrct2/ride/rtd/coaster/MineRide.h +++ b/src/openrct2/ride/rtd/coaster/MineRide.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor MineRideRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MINE_RIDE, STR_RIDE_DESCRIPTION_MINE_RIDE }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINE_RIDE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 13, 24, 9, 11, }, .MaxMass = 27, diff --git a/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h b/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h index 8bfda9bbec..eda3c1d5d3 100644 --- a/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MineTrainCoaster.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor MineTrainCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MINE_TRAIN_COASTER, STR_RIDE_DESCRIPTION_MINE_TRAIN_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINE_TRAIN_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 21, 24, 4, 7, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h b/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h index 0955641cd6..73606db057 100644 --- a/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MiniRollerCoaster.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor MiniRollerCoasterRTD = .LegacyBoosterSettings = { 0, 68, 4 }, .Naming = { STR_RIDE_NAME_MINI_ROLLER_COASTER, STR_RIDE_DESCRIPTION_MINI_ROLLER_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINI_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 16, 24, 9, 11, }, .MaxMass = 10, diff --git a/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h b/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h index 4db6112200..e69174d1fa 100644 --- a/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MiniSuspendedCoaster.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor MiniSuspendedCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MINI_SUSPENDED_COASTER, STR_RIDE_DESCRIPTION_MINI_SUSPENDED_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINI_SUSPENDED_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 10, 24, 24, 8, }, .MaxMass = 3, diff --git a/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h b/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h index 28967895ac..c3faf1c9a6 100644 --- a/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/MultiDimensionRollerCoaster.h @@ -42,7 +42,6 @@ constexpr RideTypeDescriptor MultiDimensionRollerCoasterRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_MULTI_DIMENSION_ROLLER_COASTER, STR_RIDE_DESCRIPTION_MULTI_DIMENSION_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 40, 24, 8, 11, }, .MaxMass = 78, @@ -117,7 +116,6 @@ constexpr RideTypeDescriptor MultiDimensionRollerCoasterAltRTD = .LegacyBoosterSettings = { 25, 25 }, .Naming = { STR_RIDE_NAME_38, STR_RIDE_DESCRIPTION_UNKNOWN }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER_ALT", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 40, 24, 8, 11, }, .MaxMass = 78, diff --git a/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h b/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h index 7c9a858af4..1f662b5e3e 100644 --- a/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ReverseFreefallCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor ReverseFreefallCoasterRTD = .LegacyBoosterSettings = { 40, 40 }, .Naming = { STR_RIDE_NAME_REVERSE_FREEFALL_COASTER, STR_RIDE_DESCRIPTION_REVERSE_FREEFALL_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_REVERSE_FREEFALL_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 32, 4, 7, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h b/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h index e171a308c3..3a0a12aa29 100644 --- a/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/ReverserRollerCoaster.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor ReverserRollerCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_REVERSER_ROLLER_COASTER, STR_RIDE_DESCRIPTION_REVERSER_ROLLER_COASTER }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_REVERSER_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 18, 24, 8, 11, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h b/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h index f3fe4f0f16..7e23552977 100644 --- a/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SideFrictionRollerCoaster.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor SideFrictionRollerCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_SIDE_FRICTION_ROLLER_COASTER, STR_RIDE_DESCRIPTION_SIDE_FRICTION_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 18, 24, 4, 11, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h b/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h index 5ee27b781c..735c561b0e 100644 --- a/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SingleRailRollerCoaster.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor SingleRailRollerCoasterRTD = .LegacyBoosterSettings = { 15, 52 }, .Naming = { STR_RIDE_NAME_SINGLE_RAIL_ROLLER_COASTER, STR_RIDE_DESCRIPTION_SINGLE_RAIL_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 28, 24, 5, 7}, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h b/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h index d92370ce92..d32207c972 100644 --- a/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h +++ b/src/openrct2/ride/rtd/coaster/SpinningWildMouse.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor SpinningWildMouseRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_SPINNING_WILD_MOUSE, STR_RIDE_DESCRIPTION_SPINNING_WILD_MOUSE }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SPINNING_WILD_MOUSE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 16, 24, 4, 7, }, .MaxMass = 4, diff --git a/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h b/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h index 963127fb04..89785d79e7 100644 --- a/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SpiralRollerCoaster.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor SpiralRollerCoasterRTD = .LegacyBoosterSettings = { 17, 17 }, .Naming = { STR_RIDE_NAME_SPIRAL_ROLLER_COASTER, STR_RIDE_DESCRIPTION_SPIRAL_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SPIRAL_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 19, 24, 9, 11, }, .MaxMass = 31, diff --git a/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h b/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h index ba38784585..2d6c9555d6 100644 --- a/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/StandUpRollerCoaster.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor StandUpRollerCoasterRTD = .OperatingSettings = { 7, 27 }, .Naming = { STR_RIDE_NAME_STAND_UP_ROLLER_COASTER, STR_RIDE_DESCRIPTION_STAND_UP_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_STAND_UP_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 25, 24, 9, 11, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/coaster/SteelWildMouse.h b/src/openrct2/ride/rtd/coaster/SteelWildMouse.h index 1bbc323db8..553bc49ceb 100644 --- a/src/openrct2/ride/rtd/coaster/SteelWildMouse.h +++ b/src/openrct2/ride/rtd/coaster/SteelWildMouse.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor SteelWildMouseRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_WILD_MOUSE, STR_RIDE_DESCRIPTION_WILD_MOUSE }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_STEEL_WILD_MOUSE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 16, 24, 4, 7, }, .MaxMass = 4, diff --git a/src/openrct2/ride/rtd/coaster/Steeplechase.h b/src/openrct2/ride/rtd/coaster/Steeplechase.h index 57262e10cb..f57690723b 100644 --- a/src/openrct2/ride/rtd/coaster/Steeplechase.h +++ b/src/openrct2/ride/rtd/coaster/Steeplechase.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor SteeplechaseRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_STEEPLECHASE, STR_RIDE_DESCRIPTION_STEEPLECHASE }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_STEEPLECHASE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 14, 24, 7, 7, }, .MaxMass = 4, diff --git a/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h b/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h index c8fb3f555f..53ba3f6834 100644 --- a/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h +++ b/src/openrct2/ride/rtd/coaster/SuspendedSwingingCoaster.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor SuspendedSwingingCoasterRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_SUSPENDED_SWINGING_COASTER, STR_RIDE_DESCRIPTION_SUSPENDED_SWINGING_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SUSPENDED_SWINGING_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 24, 40, 29, 8, }, .MaxMass = 26, diff --git a/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h b/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h index 31ecb9ca85..841f8f6249 100644 --- a/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/TwisterRollerCoaster.h @@ -23,7 +23,7 @@ constexpr RideTypeDescriptor TwisterRollerCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionTwisterRC, .supportType = MetalSupportType::Tubes, - .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::halfLoop, TrackGroup::corkscrew, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::curveVertical, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, + .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::halfLoop, TrackGroup::corkscrew, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::slopeSteepLong, TrackGroup::curveVertical, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge, TrackGroup::corkscrewLarge, TrackGroup::halfLoopMedium, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge}, .extraTrackGroups = {TrackGroup::liftHillSteep, TrackGroup::brakeForDrop}, }), .InvertedTrackPaintFunctions = {}, @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor TwisterRollerCoasterRTD = .LegacyBoosterSettings = { 17, 68 }, .Naming = { STR_RIDE_NAME_TWISTER_ROLLER_COASTER, STR_RIDE_DESCRIPTION_TWISTER_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_TWISTER_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 40, 24, 8, 9, }, .MaxMass = 31, diff --git a/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h b/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h index 1ece6430ff..1b159dceab 100644 --- a/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h +++ b/src/openrct2/ride/rtd/coaster/VerticalDropCoaster.h @@ -23,8 +23,8 @@ constexpr RideTypeDescriptor VerticalDropCoasterRTD = .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionTwisterRC, .supportType = MetalSupportType::Boxed, - .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::liftHillSteep, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::flatToSteepSlope, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::curveVertical, TrackGroup::halfLoopLarge, TrackGroup::brakeForDrop, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes}, - .extraTrackGroups = {TrackGroup::halfLoop, TrackGroup::corkscrew, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist}, + .enabledTrackGroups = {TrackGroup::flat, TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::liftHill, TrackGroup::liftHillSteep, TrackGroup::flatRollBanking, TrackGroup::verticalLoop, TrackGroup::slope, TrackGroup::slopeSteepUp, TrackGroup::slopeSteepDown, TrackGroup::flatToSteepSlope, TrackGroup::slopeCurve, TrackGroup::slopeCurveSteep, TrackGroup::sBend, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::helixDownBankedHalf, TrackGroup::helixUpBankedHalf, TrackGroup::brakes, TrackGroup::onridePhoto, TrackGroup::slopeVertical, TrackGroup::slopeCurveBanked, TrackGroup::blockBrakes, TrackGroup::slopeRollBanking, TrackGroup::curveVertical, TrackGroup::halfLoopLarge, TrackGroup::brakeForDrop, TrackGroup::diagBrakes, TrackGroup::diagBlockBrakes, TrackGroup::slopeCurveLarge, TrackGroup::halfLoopMedium, TrackGroup::zeroGRoll, TrackGroup::zeroGRollLarge, TrackGroup::corkscrew, TrackGroup::corkscrewLarge}, + .extraTrackGroups = {TrackGroup::halfLoop, TrackGroup::barrelRoll, TrackGroup::poweredLift, TrackGroup::halfLoopLarge, TrackGroup::quarterLoop, TrackGroup::booster, TrackGroup::twist}, }), .InvertedTrackPaintFunctions = {}, .Flags = kRtdFlagsHasThreeColours | kRtdFlagsCommonCoaster | kRtdFlagsCommonCoasterNonAlt | @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor VerticalDropCoasterRTD = .LegacyBoosterSettings = { 17, 68 }, .Naming = { STR_RIDE_NAME_VERTICAL_DROP_ROLLER_COASTER, STR_RIDE_DESCRIPTION_VERTICAL_DROP_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 55, 24, 8, 11, }, .MaxMass = 25, diff --git a/src/openrct2/ride/rtd/coaster/VirginiaReel.h b/src/openrct2/ride/rtd/coaster/VirginiaReel.h index e98045dd52..0b536b1d99 100644 --- a/src/openrct2/ride/rtd/coaster/VirginiaReel.h +++ b/src/openrct2/ride/rtd/coaster/VirginiaReel.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor VirginiaReelRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_VIRGINIA_REEL, STR_RIDE_DESCRIPTION_VIRGINIA_REEL }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_VIRGINIA_REEL", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 14, 24, 6, 7, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/coaster/WaterCoaster.h b/src/openrct2/ride/rtd/coaster/WaterCoaster.h index 639aeb2917..7d7745523f 100644 --- a/src/openrct2/ride/rtd/coaster/WaterCoaster.h +++ b/src/openrct2/ride/rtd/coaster/WaterCoaster.h @@ -49,7 +49,6 @@ constexpr RideTypeDescriptor WaterCoasterRTD = .LegacyBoosterSettings = { 17, 16, 1 }, .Naming = { STR_RIDE_NAME_WATER_COASTER, STR_RIDE_DESCRIPTION_WATER_COASTER }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_WATER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 18, 24, 4, 7, }, .MaxMass = 13, diff --git a/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h b/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h index 5cf58d8ffe..b1947d6fe3 100644 --- a/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h +++ b/src/openrct2/ride/rtd/coaster/WoodenRollerCoaster.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor WoodenRollerCoasterRTD = .LegacyBoosterSettings = { 0, 68 }, .Naming = { STR_RIDE_NAME_WOODEN_ROLLER_COASTER, STR_RIDE_DESCRIPTION_WOODEN_ROLLER_COASTER }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_WOODEN_ROLLER_COASTER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 41, 24, 8, 11, }, .MaxMass = 19, diff --git a/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h b/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h index 54aaadbb7a..5ca73a52cf 100644 --- a/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h +++ b/src/openrct2/ride/rtd/coaster/WoodenWildMouse.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor WoodenWildMouseRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_WOODEN_WILD_MOUSE, STR_RIDE_DESCRIPTION_WOODEN_WILD_MOUSE }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_WOODEN_WILD_MOUSE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION) | (1 << BREAKDOWN_BRAKES_FAILURE), .Heights = { 14, 24, 4, 7, }, .MaxMass = 4, diff --git a/src/openrct2/ride/rtd/gentle/CarRide.h b/src/openrct2/ride/rtd/gentle/CarRide.h index 2ca48f56a0..eaf8841c62 100644 --- a/src/openrct2/ride/rtd/gentle/CarRide.h +++ b/src/openrct2/ride/rtd/gentle/CarRide.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor CarRideRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_CAR_RIDE, STR_RIDE_DESCRIPTION_CAR_RIDE }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CAR_RIDE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 6, 24, 4, 7, }, .MaxMass = 2, diff --git a/src/openrct2/ride/rtd/gentle/Circus.h b/src/openrct2/ride/rtd/gentle/Circus.h index ad5ab81412..bec6193f99 100644 --- a/src/openrct2/ride/rtd/gentle/Circus.h +++ b/src/openrct2/ride/rtd/gentle/Circus.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor CircusRTD = .DefaultMode = RideMode::Circus, .Naming = { STR_RIDE_NAME_CIRCUS, STR_RIDE_DESCRIPTION_CIRCUS }, .NameConvention = { RideComponentType::Building, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CIRCUS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 12, 128, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/CrookedHouse.h b/src/openrct2/ride/rtd/gentle/CrookedHouse.h index b2a38d768c..1d30eae8f2 100644 --- a/src/openrct2/ride/rtd/gentle/CrookedHouse.h +++ b/src/openrct2/ride/rtd/gentle/CrookedHouse.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor CrookedHouseRTD = .DefaultMode = RideMode::CrookedHouse, .Naming = { STR_RIDE_NAME_CROOKED_HOUSE, STR_RIDE_DESCRIPTION_CROOKED_HOUSE }, .NameConvention = { RideComponentType::Building, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CROOKED_HOUSE", .AvailableBreakdowns = 0, .Heights = { 16, 96, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/Dodgems.h b/src/openrct2/ride/rtd/gentle/Dodgems.h index 44067abeea..3b48d42e76 100644 --- a/src/openrct2/ride/rtd/gentle/Dodgems.h +++ b/src/openrct2/ride/rtd/gentle/Dodgems.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor DodgemsRTD = .OperatingSettings = { 20, 180 }, .Naming = { STR_RIDE_NAME_DODGEMS, STR_RIDE_DESCRIPTION_DODGEMS }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_DODGEMS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 9, 48, 2, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/FerrisWheel.h b/src/openrct2/ride/rtd/gentle/FerrisWheel.h index fd7070bfa8..afae1776c3 100644 --- a/src/openrct2/ride/rtd/gentle/FerrisWheel.h +++ b/src/openrct2/ride/rtd/gentle/FerrisWheel.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor FerrisWheelRTD = .OperatingSettings = { 1, 3 }, .Naming = { STR_RIDE_NAME_FERRIS_WHEEL, STR_RIDE_DESCRIPTION_FERRIS_WHEEL }, .NameConvention = { RideComponentType::Wheel, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_FERRIS_WHEEL", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 16, 176, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/FlyingSaucers.h b/src/openrct2/ride/rtd/gentle/FlyingSaucers.h index fc6ca4c05c..15d37f137d 100644 --- a/src/openrct2/ride/rtd/gentle/FlyingSaucers.h +++ b/src/openrct2/ride/rtd/gentle/FlyingSaucers.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor FlyingSaucersRTD = .OperatingSettings = { 20, 180 }, .Naming = { STR_RIDE_NAME_FLYING_SAUCERS, STR_RIDE_DESCRIPTION_FLYING_SAUCERS }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_FLYING_SAUCERS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 9, 48, 2, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/GhostTrain.h b/src/openrct2/ride/rtd/gentle/GhostTrain.h index 8ec480ea23..f9c00ea842 100644 --- a/src/openrct2/ride/rtd/gentle/GhostTrain.h +++ b/src/openrct2/ride/rtd/gentle/GhostTrain.h @@ -38,7 +38,6 @@ constexpr RideTypeDescriptor GhostTrainRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_GHOST_TRAIN, STR_RIDE_DESCRIPTION_GHOST_TRAIN }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_GHOST_TRAIN", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 8, 24, 6, 7, }, .MaxMass = 2, diff --git a/src/openrct2/ride/rtd/gentle/HauntedHouse.h b/src/openrct2/ride/rtd/gentle/HauntedHouse.h index 9ad736cfb2..33f64c420d 100644 --- a/src/openrct2/ride/rtd/gentle/HauntedHouse.h +++ b/src/openrct2/ride/rtd/gentle/HauntedHouse.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor HauntedHouseRTD = .DefaultMode = RideMode::HauntedHouse, .Naming = { STR_RIDE_NAME_HAUNTED_HOUSE, STR_RIDE_DESCRIPTION_HAUNTED_HOUSE }, .NameConvention = { RideComponentType::Building, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_HAUNTED_HOUSE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 16, 160, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/Maze.h b/src/openrct2/ride/rtd/gentle/Maze.h index ff9891c763..4e53d6a5b4 100644 --- a/src/openrct2/ride/rtd/gentle/Maze.h +++ b/src/openrct2/ride/rtd/gentle/Maze.h @@ -29,13 +29,12 @@ constexpr RideTypeDescriptor MazeRTD = .InvertedTrackPaintFunctions = {}, .Flags = EnumsToFlags(RtdFlag::hasTrackColourSupports, RtdFlag::hasSinglePieceStation, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::noWallsAroundTrack, RtdFlag::describeAsInside, RtdFlag::hasTrack, RtdFlag::hasEntranceAndExit, - RtdFlag::guestsCanUseUmbrella, RtdFlag::isMaze), + RtdFlag::guestsCanUseUmbrella), .RideModes = EnumsToFlags(RideMode::Maze), .DefaultMode = RideMode::Maze, .OperatingSettings = { 1, 64 }, .Naming = { STR_RIDE_NAME_MAZE, STR_RIDE_DESCRIPTION_MAZE }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MAZE", .AvailableBreakdowns = 0, .Heights = { 6, 24, 0, 1, }, .MaxMass = 18, @@ -75,5 +74,6 @@ constexpr RideTypeDescriptor MazeRTD = .SpecialElementRatingAdjustment = SpecialTrackElementRatingsAjustment_Default, .GetGuestWaypointLocation = GetGuestWaypointLocationDefault, .ConstructionWindowContext = RideConstructionWindowContext::Maze, + .specialType = RtdSpecialType::maze, }; // clang-format on diff --git a/src/openrct2/ride/rtd/gentle/MerryGoRound.h b/src/openrct2/ride/rtd/gentle/MerryGoRound.h index 44ac6657f2..2525ccf736 100644 --- a/src/openrct2/ride/rtd/gentle/MerryGoRound.h +++ b/src/openrct2/ride/rtd/gentle/MerryGoRound.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor MerryGoRoundRTD = .OperatingSettings = { 4, 25 }, .Naming = { STR_RIDE_NAME_MERRY_GO_ROUND, STR_RIDE_DESCRIPTION_MERRY_GO_ROUND }, .NameConvention = { RideComponentType::Car, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MERRY_GO_ROUND", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), .Heights = { 12, 64, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/MiniGolf.h b/src/openrct2/ride/rtd/gentle/MiniGolf.h index ac1766ee68..78a8be78f8 100644 --- a/src/openrct2/ride/rtd/gentle/MiniGolf.h +++ b/src/openrct2/ride/rtd/gentle/MiniGolf.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor MiniGolfRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MINI_GOLF, STR_RIDE_DESCRIPTION_MINI_GOLF }, .NameConvention = { RideComponentType::Player, RideComponentType::Course, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINI_GOLF", .AvailableBreakdowns = 0, .Heights = { 7, 32, 2, 2, }, .MaxMass = 255, @@ -81,5 +80,6 @@ constexpr RideTypeDescriptor MiniGolfRTD = .ConstructionWindowContext = RideConstructionWindowContext::Default, .RideUpdate = nullptr, .UpdateMeasurementsSpecialElements = RideUpdateMeasurementsSpecialElements_MiniGolf, + .specialType = RtdSpecialType::miniGolf, }; // clang-format on diff --git a/src/openrct2/ride/rtd/gentle/MiniHelicopters.h b/src/openrct2/ride/rtd/gentle/MiniHelicopters.h index d58025d9ca..221757b64f 100644 --- a/src/openrct2/ride/rtd/gentle/MiniHelicopters.h +++ b/src/openrct2/ride/rtd/gentle/MiniHelicopters.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor MiniHelicoptersRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MINI_HELICOPTERS, STR_RIDE_DESCRIPTION_MINI_HELICOPTERS }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINI_HELICOPTERS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 7, 24, 4, 7, }, .MaxMass = 2, diff --git a/src/openrct2/ride/rtd/gentle/MonorailCycles.h b/src/openrct2/ride/rtd/gentle/MonorailCycles.h index 73bd5cdb19..60e36a770c 100644 --- a/src/openrct2/ride/rtd/gentle/MonorailCycles.h +++ b/src/openrct2/ride/rtd/gentle/MonorailCycles.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor MonorailCyclesRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MONORAIL_CYCLES, STR_RIDE_DESCRIPTION_MONORAIL_CYCLES }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MONORAIL_CYCLES", .AvailableBreakdowns = (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 5, 24, 8, 7, }, .MaxMass = 2, diff --git a/src/openrct2/ride/rtd/gentle/MonsterTrucks.h b/src/openrct2/ride/rtd/gentle/MonsterTrucks.h index d3a5e432fa..8c8f203b38 100644 --- a/src/openrct2/ride/rtd/gentle/MonsterTrucks.h +++ b/src/openrct2/ride/rtd/gentle/MonsterTrucks.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor MonsterTrucksRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MONSTER_TRUCKS, STR_RIDE_DESCRIPTION_MONSTER_TRUCKS }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MONSTER_TRUCKS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 18, 24, 4, 7, }, .MaxMass = 2, diff --git a/src/openrct2/ride/rtd/gentle/ObservationTower.h b/src/openrct2/ride/rtd/gentle/ObservationTower.h index baa711be27..1e5169f263 100644 --- a/src/openrct2/ride/rtd/gentle/ObservationTower.h +++ b/src/openrct2/ride/rtd/gentle/ObservationTower.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor ObservationTowerRTD = .DefaultMode = RideMode::RotatingLift, .Naming = { STR_RIDE_NAME_OBSERVATION_TOWER, STR_RIDE_DESCRIPTION_OBSERVATION_TOWER }, .NameConvention = { RideComponentType::Cabin, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_OBSERVATION_TOWER", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 32, 3, 2, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/gentle/SpaceRings.h b/src/openrct2/ride/rtd/gentle/SpaceRings.h index 793a9e0c8c..59b5b0504b 100644 --- a/src/openrct2/ride/rtd/gentle/SpaceRings.h +++ b/src/openrct2/ride/rtd/gentle/SpaceRings.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor SpaceRingsRTD = .DefaultMode = RideMode::SpaceRings, .Naming = { STR_RIDE_NAME_SPACE_RINGS, STR_RIDE_DESCRIPTION_SPACE_RINGS }, .NameConvention = { RideComponentType::Ring, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SPACE_RINGS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 16, 48, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/gentle/SpiralSlide.h b/src/openrct2/ride/rtd/gentle/SpiralSlide.h index 2e33bd06d3..883b48e81e 100644 --- a/src/openrct2/ride/rtd/gentle/SpiralSlide.h +++ b/src/openrct2/ride/rtd/gentle/SpiralSlide.h @@ -29,13 +29,12 @@ constexpr RideTypeDescriptor SpiralSlideRTD = RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::noWallsAroundTrack, RtdFlag::isFlatRide, RtdFlag::allowMusic, RtdFlag::hasEntranceAndExit, RtdFlag::interestingToLookAt, - RtdFlag::listVehiclesSeparately, RtdFlag::isSpiralSlide), + RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::SingleRidePerAdmission, RideMode::UnlimitedRidesPerAdmission), .DefaultMode = RideMode::SingleRidePerAdmission, .OperatingSettings = { 1, 5 }, .Naming = { STR_RIDE_NAME_SPIRAL_SLIDE, STR_RIDE_DESCRIPTION_SPIRAL_SLIDE }, .NameConvention = { RideComponentType::Train, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SPIRAL_SLIDE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 15, 128, 0, 2, }, .MaxMass = 255, @@ -79,5 +78,6 @@ constexpr RideTypeDescriptor SpiralSlideRTD = .GetGuestWaypointLocation = GetGuestWaypointLocationDefault, .ConstructionWindowContext = RideConstructionWindowContext::Default, .RideUpdate = UpdateSpiralSlide, + .specialType = RtdSpecialType::spiralSlide, }; // clang-format on diff --git a/src/openrct2/ride/rtd/shops/CashMachine.h b/src/openrct2/ride/rtd/shops/CashMachine.h index 3ed5d112c4..b78f85e4e8 100644 --- a/src/openrct2/ride/rtd/shops/CashMachine.h +++ b/src/openrct2/ride/rtd/shops/CashMachine.h @@ -25,13 +25,12 @@ constexpr RideTypeDescriptor CashMachineRTD = }), .InvertedTrackPaintFunctions = {}, .Flags = EnumsToFlags(RtdFlag::hasSinglePieceStation, RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, - RtdFlag::noVehicles, RtdFlag::isCashMachine, RtdFlag::isShopOrFacility, + RtdFlag::noVehicles, RtdFlag::isShopOrFacility, RtdFlag::noWallsAroundTrack, RtdFlag::isFlatRide, RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::ShopStall), .DefaultMode = RideMode::ShopStall, .Naming = { STR_RIDE_NAME_CASH_MACHINE, STR_RIDE_DESCRIPTION_CASH_MACHINE }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CASH_MACHINE", .AvailableBreakdowns = 0, .Heights = { 12, DefaultCashMachineHeight, 0, 0, }, .MaxMass = 255, @@ -62,5 +61,6 @@ constexpr RideTypeDescriptor CashMachineRTD = .DesignCreateMode = TrackDesignCreateMode::Default, .MusicUpdateFunction = DefaultMusicUpdate, .Classification = RideClassification::KioskOrFacility, + .specialType = RtdSpecialType::cashMachine, }; // clang-format on diff --git a/src/openrct2/ride/rtd/shops/DrinkStall.h b/src/openrct2/ride/rtd/shops/DrinkStall.h index 4a65a7363c..562933a666 100644 --- a/src/openrct2/ride/rtd/shops/DrinkStall.h +++ b/src/openrct2/ride/rtd/shops/DrinkStall.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor DrinkStallRTD = .DefaultMode = RideMode::ShopStall, .Naming = { STR_RIDE_NAME_DRINK_STALL, STR_RIDE_DESCRIPTION_DRINK_STALL }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_DRINK_STALL", .AvailableBreakdowns = 0, .Heights = { 12, DefaultDrinksStallHeight, 0, 0, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/shops/FirstAid.h b/src/openrct2/ride/rtd/shops/FirstAid.h index ca60bbf063..da13a5d2c3 100644 --- a/src/openrct2/ride/rtd/shops/FirstAid.h +++ b/src/openrct2/ride/rtd/shops/FirstAid.h @@ -26,14 +26,13 @@ constexpr RideTypeDescriptor FirstAidRTD = .InvertedTrackPaintFunctions = {}, .Flags = EnumsToFlags(RtdFlag::hasSinglePieceStation, RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::isShopOrFacility, RtdFlag::noWallsAroundTrack, - RtdFlag::isFlatRide, RtdFlag::isFirstAid, RtdFlag::guestsShouldGoInsideFacility, + RtdFlag::isFlatRide, RtdFlag::guestsShouldGoInsideFacility, RtdFlag::describeAsInside, RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::ShopStall), .DefaultMode = RideMode::ShopStall, .OperatingSettings = { 8, 8 }, .Naming = { STR_RIDE_NAME_FIRST_AID, STR_RIDE_DESCRIPTION_FIRST_AID }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_FIRST_AID", .AvailableBreakdowns = 0, .Heights = { 12, DefaultFirstAidHeight, 0, 0, }, .MaxMass = 255, @@ -64,5 +63,6 @@ constexpr RideTypeDescriptor FirstAidRTD = .DesignCreateMode = TrackDesignCreateMode::Default, .MusicUpdateFunction = DefaultMusicUpdate, .Classification = RideClassification::KioskOrFacility, + .specialType = RtdSpecialType::firstAid, }; // clang-format on diff --git a/src/openrct2/ride/rtd/shops/FoodStall.h b/src/openrct2/ride/rtd/shops/FoodStall.h index 8c545c60ee..62d63a91b1 100644 --- a/src/openrct2/ride/rtd/shops/FoodStall.h +++ b/src/openrct2/ride/rtd/shops/FoodStall.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor FoodStallRTD = .DefaultMode = RideMode::ShopStall, .Naming = { STR_RIDE_NAME_FOOD_STALL, STR_RIDE_DESCRIPTION_FOOD_STALL }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_FOOD_STALL", .AvailableBreakdowns = 0, .Heights = { 12, DefaultFoodStallHeight, 0, 0, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/shops/InformationKiosk.h b/src/openrct2/ride/rtd/shops/InformationKiosk.h index 89b509173c..cb9ec5b63d 100644 --- a/src/openrct2/ride/rtd/shops/InformationKiosk.h +++ b/src/openrct2/ride/rtd/shops/InformationKiosk.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor InformationKioskRTD = .DefaultMode = RideMode::ShopStall, .Naming = { STR_RIDE_NAME_INFORMATION_KIOSK, STR_RIDE_DESCRIPTION_INFORMATION_KIOSK }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_INFORMATION_KIOSK", .AvailableBreakdowns = 0, .Heights = { 12, DefaultInformationKioskHeight, 0, 0, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/shops/Shop.h b/src/openrct2/ride/rtd/shops/Shop.h index 239a3bab27..a4ab313758 100644 --- a/src/openrct2/ride/rtd/shops/Shop.h +++ b/src/openrct2/ride/rtd/shops/Shop.h @@ -32,7 +32,6 @@ constexpr RideTypeDescriptor ShopRTD = .DefaultMode = RideMode::ShopStall, .Naming = { STR_RIDE_NAME_SHOP, STR_RIDE_DESCRIPTION_SHOP }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SHOP", .AvailableBreakdowns = 0, .Heights = { 12, DefaultShopHeight, 0, 0, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/shops/Toilets.h b/src/openrct2/ride/rtd/shops/Toilets.h index adff80f683..d88e44a25b 100644 --- a/src/openrct2/ride/rtd/shops/Toilets.h +++ b/src/openrct2/ride/rtd/shops/Toilets.h @@ -27,13 +27,12 @@ constexpr RideTypeDescriptor ToiletsRTD = .Flags = EnumsToFlags(RtdFlag::hasSinglePieceStation, RtdFlag::cannotHaveGaps, RtdFlag::noTestMode, RtdFlag::noVehicles, RtdFlag::isShopOrFacility, RtdFlag::noWallsAroundTrack, RtdFlag::isFlatRide, RtdFlag::guestsShouldGoInsideFacility, RtdFlag::describeAsInside, - RtdFlag::isToilet, RtdFlag::listVehiclesSeparately), + RtdFlag::listVehiclesSeparately), .RideModes = EnumsToFlags(RideMode::ShopStall), .DefaultMode = RideMode::ShopStall, .OperatingSettings = { 4, 4 }, .Naming = { STR_RIDE_NAME_TOILETS, STR_RIDE_DESCRIPTION_TOILETS }, .NameConvention = { RideComponentType::Car, RideComponentType::Building, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_TOILETS", .AvailableBreakdowns = 0, .Heights = { 12, DefaultToiletHeight, 0, 0, }, .MaxMass = 255, @@ -64,5 +63,6 @@ constexpr RideTypeDescriptor ToiletsRTD = .DesignCreateMode = TrackDesignCreateMode::Default, .MusicUpdateFunction = DefaultMusicUpdate, .Classification = RideClassification::KioskOrFacility, + .specialType = RtdSpecialType::toilet, }; // clang-format on diff --git a/src/openrct2/ride/rtd/thrill/3DCinema.h b/src/openrct2/ride/rtd/thrill/3DCinema.h index 3fe96de6ff..d9234a99ea 100644 --- a/src/openrct2/ride/rtd/thrill/3DCinema.h +++ b/src/openrct2/ride/rtd/thrill/3DCinema.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor CinemaRTD = .DefaultMode = RideMode::MouseTails3DFilm, .Naming = { STR_RIDE_NAME_3D_CINEMA, STR_RIDE_DESCRIPTION_3D_CINEMA }, .NameConvention = { RideComponentType::Building, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_3D_CINEMA", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 12, 128, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/Enterprise.h b/src/openrct2/ride/rtd/thrill/Enterprise.h index 9a794dd58e..58ea36848f 100644 --- a/src/openrct2/ride/rtd/thrill/Enterprise.h +++ b/src/openrct2/ride/rtd/thrill/Enterprise.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor EnterpriseRTD = .OperatingSettings = { 10, 20 }, .Naming = { STR_RIDE_NAME_ENTERPRISE, STR_RIDE_DESCRIPTION_ENTERPRISE }, .NameConvention = { RideComponentType::Wheel, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_ENTERPRISE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 16, 160, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/GoKarts.h b/src/openrct2/ride/rtd/thrill/GoKarts.h index 411fbd751e..1b9dd6b837 100644 --- a/src/openrct2/ride/rtd/thrill/GoKarts.h +++ b/src/openrct2/ride/rtd/thrill/GoKarts.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor GoKartsRTD = .OperatingSettings = { 1, 10 }, .Naming = { STR_RIDE_NAME_GO_KARTS, STR_RIDE_DESCRIPTION_GO_KARTS }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_GO_KARTS", .AvailableBreakdowns = (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 7, 24, 2, 1, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h b/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h index 8619ecc566..0a80e45a99 100644 --- a/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h +++ b/src/openrct2/ride/rtd/thrill/LaunchedFreefall.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor LaunchedFreefallRTD = .OperatingSettings = { 10, 40 }, .Naming = { STR_RIDE_NAME_LAUNCHED_FREEFALL, STR_RIDE_DESCRIPTION_LAUNCHED_FREEFALL }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LAUNCHED_FREEFALL", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 32, 3, 2, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/thrill/MagicCarpet.h b/src/openrct2/ride/rtd/thrill/MagicCarpet.h index 6830542abe..40cede2fdb 100644 --- a/src/openrct2/ride/rtd/thrill/MagicCarpet.h +++ b/src/openrct2/ride/rtd/thrill/MagicCarpet.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor MagicCarpetRTD = .OperatingSettings = { 7, 15 }, .Naming = { STR_RIDE_NAME_MAGIC_CARPET, STR_RIDE_DESCRIPTION_MAGIC_CARPET }, .NameConvention = { RideComponentType::Car, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MAGIC_CARPET", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 15, 176, 7, 11, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/MotionSimulator.h b/src/openrct2/ride/rtd/thrill/MotionSimulator.h index b1d1bf0d89..f600dc221e 100644 --- a/src/openrct2/ride/rtd/thrill/MotionSimulator.h +++ b/src/openrct2/ride/rtd/thrill/MotionSimulator.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor MotionSimulatorRTD = .DefaultMode = RideMode::FilmAvengingAviators, .Naming = { STR_RIDE_NAME_MOTION_SIMULATOR, STR_RIDE_DESCRIPTION_MOTION_SIMULATOR }, .NameConvention = { RideComponentType::Car, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MOTION_SIMULATOR", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 12, 64, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/RotoDrop.h b/src/openrct2/ride/rtd/thrill/RotoDrop.h index f60e4bf93e..a6271bf6a1 100644 --- a/src/openrct2/ride/rtd/thrill/RotoDrop.h +++ b/src/openrct2/ride/rtd/thrill/RotoDrop.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor RotoDropRTD = .DefaultMode = RideMode::FreefallDrop, .Naming = { STR_RIDE_NAME_ROTO_DROP, STR_RIDE_DESCRIPTION_ROTO_DROP }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_ROTO_DROP", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_RESTRAINTS_STUCK_CLOSED) | (1 << BREAKDOWN_RESTRAINTS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 32, 3, 2, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h b/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h index 66af0b1981..6b2275719f 100644 --- a/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h +++ b/src/openrct2/ride/rtd/thrill/SwingingInverterShip.h @@ -35,7 +35,6 @@ constexpr RideTypeDescriptor SwingingInverterShipRTD = .OperatingSettings = { 7, 15 }, .Naming = { STR_RIDE_NAME_SWINGING_INVERTER_SHIP, STR_RIDE_DESCRIPTION_SWINGING_INVERTER_SHIP }, .NameConvention = { RideComponentType::Ship, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SWINGING_INVERTER_SHIP", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 15, 176, 7, 11, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/SwingingShip.h b/src/openrct2/ride/rtd/thrill/SwingingShip.h index 9e6a8d3a65..30dca2caa5 100644 --- a/src/openrct2/ride/rtd/thrill/SwingingShip.h +++ b/src/openrct2/ride/rtd/thrill/SwingingShip.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor SwingingShipRTD = .OperatingSettings = { 7, 25 }, .Naming = { STR_RIDE_NAME_SWINGING_SHIP, STR_RIDE_DESCRIPTION_SWINGING_SHIP }, .NameConvention = { RideComponentType::Ship, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SWINGING_SHIP", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 12, 112, 7, 11, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/TopSpin.h b/src/openrct2/ride/rtd/thrill/TopSpin.h index f46cdbfe4a..41c5d022eb 100644 --- a/src/openrct2/ride/rtd/thrill/TopSpin.h +++ b/src/openrct2/ride/rtd/thrill/TopSpin.h @@ -34,7 +34,6 @@ constexpr RideTypeDescriptor TopSpinRTD = .DefaultMode = RideMode::Beginners, .Naming = { STR_RIDE_NAME_TOP_SPIN, STR_RIDE_DESCRIPTION_TOP_SPIN }, .NameConvention = { RideComponentType::Car, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_TOP_SPIN", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 16, 112, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/thrill/Twist.h b/src/openrct2/ride/rtd/thrill/Twist.h index 5ab908ae3d..958d1177ec 100644 --- a/src/openrct2/ride/rtd/thrill/Twist.h +++ b/src/openrct2/ride/rtd/thrill/Twist.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor TwistRTD = .OperatingSettings = { 3, 6, 3 }, .Naming = { STR_RIDE_NAME_TWIST, STR_RIDE_DESCRIPTION_TWIST }, .NameConvention = { RideComponentType::Structure, RideComponentType::Structure, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_TWIST", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 12, 64, 3, 2, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/transport/Chairlift.h b/src/openrct2/ride/rtd/transport/Chairlift.h index 937e60eec4..d2d4f96ff4 100644 --- a/src/openrct2/ride/rtd/transport/Chairlift.h +++ b/src/openrct2/ride/rtd/transport/Chairlift.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor ChairliftRTD = .OperatingSettings = { 1, 4 }, .Naming = { STR_RIDE_NAME_CHAIRLIFT, STR_RIDE_DESCRIPTION_CHAIRLIFT }, .NameConvention = { RideComponentType::Car, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_CHAIRLIFT", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 40, 32, 28, 2, }, .MaxMass = 18, diff --git a/src/openrct2/ride/rtd/transport/Lift.h b/src/openrct2/ride/rtd/transport/Lift.h index cef2d8980f..5e0c763ee3 100644 --- a/src/openrct2/ride/rtd/transport/Lift.h +++ b/src/openrct2/ride/rtd/transport/Lift.h @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor LiftRTD = .DefaultMode = RideMode::Shuttle, .Naming = { STR_RIDE_NAME_LIFT, STR_RIDE_DESCRIPTION_LIFT }, .NameConvention = { RideComponentType::Cabin, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LIFT", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_DOORS_STUCK_CLOSED) | (1 << BREAKDOWN_DOORS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 32, 3, 2, }, .MaxMass = 15, diff --git a/src/openrct2/ride/rtd/transport/MiniatureRailway.h b/src/openrct2/ride/rtd/transport/MiniatureRailway.h index b6201d9fb8..b254ec344c 100644 --- a/src/openrct2/ride/rtd/transport/MiniatureRailway.h +++ b/src/openrct2/ride/rtd/transport/MiniatureRailway.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor MiniatureRailwayRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MINIATURE_RAILWAY, STR_RIDE_DESCRIPTION_MINIATURE_RAILWAY }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MINIATURE_RAILWAY", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 7, 32, 5, 9, }, .MaxMass = 39, diff --git a/src/openrct2/ride/rtd/transport/Monorail.h b/src/openrct2/ride/rtd/transport/Monorail.h index a27ce1ebcd..5933298fed 100644 --- a/src/openrct2/ride/rtd/transport/Monorail.h +++ b/src/openrct2/ride/rtd/transport/Monorail.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor MonorailRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_MONORAIL, STR_RIDE_DESCRIPTION_MONORAIL }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_MONORAIL", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_DOORS_STUCK_CLOSED) | (1 << BREAKDOWN_DOORS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 8, 32, 8, 9, }, .MaxMass = 78, diff --git a/src/openrct2/ride/rtd/transport/SuspendedMonorail.h b/src/openrct2/ride/rtd/transport/SuspendedMonorail.h index e94ca6b30c..b0fd090aee 100644 --- a/src/openrct2/ride/rtd/transport/SuspendedMonorail.h +++ b/src/openrct2/ride/rtd/transport/SuspendedMonorail.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor SuspendedMonorailRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_SUSPENDED_MONORAIL, STR_RIDE_DESCRIPTION_SUSPENDED_MONORAIL }, .NameConvention = { RideComponentType::Train, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SUSPENDED_MONORAIL", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_DOORS_STUCK_CLOSED) | (1 << BREAKDOWN_DOORS_STUCK_OPEN) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 12, 40, 32, 8, }, .MaxMass = 78, diff --git a/src/openrct2/ride/rtd/water/BoatHire.h b/src/openrct2/ride/rtd/water/BoatHire.h index 3d9ab1844c..8f78ac2d38 100644 --- a/src/openrct2/ride/rtd/water/BoatHire.h +++ b/src/openrct2/ride/rtd/water/BoatHire.h @@ -22,7 +22,7 @@ constexpr RideTypeDescriptor BoatHireRTD = .StartTrackPiece = OpenRCT2::TrackElemType::EndStation, .TrackPaintFunctions = TrackDrawerDescriptor({ .Drawer = GetTrackPaintFunctionBoatHire, - .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::curveVerySmall}, + .enabledTrackGroups = {TrackGroup::straight, TrackGroup::stationEnd, TrackGroup::curveVerySmall, TrackGroup::curveSmall, TrackGroup::curve, TrackGroup::curveLarge, TrackGroup::sBend}, .extraTrackGroups = {}, }), .InvertedTrackPaintFunctions = {}, @@ -33,7 +33,6 @@ constexpr RideTypeDescriptor BoatHireRTD = .DefaultMode = RideMode::BoatHire, .Naming = { STR_RIDE_NAME_BOAT_HIRE, STR_RIDE_DESCRIPTION_BOAT_HIRE }, .NameConvention = { RideComponentType::Boat, RideComponentType::DockingPlatform, RideComponentType::DockingPlatform }, - .EnumName = "RIDE_TYPE_BOAT_HIRE", .AvailableBreakdowns = (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 16, 0, 3, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/water/DinghySlide.h b/src/openrct2/ride/rtd/water/DinghySlide.h index fbd0f8eea9..a1314111b4 100644 --- a/src/openrct2/ride/rtd/water/DinghySlide.h +++ b/src/openrct2/ride/rtd/water/DinghySlide.h @@ -50,7 +50,6 @@ constexpr RideTypeDescriptor DinghySlideRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_DINGHY_SLIDE, STR_RIDE_DESCRIPTION_DINGHY_SLIDE }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_DINGHY_SLIDE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 15, 24, 5, 7, }, .MaxMass = 5, diff --git a/src/openrct2/ride/rtd/water/LogFlume.h b/src/openrct2/ride/rtd/water/LogFlume.h index 7909fb109d..f4bae6ee9d 100644 --- a/src/openrct2/ride/rtd/water/LogFlume.h +++ b/src/openrct2/ride/rtd/water/LogFlume.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor LogFlumeRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_LOG_FLUME, STR_RIDE_DESCRIPTION_LOG_FLUME }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_LOG_FLUME", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), .Heights = { 10, 24, 7, 9, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/water/RiverRafts.h b/src/openrct2/ride/rtd/water/RiverRafts.h index 6ed052bd83..ae7febaa55 100644 --- a/src/openrct2/ride/rtd/water/RiverRafts.h +++ b/src/openrct2/ride/rtd/water/RiverRafts.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor RiverRaftsRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_RIVER_RAFTS, STR_RIDE_DESCRIPTION_RIVER_RAFTS }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_RIVER_RAFTS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT), .Heights = { 12, 24, 7, 11, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/water/RiverRapids.h b/src/openrct2/ride/rtd/water/RiverRapids.h index 8ab7b5c81a..81bd264283 100644 --- a/src/openrct2/ride/rtd/water/RiverRapids.h +++ b/src/openrct2/ride/rtd/water/RiverRapids.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor RiverRapidsRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_RIVER_RAPIDS, STR_RIDE_DESCRIPTION_RIVER_RAPIDS }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_RIVER_RAPIDS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), .Heights = { 9, 32, 14, 15, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/water/SplashBoats.h b/src/openrct2/ride/rtd/water/SplashBoats.h index bef454e92f..a44c58c82c 100644 --- a/src/openrct2/ride/rtd/water/SplashBoats.h +++ b/src/openrct2/ride/rtd/water/SplashBoats.h @@ -37,7 +37,6 @@ constexpr RideTypeDescriptor SplashBoatsRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_SPLASH_BOATS, STR_RIDE_DESCRIPTION_SPLASH_BOATS }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::Station }, - .EnumName = "RIDE_TYPE_SPLASH_BOATS", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_CONTROL_FAILURE), .Heights = { 16, 24, 7, 11, }, .MaxMass = 255, diff --git a/src/openrct2/ride/rtd/water/SubmarineRide.h b/src/openrct2/ride/rtd/water/SubmarineRide.h index 1fe2f9dd6e..81f115837b 100644 --- a/src/openrct2/ride/rtd/water/SubmarineRide.h +++ b/src/openrct2/ride/rtd/water/SubmarineRide.h @@ -36,7 +36,6 @@ constexpr RideTypeDescriptor SubmarineRideRTD = .DefaultMode = RideMode::ContinuousCircuit, .Naming = { STR_RIDE_NAME_SUBMARINE_RIDE, STR_RIDE_DESCRIPTION_SUBMARINE_RIDE }, .NameConvention = { RideComponentType::Boat, RideComponentType::Track, RideComponentType::DockingPlatform }, - .EnumName = "RIDE_TYPE_SUBMARINE_RIDE", .AvailableBreakdowns = (1 << BREAKDOWN_SAFETY_CUT_OUT) | (1 << BREAKDOWN_VEHICLE_MALFUNCTION), .Heights = { 255, 16, 0, 3, }, .MaxMass = 255, diff --git a/src/openrct2/scenario/Scenario.cpp b/src/openrct2/scenario/Scenario.cpp index 575811d918..edce19bcca 100644 --- a/src/openrct2/scenario/Scenario.cpp +++ b/src/openrct2/scenario/Scenario.cpp @@ -39,6 +39,7 @@ #include "../network/network.h" #include "../object/Object.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/ScenarioTextObject.h" diff --git a/src/openrct2/scripting/Duktape.hpp b/src/openrct2/scripting/Duktape.hpp index 8619683f80..dfcccfd85f 100644 --- a/src/openrct2/scripting/Duktape.hpp +++ b/src/openrct2/scripting/Duktape.hpp @@ -11,16 +11,16 @@ #ifdef ENABLE_SCRIPTING -# include "../core/Console.hpp" -# include "../core/EnumMap.hpp" -# include "../ride/Vehicle.h" -# include "../world/Map.h" + #include "../core/Console.hpp" + #include "../core/EnumMap.hpp" + #include "../ride/Vehicle.h" + #include "../world/Map.h" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/HookEngine.cpp b/src/openrct2/scripting/HookEngine.cpp index 77ead25f9b..0b6d74f3fd 100644 --- a/src/openrct2/scripting/HookEngine.cpp +++ b/src/openrct2/scripting/HookEngine.cpp @@ -9,12 +9,12 @@ #ifdef ENABLE_SCRIPTING -# include "HookEngine.h" + #include "HookEngine.h" -# include "../core/EnumMap.hpp" -# include "ScriptEngine.h" + #include "../core/EnumMap.hpp" + #include "ScriptEngine.h" -# include + #include using namespace OpenRCT2::Scripting; diff --git a/src/openrct2/scripting/HookEngine.h b/src/openrct2/scripting/HookEngine.h index 839691aedb..550af6e85a 100644 --- a/src/openrct2/scripting/HookEngine.h +++ b/src/openrct2/scripting/HookEngine.h @@ -11,13 +11,13 @@ #ifdef ENABLE_SCRIPTING -# include "Duktape.hpp" + #include "Duktape.hpp" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/Plugin.cpp b/src/openrct2/scripting/Plugin.cpp index 7a6d7efa69..a54e60ead2 100644 --- a/src/openrct2/scripting/Plugin.cpp +++ b/src/openrct2/scripting/Plugin.cpp @@ -9,16 +9,16 @@ #ifdef ENABLE_SCRIPTING -# include "Plugin.h" + #include "Plugin.h" -# include "../Diagnostic.h" -# include "../OpenRCT2.h" -# include "../core/File.h" -# include "Duktape.hpp" -# include "ScriptEngine.h" + #include "../Diagnostic.h" + #include "../OpenRCT2.h" + #include "../core/File.h" + #include "Duktape.hpp" + #include "ScriptEngine.h" -# include -# include + #include + #include using namespace OpenRCT2::Scripting; @@ -122,15 +122,15 @@ void Plugin::ThrowIfStopping() const void Plugin::Unload() { -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105937, fixed in GCC13 -# if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -# endif + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105937, fixed in GCC13 + #if defined(__GNUC__) && !defined(__clang__) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + #endif _metadata.Main = {}; -# if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -# endif + #if defined(__GNUC__) && !defined(__clang__) + #pragma GCC diagnostic pop + #endif _hasLoaded = false; } diff --git a/src/openrct2/scripting/Plugin.h b/src/openrct2/scripting/Plugin.h index 2d6df869c6..8b91b08d82 100644 --- a/src/openrct2/scripting/Plugin.h +++ b/src/openrct2/scripting/Plugin.h @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "Duktape.hpp" + #include "Duktape.hpp" -# include -# include -# include -# include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/ScriptEngine.cpp b/src/openrct2/scripting/ScriptEngine.cpp index c73223c9a0..b678ee3ff2 100644 --- a/src/openrct2/scripting/ScriptEngine.cpp +++ b/src/openrct2/scripting/ScriptEngine.cpp @@ -9,61 +9,61 @@ #ifdef ENABLE_SCRIPTING -# include "ScriptEngine.h" + #include "ScriptEngine.h" -# include "../PlatformEnvironment.h" -# include "../actions/BannerPlaceAction.h" -# include "../actions/CustomAction.h" -# include "../actions/GameAction.h" -# include "../actions/LargeSceneryPlaceAction.h" -# include "../actions/RideCreateAction.h" -# include "../actions/StaffHireNewAction.h" -# include "../actions/WallPlaceAction.h" -# include "../config/Config.h" -# include "../core/EnumMap.hpp" -# include "../core/File.h" -# include "../core/FileScanner.h" -# include "../core/Path.hpp" -# include "../interface/InteractiveConsole.h" -# include "../platform/Platform.h" -# include "Duktape.hpp" -# include "bindings/entity/ScEntity.hpp" -# include "bindings/entity/ScGuest.hpp" -# include "bindings/entity/ScLitter.hpp" -# include "bindings/entity/ScParticle.hpp" -# include "bindings/entity/ScPeep.hpp" -# include "bindings/entity/ScStaff.hpp" -# include "bindings/entity/ScVehicle.hpp" -# include "bindings/game/ScCheats.hpp" -# include "bindings/game/ScConsole.hpp" -# include "bindings/game/ScContext.hpp" -# include "bindings/game/ScDisposable.hpp" -# include "bindings/game/ScPlugin.hpp" -# include "bindings/game/ScProfiler.hpp" -# include "bindings/network/ScNetwork.hpp" -# include "bindings/network/ScPlayer.hpp" -# include "bindings/network/ScPlayerGroup.hpp" -# include "bindings/network/ScSocket.hpp" -# include "bindings/object/ScInstalledObject.hpp" -# include "bindings/object/ScObject.hpp" -# include "bindings/object/ScObjectManager.h" -# include "bindings/ride/ScRide.hpp" -# include "bindings/ride/ScRideStation.hpp" -# include "bindings/world/ScClimate.hpp" -# include "bindings/world/ScDate.hpp" -# include "bindings/world/ScMap.hpp" -# include "bindings/world/ScPark.hpp" -# include "bindings/world/ScParkMessage.hpp" -# include "bindings/world/ScResearch.hpp" -# include "bindings/world/ScScenario.hpp" -# include "bindings/world/ScTile.hpp" -# include "bindings/world/ScTileElement.hpp" + #include "../PlatformEnvironment.h" + #include "../actions/BannerPlaceAction.h" + #include "../actions/CustomAction.h" + #include "../actions/GameAction.h" + #include "../actions/LargeSceneryPlaceAction.h" + #include "../actions/RideCreateAction.h" + #include "../actions/StaffHireNewAction.h" + #include "../actions/WallPlaceAction.h" + #include "../config/Config.h" + #include "../core/EnumMap.hpp" + #include "../core/File.h" + #include "../core/FileScanner.h" + #include "../core/Path.hpp" + #include "../interface/InteractiveConsole.h" + #include "../platform/Platform.h" + #include "Duktape.hpp" + #include "bindings/entity/ScEntity.hpp" + #include "bindings/entity/ScGuest.hpp" + #include "bindings/entity/ScLitter.hpp" + #include "bindings/entity/ScParticle.hpp" + #include "bindings/entity/ScPeep.hpp" + #include "bindings/entity/ScStaff.hpp" + #include "bindings/entity/ScVehicle.hpp" + #include "bindings/game/ScCheats.hpp" + #include "bindings/game/ScConsole.hpp" + #include "bindings/game/ScContext.hpp" + #include "bindings/game/ScDisposable.hpp" + #include "bindings/game/ScPlugin.hpp" + #include "bindings/game/ScProfiler.hpp" + #include "bindings/network/ScNetwork.hpp" + #include "bindings/network/ScPlayer.hpp" + #include "bindings/network/ScPlayerGroup.hpp" + #include "bindings/network/ScSocket.hpp" + #include "bindings/object/ScInstalledObject.hpp" + #include "bindings/object/ScObject.hpp" + #include "bindings/object/ScObjectManager.h" + #include "bindings/ride/ScRide.hpp" + #include "bindings/ride/ScRideStation.hpp" + #include "bindings/world/ScClimate.hpp" + #include "bindings/world/ScDate.hpp" + #include "bindings/world/ScMap.hpp" + #include "bindings/world/ScPark.hpp" + #include "bindings/world/ScParkMessage.hpp" + #include "bindings/world/ScResearch.hpp" + #include "bindings/world/ScScenario.hpp" + #include "bindings/world/ScTile.hpp" + #include "bindings/world/ScTileElement.hpp" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include using namespace OpenRCT2; using namespace OpenRCT2::Scripting; @@ -443,10 +443,10 @@ void ScriptEngine::Initialise() ScPeep::Register(ctx); ScGuest::Register(ctx); ScThought::Register(ctx); -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK ScSocket::Register(ctx); ScListener::Register(ctx); -# endif + #endif ScScenario::Register(ctx); ScScenarioObjective::Register(ctx); ScPatrolArea::Register(ctx); @@ -1749,16 +1749,16 @@ void ScriptEngine::RemoveIntervals(const std::shared_ptr& plugin) } } -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK void ScriptEngine::AddSocket(const std::shared_ptr& socket) { _sockets.push_back(socket); } -# endif + #endif void ScriptEngine::UpdateSockets() { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK // Use simple for i loop as Update calls can modify the list auto it = _sockets.begin(); while (it != _sockets.end()) @@ -1774,12 +1774,12 @@ void ScriptEngine::UpdateSockets() it++; } } -# endif + #endif } void ScriptEngine::RemoveSockets(const std::shared_ptr& plugin) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto it = _sockets.begin(); while (it != _sockets.end()) { @@ -1794,7 +1794,7 @@ void ScriptEngine::RemoveSockets(const std::shared_ptr& plugin) it++; } } -# endif + #endif } std::string OpenRCT2::Scripting::Stringify(const DukValue& val) diff --git a/src/openrct2/scripting/ScriptEngine.h b/src/openrct2/scripting/ScriptEngine.h index 9993840364..e05f1c2fa5 100644 --- a/src/openrct2/scripting/ScriptEngine.h +++ b/src/openrct2/scripting/ScriptEngine.h @@ -11,22 +11,22 @@ #ifdef ENABLE_SCRIPTING -# include "../actions/CustomAction.h" -# include "../core/FileWatcher.h" -# include "../management/Finance.h" -# include "../world/Location.hpp" -# include "HookEngine.h" -# include "Plugin.h" + #include "../actions/CustomAction.h" + #include "../core/FileWatcher.h" + #include "../management/Finance.h" + #include "../world/Location.hpp" + #include "HookEngine.h" + #include "Plugin.h" -# include -# include -# include -# include -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include + #include + #include + #include + #include struct duk_hthread; typedef struct duk_hthread duk_context; @@ -54,9 +54,9 @@ namespace OpenRCT2::Scripting static constexpr int32_t API_VERSION_68_CUSTOM_ACTION_ARGS = 68; static constexpr int32_t API_VERSION_77_NETWORK_IDS = 77; -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK class ScSocketBase; -# endif + #endif class ScriptExecutionInfo { @@ -173,9 +173,9 @@ namespace OpenRCT2::Scripting }; std::unordered_map _customActions; -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK std::list> _sockets; -# endif + #endif public: ScriptEngine(InteractiveConsole& console, IPlatformEnvironment& env); @@ -264,9 +264,9 @@ namespace OpenRCT2::Scripting static std::string_view ExpenditureTypeToString(ExpenditureType expenditureType); static ExpenditureType StringToExpenditureType(std::string_view expenditureType); -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK void AddSocket(const std::shared_ptr& socket); -# endif + #endif private: void RegisterConstants(); diff --git a/src/openrct2/scripting/bindings/entity/ScEntity.hpp b/src/openrct2/scripting/bindings/entity/ScEntity.hpp index 1f5010d436..2126a52842 100644 --- a/src/openrct2/scripting/bindings/entity/ScEntity.hpp +++ b/src/openrct2/scripting/bindings/entity/ScEntity.hpp @@ -11,16 +11,16 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../entity/EntityList.h" -# include "../../../entity/EntityRegistry.h" -# include "../../../entity/Peep.h" -# include "../../../util/Util.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../entity/EntityList.h" + #include "../../../entity/EntityRegistry.h" + #include "../../../entity/Peep.h" + #include "../../../util/Util.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/entity/ScGuest.cpp b/src/openrct2/scripting/bindings/entity/ScGuest.cpp index adffa367b3..4e7a451fca 100644 --- a/src/openrct2/scripting/bindings/entity/ScGuest.cpp +++ b/src/openrct2/scripting/bindings/entity/ScGuest.cpp @@ -9,13 +9,13 @@ #ifdef ENABLE_SCRIPTING -# include "ScGuest.hpp" + #include "ScGuest.hpp" -# include "../../../GameState.h" -# include "../../../entity/Guest.h" -# include "../../../localisation/Formatting.h" -# include "../../../peep/PeepAnimationData.h" -# include "../../../ride/RideEntry.h" + #include "../../../GameState.h" + #include "../../../entity/Guest.h" + #include "../../../localisation/Formatting.h" + #include "../../../peep/PeepAnimationData.h" + #include "../../../ride/RideEntry.h" namespace OpenRCT2::Scripting { @@ -148,7 +148,7 @@ namespace OpenRCT2::Scripting }); static const DukEnumMap availableGuestAnimations({ - { "walking", PeepAnimationType::None }, + { "walking", PeepAnimationType::Walking }, { "checkTime", PeepAnimationType::CheckTime }, { "watchRide", PeepAnimationType::WatchRide }, { "eatFood", PeepAnimationType::EatFood }, @@ -921,7 +921,7 @@ namespace OpenRCT2::Scripting // Special consideration for sitting peeps // TODO: something funky going on in the state machine - if (peep->AnimationType == PeepAnimationType::None && peep->State == PeepState::Sitting) + if (peep->AnimationType == PeepAnimationType::Walking && peep->State == PeepState::Sitting) action = availableGuestAnimations[PeepAnimationType::SittingIdle]; return std::string(action); diff --git a/src/openrct2/scripting/bindings/entity/ScGuest.hpp b/src/openrct2/scripting/bindings/entity/ScGuest.hpp index 02947955b1..69d36bcaf3 100644 --- a/src/openrct2/scripting/bindings/entity/ScGuest.hpp +++ b/src/openrct2/scripting/bindings/entity/ScGuest.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "../../../entity/Guest.h" -# include "../../../management/Marketing.h" -# include "ScPeep.hpp" + #include "../../../entity/Guest.h" + #include "../../../management/Marketing.h" + #include "ScPeep.hpp" enum class PeepAnimationType : uint8_t; diff --git a/src/openrct2/scripting/bindings/entity/ScLitter.cpp b/src/openrct2/scripting/bindings/entity/ScLitter.cpp index 67177cdef5..d6cef1eecc 100644 --- a/src/openrct2/scripting/bindings/entity/ScLitter.cpp +++ b/src/openrct2/scripting/bindings/entity/ScLitter.cpp @@ -9,9 +9,9 @@ #ifdef ENABLE_SCRIPTING -# include "ScLitter.hpp" + #include "ScLitter.hpp" -# include "../../../entity/Litter.h" + #include "../../../entity/Litter.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/entity/ScLitter.hpp b/src/openrct2/scripting/bindings/entity/ScLitter.hpp index 6f83ae3d09..4cd837cf08 100644 --- a/src/openrct2/scripting/bindings/entity/ScLitter.hpp +++ b/src/openrct2/scripting/bindings/entity/ScLitter.hpp @@ -11,7 +11,7 @@ #ifdef ENABLE_SCRIPTING -# include "ScEntity.hpp" + #include "ScEntity.hpp" struct Litter; diff --git a/src/openrct2/scripting/bindings/entity/ScParticle.hpp b/src/openrct2/scripting/bindings/entity/ScParticle.hpp index 1dbdec41dc..2798e281d6 100644 --- a/src/openrct2/scripting/bindings/entity/ScParticle.hpp +++ b/src/openrct2/scripting/bindings/entity/ScParticle.hpp @@ -11,11 +11,11 @@ #ifdef ENABLE_SCRIPTING -# include "../../../entity/Particle.h" -# include "../../../world/Location.hpp" -# include "ScEntity.hpp" + #include "../../../entity/Particle.h" + #include "../../../world/Location.hpp" + #include "ScEntity.hpp" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/entity/ScPeep.hpp b/src/openrct2/scripting/bindings/entity/ScPeep.hpp index 8cc4d4287a..9846349944 100644 --- a/src/openrct2/scripting/bindings/entity/ScPeep.hpp +++ b/src/openrct2/scripting/bindings/entity/ScPeep.hpp @@ -11,7 +11,7 @@ #ifdef ENABLE_SCRIPTING -# include "ScEntity.hpp" + #include "ScEntity.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/entity/ScStaff.cpp b/src/openrct2/scripting/bindings/entity/ScStaff.cpp index 3f6b993ad5..6df3274d85 100644 --- a/src/openrct2/scripting/bindings/entity/ScStaff.cpp +++ b/src/openrct2/scripting/bindings/entity/ScStaff.cpp @@ -9,16 +9,16 @@ #ifdef ENABLE_SCRIPTING -# include "ScStaff.hpp" + #include "ScStaff.hpp" -# include "../../../entity/PatrolArea.h" -# include "../../../entity/Staff.h" -# include "../../../peep/PeepAnimationData.h" + #include "../../../entity/PatrolArea.h" + #include "../../../entity/Staff.h" + #include "../../../peep/PeepAnimationData.h" namespace OpenRCT2::Scripting { static const DukEnumMap availableHandymanAnimations({ - { "walking", PeepAnimationType::None }, + { "walking", PeepAnimationType::Walking }, { "watchRide", PeepAnimationType::WatchRide }, { "hanging", PeepAnimationType::Hanging }, { "staffMower", PeepAnimationType::StaffMower }, @@ -29,7 +29,7 @@ namespace OpenRCT2::Scripting }); static const DukEnumMap availableMechanicAnimations({ - { "walking", PeepAnimationType::None }, + { "walking", PeepAnimationType::Walking }, { "watchRide", PeepAnimationType::WatchRide }, { "hanging", PeepAnimationType::Hanging }, { "drowning", PeepAnimationType::Drowning }, @@ -43,14 +43,14 @@ namespace OpenRCT2::Scripting }); static const DukEnumMap availableSecurityAnimations({ - { "walking", PeepAnimationType::None }, + { "walking", PeepAnimationType::Walking }, { "watchRide", PeepAnimationType::WatchRide }, { "hanging", PeepAnimationType::Hanging }, { "drowning", PeepAnimationType::Drowning }, }); static const DukEnumMap availableEntertainerAnimations({ - { "walking", PeepAnimationType::None }, + { "walking", PeepAnimationType::Walking }, { "watchRide", PeepAnimationType::WatchRide }, { "wave", PeepAnimationType::EatFood }, // NB: this not a typo { "hanging", PeepAnimationType::Hanging }, @@ -136,7 +136,7 @@ namespace OpenRCT2::Scripting // Reset state to walking to prevent invalid actions from carrying over peep->Action = PeepActionType::Walking; - peep->AnimationType = peep->NextAnimationType = PeepAnimationType::None; + peep->AnimationType = peep->NextAnimationType = PeepAnimationType::Walking; } } diff --git a/src/openrct2/scripting/bindings/entity/ScStaff.hpp b/src/openrct2/scripting/bindings/entity/ScStaff.hpp index 112431e4a0..12bb57819f 100644 --- a/src/openrct2/scripting/bindings/entity/ScStaff.hpp +++ b/src/openrct2/scripting/bindings/entity/ScStaff.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "ScPeep.hpp" + #include "ScPeep.hpp" -# include + #include enum class PeepAnimationType : uint8_t; enum class StaffType : uint8_t; diff --git a/src/openrct2/scripting/bindings/entity/ScVehicle.hpp b/src/openrct2/scripting/bindings/entity/ScVehicle.hpp index 4837bf6cbe..7955a162a7 100644 --- a/src/openrct2/scripting/bindings/entity/ScVehicle.hpp +++ b/src/openrct2/scripting/bindings/entity/ScVehicle.hpp @@ -11,10 +11,10 @@ #ifdef ENABLE_SCRIPTING -# include "../../../ride/Ride.h" -# include "ScEntity.hpp" + #include "../../../ride/Ride.h" + #include "ScEntity.hpp" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/game/ScCheats.hpp b/src/openrct2/scripting/bindings/game/ScCheats.hpp index 4ba6849a8b..8419b63ee8 100644 --- a/src/openrct2/scripting/bindings/game/ScCheats.hpp +++ b/src/openrct2/scripting/bindings/game/ScCheats.hpp @@ -11,10 +11,10 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Cheats.h" -# include "../../../GameState.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Cheats.h" + #include "../../../GameState.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { @@ -79,266 +79,266 @@ namespace OpenRCT2::Scripting private: bool allowArbitraryRideTypeChanges_get() { - return GetGameState().Cheats.AllowArbitraryRideTypeChanges; + return GetGameState().Cheats.allowArbitraryRideTypeChanges; } void allowArbitraryRideTypeChanges_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.AllowArbitraryRideTypeChanges = value; + GetGameState().Cheats.allowArbitraryRideTypeChanges = value; } bool allowTrackPlaceInvalidHeights_get() { - return GetGameState().Cheats.AllowTrackPlaceInvalidHeights; + return GetGameState().Cheats.allowTrackPlaceInvalidHeights; } void allowTrackPlaceInvalidHeights_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.AllowTrackPlaceInvalidHeights = value; + GetGameState().Cheats.allowTrackPlaceInvalidHeights = value; } bool buildInPauseMode_get() { - return GetGameState().Cheats.BuildInPauseMode; + return GetGameState().Cheats.buildInPauseMode; } void buildInPauseMode_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.BuildInPauseMode = value; + GetGameState().Cheats.buildInPauseMode = value; } bool disableAllBreakdowns_get() { - return GetGameState().Cheats.DisableAllBreakdowns; + return GetGameState().Cheats.disableAllBreakdowns; } void disableAllBreakdowns_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableAllBreakdowns = value; + GetGameState().Cheats.disableAllBreakdowns = value; } bool disableBrakesFailure_get() { - return GetGameState().Cheats.DisableBrakesFailure; + return GetGameState().Cheats.disableBrakesFailure; } void disableBrakesFailure_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableBrakesFailure = value; + GetGameState().Cheats.disableBrakesFailure = value; } bool disableClearanceChecks_get() { - return GetGameState().Cheats.DisableClearanceChecks; + return GetGameState().Cheats.disableClearanceChecks; } void disableClearanceChecks_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableClearanceChecks = value; + GetGameState().Cheats.disableClearanceChecks = value; } bool disableLittering_get() { - return GetGameState().Cheats.DisableLittering; + return GetGameState().Cheats.disableLittering; } void disableLittering_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableLittering = value; + GetGameState().Cheats.disableLittering = value; } bool disablePlantAging_get() { - return GetGameState().Cheats.DisablePlantAging; + return GetGameState().Cheats.disablePlantAging; } void disablePlantAging_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisablePlantAging = value; + GetGameState().Cheats.disablePlantAging = value; } bool allowRegularPathAsQueue_get() { - return GetGameState().Cheats.AllowRegularPathAsQueue; + return GetGameState().Cheats.allowRegularPathAsQueue; } void allowRegularPathAsQueue_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.AllowRegularPathAsQueue = value; + GetGameState().Cheats.allowRegularPathAsQueue = value; } bool allowSpecialColourSchemes_get() { - return GetGameState().Cheats.AllowSpecialColourSchemes; + return GetGameState().Cheats.allowSpecialColourSchemes; } void allowSpecialColourSchemes_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.AllowSpecialColourSchemes = value; + GetGameState().Cheats.allowSpecialColourSchemes = value; } bool disableRideValueAging_get() { - return GetGameState().Cheats.DisableRideValueAging; + return GetGameState().Cheats.disableRideValueAging; } void disableRideValueAging_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableRideValueAging = value; + GetGameState().Cheats.disableRideValueAging = value; } bool disableSupportLimits_get() { - return GetGameState().Cheats.DisableSupportLimits; + return GetGameState().Cheats.disableSupportLimits; } void disableSupportLimits_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableSupportLimits = value; + GetGameState().Cheats.disableSupportLimits = value; } bool disableTrainLengthLimit_get() { - return GetGameState().Cheats.DisableTrainLengthLimit; + return GetGameState().Cheats.disableTrainLengthLimit; } void disableTrainLengthLimit_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableTrainLengthLimit = value; + GetGameState().Cheats.disableTrainLengthLimit = value; } bool disableVandalism_get() { - return GetGameState().Cheats.DisableVandalism; + return GetGameState().Cheats.disableVandalism; } void disableVandalism_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.DisableVandalism = value; + GetGameState().Cheats.disableVandalism = value; } bool enableAllDrawableTrackPieces_get() { - return GetGameState().Cheats.EnableAllDrawableTrackPieces; + return GetGameState().Cheats.enableAllDrawableTrackPieces; } void enableAllDrawableTrackPieces_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.EnableAllDrawableTrackPieces = value; + GetGameState().Cheats.enableAllDrawableTrackPieces = value; } bool enableChainLiftOnAllTrack_get() { - return GetGameState().Cheats.EnableChainLiftOnAllTrack; + return GetGameState().Cheats.enableChainLiftOnAllTrack; } void enableChainLiftOnAllTrack_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.EnableChainLiftOnAllTrack = value; + GetGameState().Cheats.enableChainLiftOnAllTrack = value; } bool fastLiftHill_get() { - return GetGameState().Cheats.UnlockOperatingLimits; + return GetGameState().Cheats.unlockOperatingLimits; } void fastLiftHill_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.UnlockOperatingLimits = value; + GetGameState().Cheats.unlockOperatingLimits = value; } bool freezeWeather_get() { - return GetGameState().Cheats.FreezeWeather; + return GetGameState().Cheats.freezeWeather; } void freezeWeather_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.FreezeWeather = value; + GetGameState().Cheats.freezeWeather = value; } bool ignoreResearchStatus_get() { - return GetGameState().Cheats.IgnoreResearchStatus; + return GetGameState().Cheats.ignoreResearchStatus; } void ignoreResearchStatus_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.IgnoreResearchStatus = value; + GetGameState().Cheats.ignoreResearchStatus = value; } bool ignoreRideIntensity_get() { - return GetGameState().Cheats.IgnoreRideIntensity; + return GetGameState().Cheats.ignoreRideIntensity; } void ignoreRideIntensity_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.IgnoreRideIntensity = value; + GetGameState().Cheats.ignoreRideIntensity = value; } bool neverendingMarketing_get() { - return GetGameState().Cheats.NeverendingMarketing; + return GetGameState().Cheats.neverendingMarketing; } void neverendingMarketing_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.NeverendingMarketing = value; + GetGameState().Cheats.neverendingMarketing = value; } bool sandboxMode_get() { - return GetGameState().Cheats.SandboxMode; + return GetGameState().Cheats.sandboxMode; } void sandboxMode_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.SandboxMode = value; + GetGameState().Cheats.sandboxMode = value; } bool showAllOperatingModes_get() { - return GetGameState().Cheats.ShowAllOperatingModes; + return GetGameState().Cheats.showAllOperatingModes; } void showAllOperatingModes_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.ShowAllOperatingModes = value; + GetGameState().Cheats.showAllOperatingModes = value; } bool showVehiclesFromOtherTrackTypes_get() { - return GetGameState().Cheats.ShowVehiclesFromOtherTrackTypes; + return GetGameState().Cheats.showVehiclesFromOtherTrackTypes; } void showVehiclesFromOtherTrackTypes_set(bool value) { ThrowIfGameStateNotMutable(); - GetGameState().Cheats.ShowVehiclesFromOtherTrackTypes = value; + GetGameState().Cheats.showVehiclesFromOtherTrackTypes = value; } }; } // namespace OpenRCT2::Scripting diff --git a/src/openrct2/scripting/bindings/game/ScConfiguration.hpp b/src/openrct2/scripting/bindings/game/ScConfiguration.hpp index 452aa69094..699714a8e9 100644 --- a/src/openrct2/scripting/bindings/game/ScConfiguration.hpp +++ b/src/openrct2/scripting/bindings/game/ScConfiguration.hpp @@ -11,11 +11,11 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../config/Config.h" -# include "../../../localisation/LocalisationService.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../config/Config.h" + #include "../../../localisation/LocalisationService.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/game/ScConsole.hpp b/src/openrct2/scripting/bindings/game/ScConsole.hpp index d5d13468a5..88d18d8ddc 100644 --- a/src/openrct2/scripting/bindings/game/ScConsole.hpp +++ b/src/openrct2/scripting/bindings/game/ScConsole.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "../../../interface/InteractiveConsole.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../interface/InteractiveConsole.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/game/ScContext.hpp b/src/openrct2/scripting/bindings/game/ScContext.hpp index 8760ea6373..e1a28cbc92 100644 --- a/src/openrct2/scripting/bindings/game/ScContext.hpp +++ b/src/openrct2/scripting/bindings/game/ScContext.hpp @@ -11,23 +11,23 @@ #ifdef ENABLE_SCRIPTING -# include "../../../OpenRCT2.h" -# include "../../../actions/GameAction.h" -# include "../../../interface/Screenshot.h" -# include "../../../localisation/Formatting.h" -# include "../../../object/ObjectManager.h" -# include "../../../scenario/Scenario.h" -# include "../../Duktape.hpp" -# include "../../HookEngine.h" -# include "../../IconNames.hpp" -# include "../../ScriptEngine.h" -# include "../game/ScConfiguration.hpp" -# include "../game/ScDisposable.hpp" -# include "../object/ScObjectManager.h" -# include "../ride/ScTrackSegment.h" + #include "../../../OpenRCT2.h" + #include "../../../actions/GameAction.h" + #include "../../../interface/Screenshot.h" + #include "../../../localisation/Formatting.h" + #include "../../../object/ObjectManager.h" + #include "../../../scenario/Scenario.h" + #include "../../Duktape.hpp" + #include "../../HookEngine.h" + #include "../../IconNames.hpp" + #include "../../ScriptEngine.h" + #include "../game/ScConfiguration.hpp" + #include "../game/ScDisposable.hpp" + #include "../object/ScObjectManager.h" + #include "../ride/ScTrackSegment.h" -# include -# include + #include + #include namespace OpenRCT2::Scripting { @@ -267,12 +267,12 @@ namespace OpenRCT2::Scripting return 1; } -# ifdef _MSC_VER + #ifdef _MSC_VER // HACK workaround to resolve issue #14853 // The exception thrown in duk_error was causing a crash when RAII kicked in for this lambda. // Only ensuring it was not in the same generated method fixed it. __declspec(noinline) -# endif + #endif std::shared_ptr CreateSubscription(HOOK_TYPE hookType, const DukValue& callback) { diff --git a/src/openrct2/scripting/bindings/game/ScDisposable.hpp b/src/openrct2/scripting/bindings/game/ScDisposable.hpp index 761d7b204f..79e976afa7 100644 --- a/src/openrct2/scripting/bindings/game/ScDisposable.hpp +++ b/src/openrct2/scripting/bindings/game/ScDisposable.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" + #include "../../Duktape.hpp" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/game/ScPlugin.hpp b/src/openrct2/scripting/bindings/game/ScPlugin.hpp index 0253b08e56..834f02472c 100644 --- a/src/openrct2/scripting/bindings/game/ScPlugin.hpp +++ b/src/openrct2/scripting/bindings/game/ScPlugin.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "../game/ScContext.hpp" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "../game/ScContext.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/game/ScProfiler.hpp b/src/openrct2/scripting/bindings/game/ScProfiler.hpp index 27843c12b4..67ab448e15 100644 --- a/src/openrct2/scripting/bindings/game/ScProfiler.hpp +++ b/src/openrct2/scripting/bindings/game/ScProfiler.hpp @@ -11,8 +11,8 @@ #ifdef ENABLE_SCRIPTING -# include "../../../profiling/Profiling.h" -# include "../../Duktape.hpp" + #include "../../../profiling/Profiling.h" + #include "../../Duktape.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/network/ScNetwork.cpp b/src/openrct2/scripting/bindings/network/ScNetwork.cpp index a3b1f08f5c..bc3ac9b55e 100644 --- a/src/openrct2/scripting/bindings/network/ScNetwork.cpp +++ b/src/openrct2/scripting/bindings/network/ScNetwork.cpp @@ -9,13 +9,13 @@ #ifdef ENABLE_SCRIPTING -# include "ScNetwork.hpp" + #include "ScNetwork.hpp" -# include "../../../Context.h" -# include "../../../actions/NetworkModifyGroupAction.h" -# include "../../../actions/PlayerKickAction.h" -# include "../../../network/NetworkAction.h" -# include "../../../network/network.h" + #include "../../../Context.h" + #include "../../../actions/NetworkModifyGroupAction.h" + #include "../../../actions/PlayerKickAction.h" + #include "../../../network/NetworkAction.h" + #include "../../../network/network.h" namespace OpenRCT2::Scripting { @@ -26,7 +26,7 @@ namespace OpenRCT2::Scripting std::string ScNetwork::mode_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK switch (NetworkGetMode()) { case NETWORK_MODE_SERVER: @@ -34,86 +34,86 @@ namespace OpenRCT2::Scripting case NETWORK_MODE_CLIENT: return "client"; } -# endif + #endif return "none"; } int32_t ScNetwork::numPlayers_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK return NetworkGetNumPlayers(); -# else + #else return 0; -# endif + #endif } int32_t ScNetwork::numGroups_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK return NetworkGetNumGroups(); -# else + #else return 0; -# endif + #endif } int32_t ScNetwork::defaultGroup_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK return NetworkGetDefaultGroup(); -# else + #else return 0; -# endif + #endif } void ScNetwork::defaultGroup_set(int32_t value) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto action = NetworkModifyGroupAction(ModifyGroupType::SetDefault, value); GameActions::Execute(&action); -# endif + #endif } std::vector> ScNetwork::groups_get() const { std::vector> groups; -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto numGroups = NetworkGetNumGroups(); for (int32_t i = 0; i < numGroups; i++) { auto groupId = NetworkGetGroupID(i); groups.push_back(std::make_shared(groupId)); } -# endif + #endif return groups; } std::vector> ScNetwork::players_get() const { std::vector> players; -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto numPlayers = NetworkGetNumPlayers(); for (int32_t i = 0; i < numPlayers; i++) { auto playerId = NetworkGetPlayerID(i); players.push_back(std::make_shared(playerId)); } -# endif + #endif return players; } std::shared_ptr ScNetwork::currentPlayer_get() const { std::shared_ptr player; -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto playerId = NetworkGetCurrentPlayerId(); player = std::make_shared(playerId); -# endif + #endif return player; } std::shared_ptr ScNetwork::getPlayer(int32_t id) const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK if (GetTargetAPIVersion() < API_VERSION_77_NETWORK_IDS) { auto index = id; @@ -133,13 +133,13 @@ namespace OpenRCT2::Scripting } } -# endif + #endif return nullptr; } DukValue ScNetwork::stats_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto obj = OpenRCT2::Scripting::DukObject(_context); auto networkStats = NetworkGetStats(); { @@ -165,14 +165,14 @@ namespace OpenRCT2::Scripting obj.Set("bytesSent", DukValue::take_from_stack(_context)); } return obj.Take(); -# else + #else return ToDuk(_context, nullptr); -# endif + #endif } std::shared_ptr ScNetwork::getGroup(int32_t id) const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK if (GetTargetAPIVersion() < API_VERSION_77_NETWORK_IDS) { auto index = id; @@ -191,21 +191,21 @@ namespace OpenRCT2::Scripting return std::make_shared(id); } } -# endif + #endif return nullptr; } void ScNetwork::addGroup() { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto networkModifyGroup = NetworkModifyGroupAction(ModifyGroupType::AddGroup); GameActions::Execute(&networkModifyGroup); -# endif + #endif } void ScNetwork::removeGroup(int32_t id) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK if (GetTargetAPIVersion() < API_VERSION_77_NETWORK_IDS) { auto index = id; @@ -226,12 +226,12 @@ namespace OpenRCT2::Scripting GameActions::Execute(&networkAction); } } -# endif + #endif } void ScNetwork::kickPlayer(int32_t id) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK if (GetTargetAPIVersion() < API_VERSION_77_NETWORK_IDS) { auto index = id; @@ -252,12 +252,12 @@ namespace OpenRCT2::Scripting GameActions::Execute(&kickPlayerAction); } } -# endif + #endif } void ScNetwork::sendMessage(std::string message, DukValue players) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK if (players.is_array()) { if (NetworkGetMode() == NETWORK_MODE_SERVER) @@ -285,10 +285,10 @@ namespace OpenRCT2::Scripting { NetworkSendChat(message.c_str()); } -# endif + #endif } -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK std::shared_ptr ScNetwork::createListener() { auto& scriptEngine = GetContext()->GetScriptEngine(); @@ -297,14 +297,14 @@ namespace OpenRCT2::Scripting scriptEngine.AddSocket(socket); return socket; } -# else + #else void ScNetwork::createListener() { duk_error(_context, DUK_ERR_ERROR, "Networking has been disabled."); } -# endif + #endif -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK std::shared_ptr ScNetwork::createSocket() { auto& scriptEngine = GetContext()->GetScriptEngine(); @@ -313,12 +313,12 @@ namespace OpenRCT2::Scripting scriptEngine.AddSocket(socket); return socket; } -# else + #else void ScNetwork::createSocket() { duk_error(_context, DUK_ERR_ERROR, "Networking has been disabled."); } -# endif + #endif void ScNetwork::Register(duk_context* ctx) { diff --git a/src/openrct2/scripting/bindings/network/ScNetwork.hpp b/src/openrct2/scripting/bindings/network/ScNetwork.hpp index d1b65c8db4..07b14a84d4 100644 --- a/src/openrct2/scripting/bindings/network/ScNetwork.hpp +++ b/src/openrct2/scripting/bindings/network/ScNetwork.hpp @@ -11,21 +11,21 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" -# include "ScPlayer.hpp" -# include "ScPlayerGroup.hpp" -# include "ScSocket.hpp" + #include "../../Duktape.hpp" + #include "ScPlayer.hpp" + #include "ScPlayerGroup.hpp" + #include "ScSocket.hpp" -# include + #include namespace OpenRCT2::Scripting { class ScNetwork { private: -# ifdef __clang__ + #ifdef __clang__ [[maybe_unused]] -# endif + #endif duk_context* _context; public: @@ -57,17 +57,17 @@ namespace OpenRCT2::Scripting void sendMessage(std::string message, DukValue players); -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK std::shared_ptr createListener(); -# else + #else void createListener(); -# endif + #endif -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK std::shared_ptr createSocket(); -# else + #else void createSocket(); -# endif + #endif static void Register(duk_context* ctx); }; diff --git a/src/openrct2/scripting/bindings/network/ScPlayer.cpp b/src/openrct2/scripting/bindings/network/ScPlayer.cpp index 2af77ef49d..56362bce3f 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayer.cpp +++ b/src/openrct2/scripting/bindings/network/ScPlayer.cpp @@ -9,12 +9,12 @@ #ifdef ENABLE_SCRIPTING -# include "ScPlayer.hpp" + #include "ScPlayer.hpp" -# include "../../../Context.h" -# include "../../../actions/PlayerSetGroupAction.h" -# include "../../../network/NetworkAction.h" -# include "../../../network/network.h" + #include "../../../Context.h" + #include "../../../actions/PlayerSetGroupAction.h" + #include "../../../network/NetworkAction.h" + #include "../../../network/network.h" namespace OpenRCT2::Scripting { @@ -30,69 +30,69 @@ namespace OpenRCT2::Scripting std::string ScPlayer::name_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetPlayerIndex(_id); if (index == -1) return {}; return NetworkGetPlayerName(index); -# else + #else return {}; -# endif + #endif } int32_t ScPlayer::group_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetPlayerIndex(_id); if (index == -1) return {}; return NetworkGetPlayerGroup(index); -# else + #else return 0; -# endif + #endif } void ScPlayer::group_set(int32_t value) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto playerSetGroupAction = PlayerSetGroupAction(_id, value); GameActions::Execute(&playerSetGroupAction); -# endif + #endif } int32_t ScPlayer::ping_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetPlayerIndex(_id); if (index == -1) return {}; return NetworkGetPlayerPing(index); -# else + #else return 0; -# endif + #endif } int32_t ScPlayer::commandsRan_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetPlayerIndex(_id); if (index == -1) return {}; return NetworkGetPlayerCommandsRan(index); -# else + #else return 0; -# endif + #endif } int32_t ScPlayer::moneySpent_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetPlayerIndex(_id); if (index == -1) return {}; return NetworkGetPlayerMoneySpent(index); -# else + #else return 0; -# endif + #endif } std::string ScPlayer::ipAddress_get() const diff --git a/src/openrct2/scripting/bindings/network/ScPlayer.hpp b/src/openrct2/scripting/bindings/network/ScPlayer.hpp index 1826597953..056dea1205 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayer.hpp +++ b/src/openrct2/scripting/bindings/network/ScPlayer.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" + #include "../../Duktape.hpp" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp b/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp index 4ba8be2ebf..2bae124bdd 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp +++ b/src/openrct2/scripting/bindings/network/ScPlayerGroup.cpp @@ -9,15 +9,15 @@ #ifdef ENABLE_SCRIPTING -# include "ScPlayerGroup.hpp" + #include "ScPlayerGroup.hpp" -# include "../../../Context.h" -# include "../../../actions/NetworkModifyGroupAction.h" -# include "../../../actions/PlayerSetGroupAction.h" -# include "../../../core/String.hpp" -# include "../../../network/NetworkAction.h" -# include "../../../network/network.h" -# include "../../Duktape.hpp" + #include "../../../Context.h" + #include "../../../actions/NetworkModifyGroupAction.h" + #include "../../../actions/PlayerSetGroupAction.h" + #include "../../../core/String.hpp" + #include "../../../network/NetworkAction.h" + #include "../../../network/network.h" + #include "../../Duktape.hpp" namespace OpenRCT2::Scripting { @@ -33,25 +33,25 @@ namespace OpenRCT2::Scripting std::string ScPlayerGroup::name_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetGroupIndex(_id); if (index == -1) return {}; return NetworkGetGroupName(index); -# else + #else return {}; -# endif + #endif } void ScPlayerGroup::name_set(std::string value) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto action = NetworkModifyGroupAction(ModifyGroupType::SetName, _id, value); GameActions::Execute(&action); -# endif + #endif } -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK static std::string TransformPermissionKeyToJS(const std::string& s) { auto result = s.substr(sizeof("PERMISSION_") - 1); @@ -66,11 +66,11 @@ namespace OpenRCT2::Scripting { return "PERMISSION_" + String::ToUpper(s); } -# endif + #endif std::vector ScPlayerGroup::permissions_get() const { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto index = NetworkGetGroupIndex(_id); if (index == -1) return {}; @@ -87,14 +87,14 @@ namespace OpenRCT2::Scripting permissionIndex++; } return result; -# else + #else return {}; -# endif + #endif } void ScPlayerGroup::permissions_set(std::vector value) { -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK auto groupIndex = NetworkGetGroupIndex(_id); if (groupIndex == -1) return; @@ -131,7 +131,7 @@ namespace OpenRCT2::Scripting GameActions::Execute(&networkAction2); } } -# endif + #endif } void ScPlayerGroup::Register(duk_context* ctx) diff --git a/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp b/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp index f97a03bfc0..b2854ec0f3 100644 --- a/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp +++ b/src/openrct2/scripting/bindings/network/ScPlayerGroup.hpp @@ -11,10 +11,10 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" + #include "../../Duktape.hpp" -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/network/ScSocket.hpp b/src/openrct2/scripting/bindings/network/ScSocket.hpp index f5a6ab4e0d..1f9849993c 100644 --- a/src/openrct2/scripting/bindings/network/ScSocket.hpp +++ b/src/openrct2/scripting/bindings/network/ScSocket.hpp @@ -10,16 +10,16 @@ #pragma once #ifdef ENABLE_SCRIPTING -# ifndef DISABLE_NETWORK + #ifndef DISABLE_NETWORK -# include "../../../Context.h" -# include "../../../config/Config.h" -# include "../../../network/Socket.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../config/Config.h" + #include "../../../network/Socket.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" -# include -# include + #include + #include namespace OpenRCT2::Scripting { @@ -556,5 +556,5 @@ namespace OpenRCT2::Scripting }; } // namespace OpenRCT2::Scripting -# endif + #endif #endif diff --git a/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp b/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp index 7590eba2ee..57fc102304 100644 --- a/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp +++ b/src/openrct2/scripting/bindings/object/ScInstalledObject.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../object/ObjectRepository.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../object/ObjectRepository.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/object/ScObject.hpp b/src/openrct2/scripting/bindings/object/ScObject.hpp index 0f41cbc1b9..08c68c705c 100644 --- a/src/openrct2/scripting/bindings/object/ScObject.hpp +++ b/src/openrct2/scripting/bindings/object/ScObject.hpp @@ -11,18 +11,18 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../object/LargeSceneryObject.h" -# include "../../../object/ObjectManager.h" -# include "../../../object/RideObject.h" -# include "../../../object/SceneryGroupObject.h" -# include "../../../object/SmallSceneryObject.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "ScInstalledObject.hpp" + #include "../../../Context.h" + #include "../../../object/LargeSceneryObject.h" + #include "../../../object/ObjectManager.h" + #include "../../../object/RideObject.h" + #include "../../../object/SceneryGroupObject.h" + #include "../../../object/SmallSceneryObject.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "ScInstalledObject.hpp" -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/object/ScObjectManager.cpp b/src/openrct2/scripting/bindings/object/ScObjectManager.cpp index 39742f16e4..b17ff1033d 100644 --- a/src/openrct2/scripting/bindings/object/ScObjectManager.cpp +++ b/src/openrct2/scripting/bindings/object/ScObjectManager.cpp @@ -9,12 +9,12 @@ #ifdef ENABLE_SCRIPTING -# include "ScObjectManager.h" + #include "ScObjectManager.h" -# include "../../../object/ObjectList.h" -# include "../../../ride/RideData.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../object/ObjectList.h" + #include "../../../ride/RideData.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" using namespace OpenRCT2; using namespace OpenRCT2::Scripting; diff --git a/src/openrct2/scripting/bindings/object/ScObjectManager.h b/src/openrct2/scripting/bindings/object/ScObjectManager.h index 4a440c019c..de3e3195e0 100644 --- a/src/openrct2/scripting/bindings/object/ScObjectManager.h +++ b/src/openrct2/scripting/bindings/object/ScObjectManager.h @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "ScInstalledObject.hpp" -# include "ScObject.hpp" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "ScInstalledObject.hpp" + #include "ScObject.hpp" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/ride/ScRide.cpp b/src/openrct2/scripting/bindings/ride/ScRide.cpp index 60566ead32..5698a6f805 100644 --- a/src/openrct2/scripting/bindings/ride/ScRide.cpp +++ b/src/openrct2/scripting/bindings/ride/ScRide.cpp @@ -9,15 +9,15 @@ #ifdef ENABLE_SCRIPTING -# include "ScRide.hpp" + #include "ScRide.hpp" -# include "../../../Context.h" -# include "../../../core/UnitConversion.h" -# include "../../../ride/Ride.h" -# include "../../../ride/RideData.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "../object/ScObject.hpp" + #include "../../../Context.h" + #include "../../../core/UnitConversion.h" + #include "../../../ride/Ride.h" + #include "../../../ride/RideData.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "../object/ScObject.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/ride/ScRide.hpp b/src/openrct2/scripting/bindings/ride/ScRide.hpp index a1f3165630..fcff9e1cdc 100644 --- a/src/openrct2/scripting/bindings/ride/ScRide.hpp +++ b/src/openrct2/scripting/bindings/ride/ScRide.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../ride/Ride.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "../object/ScObject.hpp" -# include "ScRideStation.hpp" + #include "../../../Context.h" + #include "../../../ride/Ride.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "../object/ScObject.hpp" + #include "ScRideStation.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/ride/ScRideStation.cpp b/src/openrct2/scripting/bindings/ride/ScRideStation.cpp index 18a4c9e8b4..c1363486fd 100644 --- a/src/openrct2/scripting/bindings/ride/ScRideStation.cpp +++ b/src/openrct2/scripting/bindings/ride/ScRideStation.cpp @@ -9,13 +9,13 @@ #ifdef ENABLE_SCRIPTING -# include "ScRideStation.hpp" + #include "ScRideStation.hpp" -# include "../../../Context.h" -# include "../../../ride/Ride.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "../object/ScObject.hpp" + #include "../../../Context.h" + #include "../../../ride/Ride.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "../object/ScObject.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/ride/ScRideStation.hpp b/src/openrct2/scripting/bindings/ride/ScRideStation.hpp index 9dd604290e..34c0207da9 100644 --- a/src/openrct2/scripting/bindings/ride/ScRideStation.hpp +++ b/src/openrct2/scripting/bindings/ride/ScRideStation.hpp @@ -11,9 +11,9 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../ride/Ride.h" -# include "../../Duktape.hpp" + #include "../../../Context.h" + #include "../../../ride/Ride.h" + #include "../../Duktape.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp b/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp index a54e151b83..93283e907d 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp +++ b/src/openrct2/scripting/bindings/ride/ScTrackIterator.cpp @@ -9,14 +9,14 @@ #ifdef ENABLE_SCRIPTING -# include "ScTrackIterator.h" + #include "ScTrackIterator.h" -# include "../../../Context.h" -# include "../../../ride/Ride.h" -# include "../../../ride/TrackData.h" -# include "../../../world/tile_element/TrackElement.h" -# include "../../ScriptEngine.h" -# include "ScTrackSegment.h" + #include "../../../Context.h" + #include "../../../ride/Ride.h" + #include "../../../ride/TrackData.h" + #include "../../../world/tile_element/TrackElement.h" + #include "../../ScriptEngine.h" + #include "ScTrackSegment.h" using namespace OpenRCT2::Scripting; using namespace OpenRCT2::TrackMetaData; diff --git a/src/openrct2/scripting/bindings/ride/ScTrackIterator.h b/src/openrct2/scripting/bindings/ride/ScTrackIterator.h index b3a977e957..6c5353afff 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackIterator.h +++ b/src/openrct2/scripting/bindings/ride/ScTrackIterator.h @@ -11,11 +11,11 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Identifiers.h" -# include "../../Duktape.hpp" + #include "../../../Identifiers.h" + #include "../../Duktape.hpp" -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp b/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp index 4a3c469eac..27da8c20cc 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp +++ b/src/openrct2/scripting/bindings/ride/ScTrackSegment.cpp @@ -9,12 +9,12 @@ #ifdef ENABLE_SCRIPTING -# include "ScTrackSegment.h" + #include "ScTrackSegment.h" -# include "../../../Context.h" -# include "../../../ride/TrackData.h" -# include "../../../ride/Vehicle.h" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../ride/TrackData.h" + #include "../../../ride/Vehicle.h" + #include "../../ScriptEngine.h" using namespace OpenRCT2::Scripting; using namespace OpenRCT2::TrackMetaData; diff --git a/src/openrct2/scripting/bindings/ride/ScTrackSegment.h b/src/openrct2/scripting/bindings/ride/ScTrackSegment.h index 92722711aa..3eee4d37af 100644 --- a/src/openrct2/scripting/bindings/ride/ScTrackSegment.h +++ b/src/openrct2/scripting/bindings/ride/ScTrackSegment.h @@ -11,10 +11,10 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" + #include "../../Duktape.hpp" -# include -# include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScClimate.hpp b/src/openrct2/scripting/bindings/world/ScClimate.hpp index 677e658464..91d8c3d5fc 100644 --- a/src/openrct2/scripting/bindings/world/ScClimate.hpp +++ b/src/openrct2/scripting/bindings/world/ScClimate.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../GameState.h" -# include "../../../core/StringTypes.h" -# include "../../../world/Climate.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../GameState.h" + #include "../../../core/StringTypes.h" + #include "../../../world/Climate.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScDate.hpp b/src/openrct2/scripting/bindings/world/ScDate.hpp index a04b0a201f..27bcafdc60 100644 --- a/src/openrct2/scripting/bindings/world/ScDate.hpp +++ b/src/openrct2/scripting/bindings/world/ScDate.hpp @@ -11,13 +11,13 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../Date.h" -# include "../../../Game.h" -# include "../../../GameState.h" -# include "../../../localisation/Localisation.Date.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../Date.h" + #include "../../../Game.h" + #include "../../../GameState.h" + #include "../../../localisation/Localisation.Date.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScMap.cpp b/src/openrct2/scripting/bindings/world/ScMap.cpp index de59a8c083..8269838f6b 100644 --- a/src/openrct2/scripting/bindings/world/ScMap.cpp +++ b/src/openrct2/scripting/bindings/world/ScMap.cpp @@ -9,31 +9,31 @@ #ifdef ENABLE_SCRIPTING -# include "ScMap.hpp" + #include "ScMap.hpp" -# include "../../../GameState.h" -# include "../../../entity/Balloon.h" -# include "../../../entity/Duck.h" -# include "../../../entity/EntityList.h" -# include "../../../entity/Fountain.h" -# include "../../../entity/Guest.h" -# include "../../../entity/Litter.h" -# include "../../../entity/MoneyEffect.h" -# include "../../../entity/Particle.h" -# include "../../../entity/Staff.h" -# include "../../../ride/Ride.h" -# include "../../../ride/TrainManager.h" -# include "../../../world/Map.h" -# include "../../Duktape.hpp" -# include "../entity/ScEntity.hpp" -# include "../entity/ScGuest.hpp" -# include "../entity/ScLitter.hpp" -# include "../entity/ScParticle.hpp" -# include "../entity/ScStaff.hpp" -# include "../entity/ScVehicle.hpp" -# include "../ride/ScRide.hpp" -# include "../ride/ScTrackIterator.h" -# include "../world/ScTile.hpp" + #include "../../../GameState.h" + #include "../../../entity/Balloon.h" + #include "../../../entity/Duck.h" + #include "../../../entity/EntityList.h" + #include "../../../entity/Fountain.h" + #include "../../../entity/Guest.h" + #include "../../../entity/Litter.h" + #include "../../../entity/MoneyEffect.h" + #include "../../../entity/Particle.h" + #include "../../../entity/Staff.h" + #include "../../../ride/Ride.h" + #include "../../../ride/TrainManager.h" + #include "../../../world/Map.h" + #include "../../Duktape.hpp" + #include "../entity/ScEntity.hpp" + #include "../entity/ScGuest.hpp" + #include "../entity/ScLitter.hpp" + #include "../entity/ScParticle.hpp" + #include "../entity/ScStaff.hpp" + #include "../entity/ScVehicle.hpp" + #include "../ride/ScRide.hpp" + #include "../ride/ScTrackIterator.h" + #include "../world/ScTile.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScMap.hpp b/src/openrct2/scripting/bindings/world/ScMap.hpp index dcae067c71..718f40115a 100644 --- a/src/openrct2/scripting/bindings/world/ScMap.hpp +++ b/src/openrct2/scripting/bindings/world/ScMap.hpp @@ -11,10 +11,10 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" -# include "../ride/ScRide.hpp" -# include "../ride/ScTrackIterator.h" -# include "../world/ScTile.hpp" + #include "../../Duktape.hpp" + #include "../ride/ScRide.hpp" + #include "../ride/ScTrackIterator.h" + #include "../world/ScTile.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScPark.cpp b/src/openrct2/scripting/bindings/world/ScPark.cpp index 91a497da87..a6a6af0d9d 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.cpp +++ b/src/openrct2/scripting/bindings/world/ScPark.cpp @@ -9,21 +9,21 @@ #ifdef ENABLE_SCRIPTING -# include "ScPark.hpp" + #include "ScPark.hpp" -# include "../../../Context.h" -# include "../../../Date.h" -# include "../../../GameState.h" -# include "../../../core/String.hpp" -# include "../../../entity/Guest.h" -# include "../../../management/Finance.h" -# include "../../../management/NewsItem.h" -# include "../../../windows/Intent.h" -# include "../../../world/Park.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "../entity/ScGuest.hpp" -# include "ScParkMessage.hpp" + #include "../../../Context.h" + #include "../../../Date.h" + #include "../../../GameState.h" + #include "../../../core/String.hpp" + #include "../../../entity/Guest.h" + #include "../../../management/Finance.h" + #include "../../../management/NewsItem.h" + #include "../../../windows/Intent.h" + #include "../../../world/Park.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "../entity/ScGuest.hpp" + #include "ScParkMessage.hpp" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScPark.hpp b/src/openrct2/scripting/bindings/world/ScPark.hpp index bf590bdefe..250f50b6a4 100644 --- a/src/openrct2/scripting/bindings/world/ScPark.hpp +++ b/src/openrct2/scripting/bindings/world/ScPark.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../Duktape.hpp" -# include "ScParkMessage.hpp" -# include "ScResearch.hpp" + #include "../../../Context.h" + #include "../../Duktape.hpp" + #include "ScParkMessage.hpp" + #include "ScResearch.hpp" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScParkMessage.cpp b/src/openrct2/scripting/bindings/world/ScParkMessage.cpp index 1274b29721..0ccd024262 100644 --- a/src/openrct2/scripting/bindings/world/ScParkMessage.cpp +++ b/src/openrct2/scripting/bindings/world/ScParkMessage.cpp @@ -9,18 +9,18 @@ #ifdef ENABLE_SCRIPTING -# include "ScParkMessage.hpp" + #include "ScParkMessage.hpp" -# include "../../../Context.h" -# include "../../../GameState.h" -# include "../../../core/String.hpp" -# include "../../../entity/Peep.h" -# include "../../../management/Finance.h" -# include "../../../management/NewsItem.h" -# include "../../../windows/Intent.h" -# include "../../../world/Park.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../GameState.h" + #include "../../../core/String.hpp" + #include "../../../entity/Peep.h" + #include "../../../management/Finance.h" + #include "../../../management/NewsItem.h" + #include "../../../windows/Intent.h" + #include "../../../world/Park.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp index 368311976c..acfb0972a3 100644 --- a/src/openrct2/scripting/bindings/world/ScParkMessage.hpp +++ b/src/openrct2/scripting/bindings/world/ScParkMessage.hpp @@ -11,12 +11,12 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../management/NewsItem.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../management/NewsItem.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" -# include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScResearch.cpp b/src/openrct2/scripting/bindings/world/ScResearch.cpp index e61eb5a4a8..72795f74ab 100644 --- a/src/openrct2/scripting/bindings/world/ScResearch.cpp +++ b/src/openrct2/scripting/bindings/world/ScResearch.cpp @@ -9,16 +9,16 @@ #ifdef ENABLE_SCRIPTING -# include "ScResearch.hpp" + #include "ScResearch.hpp" -# include "../../../Context.h" -# include "../../../GameState.h" -# include "../../../core/String.hpp" -# include "../../../management/Research.h" -# include "../../../ride/RideData.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "../object/ScObject.hpp" + #include "../../../Context.h" + #include "../../../GameState.h" + #include "../../../core/String.hpp" + #include "../../../management/Research.h" + #include "../../../ride/RideData.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "../object/ScObject.hpp" using namespace OpenRCT2; diff --git a/src/openrct2/scripting/bindings/world/ScResearch.hpp b/src/openrct2/scripting/bindings/world/ScResearch.hpp index e2f7577bb6..dfdff928e6 100644 --- a/src/openrct2/scripting/bindings/world/ScResearch.hpp +++ b/src/openrct2/scripting/bindings/world/ScResearch.hpp @@ -11,7 +11,7 @@ #ifdef ENABLE_SCRIPTING -# include "../../ScriptEngine.h" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScScenario.hpp b/src/openrct2/scripting/bindings/world/ScScenario.hpp index c321f100f1..39d5f73eda 100644 --- a/src/openrct2/scripting/bindings/world/ScScenario.hpp +++ b/src/openrct2/scripting/bindings/world/ScScenario.hpp @@ -11,13 +11,13 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../GameState.h" -# include "../../../core/StringTypes.h" -# include "../../../scenario/Scenario.h" -# include "../../../world/Park.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../GameState.h" + #include "../../../core/StringTypes.h" + #include "../../../scenario/Scenario.h" + #include "../../../world/Park.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScTile.cpp b/src/openrct2/scripting/bindings/world/ScTile.cpp index 795911e97c..77c5986355 100644 --- a/src/openrct2/scripting/bindings/world/ScTile.cpp +++ b/src/openrct2/scripting/bindings/world/ScTile.cpp @@ -9,23 +9,23 @@ #ifdef ENABLE_SCRIPTING -# include "ScTile.hpp" + #include "ScTile.hpp" -# include "../../../Context.h" -# include "../../../core/Guard.hpp" -# include "../../../entity/EntityRegistry.h" -# include "../../../object/LargeSceneryEntry.h" -# include "../../../ride/Track.h" -# include "../../../world/Footpath.h" -# include "../../../world/Scenery.h" -# include "../../../world/tile_element/LargeSceneryElement.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" -# include "ScTileElement.hpp" + #include "../../../Context.h" + #include "../../../core/Guard.hpp" + #include "../../../entity/EntityRegistry.h" + #include "../../../object/LargeSceneryEntry.h" + #include "../../../ride/Track.h" + #include "../../../world/Footpath.h" + #include "../../../world/Scenery.h" + #include "../../../world/tile_element/LargeSceneryElement.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" + #include "ScTileElement.hpp" -# include -# include -# include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScTile.hpp b/src/openrct2/scripting/bindings/world/ScTile.hpp index ff5c2b0271..7df486cfa0 100644 --- a/src/openrct2/scripting/bindings/world/ScTile.hpp +++ b/src/openrct2/scripting/bindings/world/ScTile.hpp @@ -11,14 +11,14 @@ #ifdef ENABLE_SCRIPTING -# include "../../Duktape.hpp" -# include "ScTileElement.hpp" + #include "../../Duktape.hpp" + #include "ScTileElement.hpp" -# include -# include -# include -# include -# include + #include + #include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/scripting/bindings/world/ScTileElement.cpp b/src/openrct2/scripting/bindings/world/ScTileElement.cpp index 7ec82c4171..60a848c1da 100644 --- a/src/openrct2/scripting/bindings/world/ScTileElement.cpp +++ b/src/openrct2/scripting/bindings/world/ScTileElement.cpp @@ -9,32 +9,32 @@ #ifdef ENABLE_SCRIPTING -# include "ScTileElement.hpp" + #include "ScTileElement.hpp" -# include "../../../Context.h" -# include "../../../core/Guard.hpp" -# include "../../../entity/EntityRegistry.h" -# include "../../../object/LargeSceneryEntry.h" -# include "../../../object/WallSceneryEntry.h" -# include "../../../ride/Ride.h" -# include "../../../ride/RideData.h" -# include "../../../ride/Track.h" -# include "../../../world/Footpath.h" -# include "../../../world/Scenery.h" -# include "../../../world/tile_element/BannerElement.h" -# include "../../../world/tile_element/EntranceElement.h" -# include "../../../world/tile_element/LargeSceneryElement.h" -# include "../../../world/tile_element/PathElement.h" -# include "../../../world/tile_element/SmallSceneryElement.h" -# include "../../../world/tile_element/SurfaceElement.h" -# include "../../../world/tile_element/TrackElement.h" -# include "../../../world/tile_element/WallElement.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../core/Guard.hpp" + #include "../../../entity/EntityRegistry.h" + #include "../../../object/LargeSceneryEntry.h" + #include "../../../object/WallSceneryEntry.h" + #include "../../../ride/Ride.h" + #include "../../../ride/RideData.h" + #include "../../../ride/Track.h" + #include "../../../world/Footpath.h" + #include "../../../world/Scenery.h" + #include "../../../world/tile_element/BannerElement.h" + #include "../../../world/tile_element/EntranceElement.h" + #include "../../../world/tile_element/LargeSceneryElement.h" + #include "../../../world/tile_element/PathElement.h" + #include "../../../world/tile_element/SmallSceneryElement.h" + #include "../../../world/tile_element/SurfaceElement.h" + #include "../../../world/tile_element/TrackElement.h" + #include "../../../world/tile_element/WallElement.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" -# include -# include -# include + #include + #include + #include namespace OpenRCT2::Scripting { @@ -508,7 +508,7 @@ namespace OpenRCT2::Scripting if (ride != nullptr) { const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot read 'sequence' property, TrackElement belongs to a maze."; } @@ -561,7 +561,7 @@ namespace OpenRCT2::Scripting if (ride != nullptr) { const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot set 'sequence' property, TrackElement belongs to a maze."; } @@ -834,7 +834,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot read 'mazeEntry' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) throw DukException() << "Cannot read 'mazeEntry' property, ride is not a maze."; duk_push_int(ctx, el->GetMazeEntry()); @@ -864,7 +864,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot set 'mazeEntry' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) throw DukException() << "Cannot set 'mazeEntry' property, ride is not a maze."; el->SetMazeEntry(value.as_uint()); @@ -892,7 +892,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot read 'colourScheme' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot read 'colourScheme' property, TrackElement belongs to a maze."; duk_push_int(ctx, el->GetColourScheme()); @@ -922,7 +922,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot set 'colourScheme', ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot set 'colourScheme' property, TrackElement belongs to a maze."; el->SetColourScheme(static_cast(value.as_uint())); @@ -950,7 +950,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot read 'seatRotation' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType == RtdSpecialType::maze) throw DukException() << "Cannot read 'seatRotation' property, TrackElement belongs to a maze."; duk_push_int(ctx, el->GetSeatRotation()); @@ -980,7 +980,7 @@ namespace OpenRCT2::Scripting throw DukException() << "Cannot set 'seatRotation' property, ride is invalid."; const auto& rtd = ride->GetRideTypeDescriptor(); - if (!rtd.HasFlag(RtdFlag::isMaze)) + if (rtd.specialType != RtdSpecialType::maze) throw DukException() << "Cannot set 'seatRotation' property, TrackElement belongs to a maze."; el->SetSeatRotation(value.as_uint()); diff --git a/src/openrct2/scripting/bindings/world/ScTileElement.hpp b/src/openrct2/scripting/bindings/world/ScTileElement.hpp index b3c45e1343..f91bbe6fa5 100644 --- a/src/openrct2/scripting/bindings/world/ScTileElement.hpp +++ b/src/openrct2/scripting/bindings/world/ScTileElement.hpp @@ -11,18 +11,18 @@ #ifdef ENABLE_SCRIPTING -# include "../../../Context.h" -# include "../../../core/Guard.hpp" -# include "../../../entity/EntityRegistry.h" -# include "../../../ride/Track.h" -# include "../../../world/Footpath.h" -# include "../../../world/Scenery.h" -# include "../../Duktape.hpp" -# include "../../ScriptEngine.h" + #include "../../../Context.h" + #include "../../../core/Guard.hpp" + #include "../../../entity/EntityRegistry.h" + #include "../../../ride/Track.h" + #include "../../../world/Footpath.h" + #include "../../../world/Scenery.h" + #include "../../Duktape.hpp" + #include "../../ScriptEngine.h" -# include -# include -# include + #include + #include + #include namespace OpenRCT2::Scripting { diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index a51ea9ca72..fe29f564f8 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -1247,7 +1247,13 @@ enum : ImageIndex SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_SW_NE, SPR_G2_LATTICE_TRIANGLE_TRACK_BRAKE_ALT_OPEN_SE_NW, SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BRAKES, - SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NE_SW = SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BRAKES + 6, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_1 = SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BRAKES + 6, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_2, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_1, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_2, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_3, + SPR_G2_LATTICE_TRIANGLE_TRACK_DIAG_BOOSTER_ALT_4, + SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NE_SW, SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_NW_SE, SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SW_NE, SPR_G2_LATTICE_TRIANGLE_TRACK_DRIVE_TYRE_SE_NW, @@ -1286,7 +1292,13 @@ enum : ImageIndex SPR_G2_BM_DIAG_BRAKES = SPR_G2_BM_RC_BEGIN, SPR_G2_BM_BOOSTER_NE_SW = SPR_G2_BM_DIAG_BRAKES + 6, SPR_G2_BM_BOOSTER_NW_SE, - SPR_G2_BM_RC_END, + SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE, + SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED = SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE + 64, + SPR_G2_BM_TRACK_LARGE_CORKSCREW = SPR_G2_BM_TRACK_GENTLE_LARGE_CURVE_BANKED + 128, + SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP = SPR_G2_BM_TRACK_LARGE_CORKSCREW + 40, + SPR_G2_BM_TRACK_ZERO_G_ROLL = SPR_G2_BM_TRACK_MEDIUM_HALF_LOOP + 44, + SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL = SPR_G2_BM_TRACK_ZERO_G_ROLL + 32, + SPR_G2_BM_RC_END = SPR_G2_BM_TRACK_LARGE_ZERO_G_ROLL + 40, SPR_G2_MINIATURE_RAILWAY_BEGIN = SPR_G2_BM_RC_END, SPR_G2_MINIATURE_RAILWAY_QUARTER_TURN_3_TILES_SW_SE_PART_3 = SPR_G2_MINIATURE_RAILWAY_BEGIN, @@ -1355,7 +1367,69 @@ enum : ImageIndex SPR_G2_STANDUP_RC_BEGIN = SPR_G2_MINETRAIN_RC_END, SPR_G2_STANDUP_DIAG_BRAKES = SPR_G2_STANDUP_RC_BEGIN, - SPR_G2_STANDUP_RC_END = SPR_G2_STANDUP_DIAG_BRAKES + 6, + SPR_G2_STANDUP_TRACK_25455 = SPR_G2_STANDUP_DIAG_BRAKES + 6, + SPR_G2_STANDUP_TRACK_25457, + SPR_G2_STANDUP_TRACK_25459, + SPR_G2_STANDUP_TRACK_25461, + SPR_G2_STANDUP_TRACK_25462, + SPR_G2_STANDUP_TRACK_25463, + SPR_G2_STANDUP_TRACK_25464, + SPR_G2_STANDUP_TRACK_25466, + SPR_G2_STANDUP_TRACK_25468, + SPR_G2_STANDUP_TRACK_25470, + SPR_G2_STANDUP_TRACK_25471, + SPR_G2_STANDUP_TRACK_25472, + SPR_G2_STANDUP_TRACK_25473, + SPR_G2_STANDUP_TRACK_25521, + SPR_G2_STANDUP_TRACK_25523, + SPR_G2_STANDUP_TRACK_25526, + SPR_G2_STANDUP_TRACK_25528, + SPR_G2_STANDUP_TRACK_25530, + SPR_G2_STANDUP_TRACK_25659, + SPR_G2_STANDUP_TRACK_25661, + SPR_G2_STANDUP_TRACK_25664, + SPR_G2_STANDUP_TRACK_25665, + SPR_G2_STANDUP_TRACK_25666, + SPR_G2_STANDUP_TRACK_25668, + SPR_G2_STANDUP_TRACK_25672, + SPR_G2_STANDUP_TRACK_25673, + SPR_G2_STANDUP_TRACK_25676, + SPR_G2_STANDUP_TRACK_25677, + SPR_G2_STANDUP_TRACK_25680, + SPR_G2_STANDUP_TRACK_25684, + SPR_G2_STANDUP_TRACK_25685, + SPR_G2_STANDUP_TRACK_25686, + SPR_G2_STANDUP_TRACK_25687, + SPR_G2_STANDUP_TRACK_25689, + SPR_G2_STANDUP_TRACK_25781, + SPR_G2_STANDUP_TRACK_25783, + SPR_G2_STANDUP_TRACK_25785, + SPR_G2_STANDUP_TRACK_25787, + SPR_G2_STANDUP_TRACK_25788, + SPR_G2_STANDUP_TRACK_25792, + SPR_G2_STANDUP_TRACK_25794, + SPR_G2_STANDUP_TRACK_25796, + SPR_G2_STANDUP_TRACK_25797, + SPR_G2_STANDUP_TRACK_25798, + SPR_G2_STANDUP_TRACK_25799, + SPR_G2_STANDUP_TRACK_25803, + SPR_G2_STANDUP_TRACK_25805, + SPR_G2_STANDUP_TRACK_25807, + SPR_G2_STANDUP_TRACK_25809, + SPR_G2_STANDUP_TRACK_25810, + SPR_G2_STANDUP_TRACK_25811, + SPR_G2_STANDUP_TRACK_25812, + SPR_G2_STANDUP_TRACK_25814, + SPR_G2_STANDUP_TRACK_25816, + SPR_G2_STANDUP_TRACK_25820, + SPR_G2_STANDUP_TRACK_25821, + SPR_G2_STANDUP_TRACK_25825, + SPR_G2_STANDUP_TRACK_25827, + SPR_G2_STANDUP_TRACK_25834, + SPR_G2_STANDUP_TRACK_25835, + SPR_G2_STANDUP_TRACK_25843, + SPR_G2_STANDUP_TRACK_25844, + SPR_G2_STANDUP_RC_END, SPR_G2_STEEPLECHASE_RC_BEGIN = SPR_G2_STANDUP_RC_END, SPR_G2_STEEPLECHASE_DIAG_BRAKES = SPR_G2_STEEPLECHASE_RC_BEGIN, @@ -1420,9 +1494,17 @@ enum : ImageIndex SPR_G2_FLUME_60_25_NW_SE_BACK_WATER, SPR_G2_FLUME_60_25_NW_SE_BACK, + SPR_G2_BOAT_HIRE_BEGIN, + SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE = SPR_G2_BOAT_HIRE_BEGIN, + SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE = SPR_G2_BOAT_HIRE_TRACK_SMALL_CURVE + 24, + SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE = SPR_G2_BOAT_HIRE_TRACK_MEDIUM_CURVE + 40, + SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL = SPR_G2_BOAT_HIRE_TRACK_LARGE_CURVE + 68, + SPR_G2_BOAT_HIRE_TRACK_S_BEND = SPR_G2_BOAT_HIRE_TRACK_FLAT_DIAGONAL + 3, + SPR_G2_BOAT_HIRE_END = SPR_G2_BOAT_HIRE_TRACK_S_BEND + 32, + // G2 Supports - SPR_G2_SUPPORT_WOODEN_TRUSS, + SPR_G2_SUPPORT_WOODEN_TRUSS = SPR_G2_BOAT_HIRE_END, SPR_G2_SUPPORT_WOODEN_MINE = SPR_G2_SUPPORT_WOODEN_TRUSS + 32, SPR_G2_SUPPORT_END = SPR_G2_SUPPORT_WOODEN_MINE + 32, diff --git a/src/openrct2/util/Math.hpp b/src/openrct2/util/Math.hpp deleted file mode 100644 index 1621d5d341..0000000000 --- a/src/openrct2/util/Math.hpp +++ /dev/null @@ -1,37 +0,0 @@ - -/***************************************************************************** - * Copyright (c) 2014-2024 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#pragma once - -#include - -namespace -{ - [[maybe_unused]] constexpr bool IsPowerOf2(int v) - { - return v && ((v & (v - 1)) == 0); - } - - // Rounds an integer down to the given power of 2. y must be a power of 2. - [[maybe_unused]] constexpr int Floor2(const int x, const int y) - { - if (!IsPowerOf2(y)) - throw std::logic_error("Floor2 should only operate on power of 2"); - return x & ~(y - 1); - } - - // Rounds an integer up to the given power of 2. y must be a power of 2. - [[maybe_unused]] constexpr int Ceil2(const int x, const int y) - { - if (!IsPowerOf2(y)) - throw std::logic_error("Ceil2 should only operate on power of 2"); - return (x + y - 1) & ~(y - 1); - } -} // namespace diff --git a/src/openrct2/util/Prefetch.h b/src/openrct2/util/Prefetch.h deleted file mode 100644 index 8fbeb40556..0000000000 --- a/src/openrct2/util/Prefetch.h +++ /dev/null @@ -1,34 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2014-2024 OpenRCT2 developers - * - * For a complete list of all authors, please refer to contributors.md - * Interested in contributing? Visit https://github.com/OpenRCT2/OpenRCT2 - * - * OpenRCT2 is licensed under the GNU General Public License version 3. - *****************************************************************************/ - -#if defined(__amd64__) || defined(_M_AMD64) || defined(__i386__) || defined(_M_IX86) -// Don't bother checking for CPUID, prefetch is available since Pentium 4 -# include -// This cannot be expressed as `constexpr` function, exclude it from clang-tidy check -// NOLINTNEXTLINE(cppcoreguidelines-macro-usage) -# define PREFETCH(x) _mm_prefetch(reinterpret_cast(x), _MM_HINT_T0) - -#elif defined(_MSC_VER) && defined(_M_ARM64) -// ARM64 prefetch is available since ARMv8. -// MSVC's help (https://learn.microsoft.com/en-us/cpp/intrinsics/arm64-intrinsics?view=msvc-170) -// is incorrect and points to a different header (arm64_neon.h), which doesn't contain prefetch. -// Correct header info taken from -// https://github.com/microsoft/wdkmetadata/blob/1ac0dd0719f19196334de12cf2a6dec20316d440/generation/WDK/IdlHeaders/km/crt/intrin.h#L2 -// and -// https://github.com/microsoft/wdkmetadata/blob/1ac0dd0719f19196334de12cf2a6dec20316d440/generation/WDK/IdlHeaders/km/crt/intrin.h#L411 -# include -# define PREFETCH(x) __prefetch(x) - -#elif defined(__GNUC__) -// Let the compiler handle prefetch instruction -# define PREFETCH(x) __builtin_prefetch(x) - -#else -# define PREFETCH(x) -#endif diff --git a/src/openrct2/util/Util.h b/src/openrct2/util/Util.h index e4fff3a7bb..8f5ff2c063 100644 --- a/src/openrct2/util/Util.h +++ b/src/openrct2/util/Util.h @@ -9,15 +9,10 @@ #pragma once -#include "../core/CallingConventions.h" #include "../core/Money.hpp" #include "../core/StringTypes.h" -#include #include -#include -#include -#include int32_t StrLogicalCmp(char const* a, char const* b); char* SafeStrCpy(char* destination, const char* source, size_t num); diff --git a/src/openrct2/windows/Intent.cpp b/src/openrct2/windows/Intent.cpp index 04d38a6f21..81c70ce823 100644 --- a/src/openrct2/windows/Intent.cpp +++ b/src/openrct2/windows/Intent.cpp @@ -11,10 +11,38 @@ #include "../core/Guard.hpp" +#include #include using namespace OpenRCT2; +template +static void putExtraImpl(IntentDataStorage& storage, uint32_t key, T&& value) +{ + auto it = std::ranges::lower_bound(storage, key, {}, &IntentDataEntry::first); + + // Key should not already exist. + assert(it == storage.end() || it->first != key); + + storage.emplace(it, key, std::forward(value)); +} + +template +static auto getExtraImpl(const IntentDataStorage& storage, uint32_t key) +{ + auto it = std::ranges::lower_bound(storage, key, {}, &IntentDataEntry::first); + if (it == storage.end() || it->first != key) + { + // TODO: The code currently assumes that some things are optional, we need to handle this better. + return T{}; + } + + const auto& [_, data] = *it; + assert(std::holds_alternative(data)); + + return std::get(data); +} + Intent::Intent(WindowClass windowClass) : _Class(windowClass) { @@ -32,56 +60,31 @@ Intent::Intent(IntentAction intentAction) Intent* Intent::PutExtra(uint32_t key, uint32_t value) { - IntentData data = {}; - data.intVal.unsignedInt = value; - data.type = IntentData::DataType::Int; - - _Data.insert(std::make_pair(key, data)); - + putExtraImpl(_Data, key, static_cast(value)); return this; } Intent* Intent::PutExtra(uint32_t key, void* value) { - IntentData data = {}; - data.pointerVal = value; - data.type = IntentData::DataType::Pointer; - - _Data.insert(std::make_pair(key, data)); - + putExtraImpl(_Data, key, value); return this; } Intent* Intent::PutExtra(uint32_t key, int32_t value) { - IntentData data = {}; - data.intVal.signedInt = value; - data.type = IntentData::DataType::Int; - - _Data.insert(std::make_pair(key, data)); - + putExtraImpl(_Data, key, static_cast(value)); return this; } Intent* Intent::PutExtra(uint32_t key, std::string value) { - IntentData data = {}; - data.stringVal = std::move(value); - data.type = IntentData::DataType::String; - - _Data.insert(std::make_pair(key, data)); - + putExtraImpl(_Data, key, std::move(value)); return this; } -Intent* Intent::PutExtra(uint32_t key, close_callback value) +Intent* Intent::PutExtra(uint32_t key, CloseCallback value) { - IntentData data = {}; - data.closeCallbackVal = value; - data.type = IntentData::DataType::CloseCallback; - - _Data.insert(std::make_pair(key, data)); - + putExtraImpl(_Data, key, value); return this; } @@ -102,60 +105,25 @@ IntentAction Intent::GetAction() const void* Intent::GetPointerExtra(uint32_t key) const { - if (_Data.count(key) == 0) - { - return nullptr; - } - - auto data = _Data.at(key); - Guard::Assert(data.type == IntentData::DataType::Pointer, "Actual type doesn't match requested type"); - return static_cast(data.pointerVal); + return getExtraImpl(_Data, key); } uint32_t Intent::GetUIntExtra(uint32_t key) const { - if (_Data.count(key) == 0) - { - return 0; - } - - auto data = _Data.at(key); - Guard::Assert(data.type == IntentData::DataType::Int, "Actual type doesn't match requested type"); - return data.intVal.unsignedInt; + return static_cast(getExtraImpl(_Data, key)); } int32_t Intent::GetSIntExtra(uint32_t key) const { - if (_Data.count(key) == 0) - { - return 0; - } - - auto data = _Data.at(key); - Guard::Assert(data.type == IntentData::DataType::Int, "Actual type doesn't match requested type"); - return data.intVal.signedInt; + return static_cast(getExtraImpl(_Data, key)); } std::string Intent::GetStringExtra(uint32_t key) const { - if (_Data.count(key) == 0) - { - return std::string{}; - } - - auto data = _Data.at(key); - Guard::Assert(data.type == IntentData::DataType::String, "Actual type doesn't match requested type"); - return data.stringVal; + return getExtraImpl(_Data, key); } -close_callback Intent::GetCloseCallbackExtra(uint32_t key) const +CloseCallback Intent::GetCloseCallbackExtra(uint32_t key) const { - if (_Data.count(key) == 0) - { - return nullptr; - } - - auto data = _Data.at(key); - Guard::Assert(data.type == IntentData::DataType::CloseCallback, "Actual type doesn't match requested type"); - return data.closeCallbackVal; + return getExtraImpl(_Data, key); } diff --git a/src/openrct2/windows/Intent.h b/src/openrct2/windows/Intent.h index ed0ffa0715..bafa710594 100644 --- a/src/openrct2/windows/Intent.h +++ b/src/openrct2/windows/Intent.h @@ -13,7 +13,9 @@ #include "../interface/Window.h" #include +#include #include +#include enum IntentAction { @@ -57,51 +59,40 @@ enum IntentAction INTENT_ACTION_NULL = 255, }; -struct IntentData -{ - enum class DataType - { - Int, - String, - Pointer, - CloseCallback - } type; +// The maximum amount of data the Intent can hold, 8 should be sufficient, raise this if needed. +static constexpr size_t kIntentMaxDataSlots = 8; - union - { - uint32_t unsignedInt; - int32_t signedInt; - } intVal; - std::string stringVal; - close_callback closeCallbackVal; - void* pointerVal; -}; +using IntentData = std::variant; +using IntentDataEntry = std::pair; +using IntentDataStorage = sfl::static_vector; class Intent { -private: WindowClass _Class{ WindowClass::Null }; WindowDetail _WindowDetail{ WD_NULL }; IntentAction _Action{ INTENT_ACTION_NULL }; - std::map _Data; + IntentDataStorage _Data; public: explicit Intent(WindowClass windowClass); explicit Intent(WindowDetail windowDetail); explicit Intent(IntentAction windowclass); + WindowClass GetWindowClass() const; WindowDetail GetWindowDetail() const; IntentAction GetAction() const; + void* GetPointerExtra(uint32_t key) const; std::string GetStringExtra(uint32_t key) const; uint32_t GetUIntExtra(uint32_t key) const; int32_t GetSIntExtra(uint32_t key) const; - close_callback GetCloseCallbackExtra(uint32_t key) const; + CloseCallback GetCloseCallbackExtra(uint32_t key) const; + Intent* PutExtra(uint32_t key, uint32_t value); Intent* PutExtra(uint32_t key, void* value); Intent* PutExtra(uint32_t key, int32_t value); Intent* PutExtra(uint32_t key, std::string value); - Intent* PutExtra(uint32_t key, close_callback value); + Intent* PutExtra(uint32_t key, CloseCallback value); template Intent* PutExtra(uint32_t key, const TIdentifier& value) diff --git a/src/openrct2/world/Climate.cpp b/src/openrct2/world/Climate.cpp index 127ae7f172..256a9c66c3 100644 --- a/src/openrct2/world/Climate.cpp +++ b/src/openrct2/world/Climate.cpp @@ -125,7 +125,7 @@ void ClimateUpdate() if (gScreenFlags & (~SCREEN_FLAGS_PLAYING)) return; - if (!GetGameState().Cheats.FreezeWeather) + if (!GetGameState().Cheats.freezeWeather) { if (gameState.ClimateUpdateTimer) { diff --git a/src/openrct2/world/ConstructionClearance.cpp b/src/openrct2/world/ConstructionClearance.cpp index a3d65ad733..3d4e4e7585 100644 --- a/src/openrct2/world/ConstructionClearance.cpp +++ b/src/openrct2/world/ConstructionClearance.cpp @@ -146,7 +146,7 @@ GameActions::Result MapCanConstructWithClearAt( return res; } - if (GetGameState().Cheats.DisableClearanceChecks) + if (GetGameState().Cheats.disableClearanceChecks) { res.SetData(ConstructClearResult{ groundFlags }); return res; diff --git a/src/openrct2/world/Footpath.cpp b/src/openrct2/world/Footpath.cpp index a3f8a5ea6d..cd4c241316 100644 --- a/src/openrct2/world/Footpath.cpp +++ b/src/openrct2/world/Footpath.cpp @@ -26,6 +26,7 @@ #include "../object/FootpathRailingsObject.h" #include "../object/FootpathSurfaceObject.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectManager.h" #include "../object/PathAdditionEntry.h" #include "../paint/VirtualFloor.h" @@ -560,7 +561,7 @@ static void Loc6A6D7E( FootpathNeighbourList* neighbourList) { auto targetPos = CoordsXY{ initialTileElementPos } + CoordsDirectionDelta[direction]; - if (((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode) && MapIsEdge(targetPos)) + if (((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode) && MapIsEdge(targetPos)) { if (query) { @@ -1807,7 +1808,7 @@ void FootpathRemoveEdgesAt(const CoordsXY& footpathPos, TileElement* tileElement static ObjectEntryIndex FootpathGetDefaultSurface(bool queue) { - bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode); + bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode); for (ObjectEntryIndex i = 0; i < kMaxFootpathSurfaceObjects; i++) { auto pathEntry = GetPathSurfaceEntry(i); @@ -1831,7 +1832,7 @@ static bool FootpathIsSurfaceEntryOkay(ObjectEntryIndex index, bool queue) auto pathEntry = GetPathSurfaceEntry(index); if (pathEntry != nullptr) { - bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode); + bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode); if (!showEditorPaths && (pathEntry->Flags & FOOTPATH_ENTRY_FLAG_SHOW_ONLY_IN_SCENARIO_EDITOR)) { return false; @@ -1859,7 +1860,7 @@ static ObjectEntryIndex FootpathGetDefaultRailings() static bool FootpathIsLegacyPathEntryOkay(ObjectEntryIndex index) { - bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.SandboxMode); + bool showEditorPaths = ((gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) || GetGameState().Cheats.sandboxMode); auto& objManager = OpenRCT2::GetContext()->GetObjectManager(); auto footpathObj = objManager.GetLoadedObject(index); if (footpathObj != nullptr) diff --git a/src/openrct2/world/Location.hpp b/src/openrct2/world/Location.hpp index 086495bd77..b60f606075 100644 --- a/src/openrct2/world/Location.hpp +++ b/src/openrct2/world/Location.hpp @@ -9,7 +9,7 @@ #pragma once -#include "../util/Math.hpp" +#include "../core/Numerics.hpp" #include @@ -227,7 +227,9 @@ struct CoordsXY constexpr CoordsXY ToTileStart() const { - return { Floor2(x, kCoordsXYStep), Floor2(y, kCoordsXYStep) }; + using namespace OpenRCT2::Numerics; + + return { floor2(x, kCoordsXYStep), floor2(y, kCoordsXYStep) }; } constexpr bool IsNull() const @@ -276,7 +278,9 @@ struct CoordsXYZ : public CoordsXY constexpr CoordsXYZ ToTileStart() const { - return { Floor2(x, kCoordsXYStep), Floor2(y, kCoordsXYStep), z }; + using namespace OpenRCT2::Numerics; + + return { floor2(x, kCoordsXYStep), floor2(y, kCoordsXYStep), z }; } constexpr CoordsXYZ ToTileCentre() const @@ -661,7 +665,9 @@ struct CoordsXYZD : public CoordsXYZ constexpr CoordsXYZD ToTileStart() const { - return { Floor2(x, kCoordsXYStep), Floor2(y, kCoordsXYStep), z, direction }; + using namespace OpenRCT2::Numerics; + + return { floor2(x, kCoordsXYStep), floor2(y, kCoordsXYStep), z, direction }; } constexpr CoordsXYZD ToTileCentre() const diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index 3e69e19bdc..b79b1a5ad3 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -830,7 +830,7 @@ bool MapCanBuildAt(const CoordsXYZ& loc) { if (gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) return true; - if (GetGameState().Cheats.SandboxMode) + if (GetGameState().Cheats.sandboxMode) return true; if (MapIsLocationOwned(loc)) return true; @@ -966,7 +966,7 @@ uint8_t MapGetLowestLandHeight(const MapRange& range) if (surfaceElement != nullptr && min_height > surfaceElement->BaseHeight) { - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ xi, yi })) { @@ -995,7 +995,7 @@ uint8_t MapGetHighestLandHeight(const MapRange& range) auto* surfaceElement = MapGetSurfaceElementAt(CoordsXY{ xi, yi }); if (surfaceElement != nullptr) { - if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.SandboxMode) + if (!(gScreenFlags & SCREEN_FLAGS_SCENARIO_EDITOR) && !GetGameState().Cheats.sandboxMode) { if (!MapIsLocationInPark(CoordsXY{ xi, yi })) { @@ -1318,8 +1318,8 @@ void MapRemoveOutOfRangeElements() // Map resize has to become its own Game Action to properly solve this issue. // auto& gameState = GetGameState(); - bool buildState = gameState.Cheats.BuildInPauseMode; - gameState.Cheats.BuildInPauseMode = true; + bool buildState = gameState.Cheats.buildInPauseMode; + gameState.Cheats.buildInPauseMode = true; for (int32_t y = MAXIMUM_MAP_SIZE_BIG - kCoordsXYStep; y >= 0; y -= kCoordsXYStep) { @@ -1340,7 +1340,7 @@ void MapRemoveOutOfRangeElements() } // Reset cheat state - gameState.Cheats.BuildInPauseMode = buildState; + gameState.Cheats.buildInPauseMode = buildState; } static void MapExtendBoundarySurfaceExtendTile(const SurfaceElement& sourceTile, SurfaceElement& destTile) diff --git a/src/openrct2/world/Park.cpp b/src/openrct2/world/Park.cpp index 24a3521dc3..e4955e4078 100644 --- a/src/openrct2/world/Park.cpp +++ b/src/openrct2/world/Park.cpp @@ -49,9 +49,6 @@ using namespace OpenRCT2::Scripting; namespace OpenRCT2::Park { - // If this value is more than or equal to 0, the park rating is forced to this value. Used for cheat - static int32_t _forcedParkRating = -1; - static money64 calculateRideValue(const Ride& ride); static money64 calculateTotalRideValueForMoney(); static uint32_t calculateSuggestedMaxGuests(); @@ -395,12 +392,13 @@ namespace OpenRCT2::Park int32_t CalculateParkRating() { - if (_forcedParkRating >= 0) + auto& gameState = GetGameState(); + + if (gameState.Cheats.forcedParkRating != kForcedParkRatingDisabled) { - return _forcedParkRating; + return gameState.Cheats.forcedParkRating; } - auto& gameState = GetGameState(); int32_t result = 1150; if (gameState.Park.Flags & PARK_FLAGS_DIFFICULT_PARK_RATING) { @@ -734,15 +732,17 @@ namespace OpenRCT2::Park void SetForcedRating(int32_t rating) { - _forcedParkRating = rating; - GetGameState().Park.Rating = CalculateParkRating(); + auto& gameState = GetGameState(); + gameState.Cheats.forcedParkRating = rating; + gameState.Park.Rating = CalculateParkRating(); + auto intent = Intent(INTENT_ACTION_UPDATE_PARK_RATING); ContextBroadcastIntent(&intent); } int32_t GetForcedRating() { - return _forcedParkRating; + return GetGameState().Cheats.forcedParkRating; } money64 GetEntranceFee() diff --git a/src/openrct2/world/Park.h b/src/openrct2/world/Park.h index 023c7e9fb9..b3d2e21673 100644 --- a/src/openrct2/world/Park.h +++ b/src/openrct2/world/Park.h @@ -12,6 +12,8 @@ #include "../management/Finance.h" #include "Map.h" +#include + constexpr auto MAX_ENTRANCE_FEE = 999.00_GBP; constexpr uint16_t kParkRatingHistoryUndefined = std::numeric_limits::max(); diff --git a/src/openrct2/world/Scenery.cpp b/src/openrct2/world/Scenery.cpp index 33caedd22b..d5dc982134 100644 --- a/src/openrct2/world/Scenery.cpp +++ b/src/openrct2/world/Scenery.cpp @@ -25,6 +25,7 @@ #include "../object/BannerSceneryEntry.h" #include "../object/LargeSceneryEntry.h" #include "../object/ObjectEntryManager.h" +#include "../object/ObjectLimits.h" #include "../object/ObjectList.h" #include "../object/ObjectManager.h" #include "../object/PathAdditionEntry.h" @@ -178,7 +179,7 @@ void SmallSceneryElement::UpdateAge(const CoordsXY& sceneryPos) } auto& gameState = GetGameState(); - if (gameState.Cheats.DisablePlantAging && sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_CAN_BE_WATERED)) + if (gameState.Cheats.disablePlantAging && sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_CAN_BE_WATERED)) { return; } @@ -309,7 +310,7 @@ bool IsSceneryAvailableToBuild(const ScenerySelection& item) } auto& gameState = GetGameState(); - if (!gameState.Cheats.IgnoreResearchStatus) + if (!gameState.Cheats.ignoreResearchStatus) { if (!SceneryIsInvented(item)) { @@ -317,7 +318,7 @@ bool IsSceneryAvailableToBuild(const ScenerySelection& item) } } - if (!gameState.Cheats.SandboxMode && !(gScreenFlags & SCREEN_FLAGS_EDITOR)) + if (!gameState.Cheats.sandboxMode && !(gScreenFlags & SCREEN_FLAGS_EDITOR)) { if (IsSceneryItemRestricted(item)) { diff --git a/src/openrct2/world/tile_element/TrackElement.cpp b/src/openrct2/world/tile_element/TrackElement.cpp index 0e96088da3..46dfb7880e 100644 --- a/src/openrct2/world/tile_element/TrackElement.cpp +++ b/src/openrct2/world/tile_element/TrackElement.cpp @@ -252,7 +252,7 @@ void TrackElement::SetBrakeClosed(bool isClosed) bool TrackElement::IsIndestructible() const { - return (Flags2 & TRACK_ELEMENT_FLAGS2_INDESTRUCTIBLE_TRACK_PIECE) != 0 && !GetGameState().Cheats.MakeAllDestructible; + return (Flags2 & TRACK_ELEMENT_FLAGS2_INDESTRUCTIBLE_TRACK_PIECE) != 0 && !GetGameState().Cheats.makeAllDestructible; } void TrackElement::SetIsIndestructible(bool isIndestructible) diff --git a/src/thirdparty/sfl/private.hpp b/src/thirdparty/sfl/private.hpp new file mode 100644 index 0000000000..9c03194298 --- /dev/null +++ b/src/thirdparty/sfl/private.hpp @@ -0,0 +1,2512 @@ +// +// Copyright (c) 2022 Slaven Falandys +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef SFL_PRIVATE_HPP_INCLUDED +#define SFL_PRIVATE_HPP_INCLUDED + +#include // move, copy, etc. +#include // assert +#include // size_t +#include // abort +#include // iterator_traits, xxxxx_iterator_tag +#include // addressof, allocator_traits, pointer_traits +#include // length_error, out_of_range +#include // enable_if, is_convertible, is_function, true_type... +#include // forward, move, move_if_noexcept + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// MACROS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +#define SFL_ASSERT(x) assert(x) + +#if defined(_MSC_VER) && defined(_MSVC_LANG) + #define SFL_CXX_VERSION _MSVC_LANG +#else + #define SFL_CXX_VERSION __cplusplus +#endif + +#if SFL_CXX_VERSION >= 201402L + #define SFL_CONSTEXPR_14 constexpr +#else + #define SFL_CONSTEXPR_14 +#endif + +#if SFL_CXX_VERSION >= 201703L + #define SFL_NODISCARD [[nodiscard]] +#else + #define SFL_NODISCARD +#endif + +#ifdef SFL_NO_EXCEPTIONS + #define SFL_TRY if (true) + #define SFL_CATCH(x) if (false) + #define SFL_RETHROW +#else + #define SFL_TRY try + #define SFL_CATCH(x) catch (x) + #define SFL_RETHROW throw +#endif + +namespace sfl +{ + +namespace dtl +{ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// UTILITY FUNCTIONS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +// +// This function is used for silencing warnings about unused variables. +// +template +SFL_CONSTEXPR_14 +void ignore_unused(Args&&...) +{ + // Do nothing. +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// TYPE TRAITS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template +using void_t = void; + +template +using enable_if_t = typename std::enable_if::type; + +template +using remove_cvref_t = typename std::remove_cv::type>::type; + +// +// This struct provides information about segmented iterators. +// +// The architecture about segmented iterator traits is based on this article: +// "Segmented Iterators and Hierarchical Algorithms", Matthew H. Austern. +// +template +struct segmented_iterator_traits +{ + using is_segmented_iterator = std::false_type; + + // + // Specialized struct must define the following types and functions: + // + // using iterator = xxxxx; (it is usually `T`) + // using segment_iterator = xxxxx; + // using local_iterator = xxxxx; + // + // static segment_iterator segment(iterator); + // static local_iterator local(iterator); + // + // static local_iterator begin(segment_iterator); + // static local_iterator end(segment_iterator); + // + // static iterator compose(segment_iterator, local_iterator); + // +}; + +// +// Checks if `T` is segmented iterator. +// +template +struct is_segmented_iterator : + sfl::dtl::segmented_iterator_traits::is_segmented_iterator {}; + +// +// Checks if `T` is input iterator. +// +template +struct is_input_iterator : std::false_type {}; + +template +struct is_input_iterator< + Iterator, + sfl::dtl::enable_if_t< + std::is_convertible< + typename std::iterator_traits::iterator_category, + std::input_iterator_tag + >::value + > +> : std::true_type {}; + +// +// Checks if `T` is exactly input iterator. +// +template +struct is_exactly_input_iterator : std::false_type {}; + +template +struct is_exactly_input_iterator< + T, + sfl::dtl::enable_if_t< + std::is_convertible< + typename std::iterator_traits::iterator_category, + std::input_iterator_tag + >::value + && + !std::is_convertible< + typename std::iterator_traits::iterator_category, + std::forward_iterator_tag + >::value + > +> : std::true_type {}; + +// +// Checks if `T` is forward iterator. +// +template +struct is_forward_iterator : std::false_type {}; + +template +struct is_forward_iterator< + T, + sfl::dtl::enable_if_t< + std::is_convertible< + typename std::iterator_traits::iterator_category, + std::forward_iterator_tag + >::value + > +> : std::true_type {}; + +// +// Checks if `T` is random access iterator. +// +template +struct is_random_access_iterator : std::false_type {}; + +template +struct is_random_access_iterator< + T, + sfl::dtl::enable_if_t< + std::is_convertible< + typename std::iterator_traits::iterator_category, + std::random_access_iterator_tag + >::value + > +> : std::true_type {}; + +// +// Checks if `Type` has member `is_transparent`. +// +template +struct has_is_transparent : std::false_type {}; + +template +struct has_is_transparent< + Type, SfinaeType, sfl::dtl::void_t +> : std::true_type {}; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// POINTER TRAITS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +// +// Raw pointer overload. +// Obtains a dereferenceable pointer to its argument. +// +template +constexpr +T* to_address(T* p) noexcept +{ + static_assert(!std::is_function::value, "not a function pointer"); + return p; +} + +// +// Fancy pointer overload. +// Obtains a raw pointer from a fancy pointer. +// +template +constexpr +auto to_address(const Pointer& p) noexcept -> typename std::pointer_traits::element_type* +{ + return sfl::dtl::to_address(p.operator->()); +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// ITERATORS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template +class normal_iterator +{ + template + friend class normal_iterator; + + friend Container; + +private: + + Iterator it_; + +public: + + using difference_type = typename std::iterator_traits::difference_type; + using value_type = typename std::iterator_traits::value_type; + using pointer = typename std::iterator_traits::pointer; + using reference = typename std::iterator_traits::reference; + using iterator_category = typename std::iterator_traits::iterator_category; +#if SFL_CXX_VERSION >= 202002L + using iterator_concept = std::contiguous_iterator_tag; +#endif + +private: + + explicit normal_iterator(const Iterator& it) noexcept + : it_(it) + {} + +public: + + // Default constructor + normal_iterator() noexcept + : it_() + {} + + // Copy constructor + normal_iterator(const normal_iterator& other) noexcept + : it_(other.it_) + {} + + // Converting constructor (from iterator to const_iterator) + template ::value>* = nullptr> + normal_iterator(const normal_iterator& other) noexcept + : it_(other.it_) + {} + + // Copy assignment operator + normal_iterator& operator=(const normal_iterator& other) noexcept + { + it_ = other.it_; + return *this; + } + + SFL_NODISCARD + reference operator*() const noexcept + { + return *it_; + } + + SFL_NODISCARD + pointer operator->() const noexcept + { + return sfl::dtl::to_address(it_); + } + + normal_iterator& operator++() noexcept + { + ++it_; + return *this; + } + + normal_iterator operator++(int) noexcept + { + auto temp = *this; + ++it_; + return temp; + } + + normal_iterator& operator--() noexcept + { + --it_; + return *this; + } + + normal_iterator operator--(int) noexcept + { + auto temp = *this; + --it_; + return temp; + } + + normal_iterator& operator+=(difference_type n) noexcept + { + it_ += n; + return *this; + } + + normal_iterator& operator-=(difference_type n) noexcept + { + it_ -= n; + return *this; + } + + SFL_NODISCARD + normal_iterator operator+(difference_type n) const noexcept + { + return normal_iterator(it_ + n); + } + + SFL_NODISCARD + normal_iterator operator-(difference_type n) const noexcept + { + return normal_iterator(it_ - n); + } + + SFL_NODISCARD + reference operator[](difference_type n) const noexcept + { + return it_[n]; + } + + SFL_NODISCARD + friend normal_iterator operator+(difference_type n, const normal_iterator& it) noexcept + { + return it + n; + } + + SFL_NODISCARD + friend difference_type operator-(const normal_iterator& x, const normal_iterator& y) noexcept + { + return x.it_ - y.it_; + } + + SFL_NODISCARD + friend bool operator==(const normal_iterator& x, const normal_iterator& y) noexcept + { + return x.it_ == y.it_; + } + + SFL_NODISCARD + friend bool operator!=(const normal_iterator& x, const normal_iterator& y) noexcept + { + return !(x == y); + } + + SFL_NODISCARD + friend bool operator<(const normal_iterator& x, const normal_iterator& y) noexcept + { + return x.it_ < y.it_; + } + + SFL_NODISCARD + friend bool operator>(const normal_iterator& x, const normal_iterator& y) noexcept + { + return y < x; + } + + SFL_NODISCARD + friend bool operator<=(const normal_iterator& x, const normal_iterator& y) noexcept + { + return !(y < x); + } + + SFL_NODISCARD + friend bool operator>=(const normal_iterator& x, const normal_iterator& y) noexcept + { + return !(x < y); + } +}; + +template +class segmented_iterator +{ + template + friend class segmented_iterator; + + friend Container; + + template + friend struct sfl::dtl::segmented_iterator_traits; + +private: + + SegmentIterator segment_; + LocalIterator local_; + +public: + + using difference_type = typename std::iterator_traits::difference_type; + using value_type = typename std::iterator_traits::value_type; + using pointer = typename std::iterator_traits::pointer; + using reference = typename std::iterator_traits::reference; + using iterator_category = typename std::iterator_traits::iterator_category; + +private: + + explicit segmented_iterator(const SegmentIterator& segment, const LocalIterator& local) noexcept + : segment_(segment) + , local_(local) + {} + +public: + + // Default constructor + segmented_iterator() noexcept + : segment_() + , local_() + {} + + // Copy constructor + segmented_iterator(const segmented_iterator& other) noexcept + : segment_(other.segment_) + , local_(other.local_) + {} + + // Converting constructor (from iterator to const_iterator) + template ::value && + std::is_convertible::value >* = nullptr > + segmented_iterator(const segmented_iterator& other) noexcept + : segment_(other.segment_) + , local_(other.local_) + {} + + // Copy assignment operator + segmented_iterator& operator=(const segmented_iterator& other) noexcept + { + segment_ = other.segment_; + local_ = other.local_; + return *this; + } + + SFL_NODISCARD + reference operator*() const noexcept + { + return *local_; + } + + SFL_NODISCARD + pointer operator->() const noexcept + { + return sfl::dtl::to_address(local_); + } + + segmented_iterator& operator++() noexcept + { + ++local_; + + if (local_ == *segment_ + SegmentSize) + { + ++segment_; + local_ = *segment_; + } + + return *this; + } + + segmented_iterator operator++(int) noexcept + { + auto temp = *this; + this->operator++(); + return temp; + } + + segmented_iterator& operator--() noexcept + { + if (local_ == *segment_) + { + --segment_; + local_ = *segment_ + SegmentSize; + } + + --local_; + + return *this; + } + + segmented_iterator operator--(int) noexcept + { + auto temp = *this; + this->operator--(); + return temp; + } + + segmented_iterator& operator+=(difference_type n) noexcept + { + const difference_type offset = std::distance(LocalIterator(*segment_), local_) + n; + + if (offset >= 0 && offset < difference_type(SegmentSize)) + { + local_ += n; + } + else + { + const difference_type segment_offset = + offset > 0 + ? offset / difference_type(SegmentSize) + : -difference_type((-offset - 1) / SegmentSize) - 1; + + segment_ += segment_offset; + + local_ = *segment_ + (offset - segment_offset * difference_type(SegmentSize)); + } + + return *this; + } + + segmented_iterator& operator-=(difference_type n) noexcept + { + return this->operator+=(-n); + } + + SFL_NODISCARD + segmented_iterator operator+(difference_type n) const noexcept + { + auto temp = *this; + temp += n; + return temp; + } + + SFL_NODISCARD + segmented_iterator operator-(difference_type n) const noexcept + { + auto temp = *this; + temp -= n; + return temp; + } + + SFL_NODISCARD + reference operator[](difference_type n) const noexcept + { + auto temp = *this; + temp += n; + return *temp; + } + + SFL_NODISCARD + friend segmented_iterator operator+(difference_type n, const segmented_iterator& it) noexcept + { + return it + n; + } + + SFL_NODISCARD + friend difference_type operator-(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return (x.segment_ - y.segment_) * difference_type(SegmentSize) + + (x.local_ - *x.segment_) - (y.local_ - *y.segment_); + } + + SFL_NODISCARD + friend bool operator==(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return x.local_ == y.local_; + } + + SFL_NODISCARD + friend bool operator!=(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return !(x == y); + } + + SFL_NODISCARD + friend bool operator<(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return (x.segment_ == y.segment_) ? (x.local_ < y.local_) : (x.segment_ < y.segment_); + } + + SFL_NODISCARD + friend bool operator>(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return y < x; + } + + SFL_NODISCARD + friend bool operator<=(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return !(y < x); + } + + SFL_NODISCARD + friend bool operator>=(const segmented_iterator& x, const segmented_iterator& y) noexcept + { + return !(x < y); + } +}; + +template +struct segmented_iterator_traits> +{ + using is_segmented_iterator = std::true_type; + + using iterator = sfl::dtl::segmented_iterator; + + using segment_iterator = SegmentIterator; + + using local_iterator = LocalIterator; + + static segment_iterator segment(iterator it) noexcept + { + return it.segment_; + } + + static local_iterator local(iterator it) noexcept + { + return it.local_; + } + + static local_iterator begin(segment_iterator it) noexcept + { + return *it; + } + + static local_iterator end(segment_iterator it) noexcept + { + return *it + SegmentSize; + } + + static iterator compose(segment_iterator segment, local_iterator local) noexcept + { + SFL_ASSERT(begin(segment) <= local && local <= end(segment)); + + if (local == end(segment)) + { + ++segment; + local = begin(segment); + } + + return iterator(segment, local); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// INITIALIZED MEMORY ALGORITHMS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +OutputIt copy(InputIt first, InputIt last, OutputIt d_first) +{ + return std::copy(first, last, d_first); +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value >* = nullptr> +OutputIt copy(InputIt first, InputIt last, OutputIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_first; + } + else + { + auto curr = first; + + auto d_local = traits::local(d_first); + auto d_seg = traits::segment(d_first); + + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(curr, last), + std::distance(d_local, traits::end(d_seg)) + ); + + const auto next = curr + count; + + d_local = sfl::dtl::copy + ( + curr, + next, + d_local + ); + + curr = next; + + if (curr == last) + { + return traits::compose(d_seg, d_local); + } + + ++d_seg; + + d_local = traits::begin(d_seg); + } + } +} + +template ::value >* = nullptr> +OutputIt copy(InputIt first, InputIt last, OutputIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::copy + ( + traits::local(first), + traits::local(last), + d_first + ); + } + else + { + d_first = sfl::dtl::copy + ( + traits::local(first), + traits::end(first_seg), + d_first + ); + + ++first_seg; + + while (first_seg != last_seg) + { + d_first = sfl::dtl::copy + ( + traits::begin(first_seg), + traits::end(first_seg), + d_first + ); + + ++first_seg; + } + + d_first = sfl::dtl::copy + ( + traits::begin(last_seg), + traits::local(last), + d_first + ); + + return d_first; + } +} + +template +OutputIt copy_n(InputIt first, Size count, OutputIt d_first) +{ + return std::copy_n(first, count, d_first); +} + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) +{ + return std::copy_backward(first, last, d_last); +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value>* = nullptr> +BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_last; + } + else + { + auto curr = last; + + auto d_local = traits::local(d_last); + auto d_seg = traits::segment(d_last); + + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(first, curr), + std::distance(traits::begin(d_seg), d_local) + ); + + const auto prev = curr - count; + + d_local = sfl::dtl::copy_backward + ( + prev, + curr, + d_local + ); + + curr = prev; + + if (curr == first) + { + return traits::compose(d_seg, d_local); + } + + --d_seg; + + d_local = traits::end(d_seg); + } + } +} + +template ::value >* = nullptr> +BidirIt2 copy_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::copy_backward + ( + traits::local(first), + traits::local(last), + d_last + ); + } + else + { + d_last = sfl::dtl::copy_backward + ( + traits::begin(last_seg), + traits::local(last), + d_last + ); + + --last_seg; + + while (first_seg != last_seg) + { + d_last = sfl::dtl::copy_backward + ( + traits::begin(last_seg), + traits::end(last_seg), + d_last + ); + + --last_seg; + } + + d_last = sfl::dtl::copy_backward + ( + traits::local(first), + traits::end(last_seg), + d_last + ); + + return d_last; + } +} + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +OutputIt move(InputIt first, InputIt last, OutputIt d_first) +{ + return std::move(first, last, d_first); +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value >* = nullptr> +OutputIt move(InputIt first, InputIt last, OutputIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_first; + } + else + { + auto curr = first; + + auto d_local = traits::local(d_first); + auto d_seg = traits::segment(d_first); + + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(curr, last), + std::distance(d_local, traits::end(d_seg)) + ); + + const auto next = curr + count; + + d_local = sfl::dtl::move + ( + curr, + next, + d_local + ); + + curr = next; + + if (curr == last) + { + return traits::compose(d_seg, d_local); + } + + ++d_seg; + + d_local = traits::begin(d_seg); + } + } +} + +template ::value >* = nullptr> +OutputIt move(InputIt first, InputIt last, OutputIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::move + ( + traits::local(first), + traits::local(last), + d_first + ); + } + else + { + d_first = sfl::dtl::move + ( + traits::local(first), + traits::end(first_seg), + d_first + ); + + ++first_seg; + + while (first_seg != last_seg) + { + d_first = sfl::dtl::move + ( + traits::begin(first_seg), + traits::end(first_seg), + d_first + ); + + ++first_seg; + } + + d_first = sfl::dtl::move + ( + traits::begin(last_seg), + traits::local(last), + d_first + ); + + return d_first; + } +} + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +BidirIt2 move_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) +{ + return std::move_backward(first, last, d_last); +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value >* = nullptr> +BidirIt2 move_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_last; + } + else + { + auto curr = last; + + auto d_local = traits::local(d_last); + auto d_seg = traits::segment(d_last); + + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(first, curr), + std::distance(traits::begin(d_seg), d_local) + ); + + const auto prev = curr - count; + + d_local = sfl::dtl::move_backward + ( + prev, + curr, + d_local + ); + + curr = prev; + + if (curr == first) + { + return traits::compose(d_seg, d_local); + } + + --d_seg; + + d_local = traits::end(d_seg); + } + } +} + +template ::value >* = nullptr> +BidirIt2 move_backward(BidirIt1 first, BidirIt1 last, BidirIt2 d_last) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::move_backward + ( + traits::local(first), + traits::local(last), + d_last + ); + } + else + { + d_last = sfl::dtl::move_backward + ( + traits::begin(last_seg), + traits::local(last), + d_last + ); + + --last_seg; + + while (first_seg != last_seg) + { + d_last = sfl::dtl::move_backward + ( + traits::begin(last_seg), + traits::end(last_seg), + d_last + ); + + --last_seg; + } + + d_last = sfl::dtl::move_backward + ( + traits::local(first), + traits::end(last_seg), + d_last + ); + + return d_last; + } +} + +template ::value >* = nullptr> +void fill(ForwardIt first, ForwardIt last, const T& value) +{ + std::fill(first, last, value); +} + +template ::value >* = nullptr> +void fill(ForwardIt first, ForwardIt last, const T& value) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + sfl::dtl::fill + ( + traits::local(first), + traits::local(last), + value + ); + } + else + { + sfl::dtl::fill + ( + traits::local(first), + traits::end(first_seg), + value + ); + + ++first_seg; + + while (first_seg != last_seg) + { + sfl::dtl::fill + ( + traits::begin(first_seg), + traits::end(first_seg), + value + ); + + ++first_seg; + } + + sfl::dtl::fill + ( + traits::begin(last_seg), + traits::local(last), + value + ); + } +} + +template +OutputIt fill_n(OutputIt first, Size count, const T& value) +{ + return std::fill_n(first, count, value); +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// UNINITIALIZED MEMORY ALGORITHMS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template +auto allocate(Allocator& a, Size n) -> typename std::allocator_traits::pointer +{ + if (n != 0) + { + return std::allocator_traits::allocate(a, n); + } + return nullptr; +} + +template +void deallocate(Allocator& a, Pointer p, Size n) noexcept +{ + if (p != nullptr) + { + std::allocator_traits::deallocate(a, p, n); + } +} + +template +void construct_at_a(Allocator& a, Pointer p, Args&&... args) +{ + std::allocator_traits::construct + ( + a, + sfl::dtl::to_address(p), + std::forward(args)... + ); +} + +template +void destroy_at_a(Allocator& a, Pointer p) noexcept +{ + std::allocator_traits::destroy + ( + a, + sfl::dtl::to_address(p) + ); +} + +template ::value >* = nullptr> +void destroy_a(Allocator& a, ForwardIt first, ForwardIt last) noexcept +{ + while (first != last) + { + sfl::dtl::destroy_at_a(a, std::addressof(*first)); + ++first; + } +} + +template ::value >* = nullptr> +void destroy_a(Allocator& a, ForwardIt first, ForwardIt last) noexcept +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + sfl::dtl::destroy_a + ( + a, + traits::local(first), + traits::local(last) + ); + } + else + { + sfl::dtl::destroy_a + ( + a, + traits::local(first), + traits::end(first_seg) + ); + + ++first_seg; + + while (first_seg != last_seg) + { + sfl::dtl::destroy_a + ( + a, + traits::begin(first_seg), + traits::end(first_seg) + ); + + ++first_seg; + } + + sfl::dtl::destroy_a + ( + a, + traits::begin(last_seg), + traits::local(last) + ); + } +} + +template ::value >* = nullptr> +ForwardIt destroy_n_a(Allocator& a, ForwardIt first, Size n) noexcept +{ + while (n > 0) + { + sfl::dtl::destroy_at_a(a, std::addressof(*first)); + ++first; + --n; + } + return first; +} + +template ::value >* = nullptr> +ForwardIt destroy_n_a(Allocator& a, ForwardIt first, Size n) noexcept +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto curr_local = traits::local(first); + auto curr_seg = traits::segment(first); + + auto remainining = n; + + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + remainining, + std::distance(curr_local, traits::end(curr_seg)) + ); + + curr_local = sfl::dtl::destroy_n_a + ( + a, + curr_local, + count + ); + + remainining -= count; + + SFL_ASSERT(remainining <= n && "Bug in algorithm. Please report it."); + + if (remainining == 0) + { + return traits::compose(curr_seg, curr_local); + } + + ++curr_seg; + + curr_local = traits::begin(curr_seg); + } +} + +template ::value >* = nullptr> +void uninitialized_default_construct_a(Allocator& a, ForwardIt first, ForwardIt last) +{ + ForwardIt curr = first; + SFL_TRY + { + while (curr != last) + { + sfl::dtl::construct_at_a(a, std::addressof(*curr)); + ++curr; + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, first, curr); + SFL_RETHROW; + } +} + +template ::value >* = nullptr> +void uninitialized_default_construct_a(Allocator& a, ForwardIt first, ForwardIt last) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + sfl::dtl::uninitialized_default_construct_a + ( + a, + traits::local(first), + traits::local(last) + ); + } + else + { + sfl::dtl::uninitialized_default_construct_a + ( + a, + traits::local(first), + traits::end(first_seg) + ); + + ++first_seg; + + SFL_TRY + { + while (first_seg != last_seg) + { + sfl::dtl::uninitialized_default_construct_a + ( + a, + traits::begin(first_seg), + traits::end(first_seg) + ); + + ++first_seg; + } + + sfl::dtl::uninitialized_default_construct_a + ( + a, + traits::begin(last_seg), + traits::local(last) + ); + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + first, + traits::compose(first_seg, traits::begin(first_seg)) + ); + + SFL_RETHROW; + } + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_default_construct_n_a(Allocator& a, ForwardIt first, Size n) +{ + ForwardIt curr = first; + SFL_TRY + { + while (n > 0) + { + sfl::dtl::construct_at_a(a, std::addressof(*curr)); + ++curr; + --n; + } + return curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, first, curr); + SFL_RETHROW; + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_default_construct_n_a(Allocator& a, ForwardIt first, Size n) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto curr_local = traits::local(first); + auto curr_seg = traits::segment(first); + + auto remainining = n; + + SFL_TRY + { + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + remainining, + std::distance(curr_local, traits::end(curr_seg)) + ); + + curr_local = sfl::dtl::uninitialized_default_construct_n_a + ( + a, + curr_local, + count + ); + + remainining -= count; + + SFL_ASSERT(remainining <= n && "Bug in algorithm. Please report it."); + + if (remainining == 0) + { + return traits::compose(curr_seg, curr_local); + } + + ++curr_seg; + + curr_local = traits::begin(curr_seg); + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_n_a(a, first, n - remainining); + SFL_RETHROW; + } +} + +template ::value >* = nullptr> +void uninitialized_fill_a(Allocator& a, ForwardIt first, ForwardIt last, const T& value) +{ + ForwardIt curr = first; + SFL_TRY + { + while (curr != last) + { + sfl::dtl::construct_at_a(a, std::addressof(*curr), value); + ++curr; + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, first, curr); + SFL_RETHROW; + } +} + +template ::value >* = nullptr> +void uninitialized_fill_a(Allocator& a, ForwardIt first, ForwardIt last, const T& value) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + sfl::dtl::uninitialized_fill_a + ( + a, + traits::local(first), + traits::local(last), + value + ); + } + else + { + sfl::dtl::uninitialized_fill_a + ( + a, + traits::local(first), + traits::end(first_seg), + value + ); + + ++first_seg; + + SFL_TRY + { + while (first_seg != last_seg) + { + sfl::dtl::uninitialized_fill_a + ( + a, + traits::begin(first_seg), + traits::end(first_seg), + value + ); + + ++first_seg; + } + + sfl::dtl::uninitialized_fill_a + ( + a, + traits::begin(last_seg), + traits::local(last), + value + ); + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + first, + traits::compose(first_seg, traits::begin(first_seg)) + ); + + SFL_RETHROW; + } + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_fill_n_a(Allocator& a, ForwardIt first, Size n, const T& value) +{ + ForwardIt curr = first; + SFL_TRY + { + while (n > 0) + { + sfl::dtl::construct_at_a(a, std::addressof(*curr), value); + ++curr; + --n; + } + return curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, first, curr); + SFL_RETHROW; + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_fill_n_a(Allocator& a, ForwardIt first, Size n, const T& value) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto curr_local = traits::local(first); + auto curr_seg = traits::segment(first); + + auto remainining = n; + + SFL_TRY + { + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + remainining, + std::distance(curr_local, traits::end(curr_seg)) + ); + + curr_local = sfl::dtl::uninitialized_fill_n_a + ( + a, + curr_local, + count, + value + ); + + remainining -= count; + + SFL_ASSERT(remainining <= n && "Bug in algorithm. Please report it."); + + if (remainining == 0) + { + return traits::compose(curr_seg, curr_local); + } + + ++curr_seg; + + curr_local = traits::begin(curr_seg); + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_n_a(a, first, n - remainining); + SFL_RETHROW; + } +} + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +ForwardIt uninitialized_copy_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + ForwardIt d_curr = d_first; + SFL_TRY + { + while (first != last) + { + sfl::dtl::construct_at_a(a, std::addressof(*d_curr), *first); + ++d_curr; + ++first; + } + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, d_first, d_curr); + SFL_RETHROW; + } +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value >* = nullptr> +ForwardIt uninitialized_copy_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_first; + } + else + { + auto curr = first; + + auto d_local = traits::local(d_first); + auto d_seg = traits::segment(d_first); + + SFL_TRY + { + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(curr, last), + std::distance(d_local, traits::end(d_seg)) + ); + + const auto next = curr + count; + + d_local = sfl::dtl::uninitialized_copy_a + ( + a, + curr, + next, + d_local + ); + + curr = next; + + if (curr == last) + { + return traits::compose(d_seg, d_local); + } + + ++d_seg; + + d_local = traits::begin(d_seg); + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + d_first, + traits::compose(d_seg, d_local) + ); + SFL_RETHROW; + } + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_copy_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::uninitialized_copy_a + ( + a, + traits::local(first), + traits::local(last), + d_first + ); + } + else + { + auto d_curr = d_first; + + d_curr = sfl::dtl::uninitialized_copy_a + ( + a, + traits::local(first), + traits::end(first_seg), + d_curr + ); + + ++first_seg; + + SFL_TRY + { + while (first_seg != last_seg) + { + d_curr = sfl::dtl::uninitialized_copy_a + ( + a, + traits::begin(first_seg), + traits::end(first_seg), + d_curr + ); + + ++first_seg; + } + + d_curr = sfl::dtl::uninitialized_copy_a + ( + a, + traits::begin(last_seg), + traits::local(last), + d_curr + ); + + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + d_first, + d_curr + ); + SFL_RETHROW; + } + } +} + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +ForwardIt uninitialized_move_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + ForwardIt d_curr = d_first; + SFL_TRY + { + while (first != last) + { + sfl::dtl::construct_at_a(a, std::addressof(*d_curr), std::move(*first)); + ++d_curr; + ++first; + } + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, d_first, d_curr); + SFL_RETHROW; + } +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value >* = nullptr> +ForwardIt uninitialized_move_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_first; + } + else + { + auto curr = first; + + auto d_local = traits::local(d_first); + auto d_seg = traits::segment(d_first); + + SFL_TRY + { + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(curr, last), + std::distance(d_local, traits::end(d_seg)) + ); + + const auto next = curr + count; + + d_local = sfl::dtl::uninitialized_move_a + ( + a, + curr, + next, + d_local + ); + + curr = next; + + if (curr == last) + { + return traits::compose(d_seg, d_local); + } + + ++d_seg; + + d_local = traits::begin(d_seg); + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + d_first, + traits::compose(d_seg, d_local) + ); + SFL_RETHROW; + } + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_move_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::uninitialized_move_a + ( + a, + traits::local(first), + traits::local(last), + d_first + ); + } + else + { + auto d_curr = d_first; + + d_curr = sfl::dtl::uninitialized_move_a + ( + a, + traits::local(first), + traits::end(first_seg), + d_curr + ); + + ++first_seg; + + SFL_TRY + { + while (first_seg != last_seg) + { + d_curr = sfl::dtl::uninitialized_move_a + ( + a, + traits::begin(first_seg), + traits::end(first_seg), + d_curr + ); + + ++first_seg; + } + + d_curr = sfl::dtl::uninitialized_move_a + ( + a, + traits::begin(last_seg), + traits::local(last), + d_curr + ); + + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + d_first, + d_curr + ); + SFL_RETHROW; + } + } +} + +template ::value && + !sfl::dtl::is_segmented_iterator::value) || + (!sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_segmented_iterator::value && + !sfl::dtl::is_random_access_iterator::value) >* = nullptr> +ForwardIt uninitialized_move_if_noexcept_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + ForwardIt d_curr = d_first; + SFL_TRY + { + while (first != last) + { + sfl::dtl::construct_at_a(a, std::addressof(*d_curr), std::move_if_noexcept(*first)); + ++d_curr; + ++first; + } + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a(a, d_first, d_curr); + SFL_RETHROW; + } +} + +template ::value && + sfl::dtl::is_segmented_iterator::value && + sfl::dtl::is_random_access_iterator::value >* = nullptr> +ForwardIt uninitialized_move_if_noexcept_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + if (first == last) + { + return d_first; + } + else + { + auto curr = first; + + auto d_local = traits::local(d_first); + auto d_seg = traits::segment(d_first); + + SFL_TRY + { + while (true) + { + using difference_type = + typename std::iterator_traits::difference_type; + + const auto count = std::min + ( + std::distance(curr, last), + std::distance(d_local, traits::end(d_seg)) + ); + + const auto next = curr + count; + + d_local = sfl::dtl::uninitialized_move_if_noexcept_a + ( + a, + curr, + next, + d_local + ); + + curr = next; + + if (curr == last) + { + return traits::compose(d_seg, d_local); + } + + ++d_seg; + + d_local = traits::begin(d_seg); + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + d_first, + traits::compose(d_seg, d_local) + ); + SFL_RETHROW; + } + } +} + +template ::value >* = nullptr> +ForwardIt uninitialized_move_if_noexcept_a(Allocator& a, InputIt first, InputIt last, ForwardIt d_first) +{ + using traits = sfl::dtl::segmented_iterator_traits; + + auto first_seg = traits::segment(first); + auto last_seg = traits::segment(last); + + if (first_seg == last_seg) + { + return sfl::dtl::uninitialized_move_if_noexcept_a + ( + a, + traits::local(first), + traits::local(last), + d_first + ); + } + else + { + auto d_curr = d_first; + + d_curr = sfl::dtl::uninitialized_move_if_noexcept_a + ( + a, + traits::local(first), + traits::end(first_seg), + d_curr + ); + + ++first_seg; + + SFL_TRY + { + while (first_seg != last_seg) + { + d_curr = sfl::dtl::uninitialized_move_if_noexcept_a + ( + a, + traits::begin(first_seg), + traits::end(first_seg), + d_curr + ); + + ++first_seg; + } + + d_curr = sfl::dtl::uninitialized_move_if_noexcept_a + ( + a, + traits::begin(last_seg), + traits::local(last), + d_curr + ); + + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + a, + d_first, + d_curr + ); + SFL_RETHROW; + } + } +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template +void default_construct_at(T* p) +{ + ::new (static_cast(p)) T; +} + +template +void value_construct_at(T* p) +{ + ::new (static_cast(p)) T(); +} + +template +void construct_at(T* p, Args&&... args) +{ + ::new (static_cast(p)) T(std::forward(args)...); +} + +template +void destroy_at(T* p) noexcept +{ + p->~T(); +} + +template +void destroy(ForwardIt first, ForwardIt last) noexcept +{ + while (first != last) + { + sfl::dtl::destroy_at(std::addressof(*first)); + ++first; + } +} + +template +ForwardIt uninitialized_default_construct_n(ForwardIt first, Size n) +{ + ForwardIt curr = first; + SFL_TRY + { + while (n > 0) + { + sfl::dtl::default_construct_at(std::addressof(*curr)); + ++curr; + --n; + } + return curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy(first, curr); + SFL_RETHROW; + } +} + +template +ForwardIt uninitialized_value_construct_n(ForwardIt first, Size n) +{ + ForwardIt curr = first; + SFL_TRY + { + while (n > 0) + { + sfl::dtl::value_construct_at(std::addressof(*curr)); + ++curr; + --n; + } + return curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy(first, curr); + SFL_RETHROW; + } +} + +template +void uninitialized_fill(ForwardIt first, ForwardIt last, const T& value) +{ + ForwardIt curr = first; + SFL_TRY + { + while (curr != last) + { + sfl::dtl::construct_at(std::addressof(*curr), value); + ++curr; + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy(first, curr); + SFL_RETHROW; + } +} + +template +ForwardIt uninitialized_fill_n(ForwardIt first, Size n, const T& value) +{ + ForwardIt curr = first; + SFL_TRY + { + while (n > 0) + { + sfl::dtl::construct_at(std::addressof(*curr), value); + ++curr; + --n; + } + return curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy(first, curr); + SFL_RETHROW; + } +} + +template +ForwardIt uninitialized_copy(InputIt first, InputIt last, ForwardIt d_first) +{ + ForwardIt d_curr = d_first; + SFL_TRY + { + while (first != last) + { + sfl::dtl::construct_at(std::addressof(*d_curr), *first); + ++d_curr; + ++first; + } + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy(d_first, d_curr); + SFL_RETHROW; + } +} + +template +ForwardIt uninitialized_move(InputIt first, InputIt last, ForwardIt d_first) +{ + ForwardIt d_curr = d_first; + SFL_TRY + { + while (first != last) + { + sfl::dtl::construct_at(std::addressof(*d_curr), std::move(*first)); + ++d_curr; + ++first; + } + return d_curr; + } + SFL_CATCH (...) + { + sfl::dtl::destroy(d_first, d_curr); + SFL_RETHROW; + } +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// EXCEPTIONS +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +[[noreturn]] +inline void throw_length_error(const char* msg) +{ + #ifdef SFL_NO_EXCEPTIONS + sfl::dtl::ignore_unused(msg); + SFL_ASSERT(!"std::length_error thrown"); + std::abort(); + #else + throw std::length_error(msg); + #endif +} + +[[noreturn]] +inline void throw_out_of_range(const char* msg) +{ + #ifdef SFL_NO_EXCEPTIONS + sfl::dtl::ignore_unused(msg); + SFL_ASSERT(!"std::out_of_range thrown"); + std::abort(); + #else + throw std::out_of_range(msg); + #endif +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// INDEX SEQUENCE +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template +struct index_sequence +{ + using type = index_sequence; +}; + +template +struct index_sequence_concat; + +template +struct index_sequence_concat< sfl::dtl::index_sequence, + sfl::dtl::index_sequence > + : sfl::dtl::index_sequence +{}; + +template +struct make_index_sequence + : sfl::dtl::index_sequence_concat< typename sfl::dtl::make_index_sequence::type, + typename sfl::dtl::make_index_sequence::type >::type +{}; + +template <> +struct make_index_sequence<0> : sfl::dtl::index_sequence<> +{}; + +template <> +struct make_index_sequence<1> : sfl::dtl::index_sequence<0> +{}; + +template +using index_sequence_for = sfl::dtl::make_index_sequence; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// SCOPE GUARD +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +template +class scope_guard +{ +private: + + mutable bool dismissed_; + + Lambda lambda_; + +public: + + scope_guard(Lambda&& lambda) + : dismissed_(false) + , lambda_(std::forward(lambda)) + {} + + scope_guard(const scope_guard& other) = delete; + + scope_guard(scope_guard&& other) + : dismissed_(other.dismissed_) + , lambda_(std::move(other.lambda_)) + { + other.dismissed_ = true; + } + + scope_guard& operator=(const scope_guard& other) = delete; + + scope_guard& operator=(scope_guard&& other) + { + dismissed_ = other.dismissed_; + lambda_ = std::move(other.lambda_); + other.dismissed_ = true; + } + + ~scope_guard() + { + if (!dismissed_) + { + lambda_(); + } + } + + void dismiss() const noexcept + { + dismissed_ = true; + } +}; + +template +scope_guard make_scope_guard(Lambda&& lambda) +{ + return scope_guard(std::forward(lambda)); +} + +} // namespace dtl + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// DEFAULT INIT TAG +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +// Type used to tag that the inserted values should be default initialized. +struct default_init_t { }; + +} // namespace sfl + +#endif // SFL_PRIVATE_HPP_INCLUDED diff --git a/src/thirdparty/sfl/segmented_devector.hpp b/src/thirdparty/sfl/segmented_devector.hpp new file mode 100644 index 0000000000..45cd92e0f2 --- /dev/null +++ b/src/thirdparty/sfl/segmented_devector.hpp @@ -0,0 +1,2589 @@ +// +// Copyright (c) 2022 Slaven Falandys +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef SFL_SEGMENTED_DEVECTOR_HPP_INCLUDED +#define SFL_SEGMENTED_DEVECTOR_HPP_INCLUDED + +#include "private.hpp" + +#include // copy, move, swap, swap_ranges +#include // size_t +#include // initializer_list +#include // distance, next, reverse_iterator +#include // numeric_limits +#include // allocator, allocator_traits, pointer_traits +#include // is_same, is_nothrow_xxxxx +#include // forward, move, pair + +namespace sfl +{ + +template < typename T, + std::size_t N, + typename Allocator = std::allocator > +class segmented_devector +{ + static_assert(N > 0, "N must be greater than zero."); + +public: + + using allocator_type = Allocator; + using allocator_traits = std::allocator_traits; + using value_type = T; + using size_type = typename allocator_traits::size_type; + using difference_type = typename allocator_traits::difference_type; + using reference = T&; + using const_reference = const T&; + using pointer = typename allocator_traits::pointer; + using const_pointer = typename allocator_traits::const_pointer; + +private: + + using segment_allocator = typename std::allocator_traits::template rebind_alloc; + using segment_pointer = typename std::allocator_traits::pointer; + +public: + + using iterator = sfl::dtl::segmented_iterator; + using const_iterator = sfl::dtl::segmented_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static_assert + ( + std::is_same::value, + "Allocator::value_type must be same as sfl::segmented_devector::value_type." + ); + +public: + + static constexpr size_type segment_capacity = N; + +private: + + class data_base + { + public: + + // ---- TABLE (OF SEGMENTS) ---- + + segment_pointer table_bos_; // Begin of storage + segment_pointer table_eos_; // End of storage + segment_pointer table_first_; // First element in table + segment_pointer table_last_; // One-past-last element in table + + // ---- ELEMENTS IN VECTOR ---- + + iterator bos_; // Begin of storage + iterator eos_; // End of storage + iterator first_; // First element in vector + iterator last_; // One-past-last element in vector + }; + + class data : public data_base, public allocator_type + { + public: + + data() noexcept(std::is_nothrow_default_constructible::value) + : allocator_type() + {} + + data(const allocator_type& alloc) noexcept(std::is_nothrow_copy_constructible::value) + : allocator_type(alloc) + {} + + data(allocator_type&& other) noexcept(std::is_nothrow_move_constructible::value) + : allocator_type(std::move(other)) + {} + + allocator_type& ref_to_alloc() noexcept + { + return *this; + } + + const allocator_type& ref_to_alloc() const noexcept + { + return *this; + } + }; + + data data_; + +public: + + // + // ---- CONSTRUCTION AND DESTRUCTION -------------------------------------- + // + + segmented_devector() + : data_() + { + initialize_empty(); + } + + explicit segmented_devector(const Allocator& alloc) + : data_(alloc) + { + initialize_empty(); + } + + segmented_devector(size_type n) + : data_() + { + initialize_default_n(n); + } + + explicit segmented_devector(size_type n, const Allocator& alloc) + : data_(alloc) + { + initialize_default_n(n); + } + + segmented_devector(size_type n, const T& value) + : data_() + { + initialize_fill_n(n, value); + } + + segmented_devector(size_type n, const T& value, const Allocator& alloc) + : data_(alloc) + { + initialize_fill_n(n, value); + } + + template ::value>* = nullptr> + segmented_devector(InputIt first, InputIt last) + : data_() + { + initialize_range(first, last); + } + + template ::value>* = nullptr> + segmented_devector(InputIt first, InputIt last, const Allocator& alloc) + : data_(alloc) + { + initialize_range(first, last); + } + + segmented_devector(std::initializer_list ilist) + : segmented_devector(ilist.begin(), ilist.end()) + {} + + segmented_devector(std::initializer_list ilist, const Allocator& alloc) + : segmented_devector(ilist.begin(), ilist.end(), alloc) + {} + + segmented_devector(const segmented_devector& other) + : data_ + ( + allocator_traits::select_on_container_copy_construction + ( + other.data_.ref_to_alloc() + ) + ) + { + initialize_copy(other); + } + + segmented_devector(const segmented_devector& other, const Allocator& alloc) + : data_(alloc) + { + initialize_copy(other); + } + + segmented_devector(segmented_devector&& other) + : data_(std::move(other.data_.ref_to_alloc())) + { + initialize_move(other); + } + + segmented_devector(segmented_devector&& other, const Allocator& alloc) + : data_(alloc) + { + initialize_move(other); + } + + ~segmented_devector() + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + deallocate_storage(); + } + + // + // ---- ASSIGNMENT -------------------------------------------------------- + // + + void assign(size_type n, const T& value) + { + assign_fill_n(n, value); + } + + template ::value>* = nullptr> + void assign(InputIt first, InputIt last) + { + assign_range(first, last); + } + + void assign(std::initializer_list ilist) + { + assign_range(ilist.begin(), ilist.end()); + } + + segmented_devector& operator=(const segmented_devector& other) + { + assign_copy(other); + return *this; + } + + segmented_devector& operator=(segmented_devector&& other) + { + assign_move(other); + return *this; + } + + segmented_devector& operator=(std::initializer_list ilist) + { + assign_range(ilist.begin(), ilist.end()); + return *this; + } + + // + // ---- ALLOCATOR --------------------------------------------------------- + // + + SFL_NODISCARD + allocator_type get_allocator() const noexcept + { + return data_.ref_to_alloc(); + } + + // + // ---- ITERATORS --------------------------------------------------------- + // + + SFL_NODISCARD + iterator begin() noexcept + { + return data_.first_; + } + + SFL_NODISCARD + const_iterator begin() const noexcept + { + return data_.first_; + } + + SFL_NODISCARD + const_iterator cbegin() const noexcept + { + return data_.first_; + } + + SFL_NODISCARD + iterator end() noexcept + { + return data_.last_; + } + + SFL_NODISCARD + const_iterator end() const noexcept + { + return data_.last_; + } + + SFL_NODISCARD + const_iterator cend() const noexcept + { + return data_.last_; + } + + SFL_NODISCARD + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator rbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator rend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + iterator nth(size_type pos) noexcept + { + SFL_ASSERT(pos <= size()); + return begin() + pos; + } + + SFL_NODISCARD + const_iterator nth(size_type pos) const noexcept + { + SFL_ASSERT(pos <= size()); + return cbegin() + pos; + } + + SFL_NODISCARD + size_type index_of(const_iterator pos) const noexcept + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return std::distance(cbegin(), pos); + } + + // + // ---- SIZE AND CAPACITY ------------------------------------------------- + // + + SFL_NODISCARD + bool empty() const noexcept + { + return data_.last_ == data_.first_; + } + + SFL_NODISCARD + size_type size() const noexcept + { + return std::distance(data_.first_, data_.last_); + } + + SFL_NODISCARD + size_type max_size() const noexcept + { + return std::min + ( + allocator_traits::max_size(data_.ref_to_alloc()), + std::numeric_limits::max() / sizeof(value_type) + ); + } + + SFL_NODISCARD + size_type capacity() const noexcept + { + return std::distance(data_.bos_, data_.eos_); + } + + SFL_NODISCARD + size_type available_front() const noexcept + { + return std::distance(data_.bos_, data_.first_); + } + + SFL_NODISCARD + size_type available_back() const noexcept + { + return std::distance(data_.last_, data_.eos_); + } + + void reserve_front(size_type new_capacity) + { + const size_type size = this->size(); + const size_type available_front = this->available_front(); + + if (new_capacity > size + available_front) + { + grow_storage_front(new_capacity - (size + available_front)); + } + } + + void reserve_back(size_type new_capacity) + { + const size_type size = this->size(); + const size_type available_back = this->available_back(); + + if (new_capacity > size + available_back) + { + grow_storage_back(new_capacity - (size + available_back)); + } + } + + void shrink_to_fit() + { + shrink_storage(); + } + + // + // ---- ELEMENT ACCESS ---------------------------------------------------- + // + + SFL_NODISCARD + reference at(size_type pos) + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::segmented_devector::at"); + } + return *(begin() + pos); + } + + SFL_NODISCARD + const_reference at(size_type pos) const + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::segmented_devector::at"); + } + return *(cbegin() + pos); + } + + SFL_NODISCARD + reference operator[](size_type pos) noexcept + { + SFL_ASSERT(pos < size()); + return *(begin() + pos); + } + + SFL_NODISCARD + const_reference operator[](size_type pos) const noexcept + { + SFL_ASSERT(pos < size()); + return *(cbegin() + pos); + } + + SFL_NODISCARD + reference front() noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + const_reference front() const noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + reference back() noexcept + { + SFL_ASSERT(!empty()); + return *(--iterator(data_.last_)); + } + + SFL_NODISCARD + const_reference back() const noexcept + { + SFL_ASSERT(!empty()); + return *(--iterator(data_.last_)); + } + + // + // ---- MODIFIERS --------------------------------------------------------- + // + + void clear() noexcept + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + data_.last_ = data_.first_; + } + + template + iterator emplace(const_iterator pos, Args&&... args) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + + iterator p1 = begin() + std::distance(cbegin(), pos); + + const size_type dist_to_begin = std::distance(cbegin(), pos); + const size_type dist_to_end = std::distance(pos, cend()); + + if (dist_to_begin < dist_to_end) + { + if (data_.first_ == data_.bos_) + { + grow_storage_front(1); + p1 = nth(dist_to_begin); + } + + const iterator p2 = --iterator(p1); + + if (p1 == data_.first_) + { + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*p2), + std::forward(args)... + ); + + data_.first_ = p2; + } + else + { + const iterator p3 = ++iterator(data_.first_); + const iterator p4 = --iterator(data_.first_); + + const iterator old_first = data_.first_; + + // The order of operations is critical. First we will construct + // temporary value because arguments `args...` can contain + // reference to element in this container and after that + // we will move elements and insert new element. + + value_type tmp(std::forward(args)...); + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*p4), + std::move(*data_.first_) + ); + + data_.first_ = p4; + + sfl::dtl::move + ( + p3, + p1, + old_first + ); + + *p2 = std::move(tmp); + } + + return p2; + } + else + { + if (data_.last_ == data_.eos_) + { + grow_storage_back(1); + p1 = nth(dist_to_begin); + } + + if (p1 == data_.last_) + { + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*data_.last_), + std::forward(args)... + ); + + ++data_.last_; + } + else + { + const iterator p2 = --iterator(data_.last_); + + const iterator old_last = data_.last_; + + // The order of operations is critical. First we will construct + // temporary value because arguments `args...` can contain + // reference to element in this container and after that + // we will move elements and insert new element. + + value_type tmp(std::forward(args)...); + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*data_.last_), + std::move(*p2) + ); + + ++data_.last_; + + sfl::dtl::move_backward + ( + p1, + p2, + old_last + ); + + *p1 = std::move(tmp); + } + + return p1; + } + } + + iterator insert(const_iterator pos, const T& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return emplace(pos, value); + } + + iterator insert(const_iterator pos, T&& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return emplace(pos, std::move(value)); + } + + iterator insert(const_iterator pos, size_type n, const T& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_fill_n(pos, n, value); + } + + template ::value>* = nullptr> + iterator insert(const_iterator pos, InputIt first, InputIt last) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_range(pos, first, last); + } + + iterator insert(const_iterator pos, std::initializer_list ilist) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_range(pos, ilist.begin(), ilist.end()); + } + + template + reference emplace_front(Args&&... args) + { + if (data_.first_ == data_.bos_) + { + grow_storage_front(1); + } + + const iterator new_first = --iterator(data_.first_); + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*new_first), + std::forward(args)... + ); + + data_.first_ = new_first; + + return *new_first; + } + + template + reference emplace_back(Args&&... args) + { + if (data_.last_ == data_.eos_) + { + grow_storage_back(1); + } + + const iterator old_last = data_.last_; + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*data_.last_), + std::forward(args)... + ); + + ++data_.last_; + + return *old_last; + } + + void push_front(const T& value) + { + emplace_front(value); + } + + void push_front(T&& value) + { + emplace_front(std::move(value)); + } + + void push_back(const T& value) + { + emplace_back(value); + } + + void push_back(T&& value) + { + emplace_back(std::move(value)); + } + + void pop_front() + { + SFL_ASSERT(!empty()); + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), std::addressof(*data_.first_)); + + ++data_.first_; + } + + void pop_back() + { + SFL_ASSERT(!empty()); + + --data_.last_; + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), std::addressof(*data_.last_)); + } + + iterator erase(const_iterator pos) + { + SFL_ASSERT(cbegin() <= pos && pos < cend()); + + const size_type dist_to_begin = std::distance(cbegin(), pos); + const size_type dist_to_end = std::distance(pos, cend()); + + const iterator p1 = begin() + std::distance(cbegin(), pos); + const iterator p2 = ++iterator(p1); + + if (dist_to_begin < dist_to_end) + { + const iterator old_first = data_.first_; + + data_.first_ = sfl::dtl::move_backward(data_.first_, p1, p2); + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), std::addressof(*old_first)); + + return p2; + } + else + { + data_.last_ = sfl::dtl::move(p2, data_.last_, p1); + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), std::addressof(*data_.last_)); + + return p1; + } + } + + iterator erase(const_iterator first, const_iterator last) + { + SFL_ASSERT(cbegin() <= first && first <= last && last <= cend()); + + if (first == last) + { + return begin() + std::distance(cbegin(), first); + } + + const size_type dist_to_begin = std::distance(cbegin(), first); + const size_type dist_to_end = std::distance(last, cend()); + + if (dist_to_begin < dist_to_end) + { + const iterator p1 = begin() + std::distance(cbegin(), first); + const iterator p2 = begin() + std::distance(cbegin(), last); + + const iterator new_first = sfl::dtl::move_backward(data_.first_, p1, p2); + + sfl::dtl::destroy_a(data_.ref_to_alloc(), data_.first_, new_first); + + data_.first_ = new_first; + + return p2; + } + else + { + const iterator p1 = begin() + std::distance(cbegin(), first); + const iterator p2 = begin() + std::distance(cbegin(), last); + + const iterator new_last = sfl::dtl::move(p2, data_.last_, p1); + + sfl::dtl::destroy_a(data_.ref_to_alloc(), new_last, data_.last_); + + data_.last_ = new_last; + + return p1; + } + } + + void resize(size_type n) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = nth(n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type available_back = this->available_back(); + + if (n <= size + available_back) + { + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - size + ); + } + else + { + const size_type available_front = this->available_front(); + + if (n <= available_front + size + available_back) + { + sfl::dtl::uninitialized_default_construct_a + ( + data_.ref_to_alloc(), + data_.last_, + data_.eos_ + ); + + data_.last_ = data_.eos_; + + const iterator new_first = data_.first_ - (n - (size + available_back)); + + sfl::dtl::uninitialized_default_construct_a + ( + data_.ref_to_alloc(), + new_first, + data_.first_ + ); + + data_.first_ = new_first; + } + else + { + grow_storage_back(n - (available_front + size + available_back)); + + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - (size + available_front) + ); + + sfl::dtl::uninitialized_default_construct_a + ( + data_.ref_to_alloc(), + data_.bos_, + data_.first_ + ); + + data_.first_ = data_.bos_; + } + } + } + } + + void resize(size_type n, const T& value) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = nth(n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type available_back = this->available_back(); + + if (n <= size + available_back) + { + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - size, + value + ); + } + else + { + const size_type available_front = this->available_front(); + + if (n <= available_front + size + available_back) + { + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.last_, + data_.eos_, + value + ); + + data_.last_ = data_.eos_; + + const iterator new_first = data_.first_ - (n - (size + available_back)); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + new_first, + data_.first_, + value + ); + + data_.first_ = new_first; + } + else + { + grow_storage_back(n - (available_front + size + available_back)); + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - (size + available_front), + value + ); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.bos_, + data_.first_, + value + ); + + data_.first_ = data_.bos_; + } + } + } + } + + void resize_front(size_type n) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_first = nth(size - n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + new_first + ); + + data_.first_ = new_first; + } + else + { + const size_type available_front = this->available_front(); + + if (n > size + available_front) + { + grow_storage_front(n - (size + available_front)); + } + + const iterator new_first = data_.first_ - (n - size); + + sfl::dtl::uninitialized_default_construct_a + ( + data_.ref_to_alloc(), + new_first, + data_.first_ + ); + + data_.first_ = new_first; + } + } + + void resize_front(size_type n, const T& value) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_first = nth(size - n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + new_first + ); + + data_.first_ = new_first; + } + else + { + const size_type available_front = this->available_front(); + + if (n > size + available_front) + { + grow_storage_front(n - (size + available_front)); + } + + const iterator new_first = data_.first_ - (n - size); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + new_first, + data_.first_, + value + ); + + data_.first_ = new_first; + } + } + + void resize_back(size_type n) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = nth(n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type available_back = this->available_back(); + + if (n > size + available_back) + { + grow_storage_back(n - (size + available_back)); + } + + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - size + ); + } + } + + void resize_back(size_type n, const T& value) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = nth(n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type available_back = this->available_back(); + + if (n > size + available_back) + { + grow_storage_back(n - (size + available_back)); + } + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - size, + value + ); + } + } + + void swap(segmented_devector& other) noexcept + { + SFL_ASSERT + ( + allocator_traits::propagate_on_container_swap::value || + this->data_.ref_to_alloc() == other.data_.ref_to_alloc() + ); + + if (this == &other) + { + return; + } + + using std::swap; + + if (allocator_traits::propagate_on_container_swap::value) + { + swap(this->data_.ref_to_alloc(), other.data_.ref_to_alloc()); + } + + swap(this->data_, other.data_); + } + +private: + + // Allocates table for given number of elements (segments). + // It does not construct any element (segment). + // It only allocates memory for table. + // + segment_pointer allocate_table(size_type n) + { + segment_allocator seg_alloc(data_.ref_to_alloc()); + return sfl::dtl::allocate(seg_alloc, n); + } + + // Deallocates table. + // It does not destroy_a any element (segment). + // It only deallocates memory used by table. + // + void deallocate_table(segment_pointer p, size_type n) noexcept + { + segment_allocator seg_alloc(data_.ref_to_alloc()); + sfl::dtl::deallocate(seg_alloc, p, n); + } + + // Allocates memory for single segment. + // It does not construct any element. + // It only allocates memory for segment. + // + pointer allocate_segment() + { + return sfl::dtl::allocate(data_.ref_to_alloc(), N); + } + + // Deallocates memory used by single segment. + // It does not destroy_a any element. + // It only deallocates memory used by segment. + // + void deallocate_segment(pointer p) noexcept + { + sfl::dtl::deallocate(data_.ref_to_alloc(), p, N); + } + + // Allocates memory for multiple segments. + // It does not construct any element. + // It only allocates memory for segments. + // + void allocate_segments(segment_pointer first, segment_pointer last) + { + segment_pointer curr = first; + + SFL_TRY + { + while (curr != last) + { + *curr = allocate_segment(); + ++curr; + } + } + SFL_CATCH (...) + { + deallocate_segments(first, curr); + SFL_RETHROW; + } + } + + // Deallocates memory used by multiple segments. + // It does not destroy_a any element. + // It only deallocates memory used by segments. + // + void deallocate_segments(segment_pointer first, segment_pointer last) noexcept + { + while (first != last) + { + deallocate_segment(*first); + ++first; + } + } + + static constexpr size_type min_table_capacity() noexcept + { + return 8; + } + + // Allocates storage big enough to keep given number of elements. + // It does not construct any element. + // It only allocates memory. + // + void allocate_storage(size_type num_elements) + { + if (num_elements > max_size()) + { + sfl::dtl::throw_length_error("sfl::segmented_devector::allocate_storage"); + } + + // Required capacity of table + const size_type table_required = + num_elements / N + 1; + + const size_type table_capacity = + std::max(table_required, min_table_capacity()); + + data_.table_bos_ = allocate_table(table_capacity); + data_.table_eos_ = data_.table_bos_ + table_capacity; + data_.table_first_ = data_.table_bos_; + data_.table_last_ = data_.table_bos_ + table_required; + + SFL_TRY + { + allocate_segments(data_.table_first_, data_.table_last_); + + data_.bos_.segment_ = data_.table_first_; + data_.bos_.local_ = *data_.table_first_; + + data_.eos_.segment_ = (data_.table_last_ - 1); + data_.eos_.local_ = *(data_.table_last_ - 1) + (N - 1); + + data_.first_ = data_.bos_; + + data_.last_ = data_.first_; + } + SFL_CATCH (...) + { + deallocate_table(data_.table_bos_, table_capacity); + SFL_RETHROW; + } + } + + // Deallocates storage. + // It does not destroy_a any element. + // It only deallocates memory. + // + void deallocate_storage() noexcept + { + deallocate_segments + ( + data_.table_first_, + data_.table_last_ + ); + + deallocate_table + ( + data_.table_bos_, + std::distance(data_.table_bos_, data_.table_eos_) + ); + } + + // Increases capacity at the front for given number of elements. + // It does not construct any element. + // It only allocates memory. + // + void grow_storage_front(size_type num_additional_elements) + { + if (max_size() - capacity() < num_additional_elements) + { + sfl::dtl::throw_length_error("sfl::segmented_devector::grow_storage_front"); + } + + // Required capacity at the front of table + const size_type table_required_front = + num_additional_elements / N + (num_additional_elements % N == 0 ? 0 : 1); + + // Available capacity at the front of table + const size_type table_available_front = + std::distance(data_.table_bos_, data_.table_first_); + + // Increase table capacity at back if neccessary + if (table_required_front > table_available_front) + { + const size_type table_capacity = + std::distance(data_.table_bos_, data_.table_eos_); + + const size_type new_table_capacity = std::max + ( + table_capacity + table_capacity / 2, + table_capacity - table_available_front + table_required_front + ); + + // Distance (in segments) from BEGIN of storage to FIRST element. + const size_type dist1 = + std::distance(data_.bos_.segment_, data_.first_.segment_); + + // Distance (in segments) from BEGIN of storage to LAST element. + const size_type dist2 = + std::distance(data_.bos_.segment_, data_.last_.segment_); + + // Allocate new table. No effects if allocation fails. + const segment_pointer new_table_bos = + allocate_table(new_table_capacity); + + const segment_pointer new_table_eos = + new_table_bos + new_table_capacity; + + // Initialize LAST element in new table (noexecept). + const segment_pointer new_table_last = + new_table_eos - std::distance(data_.table_last_, data_.table_eos_); + + // Initialize FIRST element in new table (noexecept). + const segment_pointer new_table_first = sfl::dtl::copy_backward + ( + data_.table_first_, + data_.table_last_, + new_table_last + ); + + // Deallocate old table (noexecept). + deallocate_table(data_.table_bos_, table_capacity); + + // Update table (noexcept). + data_.table_bos_ = new_table_bos; + data_.table_eos_ = new_table_eos; + data_.table_first_ = new_table_first; + data_.table_last_ = new_table_last; + + // Update iterators (noexcept). + data_.bos_.segment_ = data_.table_first_; + data_.eos_.segment_ = data_.table_last_ - 1; + data_.first_.segment_ = data_.table_first_ + dist1; + data_.last_.segment_ = data_.table_first_ + dist2; + } + + const segment_pointer new_table_first = + data_.table_first_ - table_required_front; + + // Allocate additional segments. No effects if allocation fails. + allocate_segments(new_table_first, data_.table_first_); + + // Update table (noexcept). + data_.table_first_ = new_table_first; + + // Update iterators (noexcept). + data_.bos_.segment_ = data_.table_first_; + data_.bos_.local_ = *data_.table_first_; + } + + // Increases capacity at the back for given number of elements. + // It does not construct any element. + // It only allocates memory. + // + void grow_storage_back(size_type num_additional_elements) + { + if (max_size() - capacity() < num_additional_elements) + { + sfl::dtl::throw_length_error("sfl::segmented_devector::grow_storage_back"); + } + + // Required capacity at the back of table + const size_type table_required_back = + num_additional_elements / N + 1; + + // Available capacity at the back of table + const size_type table_available_back = + std::distance(data_.table_last_, data_.table_eos_); + + // Increase table capacity at back if neccessary + if (table_required_back > table_available_back) + { + const size_type table_capacity = + std::distance(data_.table_bos_, data_.table_eos_); + + const size_type new_table_capacity = std::max + ( + table_capacity + table_capacity / 2, + table_capacity - table_available_back + table_required_back + ); + + // Distance (in segments) from BEGIN of storage to FIRST element. + const size_type dist1 = + std::distance(data_.bos_.segment_, data_.first_.segment_); + + // Distance (in segments) from BEGIN of storage to LAST element. + const size_type dist2 = + std::distance(data_.bos_.segment_, data_.last_.segment_); + + // Allocate new table. No effects if allocation fails. + const segment_pointer new_table_bos = + allocate_table(new_table_capacity); + + const segment_pointer new_table_eos = + new_table_bos + new_table_capacity; + + // Initialize FIRST element in new table (noexcept). + const segment_pointer new_table_first = + new_table_bos + + std::distance(data_.table_bos_, data_.table_first_); + + // Initialize LAST element in new table (noexecept). + const segment_pointer new_table_last = sfl::dtl::copy + ( + data_.table_first_, + data_.table_last_, + new_table_first + ); + + // Deallocate old table (noexecept). + deallocate_table(data_.table_bos_, table_capacity); + + // Update table (noexcept). + data_.table_bos_ = new_table_bos; + data_.table_eos_ = new_table_eos; + data_.table_first_ = new_table_first; + data_.table_last_ = new_table_last; + + // Update iterators (noexcept). + data_.bos_.segment_ = data_.table_first_; + data_.eos_.segment_ = data_.table_last_ - 1; + data_.first_.segment_ = data_.table_first_ + dist1; + data_.last_.segment_ = data_.table_first_ + dist2; + } + + const segment_pointer new_table_last = + data_.table_last_ + table_required_back; + + // Allocate additional segments. No effects if allocation fails. + allocate_segments(data_.table_last_, new_table_last); + + // Update table (noexcept). + data_.table_last_ = new_table_last; + + // Update iterators (noexcept). + data_.eos_.segment_ = data_.table_last_ - 1; + data_.eos_.local_ = *(data_.table_last_ - 1) + (N - 1); + } + + // Removes unused capacity. + // It does not destroy_a any element. + // It only deallocates memory. + // + void shrink_storage() + { + // Destroy empty segments at front. + { + const segment_pointer new_table_first = data_.first_.segment_; + + deallocate_segments(data_.table_first_, new_table_first); + + data_.table_first_ = new_table_first; + + data_.bos_.segment_ = data_.table_first_; + data_.bos_.local_ = *data_.table_first_; + } + + // Destroy empty segments at back. + { + const segment_pointer new_table_last = data_.last_.segment_ + 1; + + deallocate_segments(new_table_last, data_.table_last_); + + data_.table_last_ = new_table_last; + + data_.eos_.segment_ = (data_.table_last_ - 1); + data_.eos_.local_ = *(data_.table_last_ - 1) + (N - 1); + } + + // Shrink table. + { + const size_type table_capacity = + std::distance(data_.table_bos_, data_.table_eos_); + + const size_type table_size = + std::distance(data_.table_first_, data_.table_last_); + + const size_type new_table_capacity = + std::max(table_size, min_table_capacity()); + + // Distance (in segments) from FIRST element to LAST element. + const size_type dist = + std::distance(data_.first_.segment_, data_.last_.segment_); + + // Allocate new table. No effects if allocation fails. + const segment_pointer new_table_bos = + allocate_table(new_table_capacity); + + const segment_pointer new_table_eos = + new_table_bos + new_table_capacity; + + // Initialize FIRST element in new table (noexcept). + const segment_pointer new_table_first = new_table_bos; + + // Initialize LAST element in new table (noexecept). + const segment_pointer new_table_last = sfl::dtl::copy + ( + data_.table_first_, + data_.table_last_, + new_table_first + ); + + // Deallocate old table (noexecept). + deallocate_table(data_.table_bos_, table_capacity); + + // Update table (noexcept). + data_.table_bos_ = new_table_bos; + data_.table_eos_ = new_table_eos; + data_.table_first_ = new_table_first; + data_.table_last_ = new_table_last; + + // Update iterators (noexcept). + data_.bos_.segment_ = data_.table_first_; + data_.eos_.segment_ = data_.table_last_ - 1; + data_.first_.segment_ = data_.table_first_; + data_.last_.segment_ = data_.table_first_ + dist; + } + } + + void initialize_empty() + { + allocate_storage(0); + } + + void initialize_default_n(size_type n) + { + allocate_storage(n); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + void initialize_fill_n(size_type n, const T& value) + { + allocate_storage(n); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n, + value + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + void initialize_range(InputIt first, InputIt last) + { + allocate_storage(0); + + SFL_TRY + { + while (first != last) + { + emplace_back(*first); + ++first; + } + } + SFL_CATCH (...) + { + clear(); + deallocate_storage(); + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + void initialize_range(ForwardIt first, ForwardIt last) + { + allocate_storage(std::distance(first, last)); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + last, + data_.first_ + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + void initialize_copy(const segmented_devector& other) + { + allocate_storage(other.size()); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + void initialize_move(segmented_devector& other) + { + if (data_.ref_to_alloc() == other.data_.ref_to_alloc()) + { + allocate_storage(0); + using std::swap; + swap(data_, other.data_); + } + else + { + allocate_storage(other.size()); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + } + + void assign_fill_n(size_type n, const T& value) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = data_.first_ + n; + + sfl::dtl::fill + ( + data_.first_, + new_last, + value + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type available_back = this->available_back(); + + if (n <= size + available_back) + { + sfl::dtl::fill + ( + data_.first_, + data_.last_, + value + ); + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - size, + value + ); + } + else + { + const size_type available_front = this->available_front(); + + if (n <= available_front + size + available_back) + { + sfl::dtl::fill + ( + data_.first_, + data_.last_, + value + ); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.last_, + data_.eos_, + value + ); + + data_.last_ = data_.eos_; + + const iterator new_first = data_.first_ - (n - (size + available_back)); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + new_first, + data_.first_, + value + ); + + data_.first_ = new_first; + } + else + { + grow_storage_back(n - (available_front + size + available_back)); + + sfl::dtl::fill + ( + data_.first_, + data_.last_, + value + ); + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - (size + available_front), + value + ); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.bos_, + data_.first_, + value + ); + + data_.first_ = data_.bos_; + } + } + } + } + + template ::value>* = nullptr> + void assign_range(InputIt first, InputIt last) + { + iterator curr = data_.first_; + + while (first != last && curr != data_.last_) + { + *curr = *first; + ++curr; + ++first; + } + + if (first != last) + { + do + { + emplace_back(*first); + ++first; + } + while (first != last); + } + else if (curr < data_.last_) + { + sfl::dtl::destroy_a(data_.ref_to_alloc(), curr, data_.last_); + data_.last_ = curr; + } + } + + template ::value>* = nullptr> + void assign_range(ForwardIt first, ForwardIt last) + { + const size_type n = std::distance(first, last); + + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = sfl::dtl::copy + ( + first, + last, + data_.first_ + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type available_back = this->available_back(); + + if (n <= size + available_back) + { + const ForwardIt mid = std::next(first, size); + + sfl::dtl::copy + ( + first, + mid, + data_.first_ + ); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid, + last, + data_.last_ + ); + } + else + { + const size_type available_front = this->available_front(); + + if (n <= available_front + size + available_back) + { + const ForwardIt mid1 = std::next(first, n - (size + available_back)); + const ForwardIt mid2 = std::next(mid1, size); + + sfl::dtl::copy + ( + mid1, + mid2, + data_.first_ + ); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid2, + last, + data_.last_ + ); + + const iterator new_first = data_.first_ - (n - (size + available_back)); + + sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + mid1, + new_first + ); + + data_.first_ = new_first; + } + else + { + grow_storage_back(n - (available_front + size + available_back)); + + const ForwardIt mid1 = std::next(first, available_front); + const ForwardIt mid2 = std::next(mid1, size); + + sfl::dtl::copy + ( + mid1, + mid2, + data_.first_ + ); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid2, + last, + data_.last_ + ); + + sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + mid1, + data_.bos_ + ); + + data_.first_ = data_.bos_; + } + } + } + } + + void assign_copy(const segmented_devector& other) + { + if (this != &other) + { + if (allocator_traits::propagate_on_container_copy_assignment::value) + { + if (data_.ref_to_alloc() != other.data_.ref_to_alloc()) + { + // Create temporary vector using other allocator. + // There are no effects if allocation fails. + segmented_devector temp(other.data_.ref_to_alloc()); + + // Clear and destroy_a current storage (noexcept). + clear(); + deallocate_storage(); + + // Set pointers to null (noexcept). + data_.table_bos_ = nullptr; + data_.table_eos_ = nullptr; + data_.table_first_ = nullptr; + data_.table_last_ = nullptr; + + // Swap storage of this and temporary vector (noexcept). + using std::swap; + swap(data_, temp.data_); + + // Temporary vector has no allocated storage (pointers + // are set to null) so destructor of temporary vector + // has nothing to do. + } + + // Propagate allocator (noexcept). + data_.ref_to_alloc() = other.data_.ref_to_alloc(); + } + + assign_range + ( + other.data_.first_, + other.data_.last_ + ); + } + } + + void assign_move(segmented_devector& other) + { + using std::swap; + + if (data_.ref_to_alloc() == other.data_.ref_to_alloc()) + { + // Create temporary container using allocator of "this". + // There are no effects if allocation fails. + // NOTE: We could also use allocator of "other". There are no + // difference since both allocators compare equal. + segmented_devector temp(data_.ref_to_alloc()); + + // Clear storage of "this" (noexcept). + clear(); + + // Destroy storage of "this" (noexcept). + // NOTE: This does not set pointers to null. + deallocate_storage(); + + // Set pointers of "this" to null pointers (noexcept). + data_.table_bos_ = nullptr; + data_.table_eos_ = nullptr; + data_.table_first_ = nullptr; + data_.table_last_ = nullptr; + + // Current state: + // - "this" has no allocated storage (pointers are null). + + // Swap storage of "this" and "other" (noexcept) + swap(data_, other.data_); + + // After swap: + // - "this" owns storage previously owned by "other". + // - "other" has no allocated storage (pointers are null). + + // Swap storage of "other" and "temp" (noexcept) + swap(other.data_, temp.data_); + + // After swap: + // - "other" owns storage previously owned by "temp". + // - "temp" has no allocated storage (pointers are null). + // This is OK in this case. Destructor of "temp" has + // nothing to do. + + if (allocator_traits::propagate_on_container_move_assignment::value) + { + // Propagate allocator (noexcept). + data_.ref_to_alloc() = std::move(other.data_.ref_to_alloc()); + } + } + else if (allocator_traits::propagate_on_container_move_assignment::value) + { + // Create temporary container using allocator of "other". + // There are no effects if allocation fails. + segmented_devector temp(other.data_.ref_to_alloc()); + + // Clear storage of "this" (noexcept). + clear(); + + // Destroy storage of "this" (noexcept). + // NOTE: This does not set pointers to null. + deallocate_storage(); + + // Set pointers of "this" to null pointers (noexcept). + data_.table_bos_ = nullptr; + data_.table_eos_ = nullptr; + data_.table_first_ = nullptr; + data_.table_last_ = nullptr; + + // Current state: + // - "this" has no allocated storage (pointers are null). + + // Swap storage of "this" and "temp" (noexcept) + swap(data_, temp.data_); + + // After swap: + // - "this" owns storage previously owned by "temp". + // That storage was allocated by allocator of "temp" + // (i.e. copy of allocator of "other"). + // "this" cannot deallocate that storage because allocators + // of "this" and "other" does not compare equal. + // - "temp" has no allocated storage (pointers are null). + // This is OK in this case. Destructor of "temp" has + // nothing to do. + + // Propagate allocator (noexcept). + data_.ref_to_alloc() = std::move(other.data_.ref_to_alloc()); + + // After propagation: + // - "this" owns storage previously owned by "temp", but now + // "this" can deallocate that storage. + + // Move elements one-by-one from "other" to "this" (can throw) + assign_range + ( + std::make_move_iterator(other.data_.first_), + std::make_move_iterator(other.data_.last_) + ); + } + else + { + // Move elements one-by-one from "other" to "this" (can throw) + assign_range + ( + std::make_move_iterator(other.data_.first_), + std::make_move_iterator(other.data_.last_) + ); + } + } + + iterator insert_fill_n(const_iterator pos, size_type n, const T& value) + { + if (n == 0) + { + return begin() + std::distance(cbegin(), pos); + } + + const value_type tmp(value); + + const size_type dist_to_begin = std::distance(cbegin(), pos); + const size_type dist_to_end = std::distance(pos, cend()); + + if (dist_to_begin < dist_to_end) + { + const size_type available_front = this->available_front(); + + if (available_front < n) + { + grow_storage_front(n - available_front); + } + + const iterator p1 = data_.first_ + dist_to_begin; + const iterator p2 = p1 - n; + + if (dist_to_begin > n) + { + const iterator p3 = data_.first_ + n; + const iterator p4 = data_.first_ - n; + + const iterator old_first = data_.first_; + + sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + data_.first_, + p3, + p4 + ); + + data_.first_ = p4; + + sfl::dtl::move + ( + p3, + p1, + old_first + ); + + sfl::dtl::fill + ( + p2, + p1, + tmp + ); + } + else + { + const iterator p3 = data_.first_ - n; + + const iterator old_first = data_.first_; + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + p2, + data_.first_, + tmp + ); + + data_.first_ = p2; + + sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + old_first, + p1, + p3 + ); + + data_.first_ = p3; + + sfl::dtl::fill + ( + old_first, + p1, + tmp + ); + } + + return p2; + } + else + { + const size_type available_back = this->available_back(); + + if (available_back < n) + { + grow_storage_back(n - available_back); + } + + const iterator p1 = data_.first_ + dist_to_begin; + const iterator p2 = p1 + n; + + if (dist_to_end > n) + { + const iterator p3 = data_.last_ - n; + + const iterator old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::fill + ( + p1, + p2, + tmp + ); + } + else + { + const iterator old_last = data_.last_; + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.last_, + p2, + tmp + ); + + data_.last_ = p2; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p1, + old_last, + data_.last_ + ); + + sfl::dtl::fill + ( + p1, + old_last, + tmp + ); + } + + return p1; + } + } + + template ::value>* = nullptr> + iterator insert_range(const_iterator pos, InputIt first, InputIt last) + { + const size_type offset = std::distance(cbegin(), pos); + + while (first != last) + { + pos = insert(pos, *first); + ++pos; + ++first; + } + + return nth(offset); + } + + template ::value>* = nullptr> + iterator insert_range(const_iterator pos, ForwardIt first, ForwardIt last) + { + if (first == last) + { + return begin() + std::distance(cbegin(), pos); + } + + const size_type n = std::distance(first, last); + + const size_type dist_to_begin = std::distance(cbegin(), pos); + const size_type dist_to_end = std::distance(pos, cend()); + + if (dist_to_begin < dist_to_end) + { + const size_type available_front = this->available_front(); + + if (available_front < n) + { + grow_storage_front(n - available_front); + } + + const iterator p1 = data_.first_ + dist_to_begin; + const iterator p2 = p1 - n; + + if (dist_to_begin > n) + { + const iterator p3 = data_.first_ + n; + const iterator p4 = data_.first_ - n; + + const iterator old_first = data_.first_; + + sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + data_.first_, + p3, + p4 + ); + + data_.first_ = p4; + + sfl::dtl::move + ( + p3, + p1, + old_first + ); + + sfl::dtl::copy + ( + first, + last, + p2 + ); + } + else + { + const iterator p3 = data_.first_ - n; + + const iterator old_first = data_.first_; + + const ForwardIt mid = std::next(first, n - dist_to_begin); + + sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + mid, + p2 + ); + + data_.first_ = p2; + + sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + old_first, + p1, + p3 + ); + + data_.first_ = p3; + + sfl::dtl::copy + ( + mid, + last, + old_first + ); + } + + return p2; + } + else + { + const size_type available_back = this->available_back(); + + if (available_back < n) + { + grow_storage_back(n - available_back); + } + + const iterator p1 = data_.first_ + dist_to_begin; + const iterator p2 = data_.last_ - n; + + if (dist_to_end > n) + { + const iterator old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p2, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p2, + old_last + ); + + sfl::dtl::copy + ( + first, + last, + p1 + ); + } + else + { + const iterator old_last = data_.last_; + + const ForwardIt mid = std::next(first, dist_to_end); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid, + last, + data_.last_ + ); + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p1, + old_last, + data_.last_ + ); + + sfl::dtl::copy + ( + first, + mid, + p1 + ); + } + + return p1; + } + } +}; + +// +// ---- NON-MEMBER FUNCTIONS -------------------------------------------------- +// + +template +SFL_NODISCARD +bool operator== +( + const segmented_devector& x, + const segmented_devector& y +) +{ + return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin()); +} + +template +SFL_NODISCARD +bool operator!= +( + const segmented_devector& x, + const segmented_devector& y +) +{ + return !(x == y); +} + +template +SFL_NODISCARD +bool operator< +( + const segmented_devector& x, + const segmented_devector& y +) +{ + return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); +} + +template +SFL_NODISCARD +bool operator> +( + const segmented_devector& x, + const segmented_devector& y +) +{ + return y < x; +} + +template +SFL_NODISCARD +bool operator<= +( + const segmented_devector& x, + const segmented_devector& y +) +{ + return !(y < x); +} + +template +SFL_NODISCARD +bool operator>= +( + const segmented_devector& x, + const segmented_devector& y +) +{ + return !(x < y); +} + +template +void swap +( + segmented_devector& x, + segmented_devector& y +) +{ + x.swap(y); +} + +template +typename segmented_devector::size_type + erase(segmented_devector& c, const U& value) +{ + auto it = std::remove(c.begin(), c.end(), value); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +template +typename segmented_devector::size_type + erase_if(segmented_devector& c, Predicate pred) +{ + auto it = std::remove_if(c.begin(), c.end(), pred); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +} // namespace sfl + +#endif // SFL_SEGMENTED_DEVECTOR_HPP_INCLUDED diff --git a/src/thirdparty/sfl/segmented_vector.hpp b/src/thirdparty/sfl/segmented_vector.hpp new file mode 100644 index 0000000000..d5c9e50d1f --- /dev/null +++ b/src/thirdparty/sfl/segmented_vector.hpp @@ -0,0 +1,1808 @@ +// +// Copyright (c) 2022 Slaven Falandys +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef SFL_SEGMENTED_VECTOR_HPP_INCLUDED +#define SFL_SEGMENTED_VECTOR_HPP_INCLUDED + +#include "private.hpp" + +#include // copy, move, swap, swap_ranges +#include // size_t +#include // initializer_list +#include // distance, next, reverse_iterator +#include // numeric_limits +#include // allocator, allocator_traits, pointer_traits +#include // is_same, is_nothrow_xxxxx +#include // forward, move, pair + +namespace sfl +{ + +template < typename T, + std::size_t N, + typename Allocator = std::allocator > +class segmented_vector +{ + static_assert(N > 0, "N must be greater than zero."); + +public: + + using allocator_type = Allocator; + using allocator_traits = std::allocator_traits; + using value_type = T; + using size_type = typename allocator_traits::size_type; + using difference_type = typename allocator_traits::difference_type; + using reference = T&; + using const_reference = const T&; + using pointer = typename allocator_traits::pointer; + using const_pointer = typename allocator_traits::const_pointer; + +private: + + using segment_allocator = typename std::allocator_traits::template rebind_alloc; + using segment_pointer = typename std::allocator_traits::pointer; + +public: + + using iterator = sfl::dtl::segmented_iterator; + using const_iterator = sfl::dtl::segmented_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static_assert + ( + std::is_same::value, + "Allocator::value_type must be same as sfl::segmented_vector::value_type." + ); + +public: + + static constexpr size_type segment_capacity = N; + +private: + + class data_base + { + public: + + // ---- TABLE (OF SEGMENTS) ---- + + segment_pointer table_first_; // First element in table + segment_pointer table_last_; // One-past-last element in table + segment_pointer table_eos_; // End of storage + + // ---- ELEMENTS IN VECTOR ---- + + iterator first_; // First element in vector + iterator last_; // One-past-last element in vector + iterator eos_; // End of storage + }; + + class data : public data_base, public allocator_type + { + public: + + data() noexcept(std::is_nothrow_default_constructible::value) + : allocator_type() + {} + + data(const allocator_type& alloc) noexcept(std::is_nothrow_copy_constructible::value) + : allocator_type(alloc) + {} + + data(allocator_type&& other) noexcept(std::is_nothrow_move_constructible::value) + : allocator_type(std::move(other)) + {} + + allocator_type& ref_to_alloc() noexcept + { + return *this; + } + + const allocator_type& ref_to_alloc() const noexcept + { + return *this; + } + }; + + data data_; + +public: + + // + // ---- CONSTRUCTION AND DESTRUCTION -------------------------------------- + // + + segmented_vector() + : data_() + { + initialize_empty(); + } + + explicit segmented_vector(const Allocator& alloc) + : data_(alloc) + { + initialize_empty(); + } + + segmented_vector(size_type n) + : data_() + { + initialize_default_n(n); + } + + explicit segmented_vector(size_type n, const Allocator& alloc) + : data_(alloc) + { + initialize_default_n(n); + } + + segmented_vector(size_type n, const T& value) + : data_() + { + initialize_fill_n(n, value); + } + + segmented_vector(size_type n, const T& value, const Allocator& alloc) + : data_(alloc) + { + initialize_fill_n(n, value); + } + + template ::value>* = nullptr> + segmented_vector(InputIt first, InputIt last) + : data_() + { + initialize_range(first, last); + } + + template ::value>* = nullptr> + segmented_vector(InputIt first, InputIt last, const Allocator& alloc) + : data_(alloc) + { + initialize_range(first, last); + } + + segmented_vector(std::initializer_list ilist) + : segmented_vector(ilist.begin(), ilist.end()) + {} + + segmented_vector(std::initializer_list ilist, const Allocator& alloc) + : segmented_vector(ilist.begin(), ilist.end(), alloc) + {} + + segmented_vector(const segmented_vector& other) + : data_ + ( + allocator_traits::select_on_container_copy_construction + ( + other.data_.ref_to_alloc() + ) + ) + { + initialize_copy(other); + } + + segmented_vector(const segmented_vector& other, const Allocator& alloc) + : data_(alloc) + { + initialize_copy(other); + } + + segmented_vector(segmented_vector&& other) + : data_(std::move(other.data_.ref_to_alloc())) + { + initialize_move(other); + } + + segmented_vector(segmented_vector&& other, const Allocator& alloc) + : data_(alloc) + { + initialize_move(other); + } + + ~segmented_vector() + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + deallocate_storage(); + } + + // + // ---- ASSIGNMENT -------------------------------------------------------- + // + + void assign(size_type n, const T& value) + { + assign_fill_n(n, value); + } + + template ::value>* = nullptr> + void assign(InputIt first, InputIt last) + { + assign_range(first, last); + } + + void assign(std::initializer_list ilist) + { + assign_range(ilist.begin(), ilist.end()); + } + + segmented_vector& operator=(const segmented_vector& other) + { + assign_copy(other); + return *this; + } + + segmented_vector& operator=(segmented_vector&& other) + { + assign_move(other); + return *this; + } + + segmented_vector& operator=(std::initializer_list ilist) + { + assign_range(ilist.begin(), ilist.end()); + return *this; + } + + // + // ---- ALLOCATOR --------------------------------------------------------- + // + + SFL_NODISCARD + allocator_type get_allocator() const noexcept + { + return data_.ref_to_alloc(); + } + + // + // ---- ITERATORS --------------------------------------------------------- + // + + SFL_NODISCARD + iterator begin() noexcept + { + return data_.first_; + } + + SFL_NODISCARD + const_iterator begin() const noexcept + { + return data_.first_; + } + + SFL_NODISCARD + const_iterator cbegin() const noexcept + { + return data_.first_; + } + + SFL_NODISCARD + iterator end() noexcept + { + return data_.last_; + } + + SFL_NODISCARD + const_iterator end() const noexcept + { + return data_.last_; + } + + SFL_NODISCARD + const_iterator cend() const noexcept + { + return data_.last_; + } + + SFL_NODISCARD + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator rbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator rend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + iterator nth(size_type pos) noexcept + { + SFL_ASSERT(pos <= size()); + + const auto i = pos / N; + const auto j = pos - i * N; + + const auto seg = data_.table_first_ + i; + const auto elem = *seg + j; + + return iterator(seg, elem); + } + + SFL_NODISCARD + const_iterator nth(size_type pos) const noexcept + { + SFL_ASSERT(pos <= size()); + + const auto i = pos / N; + const auto j = pos - i * N; + + const auto seg = data_.table_first_ + i; + const auto elem = *seg + j; + + return iterator(seg, elem); + } + + SFL_NODISCARD + size_type index_of(const_iterator pos) const noexcept + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return std::distance(cbegin(), pos); + } + + // + // ---- SIZE AND CAPACITY ------------------------------------------------- + // + + SFL_NODISCARD + bool empty() const noexcept + { + return data_.last_ == data_.first_; + } + + SFL_NODISCARD + size_type size() const noexcept + { + return std::distance(data_.first_, data_.last_); + } + + SFL_NODISCARD + size_type max_size() const noexcept + { + return std::min + ( + allocator_traits::max_size(data_.ref_to_alloc()), + std::numeric_limits::max() / sizeof(value_type) + ); + } + + SFL_NODISCARD + size_type capacity() const noexcept + { + return std::distance(data_.first_, data_.eos_); + } + + SFL_NODISCARD + size_type available() const noexcept + { + return std::distance(data_.last_, data_.eos_); + } + + void reserve(size_type new_capacity) + { + const size_type capacity = this->capacity(); + + if (new_capacity > capacity) + { + grow_storage(new_capacity - capacity); + } + } + + void shrink_to_fit() + { + shrink_storage(); + } + + // + // ---- ELEMENT ACCESS ---------------------------------------------------- + // + + SFL_NODISCARD + reference at(size_type pos) + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::segmented_vector::at"); + } + + const auto i = pos / N; + const auto j = pos - i * N; + + return *(*(data_.table_first_ + i) + j); + } + + SFL_NODISCARD + const_reference at(size_type pos) const + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::segmented_vector::at"); + } + + const auto i = pos / N; + const auto j = pos - i * N; + + return *(*(data_.table_first_ + i) + j); + } + + SFL_NODISCARD + reference operator[](size_type pos) noexcept + { + SFL_ASSERT(pos < size()); + + const auto i = pos / N; + const auto j = pos - i * N; + + return *(*(data_.table_first_ + i) + j); + } + + SFL_NODISCARD + const_reference operator[](size_type pos) const noexcept + { + SFL_ASSERT(pos < size()); + + const auto i = pos / N; + const auto j = pos - i * N; + + return *(*(data_.table_first_ + i) + j); + } + + SFL_NODISCARD + reference front() noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + const_reference front() const noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + reference back() noexcept + { + SFL_ASSERT(!empty()); + return *(--iterator(data_.last_)); + } + + SFL_NODISCARD + const_reference back() const noexcept + { + SFL_ASSERT(!empty()); + return *(--iterator(data_.last_)); + } + + // + // ---- MODIFIERS --------------------------------------------------------- + // + + void clear() noexcept + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + data_.last_ = data_.first_; + } + + template + iterator emplace(const_iterator pos, Args&&... args) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + + iterator p1 = begin() + std::distance(cbegin(), pos); + + if (data_.last_ == data_.eos_) + { + const size_type offset = std::distance(cbegin(), pos); + grow_storage(1); + p1 = nth(offset); + } + + if (p1 == data_.last_) + { + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*data_.last_), + std::forward(args)... + ); + + ++data_.last_; + } + else + { + const iterator p2 = --iterator(data_.last_); + + const iterator old_last = data_.last_; + + // The order of operations is critical. First we will construct + // temporary value because arguments `args...` can contain + // reference to element in this container and after that + // we will move elements and insert new element. + + value_type tmp(std::forward(args)...); + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*old_last), + std::move(*p2) + ); + + ++data_.last_; + + sfl::dtl::move_backward + ( + p1, + p2, + old_last + ); + + *p1 = std::move(tmp); + } + + return p1; + } + + iterator insert(const_iterator pos, const T& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return emplace(pos, value); + } + + iterator insert(const_iterator pos, T&& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return emplace(pos, std::move(value)); + } + + iterator insert(const_iterator pos, size_type n, const T& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_fill_n(pos, n, value); + } + + template ::value>* = nullptr> + iterator insert(const_iterator pos, InputIt first, InputIt last) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_range(pos, first, last); + } + + iterator insert(const_iterator pos, std::initializer_list ilist) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_range(pos, ilist.begin(), ilist.end()); + } + + template + reference emplace_back(Args&&... args) + { + if (data_.last_ == data_.eos_) + { + grow_storage(1); + } + + const iterator old_last = data_.last_; + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + std::addressof(*data_.last_), + std::forward(args)... + ); + + ++data_.last_; + + return *old_last; + } + + void push_back(const T& value) + { + emplace_back(value); + } + + void push_back(T&& value) + { + emplace_back(std::move(value)); + } + + void pop_back() + { + SFL_ASSERT(!empty()); + + --data_.last_; + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), std::addressof(*data_.last_)); + } + + iterator erase(const_iterator pos) + { + SFL_ASSERT(cbegin() <= pos && pos < cend()); + + const iterator p = begin() + std::distance(cbegin(), pos); + + data_.last_ = sfl::dtl::move(p + 1, data_.last_, p); + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), std::addressof(*data_.last_)); + + return p; + } + + iterator erase(const_iterator first, const_iterator last) + { + SFL_ASSERT(cbegin() <= first && first <= last && last <= cend()); + + if (first == last) + { + return begin() + std::distance(cbegin(), first); + } + + const iterator p1 = begin() + std::distance(cbegin(), first); + const iterator p2 = begin() + std::distance(cbegin(), last); + + const iterator new_last = sfl::dtl::move(p2, data_.last_, p1); + + sfl::dtl::destroy_a(data_.ref_to_alloc(), new_last, data_.last_); + + data_.last_ = new_last; + + return p1; + } + + void resize(size_type n) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = nth(n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type delta = n - size; + + const size_type capacity = this->capacity(); + + if (n > capacity) + { + grow_storage(n - capacity); + } + + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.last_, + delta + ); + } + } + + void resize(size_type n, const T& value) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = nth(n); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type delta = n - size; + + const size_type capacity = this->capacity(); + + if (n > capacity) + { + grow_storage(n - capacity); + } + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + delta, + value + ); + } + } + + void swap(segmented_vector& other) noexcept + { + SFL_ASSERT + ( + allocator_traits::propagate_on_container_swap::value || + this->data_.ref_to_alloc() == other.data_.ref_to_alloc() + ); + + if (this == &other) + { + return; + } + + using std::swap; + + if (allocator_traits::propagate_on_container_swap::value) + { + swap(this->data_.ref_to_alloc(), other.data_.ref_to_alloc()); + } + + swap(this->data_, other.data_); + } + +private: + + // Allocates table for given number of elements (segments). + // It does not construct any element (segment). + // It only allocates memory for table. + // + segment_pointer allocate_table(size_type n) + { + segment_allocator seg_alloc(data_.ref_to_alloc()); + return sfl::dtl::allocate(seg_alloc, n); + } + + // Deallocates table. + // It does not destroy_a any element (segment). + // It only deallocates memory used by table. + // + void deallocate_table(segment_pointer p, size_type n) noexcept + { + segment_allocator seg_alloc(data_.ref_to_alloc()); + sfl::dtl::deallocate(seg_alloc, p, n); + } + + // Allocates memory for single segment. + // It does not construct any element. + // It only allocates memory for segment. + // + pointer allocate_segment() + { + return sfl::dtl::allocate(data_.ref_to_alloc(), N); + } + + // Deallocates memory used by single segment. + // It does not destroy_a any element. + // It only deallocates memory used by segment. + // + void deallocate_segment(pointer p) noexcept + { + sfl::dtl::deallocate(data_.ref_to_alloc(), p, N); + } + + // Allocates memory for multiple segments. + // It does not construct any element. + // It only allocates memory for segments. + // + void allocate_segments(segment_pointer first, segment_pointer last) + { + segment_pointer curr = first; + + SFL_TRY + { + while (curr != last) + { + *curr = allocate_segment(); + ++curr; + } + } + SFL_CATCH (...) + { + deallocate_segments(first, curr); + SFL_RETHROW; + } + } + + // Deallocates memory used by multiple segments. + // It does not destroy_a any element. + // It only deallocates memory used by segments. + // + void deallocate_segments(segment_pointer first, segment_pointer last) noexcept + { + while (first != last) + { + deallocate_segment(*first); + ++first; + } + } + + static constexpr size_type min_table_capacity() noexcept + { + return 8; + } + + // Allocates storage big enough to keep given number of elements. + // It does not construct any element. + // It only allocates memory. + // + void allocate_storage(size_type num_elements) + { + if (num_elements > max_size()) + { + sfl::dtl::throw_length_error("sfl::segmented_vector::allocate_storage"); + } + + // Required capacity of table + const size_type table_required = + num_elements / N + 1; + + const size_type table_capacity = + std::max(table_required, min_table_capacity()); + + data_.table_first_ = allocate_table(table_capacity); + data_.table_last_ = data_.table_first_ + table_required; + data_.table_eos_ = data_.table_first_ + table_capacity; + + SFL_TRY + { + allocate_segments(data_.table_first_, data_.table_last_); + + data_.first_.segment_ = data_.table_first_; + data_.first_.local_ = *data_.table_first_; + + data_.last_ = data_.first_; + + data_.eos_.segment_ = (data_.table_last_ - 1); + data_.eos_.local_ = *(data_.table_last_ - 1) + (N - 1); + } + SFL_CATCH (...) + { + deallocate_table(data_.table_first_, table_capacity); + SFL_RETHROW; + } + } + + // Deallocates storage. + // It does not destroy_a any element. + // It only deallocates memory. + // + void deallocate_storage() noexcept + { + deallocate_segments + ( + data_.table_first_, + data_.table_last_ + ); + + deallocate_table + ( + data_.table_first_, + std::distance(data_.table_first_, data_.table_eos_) + ); + } + + // Increases capacity for given number of elements. + // It does not construct any element. + // It only allocates memory. + // + void grow_storage(size_type num_additional_elements) + { + if (max_size() - capacity() < num_additional_elements) + { + sfl::dtl::throw_length_error("sfl::segmented_vector::grow_storage"); + } + + // Required capacity of table + const size_type table_required = + num_additional_elements / N + 1; + + // Available capacity of table + const size_type table_available = + std::distance(data_.table_last_, data_.table_eos_); + + // Increase table capacity if neccessary + if (table_required > table_available) + { + const size_type table_capacity = + std::distance(data_.table_first_, data_.table_eos_); + + const size_type new_table_capacity = std::max + ( + table_capacity + table_capacity / 2, + table_capacity - table_available + table_required + ); + + // Distance (in segments) from FIRST element to LAST element. + const size_type dist1 = + std::distance(data_.first_.segment_, data_.last_.segment_); + + // Distance (in segments) from FIRST element to END OF STORAGE. + const size_type dist2 = + std::distance(data_.first_.segment_, data_.eos_.segment_); + + // Allocate new table. No effects if allocation fails. + const segment_pointer new_table_first = + allocate_table(new_table_capacity); + + const segment_pointer new_table_eos = + new_table_first + new_table_capacity; + + // Initialize LAST element in new table (noexecept). + const segment_pointer new_table_last = sfl::dtl::copy + ( + data_.table_first_, + data_.table_last_, + new_table_first + ); + + // Deallocate old table (noexcept). + deallocate_table(data_.table_first_, table_capacity); + + // Update pointers (noexcept). + data_.table_first_ = new_table_first; + data_.table_last_ = new_table_last; + data_.table_eos_ = new_table_eos; + + // Update iterators (noexcept). + data_.first_.segment_ = new_table_first; + data_.last_.segment_ = new_table_first + dist1; + data_.eos_.segment_ = new_table_first + dist2; + } + + const segment_pointer new_table_last = + data_.table_last_ + table_required; + + // Allocate additional segments. No effects if allocation fails. + allocate_segments(data_.table_last_, new_table_last); + + // Update table (noexcept). + data_.table_last_ = new_table_last; + + // Update iterators (noexcept). + data_.eos_.segment_ = data_.table_last_ - 1; + data_.eos_.local_ = *(data_.table_last_ - 1) + (N - 1); + } + + // Removes unused capacity. + // It does not destroy_a any element. + // It only deallocates memory. + // + void shrink_storage() + { + // Destroy empty segments. + { + const segment_pointer new_table_last = data_.last_.segment_ + 1; + + deallocate_segments(new_table_last, data_.table_last_); + + data_.table_last_ = new_table_last; + + data_.eos_.segment_ = (data_.table_last_ - 1); + data_.eos_.local_ = *(data_.table_last_ - 1) + (N - 1); + } + + // Shrink table. + { + const size_type table_capacity = + std::distance(data_.table_first_, data_.table_eos_); + + const size_type table_size = + std::distance(data_.table_first_, data_.table_last_); + + const size_type new_table_capacity = + std::max(table_size, min_table_capacity()); + + // Distance (in segments) from FIRST element to LAST element. + const size_type dist = + std::distance(data_.first_.segment_, data_.last_.segment_); + + // Allocate new table. No effects if allocation fails. + const segment_pointer new_table_first = + allocate_table(new_table_capacity); + + const segment_pointer new_table_eos = + new_table_first + new_table_capacity; + + // Initialize LAST element in new table (noexecept). + const segment_pointer new_table_last = sfl::dtl::copy + ( + data_.table_first_, + data_.table_last_, + new_table_first + ); + + // Deallocate old table (noexcept). + deallocate_table(data_.table_first_, table_capacity); + + // Update pointers (noexcept). + data_.table_first_ = new_table_first; + data_.table_last_ = new_table_last; + data_.table_eos_ = new_table_eos; + + // Update iterators (noexcept). + data_.first_.segment_ = data_.table_first_; + data_.last_.segment_ = data_.table_first_ + dist; + data_.eos_.segment_ = data_.table_last_ - 1; + } + } + + void initialize_empty() + { + allocate_storage(0); + } + + void initialize_default_n(size_type n) + { + allocate_storage(n); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + void initialize_fill_n(size_type n, const T& value) + { + allocate_storage(n); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n, + value + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + void initialize_range(InputIt first, InputIt last) + { + allocate_storage(0); + + SFL_TRY + { + while (first != last) + { + emplace_back(*first); + ++first; + } + } + SFL_CATCH (...) + { + clear(); + deallocate_storage(); + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + void initialize_range(ForwardIt first, ForwardIt last) + { + allocate_storage(std::distance(first, last)); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + last, + data_.first_ + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + void initialize_copy(const segmented_vector& other) + { + allocate_storage(other.size()); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + + void initialize_move(segmented_vector& other) + { + if (data_.ref_to_alloc() == other.data_.ref_to_alloc()) + { + allocate_storage(0); + using std::swap; + swap(data_, other.data_); + } + else + { + allocate_storage(other.size()); + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + SFL_CATCH (...) + { + deallocate_storage(); + SFL_RETHROW; + } + } + } + + void assign_fill_n(size_type n, const T& value) + { + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = data_.first_ + n; + + sfl::dtl::fill + ( + data_.first_, + new_last, + value + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type capacity = this->capacity(); + + if (n > capacity) + { + grow_storage(n - capacity); + } + + sfl::dtl::fill + ( + data_.first_, + data_.first_ + size, + value + ); + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + n - size, + value + ); + } + } + + template ::value>* = nullptr> + void assign_range(InputIt first, InputIt last) + { + iterator curr = data_.first_; + + while (first != last && curr != data_.last_) + { + *curr = *first; + ++curr; + ++first; + } + + if (first != last) + { + do + { + emplace_back(*first); + ++first; + } + while (first != last); + } + else if (curr < data_.last_) + { + sfl::dtl::destroy_a(data_.ref_to_alloc(), curr, data_.last_); + data_.last_ = curr; + } + } + + template ::value>* = nullptr> + void assign_range(ForwardIt first, ForwardIt last) + { + const size_type n = std::distance(first, last); + + const size_type size = this->size(); + + if (n <= size) + { + const iterator new_last = sfl::dtl::copy + ( + first, + last, + data_.first_ + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const size_type capacity = this->capacity(); + + if (n > capacity) + { + grow_storage(n - capacity); + } + + const ForwardIt mid = std::next(first, size); + + sfl::dtl::copy + ( + first, + mid, + data_.first_ + ); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid, + last, + data_.last_ + ); + } + } + + void assign_copy(const segmented_vector& other) + { + if (this != &other) + { + if (allocator_traits::propagate_on_container_copy_assignment::value) + { + if (data_.ref_to_alloc() != other.data_.ref_to_alloc()) + { + // Create temporary vector using other allocator. + // There are no effects if allocation fails. + segmented_vector temp(other.data_.ref_to_alloc()); + + // Clear and destroy_a current storage (noexcept). + clear(); + deallocate_storage(); + + // Set pointers to null (noexcept). + data_.table_first_ = nullptr; + data_.table_last_ = nullptr; + data_.table_eos_ = nullptr; + + // Swap storage of this and temporary vector (noexcept). + using std::swap; + swap(data_, temp.data_); + + // Temporary vector has no allocated storage (pointers + // are set to null) so destructor of temporary vector + // has nothing to do. + } + + // Propagate allocator (noexcept). + data_.ref_to_alloc() = other.data_.ref_to_alloc(); + } + + assign_range + ( + other.data_.first_, + other.data_.last_ + ); + } + } + + void assign_move(segmented_vector& other) + { + using std::swap; + + if (data_.ref_to_alloc() == other.data_.ref_to_alloc()) + { + // Create temporary container using allocator of "this". + // There are no effects if allocation fails. + // NOTE: We could also use allocator of "other". There are no + // difference since both allocators compare equal. + segmented_vector temp(data_.ref_to_alloc()); + + // Clear storage of "this" (noexcept). + clear(); + + // Destroy storage of "this" (noexcept). + // NOTE: This does not set pointers to null. + deallocate_storage(); + + // Set pointers of "this" to null pointers (noexcept). + data_.table_first_ = nullptr; + data_.table_last_ = nullptr; + data_.table_eos_ = nullptr; + + // Current state: + // - "this" has no allocated storage (pointers are null). + + // Swap storage of "this" and "other" (noexcept) + swap(data_, other.data_); + + // After swap: + // - "this" owns storage previously owned by "other". + // - "other" has no allocated storage (pointers are null). + + // Swap storage of "other" and "temp" (noexcept) + swap(other.data_, temp.data_); + + // After swap: + // - "other" owns storage previously owned by "temp". + // - "temp" has no allocated storage (pointers are null). + // This is OK in this case. Destructor of "temp" has + // nothing to do. + + if (allocator_traits::propagate_on_container_move_assignment::value) + { + // Propagate allocator (noexcept). + data_.ref_to_alloc() = std::move(other.data_.ref_to_alloc()); + } + } + else if (allocator_traits::propagate_on_container_move_assignment::value) + { + // Create temporary container using allocator of "other". + // There are no effects if allocation fails. + segmented_vector temp(other.data_.ref_to_alloc()); + + // Clear storage of "this" (noexcept). + clear(); + + // Destroy storage of "this" (noexcept). + // NOTE: This does not set pointers to null. + deallocate_storage(); + + // Set pointers of "this" to null pointers (noexcept). + data_.table_first_ = nullptr; + data_.table_last_ = nullptr; + data_.table_eos_ = nullptr; + + // Current state: + // - "this" has no allocated storage (pointers are null). + + // Swap storage of "this" and "temp" (noexcept) + swap(data_, temp.data_); + + // After swap: + // - "this" owns storage previously owned by "temp". + // That storage was allocated by allocator of "temp" + // (i.e. copy of allocator of "other"). + // "this" cannot deallocate that storage because allocators + // of "this" and "other" does not compare equal. + // - "temp" has no allocated storage (pointers are null). + // This is OK in this case. Destructor of "temp" has + // nothing to do. + + // Propagate allocator (noexcept). + data_.ref_to_alloc() = std::move(other.data_.ref_to_alloc()); + + // After propagation: + // - "this" owns storage previously owned by "temp", but now + // "this" can deallocate that storage. + + // Move elements one-by-one from "other" to "this" (can throw) + assign_range + ( + std::make_move_iterator(other.data_.first_), + std::make_move_iterator(other.data_.last_) + ); + } + else + { + // Move elements one-by-one from "other" to "this" (can throw) + assign_range + ( + std::make_move_iterator(other.data_.first_), + std::make_move_iterator(other.data_.last_) + ); + } + } + + iterator insert_fill_n(const_iterator pos, size_type n, const T& value) + { + if (n == 0) + { + return begin() + std::distance(cbegin(), pos); + } + + const value_type tmp(value); + + const size_type dist_to_begin = std::distance(cbegin(), pos); + + const size_type available = this->available(); + + if (available < n) + { + grow_storage(n - available); + } + + const iterator p1 = data_.first_ + dist_to_begin; + const iterator p2 = p1 + n; + + if (p2 <= data_.last_) + { + const iterator p3 = data_.last_ - n; + + const iterator old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::fill + ( + p1, + p2, + tmp + ); + } + else + { + const iterator old_last = data_.last_; + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.last_, + p2, + tmp + ); + + data_.last_ = p2; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p1, + old_last, + data_.last_ + ); + + sfl::dtl::fill + ( + p1, + old_last, + tmp + ); + } + + return p1; + } + + template ::value>* = nullptr> + iterator insert_range(const_iterator pos, InputIt first, InputIt last) + { + const size_type offset = std::distance(cbegin(), pos); + + while (first != last) + { + pos = insert(pos, *first); + ++pos; + ++first; + } + + return nth(offset); + } + + template ::value>* = nullptr> + iterator insert_range(const_iterator pos, ForwardIt first, ForwardIt last) + { + if (first == last) + { + return begin() + std::distance(cbegin(), pos); + } + + const size_type n = std::distance(first, last); + + const size_type dist_to_begin = std::distance(cbegin(), pos); + const size_type dist_to_end = std::distance(pos, cend()); + + const size_type available = this->available(); + + if (available < n) + { + grow_storage(n - available); + } + + const iterator p1 = data_.first_ + dist_to_begin; + const iterator p2 = p1 + n; + + if (p2 <= data_.last_) + { + const iterator p3 = data_.last_ - n; + + const iterator old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::copy + ( + first, + last, + p1 + ); + } + else + { + const iterator old_last = data_.last_; + + const ForwardIt mid = std::next(first, dist_to_end); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid, + last, + data_.last_ + ); + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p1, + old_last, + data_.last_ + ); + + sfl::dtl::copy + ( + first, + mid, + p1 + ); + } + + return p1; + } +}; + +// +// ---- NON-MEMBER FUNCTIONS -------------------------------------------------- +// + +template +SFL_NODISCARD +bool operator== +( + const segmented_vector& x, + const segmented_vector& y +) +{ + return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin()); +} + +template +SFL_NODISCARD +bool operator!= +( + const segmented_vector& x, + const segmented_vector& y +) +{ + return !(x == y); +} + +template +SFL_NODISCARD +bool operator< +( + const segmented_vector& x, + const segmented_vector& y +) +{ + return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); +} + +template +SFL_NODISCARD +bool operator> +( + const segmented_vector& x, + const segmented_vector& y +) +{ + return y < x; +} + +template +SFL_NODISCARD +bool operator<= +( + const segmented_vector& x, + const segmented_vector& y +) +{ + return !(y < x); +} + +template +SFL_NODISCARD +bool operator>= +( + const segmented_vector& x, + const segmented_vector& y +) +{ + return !(x < y); +} + +template +void swap +( + segmented_vector& x, + segmented_vector& y +) +{ + x.swap(y); +} + +template +typename segmented_vector::size_type + erase(segmented_vector& c, const U& value) +{ + auto it = std::remove(c.begin(), c.end(), value); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +template +typename segmented_vector::size_type + erase_if(segmented_vector& c, Predicate pred) +{ + auto it = std::remove_if(c.begin(), c.end(), pred); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +} // namespace sfl + +#endif // SFL_SEGMENTED_VECTOR_HPP_INCLUDED diff --git a/src/thirdparty/sfl/small_vector.hpp b/src/thirdparty/sfl/small_vector.hpp new file mode 100644 index 0000000000..0d2c6b09ad --- /dev/null +++ b/src/thirdparty/sfl/small_vector.hpp @@ -0,0 +1,2540 @@ +// +// Copyright (c) 2022 Slaven Falandys +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef SFL_SMALL_VECTOR_HPP_INCLUDED +#define SFL_SMALL_VECTOR_HPP_INCLUDED + +#include "private.hpp" + +#include // copy, move, swap, swap_ranges +#include // size_t +#include // initializer_list +#include // distance, next, reverse_iterator +#include // numeric_limits +#include // allocator, allocator_traits, pointer_traits +#include // is_same, is_nothrow_xxxxx +#include // forward, move, pair + +namespace sfl +{ + +template < typename T, + std::size_t N, + typename Allocator = std::allocator > +class small_vector +{ +public: + + using allocator_type = Allocator; + using allocator_traits = std::allocator_traits; + using value_type = T; + using size_type = typename allocator_traits::size_type; + using difference_type = typename allocator_traits::difference_type; + using reference = T&; + using const_reference = const T&; + using pointer = typename allocator_traits::pointer; + using const_pointer = typename allocator_traits::const_pointer; + using iterator = sfl::dtl::normal_iterator; + using const_iterator = sfl::dtl::normal_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static_assert + ( + std::is_same::value, + "Allocator::value_type must be same as sfl::small_vector::value_type." + ); + +public: + + static constexpr size_type static_capacity = N; + +private: + + template + class data_base + { + private: + + union + { + value_type internal_storage_[N]; + }; + + public: + + pointer first_; + pointer last_; + pointer eos_; + + data_base() noexcept + : first_(std::pointer_traits::pointer_to(*internal_storage_)) + , last_(first_) + , eos_(first_ + N) + {} + + ~data_base() noexcept + {} + + pointer internal_storage() noexcept + { + return std::pointer_traits::pointer_to(*internal_storage_); + } + }; + + template + class data_base + { + public: + + pointer first_; + pointer last_; + pointer eos_; + + data_base() noexcept + : first_(nullptr) + , last_(nullptr) + , eos_(nullptr) + {} + + pointer internal_storage() noexcept + { + return nullptr; + } + }; + + class data : public data_base<(N > 0)> , public allocator_type + { + public: + + data() noexcept(std::is_nothrow_default_constructible::value) + : allocator_type() + {} + + data(const allocator_type& alloc) noexcept(std::is_nothrow_copy_constructible::value) + : allocator_type(alloc) + {} + + data(allocator_type&& other) noexcept(std::is_nothrow_move_constructible::value) + : allocator_type(std::move(other)) + {} + + allocator_type& ref_to_alloc() noexcept + { + return *this; + } + + const allocator_type& ref_to_alloc() const noexcept + { + return *this; + } + }; + + data data_; + +public: + + // + // ---- CONSTRUCTION AND DESTRUCTION -------------------------------------- + // + + small_vector() noexcept + ( + std::is_nothrow_default_constructible::value + ) + : data_() + {} + + explicit small_vector(const Allocator& alloc) noexcept + ( + std::is_nothrow_copy_constructible::value + ) + : data_(alloc) + {} + + small_vector(size_type n) + : data_() + { + initialize_default_n(n); + } + + explicit small_vector(size_type n, const Allocator& alloc) + : data_(alloc) + { + initialize_default_n(n); + } + + small_vector(size_type n, const T& value) + : data_() + { + initialize_fill_n(n, value); + } + + small_vector(size_type n, const T& value, const Allocator& alloc) + : data_(alloc) + { + initialize_fill_n(n, value); + } + + template ::value>* = nullptr> + small_vector(InputIt first, InputIt last) + : data_() + { + initialize_range(first, last); + } + + template ::value>* = nullptr> + small_vector(InputIt first, InputIt last, const Allocator& alloc) + : data_(alloc) + { + initialize_range(first, last); + } + + small_vector(std::initializer_list ilist) + : small_vector(ilist.begin(), ilist.end()) + {} + + small_vector(std::initializer_list ilist, const Allocator& alloc) + : small_vector(ilist.begin(), ilist.end(), alloc) + {} + + small_vector(const small_vector& other) + : data_ + ( + allocator_traits::select_on_container_copy_construction + ( + other.data_.ref_to_alloc() + ) + ) + { + initialize_copy(other); + } + + small_vector(const small_vector& other, const Allocator& alloc) + : data_(alloc) + { + initialize_copy(other); + } + + small_vector(small_vector&& other) + : data_(std::move(other.data_.ref_to_alloc())) + { + initialize_move(other); + } + + small_vector(small_vector&& other, const Allocator& alloc) + : data_(alloc) + { + initialize_move(other); + } + + ~small_vector() + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + } + + // + // ---- ASSIGNMENT -------------------------------------------------------- + // + + void assign(size_type n, const T& value) + { + assign_fill_n(n, value); + } + + template ::value>* = nullptr> + void assign(InputIt first, InputIt last) + { + assign_range(first, last); + } + + void assign(std::initializer_list ilist) + { + assign_range(ilist.begin(), ilist.end()); + } + + small_vector& operator=(const small_vector& other) + { + assign_copy(other); + return *this; + } + + small_vector& operator=(small_vector&& other) + { + assign_move(other); + return *this; + } + + small_vector& operator=(std::initializer_list ilist) + { + assign_range(ilist.begin(), ilist.end()); + return *this; + } + + // + // ---- ALLOCATOR --------------------------------------------------------- + // + + SFL_NODISCARD + allocator_type get_allocator() const noexcept + { + return data_.ref_to_alloc(); + } + + // + // ---- ITERATORS --------------------------------------------------------- + // + + SFL_NODISCARD + iterator begin() noexcept + { + return iterator(data_.first_); + } + + SFL_NODISCARD + const_iterator begin() const noexcept + { + return const_iterator(data_.first_); + } + + SFL_NODISCARD + const_iterator cbegin() const noexcept + { + return const_iterator(data_.first_); + } + + SFL_NODISCARD + iterator end() noexcept + { + return iterator(data_.last_); + } + + SFL_NODISCARD + const_iterator end() const noexcept + { + return const_iterator(data_.last_); + } + + SFL_NODISCARD + const_iterator cend() const noexcept + { + return const_iterator(data_.last_); + } + + SFL_NODISCARD + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator rbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator rend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + iterator nth(size_type pos) noexcept + { + SFL_ASSERT(pos <= size()); + return iterator(data_.first_ + pos); + } + + SFL_NODISCARD + const_iterator nth(size_type pos) const noexcept + { + SFL_ASSERT(pos <= size()); + return const_iterator(data_.first_ + pos); + } + + SFL_NODISCARD + size_type index_of(const_iterator pos) const noexcept + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return std::distance(cbegin(), pos); + } + + // + // ---- SIZE AND CAPACITY ------------------------------------------------- + // + + SFL_NODISCARD + bool empty() const noexcept + { + return data_.first_ == data_.last_; + } + + SFL_NODISCARD + size_type size() const noexcept + { + return std::distance(data_.first_, data_.last_); + } + + SFL_NODISCARD + size_type max_size() const noexcept + { + return std::min + ( + allocator_traits::max_size(data_.ref_to_alloc()), + std::numeric_limits::max() / sizeof(value_type) + ); + } + + SFL_NODISCARD + size_type capacity() const noexcept + { + return std::distance(data_.first_, data_.eos_); + } + + SFL_NODISCARD + size_type available() const noexcept + { + return std::distance(data_.last_, data_.eos_); + } + + void reserve(size_type new_cap) + { + check_size(new_cap, "sfl::small_vector::reserve"); + + if (new_cap > capacity()) + { + if (new_cap <= N) + { + if (data_.first_ == data_.internal_storage()) + { + // Do nothing. We are already using internal storage. + } + else + { + // We are not using internal storage but new capacity + // can fit in internal storage. + + pointer new_first = data_.internal_storage(); + pointer new_last = new_first; + pointer new_eos = new_first + N; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + } + } + else + { + pointer new_first = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + pointer new_last = new_first; + pointer new_eos = new_first + new_cap; + + SFL_TRY + { + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + } + SFL_CATCH (...) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + new_cap + ); + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + } + } + } + + void shrink_to_fit() + { + const size_type new_cap = size(); + + if (new_cap < capacity()) + { + if (new_cap <= N) + { + if (data_.first_ == data_.internal_storage()) + { + // Do nothing. We are already using internal storage. + } + else + { + // We are not using internal storage but new capacity + // can fit in internal storage. + + pointer new_first = data_.internal_storage(); + pointer new_last = new_first; + pointer new_eos = new_first + N; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + } + } + else + { + pointer new_first = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + pointer new_last = new_first; + pointer new_eos = new_first + new_cap; + + SFL_TRY + { + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + } + SFL_CATCH (...) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + new_cap + ); + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + } + } + } + + // + // ---- ELEMENT ACCESS ---------------------------------------------------- + // + + SFL_NODISCARD + reference at(size_type pos) + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::small_vector::at"); + } + + return *(data_.first_ + pos); + } + + SFL_NODISCARD + const_reference at(size_type pos) const + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::small_vector::at"); + } + + return *(data_.first_ + pos); + } + + SFL_NODISCARD + reference operator[](size_type pos) noexcept + { + SFL_ASSERT(pos < size()); + return *(data_.first_ + pos); + } + + SFL_NODISCARD + const_reference operator[](size_type pos) const noexcept + { + SFL_ASSERT(pos < size()); + return *(data_.first_ + pos); + } + + SFL_NODISCARD + reference front() noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + const_reference front() const noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + reference back() noexcept + { + SFL_ASSERT(!empty()); + return *(data_.last_ - 1); + } + + SFL_NODISCARD + const_reference back() const noexcept + { + SFL_ASSERT(!empty()); + return *(data_.last_ - 1); + } + + SFL_NODISCARD + T* data() noexcept + { + return sfl::dtl::to_address(data_.first_); + } + + SFL_NODISCARD + const T* data() const noexcept + { + return sfl::dtl::to_address(data_.first_); + } + + // + // ---- MODIFIERS --------------------------------------------------------- + // + + void clear() noexcept + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + data_.last_ = data_.first_; + } + + template + iterator emplace(const_iterator pos, Args&&... args) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + + if (data_.last_ != data_.eos_) + { + const pointer p1 = data_.first_ + std::distance(cbegin(), pos); + + if (p1 == data_.last_) + { + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + p1, + std::forward(args)... + ); + + ++data_.last_; + } + else + { + // This container can contain duplicates so we must + // create new element now as a temporary value. + value_type tmp(std::forward(args)...); + + const pointer p2 = data_.last_ - 1; + + const pointer old_last = data_.last_; + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + data_.last_, + std::move(*p2) + ); + + ++data_.last_; + + sfl::dtl::move_backward + ( + p1, + p2, + old_last + ); + + *p1 = std::move(tmp); + } + + return iterator(p1); + } + else + { + const difference_type offset = std::distance(cbegin(), pos); + + const size_type new_cap = + calculate_new_capacity(1, "sfl::small_vector::emplace"); + + pointer new_first; + pointer new_last; + pointer new_eos; + + if (new_cap <= N && data_.first_ != data_.internal_storage()) + { + new_first = data_.internal_storage(); + new_last = new_first; + new_eos = new_first + N; + } + else + { + new_first = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + new_last = new_first; + new_eos = new_first + new_cap; + } + + const pointer p = new_first + offset; + + SFL_TRY + { + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + p, + std::forward(args)... + ); + + new_last = nullptr; + + const pointer mid = data_.first_ + offset; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + mid, + new_first + ); + + ++new_last; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + mid, + data_.last_, + new_last + ); + } + SFL_CATCH (...) + { + if (new_last == nullptr) + { + sfl::dtl::destroy_at_a + ( + data_.ref_to_alloc(), + p + ); + } + else + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_first, + new_last + ); + } + + if (new_first != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + new_cap + ); + } + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + + return iterator(p); + } + } + + iterator insert(const_iterator pos, const T& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return emplace(pos, value); + } + + iterator insert(const_iterator pos, T&& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return emplace(pos, std::move(value)); + } + + iterator insert(const_iterator pos, size_type n, const T& value) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_fill_n(pos, n, value); + } + + template ::value>* = nullptr> + iterator insert(const_iterator pos, InputIt first, InputIt last) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_range(pos, first, last); + } + + iterator insert(const_iterator pos, std::initializer_list ilist) + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return insert_range(pos, ilist.begin(), ilist.end()); + } + + template + reference emplace_back(Args&&... args) + { + if (data_.last_ != data_.eos_) + { + const pointer old_last = data_.last_; + + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + data_.last_, + std::forward(args)... + ); + + ++data_.last_; + + return *old_last; + } + else + { + const size_type new_cap = + calculate_new_capacity(1, "sfl::small_vector::emplace_back"); + + pointer new_first; + pointer new_last; + pointer new_eos; + + if (new_cap <= N && data_.first_ != data_.internal_storage()) + { + new_first = data_.internal_storage(); + new_last = new_first; + new_eos = new_first + N; + } + else + { + new_first = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + new_last = new_first; + new_eos = new_first + new_cap; + } + + const pointer p = new_first + size(); + + SFL_TRY + { + sfl::dtl::construct_at_a + ( + data_.ref_to_alloc(), + p, + std::forward(args)... + ); + + new_last = nullptr; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + + ++new_last; + } + SFL_CATCH (...) + { + if (new_last == nullptr) + { + sfl::dtl::destroy_at_a + ( + data_.ref_to_alloc(), + p + ); + } + else + { + // Nothing to do + } + + if (new_first != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + new_cap + ); + } + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + + return *p; + } + } + + void push_back(const T& value) + { + emplace_back(value); + } + + void push_back(T&& value) + { + emplace_back(std::move(value)); + } + + void pop_back() + { + SFL_ASSERT(!empty()); + + --data_.last_; + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), data_.last_); + } + + iterator erase(const_iterator pos) + { + SFL_ASSERT(cbegin() <= pos && pos < cend()); + + const pointer p = data_.first_ + std::distance(cbegin(), pos); + + data_.last_ = sfl::dtl::move(p + 1, data_.last_, p); + + sfl::dtl::destroy_at_a(data_.ref_to_alloc(), data_.last_); + + return iterator(p); + } + + iterator erase(const_iterator first, const_iterator last) + { + SFL_ASSERT(cbegin() <= first && first <= last && last <= cend()); + + if (first == last) + { + return begin() + std::distance(cbegin(), first); + } + + const pointer p1 = data_.first_ + std::distance(cbegin(), first); + const pointer p2 = data_.first_ + std::distance(cbegin(), last); + + const pointer new_last = sfl::dtl::move(p2, data_.last_, p1); + + sfl::dtl::destroy_a(data_.ref_to_alloc(), new_last, data_.last_); + + data_.last_ = new_last; + + return iterator(p1); + } + + void resize(size_type n) + { + check_size(n, "sfl::small_vector::resize"); + + const size_type size = this->size(); + + if (n < size) + { + const pointer new_last = data_.first_ + n; + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else if (n > size) + { + const size_type delta = n - size; + + if (n > capacity()) + { + pointer new_first; + pointer new_last; + pointer new_eos; + + if (n <= N && data_.first_ != data_.internal_storage()) + { + new_first = data_.internal_storage(); + new_last = new_first; + new_eos = new_first + N; + } + else + { + new_first = sfl::dtl::allocate(data_.ref_to_alloc(), n); + new_last = new_first; + new_eos = new_first + n; + } + + SFL_TRY + { + sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + new_first + size, + delta + ); + + new_last = nullptr; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + + new_last += delta; + } + SFL_CATCH (...) + { + if (new_last == nullptr) + { + sfl::dtl::destroy_n_a + ( + data_.ref_to_alloc(), + new_first + size, + delta + ); + } + else + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_first, + new_last + ); + } + + if (new_first != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + n + ); + } + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + } + else + { + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.last_, + delta + ); + } + } + } + + void resize(size_type n, const T& value) + { + check_size(n, "sfl::small_vector::resize"); + + const size_type size = this->size(); + + if (n < size) + { + const pointer new_last = data_.first_ + n; + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else if (n > size) + { + const size_type delta = n - size; + + if (n > capacity()) + { + pointer new_first; + pointer new_last; + pointer new_eos; + + if (n <= N && data_.first_ != data_.internal_storage()) + { + new_first = data_.internal_storage(); + new_last = new_first; + new_eos = new_first + N; + } + else + { + new_first = sfl::dtl::allocate(data_.ref_to_alloc(), n); + new_last = new_first; + new_eos = new_first + n; + } + + SFL_TRY + { + sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + new_first + size, + delta, + value + ); + + new_last = nullptr; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_, + new_first + ); + + new_last += delta; + } + SFL_CATCH (...) + { + if (new_last == nullptr) + { + sfl::dtl::destroy_n_a + ( + data_.ref_to_alloc(), + new_first + size, + delta + ); + } + else + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_first, + new_last + ); + } + + if (new_first != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + n + ); + } + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + } + else + { + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.last_, + delta, + value + ); + } + } + } + + void swap(small_vector& other) + { + if (this == &other) + { + return; + } + + using std::swap; + + SFL_ASSERT + ( + allocator_traits::propagate_on_container_swap::value || + this->data_.ref_to_alloc() == other.data_.ref_to_alloc() + ); + + // If this and other allocator compares equal then one allocator + // can deallocate memory allocated by another allocator. + // One allocator can safely destroy_a elements constructed by other + // allocator regardless the two allocators compare equal or not. + + if (allocator_traits::propagate_on_container_swap::value) + { + swap(this->data_.ref_to_alloc(), other.data_.ref_to_alloc()); + } + + if + ( + this->data_.first_ == this->data_.internal_storage() && + other.data_.first_ == other.data_.internal_storage() + ) + { + const size_type this_size = this->size(); + const size_type other_size = other.size(); + + if (this_size <= other_size) + { + std::swap_ranges + ( + this->data_.first_, + this->data_.first_ + this_size, + other.data_.first_ + ); + + sfl::dtl::uninitialized_move_a + ( + this->data_.ref_to_alloc(), + other.data_.first_ + this_size, + other.data_.first_ + other_size, + this->data_.first_ + this_size + ); + + sfl::dtl::destroy_a + ( + other.data_.ref_to_alloc(), + other.data_.first_ + this_size, + other.data_.first_ + other_size + ); + } + else + { + std::swap_ranges + ( + other.data_.first_, + other.data_.first_ + other_size, + this->data_.first_ + ); + + sfl::dtl::uninitialized_move_a + ( + other.data_.ref_to_alloc(), + this->data_.first_ + other_size, + this->data_.first_ + this_size, + other.data_.first_ + other_size + ); + + sfl::dtl::destroy_a + ( + this->data_.ref_to_alloc(), + this->data_.first_ + other_size, + this->data_.first_ + this_size + ); + } + + this->data_.last_ = this->data_.first_ + other_size; + other.data_.last_ = other.data_.first_ + this_size; + } + else if + ( + this->data_.first_ == this->data_.internal_storage() && + other.data_.first_ != other.data_.internal_storage() + ) + { + pointer new_other_first = other.data_.internal_storage(); + pointer new_other_last = new_other_first; + pointer new_other_eos = new_other_first + N; + + new_other_last = sfl::dtl::uninitialized_move_a + ( + other.data_.ref_to_alloc(), + this->data_.first_, + this->data_.last_, + new_other_first + ); + + sfl::dtl::destroy_a + ( + this->data_.ref_to_alloc(), + this->data_.first_, + this->data_.last_ + ); + + this->data_.first_ = other.data_.first_; + this->data_.last_ = other.data_.last_; + this->data_.eos_ = other.data_.eos_; + + other.data_.first_ = new_other_first; + other.data_.last_ = new_other_last; + other.data_.eos_ = new_other_eos; + } + else if + ( + this->data_.first_ != this->data_.internal_storage() && + other.data_.first_ == other.data_.internal_storage() + ) + { + pointer new_this_first = this->data_.internal_storage(); + pointer new_this_last = new_this_first; + pointer new_this_eos = new_this_first + N; + + new_this_last = sfl::dtl::uninitialized_move_a + ( + this->data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + new_this_first + ); + + sfl::dtl::destroy_a + ( + other.data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_ + ); + + other.data_.first_ = this->data_.first_; + other.data_.last_ = this->data_.last_; + other.data_.eos_ = this->data_.eos_; + + this->data_.first_ = new_this_first; + this->data_.last_ = new_this_last; + this->data_.eos_ = new_this_eos; + } + else + { + swap(this->data_.first_, other.data_.first_); + swap(this->data_.last_, other.data_.last_); + swap(this->data_.eos_, other.data_.eos_); + } + } + +private: + + void check_size(size_type n, const char* msg) + { + if (n > max_size()) + { + sfl::dtl::throw_length_error(msg); + } + } + + size_type calculate_new_capacity(size_type num_additional_elements, const char* msg) + { + const size_type size = this->size(); + const size_type capacity = this->capacity(); + const size_type max_size = this->max_size(); + + if (max_size - size < num_additional_elements) + { + sfl::dtl::throw_length_error(msg); + } + else if (max_size - capacity < capacity / 2) + { + return max_size; + } + else if (size + num_additional_elements < capacity + capacity / 2) + { + return std::max(N, capacity + capacity / 2); + } + else + { + return std::max(N, size + num_additional_elements); + } + } + + void reset(size_type new_cap = N) + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = data_.internal_storage(); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + N; + + if (new_cap > N) + { + data_.first_ = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + new_cap; + + // If allocation throws, first_, last_ and eos_ will be valid + // (they will be pointing to internal_storage). + } + } + + void initialize_default_n(size_type n) + { + check_size(n, "sfl::small_vector::initialize_default_n"); + + if (n > N) + { + data_.first_ = sfl::dtl::allocate(data_.ref_to_alloc(), n); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + n; + } + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_default_construct_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n + ); + } + SFL_CATCH (...) + { + if (n > N) + { + sfl::dtl::deallocate(data_.ref_to_alloc(), data_.first_, n); + } + + SFL_RETHROW; + } + } + + void initialize_fill_n(size_type n, const T& value) + { + check_size(n, "sfl::small_vector::initialize_fill_n"); + + if (n > N) + { + data_.first_ = sfl::dtl::allocate(data_.ref_to_alloc(), n); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + n; + } + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n, + value + ); + } + SFL_CATCH (...) + { + if (n > N) + { + sfl::dtl::deallocate(data_.ref_to_alloc(), data_.first_, n); + } + + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + void initialize_range(InputIt first, InputIt last) + { + SFL_TRY + { + while (first != last) + { + emplace_back(*first); + ++first; + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + void initialize_range(ForwardIt first, ForwardIt last) + { + const size_type n = std::distance(first, last); + + check_size(n, "sfl::small_vector::initialize_range"); + + if (n > N) + { + data_.first_ = sfl::dtl::allocate(data_.ref_to_alloc(), n); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + n; + } + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + last, + data_.first_ + ); + } + SFL_CATCH (...) + { + if (n > N) + { + sfl::dtl::deallocate(data_.ref_to_alloc(), data_.first_, n); + } + + SFL_RETHROW; + } + } + + void initialize_copy(const small_vector& other) + { + const size_type n = other.size(); + + check_size(n, "sfl::small_vector::initialize_copy"); + + if (n > N) + { + data_.first_ = sfl::dtl::allocate(data_.ref_to_alloc(), n); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + n; + } + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + SFL_CATCH (...) + { + if (n > N) + { + sfl::dtl::deallocate(data_.ref_to_alloc(), data_.first_, n); + } + + SFL_RETHROW; + } + } + + void initialize_move(small_vector& other) + { + if (other.data_.first_ == other.data_.internal_storage()) + { + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + else if (data_.ref_to_alloc() == other.data_.ref_to_alloc()) + { + data_.first_ = other.data_.first_; + data_.last_ = other.data_.last_; + data_.eos_ = other.data_.eos_; + + other.data_.first_ = nullptr; + other.data_.last_ = nullptr; + other.data_.eos_ = nullptr; + } + else + { + const size_type n = other.size(); + + check_size(n, "sfl::small_vector::initialize_move"); + + if (n > N) + { + data_.first_ = sfl::dtl::allocate(data_.ref_to_alloc(), n); + data_.last_ = data_.first_; + data_.eos_ = data_.first_ + n; + } + + SFL_TRY + { + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + other.data_.first_, + other.data_.last_, + data_.first_ + ); + } + SFL_CATCH (...) + { + if (n > N) + { + sfl::dtl::deallocate(data_.ref_to_alloc(), data_.first_, n); + } + + SFL_RETHROW; + } + } + } + + void assign_fill_n(size_type n, const T& value) + { + check_size(n, "sfl::small_vector::assign_fill_n"); + + if (n <= capacity()) + { + const size_type size = this->size(); + + const pointer new_last = data_.first_ + n; + + if (n <= size) + { + sfl::dtl::fill + ( + data_.first_, + new_last, + value + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + } + else + { + sfl::dtl::fill + ( + data_.first_, + data_.last_, + value + ); + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.last_, + new_last, + value + ); + } + + data_.last_ = new_last; + } + else + { + reset(n); + + data_.last_ = sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + data_.first_, + n, + value + ); + } + } + + template ::value>* = nullptr> + void assign_range(InputIt first, InputIt last) + { + pointer curr = data_.first_; + + while (first != last && curr != data_.last_) + { + *curr = *first; + ++curr; + ++first; + } + + if (first != last) + { + do + { + emplace_back(*first); + ++first; + } + while (first != last); + } + else if (curr < data_.last_) + { + sfl::dtl::destroy_a(data_.ref_to_alloc(), curr, data_.last_); + data_.last_ = curr; + } + } + + template ::value>* = nullptr> + void assign_range(ForwardIt first, ForwardIt last) + { + const size_type n = std::distance(first, last); + + check_size(n, "sfl::small_vector::assign_range"); + + if (n <= capacity()) + { + const size_type size = this->size(); + + if (n <= size) + { + const pointer new_last = sfl::dtl::copy + ( + first, + last, + data_.first_ + ); + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const ForwardIt mid = std::next(first, size); + + sfl::dtl::copy + ( + first, + mid, + data_.first_ + ); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid, + last, + data_.last_ + ); + } + } + else + { + reset(n); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + last, + data_.first_ + ); + } + } + + void assign_copy(const small_vector& other) + { + if (this != &other) + { + if (allocator_traits::propagate_on_container_copy_assignment::value) + { + if (data_.ref_to_alloc() != other.data_.ref_to_alloc()) + { + reset(); + } + + data_.ref_to_alloc() = other.data_.ref_to_alloc(); + } + + assign_range + ( + other.data_.first_, + other.data_.last_ + ); + } + } + + void assign_move(small_vector& other) + { + if (allocator_traits::propagate_on_container_move_assignment::value) + { + if (data_.ref_to_alloc() != other.data_.ref_to_alloc()) + { + reset(); + } + + data_.ref_to_alloc() = std::move(other.data_.ref_to_alloc()); + } + + if (other.data_.first_ == other.data_.internal_storage()) + { + assign_range + ( + std::make_move_iterator(other.data_.first_), + std::make_move_iterator(other.data_.last_) + ); + } + else if (data_.ref_to_alloc() == other.data_.ref_to_alloc()) + { + reset(); + + data_.first_ = other.data_.first_; + data_.last_ = other.data_.last_; + data_.eos_ = other.data_.eos_; + + other.data_.first_ = nullptr; + other.data_.last_ = nullptr; + other.data_.eos_ = nullptr; + } + else + { + assign_range + ( + std::make_move_iterator(other.data_.first_), + std::make_move_iterator(other.data_.last_) + ); + } + } + + iterator insert_fill_n(const_iterator pos, size_type n, const T& value) + { + if (n == 0) + { + return begin() + std::distance(cbegin(), pos); + } + + if (available() >= n) + { + const value_type tmp(value); + + const pointer p1 = data_.first_ + std::distance(cbegin(), pos); + const pointer p2 = p1 + n; + + if (p2 <= data_.last_) + { + const pointer p3 = data_.last_ - n; + + const pointer old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::fill + ( + p1, + p2, + tmp + ); + } + else + { + const pointer old_last = data_.last_; + + sfl::dtl::uninitialized_fill_a + ( + data_.ref_to_alloc(), + data_.last_, + p2, + tmp + ); + + data_.last_ = p2; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p1, + old_last, + data_.last_ + ); + + sfl::dtl::fill + ( + p1, + old_last, + tmp + ); + } + + return iterator(p1); + } + else + { + const difference_type offset = std::distance(cbegin(), pos); + + const size_type new_cap = + calculate_new_capacity(n, "sfl::small_vector::insert_fill_n"); + + pointer new_first; + pointer new_last; + pointer new_eos; + + if (new_cap <= N && data_.first_ != data_.internal_storage()) + { + new_first = data_.internal_storage(); + new_last = new_first; + new_eos = new_first + N; + } + else + { + new_first = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + new_last = new_first; + new_eos = new_first + new_cap; + } + + const pointer p = new_first + offset; + + SFL_TRY + { + // `value` can be a reference to an element in this + // container. First we will create `n` copies of `value` + // and ffter that we can move elements. + + sfl::dtl::uninitialized_fill_n_a + ( + data_.ref_to_alloc(), + p, + n, + value + ); + + new_last = nullptr; + + const pointer mid = data_.first_ + offset; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + mid, + new_first + ); + + new_last += n; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + mid, + data_.last_, + new_last + ); + } + SFL_CATCH (...) + { + if (new_last == nullptr) + { + sfl::dtl::destroy_n_a + ( + data_.ref_to_alloc(), + p, + n + ); + } + else + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_first, + new_last + ); + } + + if (new_first != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + new_cap + ); + } + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + + return iterator(p); + } + } + + template ::value>* = nullptr> + iterator insert_range(const_iterator pos, InputIt first, InputIt last) + { + const difference_type offset = std::distance(cbegin(), pos); + + while (first != last) + { + pos = insert(pos, *first); + ++pos; + ++first; + } + + return begin() + offset; + } + + template ::value>* = nullptr> + iterator insert_range(const_iterator pos, ForwardIt first, ForwardIt last) + { + if (first == last) + { + return begin() + std::distance(cbegin(), pos); + } + + const size_type n = std::distance(first, last); + + if (available() >= n) + { + const pointer p1 = data_.first_ + std::distance(cbegin(), pos); + const pointer p2 = p1 + n; + + if (p2 <= data_.last_) + { + const pointer p3 = data_.last_ - n; + + const pointer old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::copy + ( + first, + last, + p1 + ); + } + else + { + const pointer old_last = data_.last_; + + const ForwardIt mid = std::next(first, std::distance(pos, cend())); + + data_.last_ = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + mid, + last, + data_.last_ + ); + + data_.last_ = sfl::dtl::uninitialized_move_a + ( + data_.ref_to_alloc(), + p1, + old_last, + data_.last_ + ); + + sfl::dtl::copy + ( + first, + mid, + p1 + ); + } + + return iterator(p1); + } + else + { + const difference_type offset = std::distance(cbegin(), pos); + + const size_type new_cap = + calculate_new_capacity(n, "sfl::small_vector::insert_range"); + + pointer new_first; + pointer new_last; + pointer new_eos; + + if (new_cap <= N && data_.first_ != data_.internal_storage()) + { + new_first = data_.internal_storage(); + new_last = new_first; + new_eos = new_first + N; + } + else + { + new_first = sfl::dtl::allocate(data_.ref_to_alloc(), new_cap); + new_last = new_first; + new_eos = new_first + new_cap; + } + + const pointer p = new_first + offset; + + SFL_TRY + { + const pointer mid = data_.first_ + offset; + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + data_.first_, + mid, + new_first + ); + + new_last = sfl::dtl::uninitialized_copy_a + ( + data_.ref_to_alloc(), + first, + last, + new_last + ); + + new_last = sfl::dtl::uninitialized_move_if_noexcept_a + ( + data_.ref_to_alloc(), + mid, + data_.last_, + new_last + ); + } + SFL_CATCH (...) + { + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + new_first, + new_last + ); + + if (new_first != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + new_first, + new_cap + ); + } + + SFL_RETHROW; + } + + sfl::dtl::destroy_a + ( + data_.ref_to_alloc(), + data_.first_, + data_.last_ + ); + + if (data_.first_ != data_.internal_storage()) + { + sfl::dtl::deallocate + ( + data_.ref_to_alloc(), + data_.first_, + std::distance(data_.first_, data_.eos_) + ); + } + + data_.first_ = new_first; + data_.last_ = new_last; + data_.eos_ = new_eos; + + return iterator(p); + } + } +}; + +// +// ---- NON-MEMBER FUNCTIONS -------------------------------------------------- +// + +template +SFL_NODISCARD +bool operator== +( + const small_vector& x, + const small_vector& y +) +{ + return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin()); +} + +template +SFL_NODISCARD +bool operator!= +( + const small_vector& x, + const small_vector& y +) +{ + return !(x == y); +} + +template +SFL_NODISCARD +bool operator< +( + const small_vector& x, + const small_vector& y +) +{ + return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); +} + +template +SFL_NODISCARD +bool operator> +( + const small_vector& x, + const small_vector& y +) +{ + return y < x; +} + +template +SFL_NODISCARD +bool operator<= +( + const small_vector& x, + const small_vector& y +) +{ + return !(y < x); +} + +template +SFL_NODISCARD +bool operator>= +( + const small_vector& x, + const small_vector& y +) +{ + return !(x < y); +} + +template +void swap +( + small_vector& x, + small_vector& y +) +{ + x.swap(y); +} + +template +typename small_vector::size_type + erase(small_vector& c, const U& value) +{ + auto it = std::remove(c.begin(), c.end(), value); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +template +typename small_vector::size_type + erase_if(small_vector& c, Predicate pred) +{ + auto it = std::remove_if(c.begin(), c.end(), pred); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +} // namespace sfl + +#endif // SFL_SMALL_VECTOR_HPP_INCLUDED diff --git a/src/thirdparty/sfl/static_vector.hpp b/src/thirdparty/sfl/static_vector.hpp new file mode 100644 index 0000000000..c993413544 --- /dev/null +++ b/src/thirdparty/sfl/static_vector.hpp @@ -0,0 +1,1119 @@ +// +// Copyright (c) 2022 Slaven Falandys +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#ifndef SFL_STATIC_VECTOR_HPP_INCLUDED +#define SFL_STATIC_VECTOR_HPP_INCLUDED + +#include "private.hpp" + +#include // copy, move, swap, swap_ranges +#include // size_t +#include // initializer_list +#include // distance, next, reverse_iterator +#include // numeric_limits +#include // allocator, allocator_traits, pointer_traits +#include // is_same, is_nothrow_xxxxx +#include // forward, move, pair + +namespace sfl +{ + +template +class static_vector +{ + static_assert(N > 0, "N must be greater than zero."); + +public: + + using value_type = T; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + using iterator = sfl::dtl::normal_iterator; + using const_iterator = sfl::dtl::normal_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + +public: + + static constexpr size_type static_capacity = N; + +private: + + struct data + { + union + { + value_type first_[N]; + }; + + pointer last_; + + data() noexcept + : last_(first_) + {} + + ~data() noexcept + {} + }; + + data data_; + +public: + + // + // ---- CONSTRUCTION AND DESTRUCTION -------------------------------------- + // + + static_vector() noexcept + {} + + static_vector(size_type n) + { + SFL_ASSERT(n <= capacity()); + + data_.last_ = sfl::dtl::uninitialized_value_construct_n + ( + data_.first_, + n + ); + } + + static_vector(size_type n, sfl::default_init_t) + { + SFL_ASSERT(n <= capacity()); + + data_.last_ = sfl::dtl::uninitialized_default_construct_n + ( + data_.first_, + n + ); + } + + static_vector(size_type n, const T& value) + { + SFL_ASSERT(n <= capacity()); + + data_.last_ = sfl::dtl::uninitialized_fill_n + ( + data_.first_, + n, + value + ); + } + + template ::value>* = nullptr> + static_vector(InputIt first, InputIt last) + { + SFL_TRY + { + while (first != last) + { + emplace_back(*first); + ++first; + } + } + SFL_CATCH (...) + { + sfl::dtl::destroy(data_.first_, data_.last_); + SFL_RETHROW; + } + } + + template ::value>* = nullptr> + static_vector(ForwardIt first, ForwardIt last) + { + SFL_ASSERT(size_type(std::distance(first, last)) <= capacity()); + + data_.last_ = sfl::dtl::uninitialized_copy + ( + first, + last, + data_.first_ + ); + } + + static_vector(std::initializer_list ilist) + : static_vector(ilist.begin(), ilist.end()) + {} + + static_vector(const static_vector& other) + { + data_.last_ = sfl::dtl::uninitialized_copy + ( + pointer(other.data_.first_), + pointer(other.data_.last_), + data_.first_ + ); + } + + static_vector(static_vector&& other) + { + data_.last_ = sfl::dtl::uninitialized_move + ( + std::make_move_iterator(pointer(other.data_.first_)), + std::make_move_iterator(pointer(other.data_.last_)), + data_.first_ + ); + } + + ~static_vector() noexcept + { + sfl::dtl::destroy(data_.first_, data_.last_); + } + + // + // ---- ASSIGNMENT -------------------------------------------------------- + // + + void assign(size_type n, const T& value) + { + SFL_ASSERT(n <= capacity()); + + const size_type size = this->size(); + + const pointer new_last = data_.first_ + n; + + if (n <= size) + { + sfl::dtl::fill + ( + data_.first_, + new_last, + value + ); + + sfl::dtl::destroy + ( + new_last, + data_.last_ + ); + } + else + { + sfl::dtl::fill + ( + data_.first_, + data_.last_, + value + ); + + sfl::dtl::uninitialized_fill + ( + data_.last_, + new_last, + value + ); + } + + data_.last_ = new_last; + } + + template ::value>* = nullptr> + void assign(InputIt first, InputIt last) + { + pointer curr = data_.first_; + + while (first != last && curr != data_.last_) + { + *curr = *first; + ++curr; + ++first; + } + + if (first != last) + { + do + { + emplace_back(*first); + ++first; + } + while (first != last); + } + else if (curr < data_.last_) + { + sfl::dtl::destroy(curr, data_.last_); + data_.last_ = curr; + } + } + + template ::value>* = nullptr> + void assign(ForwardIt first, ForwardIt last) + { + SFL_ASSERT(size_type(std::distance(first, last)) <= capacity()); + + const size_type n = std::distance(first, last); + + const size_type size = this->size(); + + if (n <= size) + { + const pointer new_last = sfl::dtl::copy + ( + first, + last, + data_.first_ + ); + + sfl::dtl::destroy + ( + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else + { + const ForwardIt mid = std::next(first, size); + + sfl::dtl::copy + ( + first, + mid, + data_.first_ + ); + + data_.last_ = sfl::dtl::uninitialized_copy + ( + mid, + last, + data_.last_ + ); + } + } + + void assign(std::initializer_list ilist) + { + assign(ilist.begin(), ilist.end()); + } + + static_vector& operator=(const static_vector& other) + { + if (this != &other) + { + assign + ( + pointer(other.data_.first_), + pointer(other.data_.last_) + ); + } + return *this; + } + + static_vector& operator=(static_vector&& other) + { + assign + ( + std::make_move_iterator(pointer(other.data_.first_)), + std::make_move_iterator(pointer(other.data_.last_)) + ); + return *this; + } + + static_vector& operator=(std::initializer_list ilist) + { + assign(ilist.begin(), ilist.end()); + return *this; + } + + // + // ---- ITERATORS --------------------------------------------------------- + // + + SFL_NODISCARD + iterator begin() noexcept + { + return iterator(data_.first_); + } + + SFL_NODISCARD + const_iterator begin() const noexcept + { + return const_iterator(data_.first_); + } + + SFL_NODISCARD + const_iterator cbegin() const noexcept + { + return const_iterator(data_.first_); + } + + SFL_NODISCARD + iterator end() noexcept + { + return iterator(data_.last_); + } + + SFL_NODISCARD + const_iterator end() const noexcept + { + return const_iterator(data_.last_); + } + + SFL_NODISCARD + const_iterator cend() const noexcept + { + return const_iterator(data_.last_); + } + + SFL_NODISCARD + reverse_iterator rbegin() noexcept + { + return reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator rbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + SFL_NODISCARD + reverse_iterator rend() noexcept + { + return reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator rend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(begin()); + } + + SFL_NODISCARD + iterator nth(size_type pos) noexcept + { + SFL_ASSERT(pos <= size()); + return iterator(data_.first_ + pos); + } + + SFL_NODISCARD + const_iterator nth(size_type pos) const noexcept + { + SFL_ASSERT(pos <= size()); + return const_iterator(data_.first_ + pos); + } + + SFL_NODISCARD + size_type index_of(const_iterator pos) const noexcept + { + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + return std::distance(cbegin(), pos); + } + + // + // ---- SIZE AND CAPACITY ------------------------------------------------- + // + + SFL_NODISCARD + bool empty() const noexcept + { + return data_.first_ == data_.last_; + } + + SFL_NODISCARD + bool full() const noexcept + { + return std::distance(begin(), end()) == N; + } + + SFL_NODISCARD + size_type size() const noexcept + { + return std::distance(begin(), end()); + } + + SFL_NODISCARD + static constexpr size_type max_size() noexcept + { + return N; + } + + SFL_NODISCARD + static constexpr size_type capacity() noexcept + { + return N; + } + + SFL_NODISCARD + size_type available() const noexcept + { + return capacity() - size(); + } + + // + // ---- ELEMENT ACCESS ---------------------------------------------------- + // + + SFL_NODISCARD + reference at(size_type pos) + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::static_vector::at"); + } + + return *(data_.first_ + pos); + } + + SFL_NODISCARD + const_reference at(size_type pos) const + { + if (pos >= size()) + { + sfl::dtl::throw_out_of_range("sfl::static_vector::at"); + } + + return *(data_.first_ + pos); + } + + SFL_NODISCARD + reference operator[](size_type pos) noexcept + { + SFL_ASSERT(pos < size()); + return *(data_.first_ + pos); + } + + SFL_NODISCARD + const_reference operator[](size_type pos) const noexcept + { + SFL_ASSERT(pos < size()); + return *(data_.first_ + pos); + } + + SFL_NODISCARD + reference front() noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + const_reference front() const noexcept + { + SFL_ASSERT(!empty()); + return *data_.first_; + } + + SFL_NODISCARD + reference back() noexcept + { + SFL_ASSERT(!empty()); + return *(data_.last_ - 1); + } + + SFL_NODISCARD + const_reference back() const noexcept + { + SFL_ASSERT(!empty()); + return *(data_.last_ - 1); + } + + SFL_NODISCARD + T* data() noexcept + { + return data_.first_; + } + + SFL_NODISCARD + const T* data() const noexcept + { + return data_.first_; + } + + // + // ---- MODIFIERS --------------------------------------------------------- + // + + void clear() noexcept + { + sfl::dtl::destroy(data_.first_, data_.last_); + data_.last_ = data_.first_; + } + + template + iterator emplace(const_iterator pos, Args&&... args) + { + SFL_ASSERT(!full()); + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + + const pointer p1 = data_.first_ + std::distance(cbegin(), pos); + + if (p1 == data_.last_) + { + sfl::dtl::construct_at + ( + p1, + std::forward(args)... + ); + + ++data_.last_; + } + else + { + // This container can contain duplicates so we must + // create new element now as a temporary value. + value_type tmp(std::forward(args)...); + + const pointer p2 = data_.last_ - 1; + + const pointer old_last = data_.last_; + + sfl::dtl::construct_at + ( + data_.last_, + std::move(*p2) + ); + + ++data_.last_; + + sfl::dtl::move_backward + ( + p1, + p2, + old_last + ); + + *p1 = std::move(tmp); + } + + return iterator(p1); + } + + iterator insert(const_iterator pos, const T& value) + { + return emplace(pos, value); + } + + iterator insert(const_iterator pos, T&& value) + { + return emplace(pos, std::move(value)); + } + + iterator insert(const_iterator pos, size_type n, const T& value) + { + SFL_ASSERT(n <= available()); + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + + if (n == 0) + { + return begin() + std::distance(cbegin(), pos); + } + + const value_type tmp(value); + + const pointer p1 = data_.first_ + std::distance(cbegin(), pos); + const pointer p2 = p1 + n; + + if (p2 <= data_.last_) + { + const pointer p3 = data_.last_ - n; + + const pointer old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move + ( + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::fill + ( + p1, + p2, + tmp + ); + } + else + { + const pointer old_last = data_.last_; + + sfl::dtl::uninitialized_fill + ( + data_.last_, + p2, + tmp + ); + + data_.last_ = p2; + + data_.last_ = sfl::dtl::uninitialized_move + ( + p1, + old_last, + data_.last_ + ); + + sfl::dtl::fill + ( + p1, + old_last, + tmp + ); + } + + return iterator(p1); + } + + template ::value>* = nullptr> + iterator insert(const_iterator pos, InputIt first, InputIt last) + { + const difference_type offset = std::distance(cbegin(), pos); + + while (first != last) + { + pos = emplace(pos, *first); + ++pos; + ++first; + } + + return begin() + offset; + } + + template ::value>* = nullptr> + iterator insert(const_iterator pos, ForwardIt first, ForwardIt last) + { + SFL_ASSERT(size_type(std::distance(first, last)) <= available()); + SFL_ASSERT(cbegin() <= pos && pos <= cend()); + + if (first == last) + { + return begin() + std::distance(cbegin(), pos); + } + + const size_type n = std::distance(first, last); + + const pointer p1 = data_.first_ + std::distance(cbegin(), pos); + const pointer p2 = p1 + n; + + if (p2 <= data_.last_) + { + const pointer p3 = data_.last_ - n; + + const pointer old_last = data_.last_; + + data_.last_ = sfl::dtl::uninitialized_move + ( + p3, + data_.last_, + data_.last_ + ); + + sfl::dtl::move_backward + ( + p1, + p3, + old_last + ); + + sfl::dtl::copy + ( + first, + last, + p1 + ); + } + else + { + const pointer old_last = data_.last_; + + const ForwardIt mid = std::next(first, std::distance(pos, cend())); + + data_.last_ = sfl::dtl::uninitialized_copy + ( + mid, + last, + data_.last_ + ); + + data_.last_ = sfl::dtl::uninitialized_move + ( + p1, + old_last, + data_.last_ + ); + + sfl::dtl::copy + ( + first, + mid, + p1 + ); + } + + return iterator(p1); + } + + iterator insert(const_iterator pos, std::initializer_list ilist) + { + return insert(pos, ilist.begin(), ilist.end()); + } + + template + reference emplace_back(Args&&... args) + { + SFL_ASSERT(!full()); + + const pointer old_last = data_.last_; + + sfl::dtl::construct_at(data_.last_, std::forward(args)...); + + ++data_.last_; + + return *old_last; + } + + void push_back(const T& value) + { + emplace_back(value); + } + + void push_back(T&& value) + { + emplace_back(std::move(value)); + } + + void pop_back() + { + SFL_ASSERT(!empty()); + + --data_.last_; + + sfl::dtl::destroy_at(data_.last_); + } + + iterator erase(const_iterator pos) + { + SFL_ASSERT(cbegin() <= pos && pos < cend()); + + const pointer p = data_.first_ + std::distance(cbegin(), pos); + + data_.last_ = sfl::dtl::move(p + 1, data_.last_, p); + + sfl::dtl::destroy_at(data_.last_); + + return iterator(p); + } + + iterator erase(const_iterator first, const_iterator last) + { + SFL_ASSERT(cbegin() <= first && first <= last && last <= cend()); + + if (first == last) + { + return begin() + std::distance(cbegin(), first); + } + + const pointer p1 = data_.first_ + std::distance(cbegin(), first); + const pointer p2 = data_.first_ + std::distance(cbegin(), last); + + const pointer new_last = sfl::dtl::move(p2, data_.last_, p1); + + sfl::dtl::destroy(new_last, data_.last_); + + data_.last_ = new_last; + + return iterator(p1); + } + + void resize(size_type n) + { + SFL_ASSERT(n <= capacity()); + + const size_type size = this->size(); + + if (n < size) + { + const pointer new_last = data_.first_ + n; + + sfl::dtl::destroy + ( + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else if (n > size) + { + const size_type delta = n - size; + + data_.last_ = sfl::dtl::uninitialized_value_construct_n + ( + data_.last_, + delta + ); + } + } + + void resize(size_type n, sfl::default_init_t) + { + SFL_ASSERT(n <= capacity()); + + const size_type size = this->size(); + + if (n < size) + { + const pointer new_last = data_.first_ + n; + + sfl::dtl::destroy + ( + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else if (n > size) + { + const size_type delta = n - size; + + data_.last_ = sfl::dtl::uninitialized_default_construct_n + ( + data_.last_, + delta + ); + } + } + + void resize(size_type n, const T& value) + { + SFL_ASSERT(n <= capacity()); + + const size_type size = this->size(); + + if (n < size) + { + const pointer new_last = data_.first_ + n; + + sfl::dtl::destroy + ( + new_last, + data_.last_ + ); + + data_.last_ = new_last; + } + else if (n > size) + { + const size_type delta = n - size; + + data_.last_ = sfl::dtl::uninitialized_fill_n + ( + data_.last_, + delta, + value + ); + } + } + + void swap(static_vector& other) + { + if (this == &other) + { + return; + } + + const size_type this_size = this->size(); + const size_type other_size = other.size(); + + if (this_size <= other_size) + { + std::swap_ranges + ( + this->data_.first_, + this->data_.first_ + this_size, + other.data_.first_ + ); + + sfl::dtl::uninitialized_move + ( + other.data_.first_ + this_size, + other.data_.first_ + other_size, + this->data_.first_ + this_size + ); + + sfl::dtl::destroy + ( + other.data_.first_ + this_size, + other.data_.first_ + other_size + ); + } + else + { + std::swap_ranges + ( + other.data_.first_, + other.data_.first_ + other_size, + this->data_.first_ + ); + + sfl::dtl::uninitialized_move + ( + this->data_.first_ + other_size, + this->data_.first_ + this_size, + other.data_.first_ + other_size + ); + + sfl::dtl::destroy + ( + this->data_.first_ + other_size, + this->data_.first_ + this_size + ); + } + + this->data_.last_ = this->data_.first_ + other_size; + other.data_.last_ = other.data_.first_ + this_size; + } +}; + +// +// ---- NON-MEMBER FUNCTIONS -------------------------------------------------- +// + +template +SFL_NODISCARD +bool operator== +( + const static_vector& x, + const static_vector& y +) +{ + return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin()); +} + +template +SFL_NODISCARD +bool operator!= +( + const static_vector& x, + const static_vector& y +) +{ + return !(x == y); +} + +template +SFL_NODISCARD +bool operator< +( + const static_vector& x, + const static_vector& y +) +{ + return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); +} + +template +SFL_NODISCARD +bool operator> +( + const static_vector& x, + const static_vector& y +) +{ + return y < x; +} + +template +SFL_NODISCARD +bool operator<= +( + const static_vector& x, + const static_vector& y +) +{ + return !(y < x); +} + +template +SFL_NODISCARD +bool operator>= +( + const static_vector& x, + const static_vector& y +) +{ + return !(x < y); +} + +template +void swap +( + static_vector& x, + static_vector& y +) +{ + x.swap(y); +} + +template +typename static_vector::size_type + erase(static_vector& c, const U& value) +{ + auto it = std::remove(c.begin(), c.end(), value); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +template +typename static_vector::size_type + erase_if(static_vector& c, Predicate pred) +{ + auto it = std::remove_if(c.begin(), c.end(), pred); + auto r = std::distance(it, c.end()); + c.erase(it, c.end()); + return r; +} + +} // namespace sfl + +#endif // SFL_STATIC_VECTOR_HPP_INCLUDED diff --git a/test/tests/PlayTests.cpp b/test/tests/PlayTests.cpp index 1cbeb80f2b..f5ff736982 100644 --- a/test/tests/PlayTests.cpp +++ b/test/tests/PlayTests.cpp @@ -116,7 +116,7 @@ TEST_F(PlayTests, SecondGuestInQueueShouldNotRideIfNoFunds) execute(ferrisWheel.id, 0, true); // Ignore intensity to stimulate peeps to queue into ferris wheel - gameState.Cheats.IgnoreRideIntensity = true; + gameState.Cheats.ignoreRideIntensity = true; // Insert a rich guest auto richGuest = Park::GenerateGuest(); @@ -175,7 +175,7 @@ TEST_F(PlayTests, CarRideWithOneCarOnlyAcceptsTwoGuests) execute(carRide.id, 0, true); // Ignore intensity to stimulate peeps to queue into the ride - gameState.Cheats.IgnoreRideIntensity = true; + gameState.Cheats.ignoreRideIntensity = true; // Create some guests std::vector guests; diff --git a/test/tests/RideRatings.cpp b/test/tests/RideRatings.cpp index c37fa03421..2348896267 100644 --- a/test/tests/RideRatings.cpp +++ b/test/tests/RideRatings.cpp @@ -47,9 +47,10 @@ protected: std::string FormatRatings(const Ride& ride) { RatingTuple ratings = ride.ratings; + auto name = std::string(ride.GetRideTypeDescriptor().Name); std::string line = String::StdFormat( - "%s: (%d, %d, %d)", ride.GetRideTypeDescriptor().EnumName, static_cast(ratings.excitement), - static_cast(ratings.intensity), static_cast(ratings.nausea)); + "%s: (%d, %d, %d)", name.c_str(), static_cast(ratings.excitement), static_cast(ratings.intensity), + static_cast(ratings.nausea)); return line; } diff --git a/test/tests/testdata/ratings/BigMapTest.sv6.txt b/test/tests/testdata/ratings/BigMapTest.sv6.txt index 7febcdaf81..f3f684f653 100644 --- a/test/tests/testdata/ratings/BigMapTest.sv6.txt +++ b/test/tests/testdata/ratings/BigMapTest.sv6.txt @@ -1,100 +1,100 @@ -RIDE_TYPE_MINIATURE_RAILWAY: (150, 15, 1) -RIDE_TYPE_MONORAIL: (299, 14, 6) -RIDE_TYPE_SUSPENDED_MONORAIL: (141, 19, 5) -RIDE_TYPE_CHAIRLIFT: (98, 23, 25) -RIDE_TYPE_LIFT: (579, 35, 102) -RIDE_TYPE_MONORAIL_CYCLES: (212, 28, 1) -RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34) -RIDE_TYPE_HAUNTED_HOUSE: (341, 153, 10) -RIDE_TYPE_FERRIS_WHEEL: (88, 50, 55) -RIDE_TYPE_MAZE: (166, 122, 0) -RIDE_TYPE_MERRY_GO_ROUND: (167, 60, 75) -RIDE_TYPE_MINI_GOLF: (295, 90, 0) -RIDE_TYPE_OBSERVATION_TOWER: (302, 0, 74) -RIDE_TYPE_CAR_RIDE: (39, 29, 1) -RIDE_TYPE_MONSTER_TRUCKS: (376, 69, 6) -RIDE_TYPE_MINI_HELICOPTERS: (322, 48, 2) -RIDE_TYPE_SPIRAL_SLIDE: (150, 140, 90) -RIDE_TYPE_DODGEMS: (270, 80, 35) -RIDE_TYPE_SPACE_RINGS: (150, 210, 650) -RIDE_TYPE_CIRCUS: (210, 30, 0) -RIDE_TYPE_GHOST_TRAIN: (282, 42, 19) -RIDE_TYPE_FLYING_SAUCERS: (380, 85, 39) -RIDE_TYPE_VIRGINIA_REEL: (512, 487, 542) -RIDE_TYPE_REVERSER_ROLLER_COASTER: (506, 525, 388) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (626, 683, 382) -RIDE_TYPE_STEEL_WILD_MOUSE: (709, 784, 475) -RIDE_TYPE_SPINNING_WILD_MOUSE: (618, 667, 523) -RIDE_TYPE_INVERTED_HAIRPIN_COASTER: (656, 769, 460) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (475, 550, 366) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (279, 1158, 917) -RIDE_TYPE_MINI_ROLLER_COASTER: (495, 572, 383) -RIDE_TYPE_SPIRAL_ROLLER_COASTER: (591, 370, 192) -RIDE_TYPE_MINE_TRAIN_COASTER: (642, 708, 468) -RIDE_TYPE_LOOPING_ROLLER_COASTER: (606, 564, 264) -RIDE_TYPE_STAND_UP_ROLLER_COASTER: (536, 943, 644) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (613, 830, 365) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (632, 937, 529) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (784, 645, 372) -RIDE_TYPE_HYPER_TWISTER: (737, 620, 344) -RIDE_TYPE_GIGA_COASTER: (851, 545, 305) -RIDE_TYPE_INVERTED_ROLLER_COASTER: (703, 906, 716) -RIDE_TYPE_INVERTED_IMPULSE_COASTER: (648, 713, 567) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (533, 711, 480) -RIDE_TYPE_STEEPLECHASE: (573, 541, 390) -RIDE_TYPE_BOBSLEIGH_COASTER: (619, 657, 466) -RIDE_TYPE_MINE_RIDE: (564, 454, 376) -RIDE_TYPE_HEARTLINE_TWISTER_COASTER: (523, 837, 545) -RIDE_TYPE_LAY_DOWN_ROLLER_COASTER: (696, 664, 538) -RIDE_TYPE_FLYING_ROLLER_COASTER: (744, 690, 668) -RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER: (674, 833, 762) -RIDE_TYPE_REVERSE_FREEFALL_COASTER: (472, 744, 532) -RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER: (852, 892, 698) -RIDE_TYPE_WATER_COASTER: (-1, 0, 0) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_MAGIC_CARPET: (335, 340, 440) -RIDE_TYPE_LAUNCHED_FREEFALL: (368, 941, 563) -RIDE_TYPE_SWINGING_SHIP: (205, 245, 251) -RIDE_TYPE_GO_KARTS: (-1, 0, 0) -RIDE_TYPE_SWINGING_INVERTER_SHIP: (350, 468, 472) -RIDE_TYPE_MOTION_SIMULATOR: (290, 350, 300) -RIDE_TYPE_3D_CINEMA: (350, 240, 140) -RIDE_TYPE_TOP_SPIN: (200, 480, 574) -RIDE_TYPE_ROTO_DROP: (270, 1444, 1444) -RIDE_TYPE_ENTERPRISE: (374, 647, 764) -RIDE_TYPE_DINGHY_SLIDE: (484, 589, 354) -RIDE_TYPE_LOG_FLUME: (459, 236, 117) -RIDE_TYPE_RIVER_RAPIDS: (581, 169, 108) -RIDE_TYPE_SPLASH_BOATS: (422, 203, 102) -RIDE_TYPE_SUBMARINE_RIDE: (246, 180, 140) -RIDE_TYPE_BOAT_HIRE: (202, 80, 90) -RIDE_TYPE_RIVER_RAFTS: (243, 45, 43) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) +miniature_railway: (150, 15, 1) +monorail: (299, 14, 6) +suspended_monorail: (141, 19, 5) +chairlift: (98, 23, 25) +lift: (579, 35, 102) +monorail_cycles: (212, 28, 1) +crooked_house: (215, 62, 34) +haunted_house: (341, 153, 10) +ferris_wheel: (88, 50, 55) +maze: (166, 122, 0) +merry_go_round: (167, 60, 75) +mini_golf: (295, 90, 0) +observation_tower: (302, 0, 74) +car_ride: (39, 29, 1) +monster_trucks: (376, 69, 6) +mini_helicopters: (322, 48, 2) +spiral_slide: (150, 140, 90) +dodgems: (270, 80, 35) +space_rings: (150, 210, 650) +circus: (210, 30, 0) +ghost_train: (282, 42, 19) +flying_saucers: (380, 85, 39) +virginia_reel: (512, 487, 542) +reverser_rc: (506, 525, 388) +wooden_rc: (626, 683, 382) +steel_wild_mouse: (709, 784, 475) +spinning_wild_mouse: (618, 667, 523) +inverted_hairpin_rc: (656, 769, 460) +junior_rc: (475, 550, 366) +classic_mini_rc: (279, 1158, 917) +mini_rc: (495, 572, 383) +spiral_rc: (591, 370, 192) +mine_train_rc: (642, 708, 468) +looping_rc: (606, 564, 264) +stand_up_rc: (536, 943, 644) +corkscrew_rc: (613, 830, 365) +lim_launched_rc: (632, 937, 529) +twister_rc: (784, 645, 372) +hyper_twister: (737, 620, 344) +giga_rc: (851, 545, 305) +inverted_rc: (703, 906, 716) +inverted_impulse_rc: (648, 713, 567) +mini_suspended_rc: (533, 711, 480) +steeplechase: (573, 541, 390) +bobsleigh_rc: (619, 657, 466) +mine_ride: (564, 454, 376) +heartline_twister_rc: (523, 837, 545) +lay_down_rc: (696, 664, 538) +flying_rc: (744, 690, 668) +multi_dimension_rc: (674, 833, 762) +reverse_freefall_rc: (472, 744, 532) +air_powered_vertical_rc: (852, 892, 698) +water_coaster: (-1, 0, 0) +twist: (173, 157, 250) +magic_carpet: (335, 340, 440) +launched_freefall: (368, 941, 563) +swinging_ship: (205, 245, 251) +go_karts: (-1, 0, 0) +swinging_inverter_ship: (350, 468, 472) +motion_simulator: (290, 350, 300) +3d_cinema: (350, 240, 140) +top_spin: (200, 480, 574) +roto_drop: (270, 1444, 1444) +enterprise: (374, 647, 764) +dinghy_slide: (484, 589, 354) +log_flume: (459, 236, 117) +river_rapids: (581, 169, 108) +splash_boats: (422, 203, 102) +submarine_ride: (246, 180, 140) +boat_hire: (202, 80, 90) +river_rafts: (243, 45, 43) +information_kiosk: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +shop: (-1, 0, 0) +first_aid: (-1, 0, 0) +drink_stall: (-1, 0, 0) +first_aid: (-1, 0, 0) +shop: (-1, 0, 0) +food_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +food_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +toilets: (-1, 0, 0) +toilets: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +shop: (-1, 0, 0) +toilets: (-1, 0, 0) +first_aid: (-1, 0, 0) +first_aid: (-1, 0, 0) +first_aid: (-1, 0, 0) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +toilets: (-1, 0, 0) diff --git a/test/tests/testdata/ratings/EverythingPark.park.txt b/test/tests/testdata/ratings/EverythingPark.park.txt index 812c92259e..4a670df88f 100644 --- a/test/tests/testdata/ratings/EverythingPark.park.txt +++ b/test/tests/testdata/ratings/EverythingPark.park.txt @@ -1,529 +1,529 @@ -RIDE_TYPE_MERRY_GO_ROUND: (105, 60, 75) -RIDE_TYPE_LOOPING_ROLLER_COASTER: (646, 612, 271) -RIDE_TYPE_FOOD_STALL: (-1, 702, 346) -RIDE_TYPE_DRINK_STALL: (-1, 886, 620) -RIDE_TYPE_TOILETS: (-1, 245, 251) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 157, 250) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (479, 583, 384) -RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER: (746, 768, 369) -RIDE_TYPE_MAZE: (155, 90, 0) -RIDE_TYPE_SWINGING_SHIP: (207, 245, 251) -RIDE_TYPE_BOAT_HIRE: (213, 80, 90) -RIDE_TYPE_ENTERPRISE: (372, 647, 764) -RIDE_TYPE_TOP_SPIN: (200, 480, 574) -RIDE_TYPE_HAUNTED_HOUSE: (341, 153, 10) -RIDE_TYPE_FOOD_STALL: (-1, 678, 684) -RIDE_TYPE_FOOD_STALL: (-1, 248, 131) -RIDE_TYPE_FOOD_STALL: (-1, 113, 67) -RIDE_TYPE_FOOD_STALL: (-1, 947, 763) -RIDE_TYPE_FOOD_STALL: (-1, 968, 559) -RIDE_TYPE_FOOD_STALL: (-1, 242, 118) -RIDE_TYPE_FOOD_STALL: (-1, 60, 75) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 157, 250) -RIDE_TYPE_FOOD_STALL: (-1, 80, 35) -RIDE_TYPE_FOOD_STALL: (-1, 647, 764) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 50, 55) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 254, 41) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 30, 0) -RIDE_TYPE_FIRST_AID: (-1, 62, 34) -RIDE_TYPE_CASH_MACHINE: (-1, 350, 300) -RIDE_TYPE_TOILETS: (-1, 157, 250) -RIDE_TYPE_TOILETS: (-1, 153, 10) -RIDE_TYPE_TOILETS: (-1, 850, 809) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (622, 763, 369) -RIDE_TYPE_HEARTLINE_TWISTER_COASTER: (546, 918, 606) -RIDE_TYPE_MERRY_GO_ROUND: (119, 61, 75) -RIDE_TYPE_DODGEMS: (270, 80, 35) -RIDE_TYPE_DODGEMS: (271, 80, 35) -RIDE_TYPE_DODGEMS: (273, 80, 35) -RIDE_TYPE_TOP_SPIN: (206, 480, 574) -RIDE_TYPE_TOP_SPIN: (206, 480, 574) -RIDE_TYPE_MOTION_SIMULATOR: (290, 350, 300) -RIDE_TYPE_MOTION_SIMULATOR: (290, 350, 300) -RIDE_TYPE_3D_CINEMA: (350, 240, 140) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_WOODEN_WILD_MOUSE: (727, 873, 495) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34) -RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34) -RIDE_TYPE_CROOKED_HOUSE: (340, 62, 34) -RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34) -RIDE_TYPE_MAGIC_CARPET: (335, 340, 440) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (672, 939, 477) -RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER: (634, 747, 408) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (680, 706, 387) -RIDE_TYPE_ENTERPRISE: (382, 647, 764) -RIDE_TYPE_GIGA_COASTER: (1030, 898, 444) -RIDE_TYPE_SUBMARINE_RIDE: (256, 180, 140) -RIDE_TYPE_OBSERVATION_TOWER: (428, 0, 117) -RIDE_TYPE_SWINGING_INVERTER_SHIP: (351, 468, 472) -RIDE_TYPE_SWINGING_INVERTER_SHIP: (352, 468, 472) -RIDE_TYPE_HAUNTED_HOUSE: (341, 153, 10) -RIDE_TYPE_SPACE_RINGS: (161, 210, 650) -RIDE_TYPE_MINI_GOLF: (342, 90, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_ROTO_DROP: (507, 1078, 1078) -RIDE_TYPE_TOP_SPIN: (202, 480, 574) -RIDE_TYPE_TOP_SPIN: (204, 480, 574) -RIDE_TYPE_LAUNCHED_FREEFALL: (380, 982, 577) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (417, 456, 182) -RIDE_TYPE_GO_KARTS: (518, 262, 49) -RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER: (687, 822, 833) -RIDE_TYPE_HYBRID_COASTER: (799, 786, 363) -RIDE_TYPE_SINGLE_RAIL_ROLLER_COASTER: (734, 613, 283) -RIDE_TYPE_MINIATURE_RAILWAY: (165, 12, 1) -RIDE_TYPE_MONORAIL: (138, 9, 1) -RIDE_TYPE_MONORAIL: (136, 7, 1) -RIDE_TYPE_MONORAIL: (137, 8, 2) -RIDE_TYPE_SUSPENDED_MONORAIL: (146, 21, 5) -RIDE_TYPE_CHAIRLIFT: (234, 71, 52) -RIDE_TYPE_MONORAIL_CYCLES: (95, 14, 0) -RIDE_TYPE_LIFT: (181, 35, 46) -RIDE_TYPE_SPIRAL_SLIDE: (151, 140, 90) -RIDE_TYPE_SPIRAL_SLIDE: (153, 140, 90) -RIDE_TYPE_SPIRAL_SLIDE: (153, 140, 90) -RIDE_TYPE_SPIRAL_SLIDE: (153, 140, 90) -RIDE_TYPE_SPIRAL_SLIDE: (153, 140, 90) -RIDE_TYPE_SPIRAL_SLIDE: (151, 140, 90) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_MERRY_GO_ROUND: (106, 60, 75) -RIDE_TYPE_CIRCUS: (210, 30, 0) -RIDE_TYPE_INVERTED_ROLLER_COASTER: (602, 799, 635) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_BOBSLEIGH_COASTER: (590, 650, 487) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_CAR_RIDE: (377, 58, 4) -RIDE_TYPE_SPACE_RINGS: (275, 333, 751) -RIDE_TYPE_SPACE_RINGS: (165, 210, 650) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (509, 635, 448) -RIDE_TYPE_HYPER_TWISTER: (849, 761, 379) -RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER: (785, 826, 375) -RIDE_TYPE_REVERSE_FREEFALL_COASTER: (164, 241, 184) -RIDE_TYPE_MINI_ROLLER_COASTER: (549, 760, 497) -RIDE_TYPE_MONSTER_TRUCKS: (411, 69, 6) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (648, 885, 503) -RIDE_TYPE_VIRGINIA_REEL: (655, 684, 674) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_LOG_FLUME: (529, 293, 141) -RIDE_TYPE_SPLASH_BOATS: (795, 503, 229) -RIDE_TYPE_MERRY_GO_ROUND: (106, 60, 75) -RIDE_TYPE_DINGHY_SLIDE: (550, 647, 410) -RIDE_TYPE_RIVER_RAPIDS: (362, 144, 83) -RIDE_TYPE_RIVER_RAFTS: (217, 45, 43) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (28, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_CAR_RIDE: (29, 29, 1) -RIDE_TYPE_GO_KARTS: (397, 253, 42) -RIDE_TYPE_GO_KARTS: (400, 253, 42) -RIDE_TYPE_GO_KARTS: (397, 253, 42) -RIDE_TYPE_GO_KARTS: (397, 253, 42) -RIDE_TYPE_FLYING_SAUCERS: (393, 85, 39) -RIDE_TYPE_FLYING_SAUCERS: (394, 85, 39) -RIDE_TYPE_FLYING_SAUCERS: (394, 85, 39) -RIDE_TYPE_FLYING_SAUCERS: (624, 111, 42) -RIDE_TYPE_FLYING_SAUCERS: (394, 85, 39) -RIDE_TYPE_MINI_HELICOPTERS: (302, 48, 1) -RIDE_TYPE_BOAT_HIRE: (259, 89, 100) -RIDE_TYPE_BOAT_HIRE: (208, 80, 90) -RIDE_TYPE_BOAT_HIRE: (208, 80, 90) -RIDE_TYPE_BOAT_HIRE: (329, 126, 118) -RIDE_TYPE_BOAT_HIRE: (329, 126, 118) -RIDE_TYPE_BOAT_HIRE: (214, 80, 91) -RIDE_TYPE_BOAT_HIRE: (256, 89, 100) -RIDE_TYPE_BOAT_HIRE: (216, 81, 90) -RIDE_TYPE_BOAT_HIRE: (208, 80, 90) -RIDE_TYPE_BOAT_HIRE: (208, 80, 90) -RIDE_TYPE_BOAT_HIRE: (223, 81, 90) -RIDE_TYPE_WOODEN_WILD_MOUSE: (63, 77, 43) -RIDE_TYPE_WOODEN_WILD_MOUSE: (63, 78, 43) -RIDE_TYPE_STEEL_WILD_MOUSE: (123, 145, 86) -RIDE_TYPE_STEEL_WILD_MOUSE: (125, 145, 86) -RIDE_TYPE_REVERSER_ROLLER_COASTER: (482, 439, 340) -RIDE_TYPE_REVERSER_ROLLER_COASTER: (482, 440, 340) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (12, 11, 7) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (12, 11, 7) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (12, 10, 7) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (12, 11, 7) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (12, 11, 7) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (12, 11, 7) -RIDE_TYPE_CLASSIC_WOODEN_ROLLER_COASTER: (10, 385, 8) -RIDE_TYPE_LAY_DOWN_ROLLER_COASTER: (166, 1630, 1072) -RIDE_TYPE_LAY_DOWN_ROLLER_COASTER: (169, 1612, 1064) -RIDE_TYPE_MINI_ROLLER_COASTER: (39, 37, 28) -RIDE_TYPE_MINI_ROLLER_COASTER: (39, 37, 28) -RIDE_TYPE_MINI_ROLLER_COASTER: (38, 37, 28) -RIDE_TYPE_MINI_ROLLER_COASTER: (38, 37, 28) -RIDE_TYPE_MINI_ROLLER_COASTER: (39, 37, 28) -RIDE_TYPE_MINI_ROLLER_COASTER: (38, 37, 28) -RIDE_TYPE_MINI_ROLLER_COASTER: (38, 37, 28) -RIDE_TYPE_STEEPLECHASE: (20, 18, 13) -RIDE_TYPE_STEEPLECHASE: (20, 18, 13) -RIDE_TYPE_STEEPLECHASE: (20, 18, 13) -RIDE_TYPE_STEEPLECHASE: (20, 18, 13) -RIDE_TYPE_STEEPLECHASE: (20, 18, 13) -RIDE_TYPE_STEEPLECHASE: (20, 18, 13) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (21, 21, 19) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (21, 21, 19) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (21, 21, 19) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (21, 21, 19) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (21, 21, 19) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (22, 25, 21) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (415, 432, 161) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (415, 431, 160) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (415, 431, 160) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (415, 432, 161) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (415, 432, 161) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (415, 432, 161) -RIDE_TYPE_SPINNING_WILD_MOUSE: (599, 716, 549) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (575, 790, 439) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (539, 623, 272) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (532, 562, 254) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (537, 640, 279) -RIDE_TYPE_INVERTED_HAIRPIN_COASTER: (671, 828, 481) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (26, 22, 26) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (24, 22, 25) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (343, 512, 329) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (344, 512, 329) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (380, 533, 330) -RIDE_TYPE_JUNIOR_ROLLER_COASTER: (343, 512, 329) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (46, 44, 45) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (47, 48, 48) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (48, 49, 48) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (47, 49, 48) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (53, 58, 53) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER: (58, 1412, 1165) -RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER: (785, 863, 666) -RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER: (58, 1412, 1165) -RIDE_TYPE_BOBSLEIGH_COASTER: (44, 47, 36) -RIDE_TYPE_BOBSLEIGH_COASTER: (44, 47, 36) -RIDE_TYPE_BOBSLEIGH_COASTER: (44, 47, 36) -RIDE_TYPE_BOBSLEIGH_COASTER: (43, 47, 36) -RIDE_TYPE_SPIRAL_ROLLER_COASTER: (24, 6, 4) -RIDE_TYPE_SPIRAL_ROLLER_COASTER: (24, 6, 4) -RIDE_TYPE_SPIRAL_ROLLER_COASTER: (24, 6, 4) -RIDE_TYPE_STAND_UP_ROLLER_COASTER: (77, 97, 86) -RIDE_TYPE_STAND_UP_ROLLER_COASTER: (77, 97, 86) -RIDE_TYPE_STAND_UP_ROLLER_COASTER: (77, 97, 86) -RIDE_TYPE_WATER_COASTER: (44, 44, 33) -RIDE_TYPE_WATER_COASTER: (44, 44, 32) -RIDE_TYPE_WATER_COASTER: (44, 44, 32) -RIDE_TYPE_WATER_COASTER: (44, 44, 32) -RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER: (388, 1108, 462) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (174, 265, 166) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (175, 263, 165) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (177, 260, 166) -RIDE_TYPE_GIGA_COASTER: (460, 1219, 505) -RIDE_TYPE_MAZE: (139, 52, 0) -RIDE_TYPE_SUBMARINE_RIDE: (247, 180, 140) -RIDE_TYPE_SUBMARINE_RIDE: (247, 180, 140) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (53, 61, 40) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (53, 61, 40) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (53, 61, 40) -RIDE_TYPE_FLYING_ROLLER_COASTER: (31, 282, 473) -RIDE_TYPE_FLYING_ROLLER_COASTER: (31, 282, 473) -RIDE_TYPE_FLYING_ROLLER_COASTER: (31, 282, 473) -RIDE_TYPE_HYPER_TWISTER: (29, 7, 4) -RIDE_TYPE_HYPER_TWISTER: (28, 7, 4) -RIDE_TYPE_HYPERCOASTER: (24, 8, 3) -RIDE_TYPE_HYPERCOASTER: (24, 8, 3) -RIDE_TYPE_HEARTLINE_TWISTER_COASTER: (423, 565, 393) -RIDE_TYPE_HEARTLINE_TWISTER_COASTER: (423, 568, 395) -RIDE_TYPE_REVERSE_FREEFALL_COASTER: (594, 811, 568) -RIDE_TYPE_REVERSE_FREEFALL_COASTER: (594, 811, 568) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER: (486, 681, 370) -RIDE_TYPE_LOOPING_ROLLER_COASTER: (22, 8, 3) -RIDE_TYPE_LOOPING_ROLLER_COASTER: (22, 8, 3) -RIDE_TYPE_LOOPING_ROLLER_COASTER: (485, 628, 252) -RIDE_TYPE_INVERTED_IMPULSE_COASTER: (715, 826, 555) -RIDE_TYPE_INVERTED_IMPULSE_COASTER: (706, 814, 555) -RIDE_TYPE_MINE_TRAIN_COASTER: (601, 752, 454) -RIDE_TYPE_MINE_RIDE: (523, 451, 352) -RIDE_TYPE_ALPINE_ROLLER_COASTER: (170, 141, 65) -RIDE_TYPE_OBSERVATION_TOWER: (354, 0, 97) -RIDE_TYPE_OBSERVATION_TOWER: (313, 0, 74) -RIDE_TYPE_GHOST_TRAIN: (132, 24, 8) -RIDE_TYPE_GHOST_TRAIN: (132, 24, 8) -RIDE_TYPE_LOG_FLUME: (446, 265, 125) -RIDE_TYPE_RIVER_RAFTS: (225, 45, 43) -RIDE_TYPE_RIVER_RAPIDS: (354, 181, 114) -RIDE_TYPE_MAZE: (150, 90, 0) -RIDE_TYPE_MAZE: (150, 90, 0) -RIDE_TYPE_MAZE: (150, 90, 0) -RIDE_TYPE_MAZE: (150, 90, 0) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (482, 510, 220) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (528, 730, 443) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (532, 727, 436) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (530, 812, 472) -RIDE_TYPE_MINIATURE_RAILWAY: (154, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (154, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (149, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (151, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (157, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (154, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (150, 12, 1) -RIDE_TYPE_MINIATURE_RAILWAY: (149, 12, 1) -RIDE_TYPE_SUSPENDED_MONORAIL: (137, 19, 5) -RIDE_TYPE_SUSPENDED_MONORAIL: (137, 19, 5) -RIDE_TYPE_LIFT: (176, 35, 51) -RIDE_TYPE_LIFT: (208, 35, 51) -RIDE_TYPE_CHAIRLIFT: (99, 35, 26) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (701, 623, 407) -RIDE_TYPE_MOTION_SIMULATOR: (290, 350, 300) -RIDE_TYPE_MOTION_SIMULATOR: (325, 410, 330) -RIDE_TYPE_3D_CINEMA: (350, 240, 140) -RIDE_TYPE_3D_CINEMA: (400, 265, 155) -RIDE_TYPE_3D_CINEMA: (420, 260, 148) -RIDE_TYPE_TOP_SPIN: (200, 480, 574) -RIDE_TYPE_TOP_SPIN: (300, 575, 664) -RIDE_TYPE_TOP_SPIN: (320, 680, 794) -RIDE_TYPE_LAUNCHED_FREEFALL: (339, 713, 487) -RIDE_TYPE_LAUNCHED_FREEFALL: (550, 729, 759) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_SPIRAL_ROLLER_COASTER: (581, 467, 249) -RIDE_TYPE_SPIRAL_SLIDE: (190, 160, 115) -RIDE_TYPE_SPIRAL_SLIDE: (150, 140, 90) -RIDE_TYPE_GIGA_COASTER: (637, 447, 239) -RIDE_TYPE_ROTO_DROP: (306, 350, 350) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (50, 42, 30) -RIDE_TYPE_GIGA_COASTER: (171, 1624, 980) -RIDE_TYPE_CHAIRLIFT: (0, 11, 25) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (-1, 1042, 811) -RIDE_TYPE_MERRY_GO_ROUND: (185, 140, 155) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_GO_KARTS: (422, 255, 42) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_BOAT_HIRE: (201, 80, 90) -RIDE_TYPE_INVERTED_HAIRPIN_COASTER: (703, 936, 520) -RIDE_TYPE_HAUNTED_HOUSE: (-1, 0, 0) -RIDE_TYPE_WOODEN_WILD_MOUSE: (5, 5, 3) -RIDE_TYPE_CAR_RIDE: (329, 59, 10) -RIDE_TYPE_MINIATURE_RAILWAY: (154, 12, 1) \ No newline at end of file +merry_go_round: (105, 60, 75) +looping_rc: (646, 612, 271) +food_stall: (-1, 702, 346) +drink_stall: (-1, 886, 620) +toilets: (-1, 245, 251) +information_kiosk: (-1, 157, 250) +shop: (-1, 0, 0) +cash_machine: (-1, 0, 0) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +twist: (173, 157, 250) +junior_rc: (479, 583, 384) +single_rail_rc: (746, 768, 369) +maze: (155, 90, 0) +swinging_ship: (207, 245, 251) +boat_hire: (213, 80, 90) +enterprise: (372, 647, 764) +top_spin: (200, 480, 574) +haunted_house: (341, 153, 10) +food_stall: (-1, 678, 684) +food_stall: (-1, 248, 131) +food_stall: (-1, 113, 67) +food_stall: (-1, 947, 763) +food_stall: (-1, 968, 559) +food_stall: (-1, 242, 118) +food_stall: (-1, 60, 75) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 157, 250) +food_stall: (-1, 80, 35) +food_stall: (-1, 647, 764) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 50, 55) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 254, 41) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +information_kiosk: (-1, 30, 0) +first_aid: (-1, 62, 34) +cash_machine: (-1, 350, 300) +toilets: (-1, 157, 250) +toilets: (-1, 153, 10) +toilets: (-1, 850, 809) +corkscrew_rc: (622, 763, 369) +heartline_twister_rc: (546, 918, 606) +merry_go_round: (119, 61, 75) +dodgems: (270, 80, 35) +dodgems: (271, 80, 35) +dodgems: (273, 80, 35) +top_spin: (206, 480, 574) +top_spin: (206, 480, 574) +motion_simulator: (290, 350, 300) +motion_simulator: (290, 350, 300) +3d_cinema: (350, 240, 140) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +wooden_wild_mouse: (727, 873, 495) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +cash_machine: (-1, 0, 0) +drink_stall: (-1, 0, 0) +shop: (-1, 0, 0) +toilets: (-1, 0, 0) +crooked_house: (215, 62, 34) +crooked_house: (215, 62, 34) +crooked_house: (340, 62, 34) +crooked_house: (215, 62, 34) +magic_carpet: (335, 340, 440) +twister_rc: (672, 939, 477) +classic_wooden_rc: (634, 747, 408) +wooden_rc: (680, 706, 387) +enterprise: (382, 647, 764) +giga_rc: (1030, 898, 444) +submarine_ride: (256, 180, 140) +observation_tower: (428, 0, 117) +swinging_inverter_ship: (351, 468, 472) +swinging_inverter_ship: (352, 468, 472) +haunted_house: (341, 153, 10) +space_rings: (161, 210, 650) +mini_golf: (342, 90, 0) +cash_machine: (-1, 0, 0) +toilets: (-1, 0, 0) +first_aid: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +shop: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +first_aid: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +roto_drop: (507, 1078, 1078) +top_spin: (202, 480, 574) +top_spin: (204, 480, 574) +launched_freefall: (380, 982, 577) +corkscrew_rc: (417, 456, 182) +go_karts: (518, 262, 49) +multi_dimension_rc: (687, 822, 833) +hybrid_rc: (799, 786, 363) +single_rail_rc: (734, 613, 283) +miniature_railway: (165, 12, 1) +monorail: (138, 9, 1) +monorail: (136, 7, 1) +monorail: (137, 8, 2) +suspended_monorail: (146, 21, 5) +chairlift: (234, 71, 52) +monorail_cycles: (95, 14, 0) +lift: (181, 35, 46) +spiral_slide: (151, 140, 90) +spiral_slide: (153, 140, 90) +spiral_slide: (153, 140, 90) +spiral_slide: (153, 140, 90) +spiral_slide: (153, 140, 90) +spiral_slide: (151, 140, 90) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +first_aid: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +shop: (-1, 0, 0) +merry_go_round: (106, 60, 75) +circus: (210, 30, 0) +inverted_rc: (602, 799, 635) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +first_aid: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +bobsleigh_rc: (590, 650, 487) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +cash_machine: (-1, 0, 0) +first_aid: (-1, 0, 0) +shop: (-1, 0, 0) +car_ride: (377, 58, 4) +space_rings: (275, 333, 751) +space_rings: (165, 210, 650) +mini_suspended_rc: (509, 635, 448) +hyper_twister: (849, 761, 379) +vertical_drop_rc: (785, 826, 375) +reverse_freefall_rc: (164, 241, 184) +mini_rc: (549, 760, 497) +monster_trucks: (411, 69, 6) +wooden_rc: (648, 885, 503) +virginia_reel: (655, 684, 674) +food_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +drink_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +cash_machine: (-1, 0, 0) +shop: (-1, 0, 0) +first_aid: (-1, 0, 0) +log_flume: (529, 293, 141) +splash_boats: (795, 503, 229) +merry_go_round: (106, 60, 75) +dinghy_slide: (550, 647, 410) +river_rapids: (362, 144, 83) +river_rafts: (217, 45, 43) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +shop: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +first_aid: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +cash_machine: (-1, 0, 0) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (28, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +car_ride: (29, 29, 1) +go_karts: (397, 253, 42) +go_karts: (400, 253, 42) +go_karts: (397, 253, 42) +go_karts: (397, 253, 42) +flying_saucers: (393, 85, 39) +flying_saucers: (394, 85, 39) +flying_saucers: (394, 85, 39) +flying_saucers: (624, 111, 42) +flying_saucers: (394, 85, 39) +mini_helicopters: (302, 48, 1) +boat_hire: (259, 89, 100) +boat_hire: (208, 80, 90) +boat_hire: (208, 80, 90) +boat_hire: (329, 126, 118) +boat_hire: (329, 126, 118) +boat_hire: (214, 80, 91) +boat_hire: (256, 89, 100) +boat_hire: (216, 81, 90) +boat_hire: (208, 80, 90) +boat_hire: (208, 80, 90) +boat_hire: (223, 81, 90) +wooden_wild_mouse: (63, 77, 43) +wooden_wild_mouse: (63, 78, 43) +steel_wild_mouse: (123, 145, 86) +steel_wild_mouse: (125, 145, 86) +reverser_rc: (482, 439, 340) +reverser_rc: (482, 440, 340) +wooden_rc: (12, 11, 7) +wooden_rc: (12, 11, 7) +wooden_rc: (12, 10, 7) +wooden_rc: (12, 11, 7) +wooden_rc: (12, 11, 7) +wooden_rc: (12, 11, 7) +classic_wooden_rc: (10, 385, 8) +lay_down_rc: (166, 1630, 1072) +lay_down_rc: (169, 1612, 1064) +mini_rc: (39, 37, 28) +mini_rc: (39, 37, 28) +mini_rc: (38, 37, 28) +mini_rc: (38, 37, 28) +mini_rc: (39, 37, 28) +mini_rc: (38, 37, 28) +mini_rc: (38, 37, 28) +steeplechase: (20, 18, 13) +steeplechase: (20, 18, 13) +steeplechase: (20, 18, 13) +steeplechase: (20, 18, 13) +steeplechase: (20, 18, 13) +steeplechase: (20, 18, 13) +mini_suspended_rc: (21, 21, 19) +mini_suspended_rc: (21, 21, 19) +mini_suspended_rc: (21, 21, 19) +mini_suspended_rc: (21, 21, 19) +mini_suspended_rc: (21, 21, 19) +mini_suspended_rc: (22, 25, 21) +corkscrew_rc: (415, 432, 161) +corkscrew_rc: (415, 431, 160) +corkscrew_rc: (415, 431, 160) +corkscrew_rc: (415, 432, 161) +corkscrew_rc: (415, 432, 161) +corkscrew_rc: (415, 432, 161) +spinning_wild_mouse: (599, 716, 549) +twister_rc: (575, 790, 439) +twister_rc: (539, 623, 272) +twister_rc: (532, 562, 254) +twister_rc: (537, 640, 279) +inverted_hairpin_rc: (671, 828, 481) +suspended_swinging_rc: (24, 22, 25) +suspended_swinging_rc: (24, 22, 25) +suspended_swinging_rc: (24, 22, 25) +suspended_swinging_rc: (24, 22, 25) +suspended_swinging_rc: (26, 22, 26) +suspended_swinging_rc: (24, 22, 25) +suspended_swinging_rc: (24, 22, 25) +suspended_swinging_rc: (24, 22, 25) +junior_rc: (343, 512, 329) +junior_rc: (344, 512, 329) +junior_rc: (380, 533, 330) +junior_rc: (343, 512, 329) +compact_inverted_rc: (46, 44, 45) +compact_inverted_rc: (47, 48, 48) +compact_inverted_rc: (48, 49, 48) +compact_inverted_rc: (47, 49, 48) +compact_inverted_rc: (53, 58, 53) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +cash_machine: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +toilets: (-1, 0, 0) +shop: (-1, 0, 0) +air_powered_vertical_rc: (58, 1412, 1165) +air_powered_vertical_rc: (785, 863, 666) +air_powered_vertical_rc: (58, 1412, 1165) +bobsleigh_rc: (44, 47, 36) +bobsleigh_rc: (44, 47, 36) +bobsleigh_rc: (44, 47, 36) +bobsleigh_rc: (43, 47, 36) +spiral_rc: (24, 6, 4) +spiral_rc: (24, 6, 4) +spiral_rc: (24, 6, 4) +stand_up_rc: (77, 97, 86) +stand_up_rc: (77, 97, 86) +stand_up_rc: (77, 97, 86) +water_coaster: (44, 44, 33) +water_coaster: (44, 44, 32) +water_coaster: (44, 44, 32) +water_coaster: (44, 44, 32) +vertical_drop_rc: (388, 1108, 462) +classic_mini_rc: (174, 265, 166) +classic_mini_rc: (175, 263, 165) +classic_mini_rc: (177, 260, 166) +giga_rc: (460, 1219, 505) +maze: (139, 52, 0) +submarine_ride: (247, 180, 140) +submarine_ride: (247, 180, 140) +lim_launched_rc: (53, 61, 40) +lim_launched_rc: (53, 61, 40) +lim_launched_rc: (53, 61, 40) +flying_rc: (31, 282, 473) +flying_rc: (31, 282, 473) +flying_rc: (31, 282, 473) +hyper_twister: (29, 7, 4) +hyper_twister: (28, 7, 4) +hypercoaster: (24, 8, 3) +hypercoaster: (24, 8, 3) +heartline_twister_rc: (423, 565, 393) +heartline_twister_rc: (423, 568, 395) +reverse_freefall_rc: (594, 811, 568) +reverse_freefall_rc: (594, 811, 568) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +first_aid: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +side_friction_rc: (486, 681, 370) +looping_rc: (22, 8, 3) +looping_rc: (22, 8, 3) +looping_rc: (485, 628, 252) +inverted_impulse_rc: (715, 826, 555) +inverted_impulse_rc: (706, 814, 555) +mine_train_rc: (601, 752, 454) +mine_ride: (523, 451, 352) +alpine_rc: (170, 141, 65) +observation_tower: (354, 0, 97) +observation_tower: (313, 0, 74) +ghost_train: (132, 24, 8) +ghost_train: (132, 24, 8) +log_flume: (446, 265, 125) +river_rafts: (225, 45, 43) +river_rapids: (354, 181, 114) +maze: (150, 90, 0) +maze: (150, 90, 0) +maze: (150, 90, 0) +maze: (150, 90, 0) +corkscrew_rc: (482, 510, 220) +lim_launched_rc: (528, 730, 443) +lim_launched_rc: (532, 727, 436) +lim_launched_rc: (530, 812, 472) +miniature_railway: (154, 12, 1) +miniature_railway: (154, 12, 1) +miniature_railway: (149, 12, 1) +miniature_railway: (151, 12, 1) +miniature_railway: (157, 12, 1) +miniature_railway: (154, 12, 1) +miniature_railway: (150, 12, 1) +miniature_railway: (149, 12, 1) +suspended_monorail: (137, 19, 5) +suspended_monorail: (137, 19, 5) +lift: (176, 35, 51) +lift: (208, 35, 51) +chairlift: (99, 35, 26) +twister_rc: (701, 623, 407) +motion_simulator: (290, 350, 300) +motion_simulator: (325, 410, 330) +3d_cinema: (350, 240, 140) +3d_cinema: (400, 265, 155) +3d_cinema: (420, 260, 148) +top_spin: (200, 480, 574) +top_spin: (300, 575, 664) +top_spin: (320, 680, 794) +launched_freefall: (339, 713, 487) +launched_freefall: (550, 729, 759) +ferris_wheel: (85, 50, 55) +ferris_wheel: (85, 50, 55) +spiral_rc: (581, 467, 249) +spiral_slide: (190, 160, 115) +spiral_slide: (150, 140, 90) +giga_rc: (637, 447, 239) +roto_drop: (306, 350, 350) +classic_mini_rc: (50, 42, 30) +giga_rc: (171, 1624, 980) +chairlift: (0, 11, 25) +compact_inverted_rc: (-1, 1042, 811) +merry_go_round: (185, 140, 155) +lim_launched_rc: (-1, 0, 0) +shop: (-1, 0, 0) +go_karts: (422, 255, 42) +toilets: (-1, 0, 0) +cash_machine: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +boat_hire: (201, 80, 90) +inverted_hairpin_rc: (703, 936, 520) +haunted_house: (-1, 0, 0) +wooden_wild_mouse: (5, 5, 3) +car_ride: (329, 59, 10) +miniature_railway: (154, 12, 1) diff --git a/test/tests/testdata/ratings/bpb.sv6.txt b/test/tests/testdata/ratings/bpb.sv6.txt index c3d1da1555..9910aa43f5 100644 --- a/test/tests/testdata/ratings/bpb.sv6.txt +++ b/test/tests/testdata/ratings/bpb.sv6.txt @@ -1,134 +1,134 @@ -RIDE_TYPE_HYPERCOASTER: (840, 766, 346) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (643, 1011, 626) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (700, 734, 428) -RIDE_TYPE_MINIATURE_RAILWAY: (465, 37, 27) -RIDE_TYPE_LOG_FLUME: (522, 199, 107) -RIDE_TYPE_BOBSLEIGH_COASTER: (555, 548, 440) -RIDE_TYPE_CORKSCREW_ROLLER_COASTER: (501, 533, 204) -RIDE_TYPE_CAR_RIDE: (410, 58, 3) -RIDE_TYPE_WOODEN_WILD_MOUSE: (323, 381, 220) -RIDE_TYPE_LOG_FLUME: (208, 69, 52) -RIDE_TYPE_3D_CINEMA: (350, 240, 140) -RIDE_TYPE_HAUNTED_HOUSE: (341, 153, 10) -RIDE_TYPE_MONORAIL: (434, 25, 5) -RIDE_TYPE_MINI_GOLF: (306, 90, 0) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (634, 648, 377) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (71, 68, 41) -RIDE_TYPE_STEEPLECHASE: (609, 509, 351) -RIDE_TYPE_STEEPLECHASE: (587, 492, 338) -RIDE_TYPE_CLASSIC_MINI_ROLLER_COASTER: (244, 245, 170) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_LOG_FLUME: (133, 37, 19) -RIDE_TYPE_CAR_RIDE: (38, 29, 1) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34) -RIDE_TYPE_MINE_TRAIN_COASTER: (35, 32, 22) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_GHOST_TRAIN: (389, 43, 22) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_CAR_RIDE: (40, 29, 2) -RIDE_TYPE_SPIRAL_SLIDE: (178, 140, 90) -RIDE_TYPE_TWIST: (193, 157, 250) -RIDE_TYPE_MERRY_GO_ROUND: (125, 60, 75) -RIDE_TYPE_MERRY_GO_ROUND: (106, 60, 75) -RIDE_TYPE_DODGEMS: (275, 80, 35) -RIDE_TYPE_TWIST: (173, 157, 250) -RIDE_TYPE_LAUNCHED_FREEFALL: (379, 879, 543) -RIDE_TYPE_BOAT_HIRE: (269, 89, 100) -RIDE_TYPE_MOTION_SIMULATOR: (290, 350, 300) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_CHAIRLIFT: (287, 55, 51) -RIDE_TYPE_GO_KARTS: (509, 288, 45) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_MAZE: (191, 104, 0) -RIDE_TYPE_TWIST: (180, 157, 250) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_TOILETS: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_LOG_FLUME: (586, 268, 172) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_WOODEN_ROLLER_COASTER: (124, 150, 87) -RIDE_TYPE_FOOD_STALL: (-1, 30, 0) -RIDE_TYPE_CROOKED_HOUSE: (215, 62, 34) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_INFORMATION_KIOSK: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_DRINK_STALL: (-1, 0, 0) -RIDE_TYPE_DODGEMS: (270, 80, 35) -RIDE_TYPE_DODGEMS: (274, 80, 35) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_FOOD_STALL: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_SHOP: (-1, 0, 0) -RIDE_TYPE_FIRST_AID: (-1, 0, 0) -RIDE_TYPE_CASH_MACHINE: (-1, 0, 0) -RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER: (694, 833, 772) -RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER: (486, 586, 338) -RIDE_TYPE_REVERSER_ROLLER_COASTER: (548, 525, 387) -RIDE_TYPE_INVERTED_HAIRPIN_COASTER: (670, 770, 470) -RIDE_TYPE_VIRGINIA_REEL: (531, 542, 588) -RIDE_TYPE_STEEL_WILD_MOUSE: (631, 768, 473) -RIDE_TYPE_MINI_ROLLER_COASTER: (539, 563, 397) -RIDE_TYPE_SPIRAL_ROLLER_COASTER: (620, 373, 215) -RIDE_TYPE_LOOPING_ROLLER_COASTER: (467, 441, 182) -RIDE_TYPE_STAND_UP_ROLLER_COASTER: (553, 790, 558) -RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER: (680, 944, 573) -RIDE_TYPE_TWISTER_ROLLER_COASTER: (778, 769, 425) -RIDE_TYPE_GIGA_COASTER: (624, 359, 200) -RIDE_TYPE_INVERTED_ROLLER_COASTER: (678, 850, 686) -RIDE_TYPE_INVERTED_IMPULSE_COASTER: (643, 750, 569) -RIDE_TYPE_MINI_SUSPENDED_COASTER: (512, 696, 475) -RIDE_TYPE_MINE_RIDE: (644, 458, 381) -RIDE_TYPE_HEARTLINE_TWISTER_COASTER: (474, 658, 462) -RIDE_TYPE_LAY_DOWN_ROLLER_COASTER: (682, 666, 548) -RIDE_TYPE_FLYING_ROLLER_COASTER: (719, 711, 678) -RIDE_TYPE_REVERSE_FREEFALL_COASTER: (518, 747, 534) -RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER: (639, 618, 282) -RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER: (873, 895, 701) -RIDE_TYPE_SUSPENDED_MONORAIL: (336, 47, 23) -RIDE_TYPE_LIFT: (563, 35, 102) -RIDE_TYPE_MONORAIL_CYCLES: (226, 29, 1) -RIDE_TYPE_FERRIS_WHEEL: (85, 50, 55) -RIDE_TYPE_OBSERVATION_TOWER: (594, 0, 61) -RIDE_TYPE_SPIRAL_SLIDE: (157, 140, 90) -RIDE_TYPE_SPACE_RINGS: (167, 210, 650) -RIDE_TYPE_CIRCUS: (210, 30, 0) -RIDE_TYPE_FLYING_SAUCERS: (381, 85, 39) -RIDE_TYPE_MAGIC_CARPET: (374, 340, 440) -RIDE_TYPE_SWINGING_SHIP: (264, 245, 251) -RIDE_TYPE_SWINGING_INVERTER_SHIP: (349, 468, 472) -RIDE_TYPE_TOP_SPIN: (201, 480, 574) -RIDE_TYPE_ROTO_DROP: (395, 1148, 1148) -RIDE_TYPE_ENTERPRISE: (392, 647, 764) -RIDE_TYPE_RIVER_RAPIDS: (376, 153, 90) -RIDE_TYPE_RIVER_RAFTS: (263, 45, 43) -RIDE_TYPE_DINGHY_SLIDE: (477, 577, 358) -RIDE_TYPE_MINI_HELICOPTERS: (315, 50, 4) -RIDE_TYPE_SUSPENDED_SWINGING_COASTER: (690, 691, 720) -RIDE_TYPE_COMPACT_INVERTED_COASTER: (680, 830, 698) -RIDE_TYPE_SPLASH_BOATS: (474, 204, 113) -RIDE_TYPE_SUBMARINE_RIDE: (255, 180, 140) +hypercoaster: (840, 766, 346) +wooden_rc: (643, 1011, 626) +wooden_rc: (700, 734, 428) +miniature_railway: (465, 37, 27) +log_flume: (522, 199, 107) +bobsleigh_rc: (555, 548, 440) +corkscrew_rc: (501, 533, 204) +car_ride: (410, 58, 3) +wooden_wild_mouse: (323, 381, 220) +log_flume: (208, 69, 52) +3d_cinema: (350, 240, 140) +haunted_house: (341, 153, 10) +monorail: (434, 25, 5) +mini_golf: (306, 90, 0) +wooden_rc: (634, 648, 377) +wooden_rc: (71, 68, 41) +steeplechase: (609, 509, 351) +steeplechase: (587, 492, 338) +classic_mini_rc: (244, 245, 170) +shop: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +food_stall: (-1, 0, 0) +log_flume: (133, 37, 19) +car_ride: (38, 29, 1) +food_stall: (-1, 0, 0) +crooked_house: (215, 62, 34) +mine_train_rc: (35, 32, 22) +toilets: (-1, 0, 0) +drink_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +ghost_train: (389, 43, 22) +shop: (-1, 0, 0) +car_ride: (40, 29, 2) +spiral_slide: (178, 140, 90) +twist: (193, 157, 250) +merry_go_round: (125, 60, 75) +merry_go_round: (106, 60, 75) +dodgems: (275, 80, 35) +twist: (173, 157, 250) +launched_freefall: (379, 879, 543) +boat_hire: (269, 89, 100) +motion_simulator: (290, 350, 300) +drink_stall: (-1, 0, 0) +chairlift: (287, 55, 51) +go_karts: (509, 288, 45) +information_kiosk: (-1, 0, 0) +food_stall: (-1, 0, 0) +shop: (-1, 0, 0) +maze: (191, 104, 0) +twist: (180, 157, 250) +drink_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +shop: (-1, 0, 0) +toilets: (-1, 0, 0) +toilets: (-1, 0, 0) +toilets: (-1, 0, 0) +toilets: (-1, 0, 0) +food_stall: (-1, 0, 0) +log_flume: (586, 268, 172) +information_kiosk: (-1, 0, 0) +wooden_rc: (124, 150, 87) +food_stall: (-1, 30, 0) +crooked_house: (215, 62, 34) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +shop: (-1, 0, 0) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +shop: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +information_kiosk: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +drink_stall: (-1, 0, 0) +dodgems: (270, 80, 35) +dodgems: (274, 80, 35) +food_stall: (-1, 0, 0) +food_stall: (-1, 0, 0) +shop: (-1, 0, 0) +shop: (-1, 0, 0) +first_aid: (-1, 0, 0) +cash_machine: (-1, 0, 0) +multi_dimension_rc: (694, 833, 772) +side_friction_rc: (486, 586, 338) +reverser_rc: (548, 525, 387) +inverted_hairpin_rc: (670, 770, 470) +virginia_reel: (531, 542, 588) +steel_wild_mouse: (631, 768, 473) +mini_rc: (539, 563, 397) +spiral_rc: (620, 373, 215) +looping_rc: (467, 441, 182) +stand_up_rc: (553, 790, 558) +lim_launched_rc: (680, 944, 573) +twister_rc: (778, 769, 425) +giga_rc: (624, 359, 200) +inverted_rc: (678, 850, 686) +inverted_impulse_rc: (643, 750, 569) +mini_suspended_rc: (512, 696, 475) +mine_ride: (644, 458, 381) +heartline_twister_rc: (474, 658, 462) +lay_down_rc: (682, 666, 548) +flying_rc: (719, 711, 678) +reverse_freefall_rc: (518, 747, 534) +vertical_drop_rc: (639, 618, 282) +air_powered_vertical_rc: (873, 895, 701) +suspended_monorail: (336, 47, 23) +lift: (563, 35, 102) +monorail_cycles: (226, 29, 1) +ferris_wheel: (85, 50, 55) +observation_tower: (594, 0, 61) +spiral_slide: (157, 140, 90) +space_rings: (167, 210, 650) +circus: (210, 30, 0) +flying_saucers: (381, 85, 39) +magic_carpet: (374, 340, 440) +swinging_ship: (264, 245, 251) +swinging_inverter_ship: (349, 468, 472) +top_spin: (201, 480, 574) +roto_drop: (395, 1148, 1148) +enterprise: (392, 647, 764) +river_rapids: (376, 153, 90) +river_rafts: (263, 45, 43) +dinghy_slide: (477, 577, 358) +mini_helicopters: (315, 50, 4) +suspended_swinging_rc: (690, 691, 720) +compact_inverted_rc: (680, 830, 698) +splash_boats: (474, 204, 113) +submarine_ride: (255, 180, 140) diff --git a/test/tests/testdata/ratings/testReversedTrains.park.txt b/test/tests/testdata/ratings/testReversedTrains.park.txt index 80a0810a2e..05b5c8049b 100644 --- a/test/tests/testdata/ratings/testReversedTrains.park.txt +++ b/test/tests/testdata/ratings/testReversedTrains.park.txt @@ -1,2 +1,2 @@ -RIDE_TYPE_HYPERCOASTER: (592, 537, 239) -RIDE_TYPE_HYPERCOASTER: (600, 624, 294) \ No newline at end of file +hypercoaster: (592, 537, 239) +hypercoaster: (600, 624, 294) diff --git a/test/tests/tests.cpp b/test/tests/tests.cpp index 4293d589fe..fbbfa7b8f9 100644 --- a/test/tests/tests.cpp +++ b/test/tests/tests.cpp @@ -11,8 +11,8 @@ // directly into the test binary. #ifdef _MSC_VER -# include -# include + #include + #include int main(int argc, char** argv) {