Compare commits
131 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d8891f1fe4 | |||
| 85385db099 | |||
| d1c930b5e5 | |||
| 6d4761f349 | |||
| 23d89122b3 | |||
| 2ea72f835a | |||
| a72997f12b | |||
| c70bdb7700 | |||
| 72358eb4d7 | |||
| b887d38f5f | |||
| 23d40c1ca5 | |||
| caf8f1badc | |||
| 77987a42cf | |||
| b166bdd3fc | |||
| f5aacaf38b | |||
| fac898d759 | |||
| 91bd693ff6 | |||
| f31a841789 | |||
| 778f548b01 | |||
| 81372c092d | |||
| 79a10c62ef | |||
| 5f0f2731ee | |||
| f9cfcde627 | |||
| c3ba15ed57 | |||
| d025ca0d90 | |||
| c02dcb598a | |||
| 176650cb3a | |||
| 7d0515c501 | |||
| f81b042843 | |||
| 2845a29e28 | |||
| f27ef0ec3b | |||
| f9a696e9bd | |||
| c3c97f207f | |||
| 4980ae8dcc | |||
| 859bf856b8 | |||
| dac90bb9eb | |||
| 3f896f126f | |||
| 4166dbf907 | |||
| 2af99dfc3a | |||
| 6d2fd664fb | |||
| 000a5d28f3 | |||
| aea46e7cb2 | |||
| 44d3f1ccbb | |||
| bd3ee64d81 | |||
| 9be85df4b2 | |||
| d0041d28ea | |||
| 5324dfae67 | |||
| 25ceca0fbf | |||
| c4b90d0bfe | |||
| 512336f858 | |||
| 42ff9742ed | |||
| 37c0345529 | |||
| 359cc3d5f6 | |||
| c146ca4aa5 | |||
| 8f0f8c7644 | |||
| 1b63f4ca1a | |||
| 7d20509b5b | |||
| 37390c441f | |||
| 853bff3e41 | |||
| 7a96e700bf | |||
| 16ee259d0b | |||
| 6562823b72 | |||
| 4aee3b6cc9 | |||
| 19d8d38082 | |||
| 579087e527 | |||
| 831711a459 | |||
| e72eeb95aa | |||
| ead17892fe | |||
| 1861335cf0 | |||
| 660c3ec3b0 | |||
| 92fa54c3f9 | |||
| 08828da9fc | |||
| c4ce2f10cd | |||
| 38c31d2d4e | |||
| 40b6dae261 | |||
| ac506c8b3e | |||
| 059df8187e | |||
| 82b6c48497 | |||
| fe71cdfbb6 | |||
| 6f8207d3bb | |||
| d56899dd0b | |||
| b6e9e9cd0f | |||
| 6f9c31dd6c | |||
| b47d538e62 | |||
| 330da0b5ec | |||
| 1fa31410c2 | |||
| 2149cd1fdd | |||
| 0f6147f41d | |||
| 693f778b60 | |||
| b10e489cc6 | |||
| ad60ad7c2b | |||
| 196de9d05d | |||
| bd05cb8b5d | |||
| d434941724 | |||
| 44906598e4 | |||
| ff1d8a9e9d | |||
| 0f40472c1a | |||
| 2af952b180 | |||
| 94ad837c02 | |||
| 77cc91d0de | |||
| fb8dacbc69 | |||
| f6ce7e6492 | |||
| 04d0cd8532 | |||
| b099b5649b | |||
| ca23d87a3a | |||
| 21d82e7c4c | |||
| 2aa7c71eac | |||
| 2a0a31ae7e | |||
| c9c7fc7df6 | |||
| 7f5f4251ca | |||
| bd07a56022 | |||
| b2698fa126 | |||
| 58ef377d87 | |||
| 1b158015e6 | |||
| 356d959b70 | |||
| b157cc5a16 | |||
| 2bd8316d54 | |||
| 866882e4c6 | |||
| 76e99ffe19 | |||
| 73052617ed | |||
| 4a89c20ac9 | |||
| eb28d114cd | |||
| dbcc6b4818 | |||
| 76ceda3118 | |||
| 981c6348ab | |||
| d3f864cea9 | |||
| 21466192e5 | |||
| 72777a0eb2 | |||
| b13f6f4b70 | |||
| 7551fba3d2 | |||
| 109345e94d |
@@ -0,0 +1 @@
|
||||
* text=auto eol=lf
|
||||
@@ -6,8 +6,59 @@ concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
jobs:
|
||||
generate-soh-otr:
|
||||
runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
- name: ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: ${{ runner.os }}-soh-otr-ccache
|
||||
- name: Install dependencies
|
||||
if: ${{ !vars.LINUX_RUNNER }}
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y $(cat .github/workflows/apt-deps.txt)
|
||||
- name: Install latest SDL
|
||||
if: ${{ !vars.LINUX_RUNNER }}
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz
|
||||
tar -xzf SDL2-2.26.1.tar.gz
|
||||
cd SDL2-2.26.1
|
||||
./configure
|
||||
make -j 10
|
||||
sudo make install
|
||||
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
|
||||
- name: Install latest SDL_net
|
||||
if: ${{ !vars.LINUX_RUNNER }}
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz
|
||||
tar -xzf SDL2_net-2.2.0.tar.gz
|
||||
cd SDL2_net-2.2.0
|
||||
./configure
|
||||
make -j 10
|
||||
sudo make install
|
||||
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
|
||||
- name: Generate soh.otr
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release
|
||||
cmake --build build-cmake --config Release --target ZAPD
|
||||
mkdir Extract
|
||||
cp -r OTRExporter/assets/ ./Extract/assets
|
||||
./build-cmake/ZAPD/ZAPD.out botr -se OTR --norom
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: soh.otr
|
||||
path: soh.otr
|
||||
retention-days: 1
|
||||
build-macos:
|
||||
runs-on: macos-12
|
||||
needs: generate-soh-otr
|
||||
runs-on: ${{ (vars.MAC_RUNNER && fromJSON(vars.MAC_RUNNER)) || 'macos-12' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -17,12 +68,14 @@ jobs:
|
||||
with:
|
||||
key: ${{ runner.os }}-ccache
|
||||
- name: Install gtar wrapper
|
||||
if: ${{ !vars.MAC_RUNNER }}
|
||||
run: |
|
||||
sudo mv /usr/local/bin/gtar /usr/local/bin/gtar.orig
|
||||
sudo cp .github/workflows//gtar /usr/local/bin/gtar
|
||||
sudo chmod +x /usr/local/bin/gtar
|
||||
- name: Cache MacPorts
|
||||
id: cache-macports
|
||||
if: ${{ !vars.MAC_RUNNER }}
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /opt/local/
|
||||
@@ -30,6 +83,7 @@ jobs:
|
||||
restore-keys: |
|
||||
${{ runner.os }}-macports-
|
||||
- name: Install MacPorts (if necessary)
|
||||
if: ${{ !vars.MAC_RUNNER }}
|
||||
run: |
|
||||
if [ -d /opt/local/ ]; then
|
||||
echo "MacPorts already installed"
|
||||
@@ -39,15 +93,21 @@ jobs:
|
||||
fi
|
||||
echo "/opt/local/bin:/opt/local/sbin" >> $GITHUB_PATH
|
||||
- name: Install dependencies
|
||||
if: ${{ !vars.MAC_RUNNER }}
|
||||
run: |
|
||||
brew uninstall --ignore-dependencies libpng
|
||||
sudo port install $(cat .github/workflows/macports-deps.txt)
|
||||
brew install ninja
|
||||
- name: Download soh.otr
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: soh.otr
|
||||
- name: Build SoH
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
|
||||
cmake --build build-cmake --config Release --parallel 10
|
||||
mv soh.otr build-cmake/soh
|
||||
(cd build-cmake && cpack)
|
||||
|
||||
mv _packages/*.dmg SoH.dmg
|
||||
@@ -60,6 +120,7 @@ jobs:
|
||||
SoH.dmg
|
||||
readme.txt
|
||||
build-linux:
|
||||
needs: generate-soh-otr
|
||||
strategy:
|
||||
fail-fast: true
|
||||
matrix:
|
||||
@@ -70,12 +131,13 @@ jobs:
|
||||
- os: ubuntu-22.04
|
||||
gcc: 12
|
||||
archive-suffix: performance
|
||||
runs-on: ${{ matrix.os }}
|
||||
runs-on: ${{ (matrix.os == 'ubuntu-20.04' && ((vars.LINUX_COMPATIBILITY_RUNNER && fromJSON(vars.LINUX_COMPATIBILITY_RUNNER)) || matrix.os)) || (matrix.os == 'ubuntu-22.04' && ((vars.LINUX_PERFORMANCE_RUNNER && fromJSON(vars.LINUX_PERFORMANCE_RUNNER)) || matrix.os)) }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Install dependencies
|
||||
if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) || (matrix.os == 'ubuntu-22.04' && !vars.LINUX_PERFORMANCE_RUNNER) }}
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y $(cat .github/workflows/apt-deps.txt)
|
||||
@@ -84,6 +146,7 @@ jobs:
|
||||
with:
|
||||
key: ${{ matrix.os }}-ccache
|
||||
- name: Install latest SDL
|
||||
if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) || (matrix.os == 'ubuntu-22.04' && !vars.LINUX_PERFORMANCE_RUNNER) }}
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz
|
||||
@@ -94,6 +157,7 @@ jobs:
|
||||
sudo make install
|
||||
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
|
||||
- name: Install latest SDL_net
|
||||
if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) || (matrix.os == 'ubuntu-22.04' && !vars.LINUX_PERFORMANCE_RUNNER) }}
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
wget https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz
|
||||
@@ -103,11 +167,14 @@ jobs:
|
||||
make -j 10
|
||||
sudo make install
|
||||
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
|
||||
- name: Download soh.otr
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: soh.otr
|
||||
- name: Build SoH
|
||||
run: |
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release
|
||||
cmake --build build-cmake --target OTRGui -j3
|
||||
cmake --build build-cmake --config Release -j3
|
||||
(cd build-cmake && cpack -G External)
|
||||
|
||||
@@ -124,7 +191,8 @@ jobs:
|
||||
soh.appimage
|
||||
readme.txt
|
||||
build-switch:
|
||||
runs-on: ubuntu-latest
|
||||
needs: generate-soh-otr
|
||||
runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
|
||||
container:
|
||||
image: devkitpro/devkita64:latest
|
||||
steps:
|
||||
@@ -132,6 +200,9 @@ jobs:
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ninja-build
|
||||
- name: Fix dubious ownership error
|
||||
if: ${{ vars.LINUX_RUNNER }}
|
||||
run: git config --global --add safe.directory '*'
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
@@ -146,52 +217,66 @@ jobs:
|
||||
|
||||
mv build-switch/soh/*.nro soh.nro
|
||||
mv README.md readme.txt
|
||||
- name: Download soh.otr
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: soh.otr
|
||||
- name: Upload build
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: soh-switch
|
||||
path: |
|
||||
soh.nro
|
||||
soh.otr
|
||||
readme.txt
|
||||
build-wiiu:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: devkitpro/devkitppc:latest
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ninja-build
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
- name: ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: ${{ runner.os }}-wiiu-ccache
|
||||
- name: Build SoH
|
||||
run: |
|
||||
cmake -H. -Bbuild-wiiu -GNinja -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/WiiU.cmake -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
|
||||
cmake --build build-wiiu --target soh_wuhb --config Release -j3
|
||||
# build-wiiu:
|
||||
# needs: generate-soh-otr
|
||||
# runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
|
||||
# container:
|
||||
# image: devkitpro/devkitppc:latest
|
||||
# steps:
|
||||
# - name: Install dependencies
|
||||
# if: ${{ !vars.LINUX_RUNNER }}
|
||||
# run: |
|
||||
# sudo apt-get update
|
||||
# sudo apt-get install -y ninja-build
|
||||
# - uses: actions/checkout@v3
|
||||
# with:
|
||||
# submodules: true
|
||||
# - name: ccache
|
||||
# uses: hendrikmuhs/ccache-action@v1.2
|
||||
# with:
|
||||
# key: ${{ runner.os }}-wiiu-ccache
|
||||
# - name: Build SoH
|
||||
# run: |
|
||||
# cmake -H. -Bbuild-wiiu -GNinja -DCMAKE_TOOLCHAIN_FILE=/opt/devkitpro/cmake/WiiU.cmake -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache
|
||||
# cmake --build build-wiiu --target soh_wuhb --config Release -j3
|
||||
|
||||
mv build-wiiu/soh/*.rpx soh.rpx
|
||||
mv build-wiiu/soh/*.wuhb soh.wuhb
|
||||
mv README.md readme.txt
|
||||
env:
|
||||
DEVKITPRO: /opt/devkitpro
|
||||
DEVKITPPC: /opt/devkitpro/devkitPPC
|
||||
- name: Upload build
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: soh-wiiu
|
||||
path: |
|
||||
soh.rpx
|
||||
soh.wuhb
|
||||
readme.txt
|
||||
# mv build-wiiu/soh/*.rpx soh.rpx
|
||||
# mv build-wiiu/soh/*.wuhb soh.wuhb
|
||||
# mv README.md readme.txt
|
||||
# env:
|
||||
# DEVKITPRO: /opt/devkitpro
|
||||
# DEVKITPPC: /opt/devkitpro/devkitPPC
|
||||
# - name: Download soh.otr
|
||||
# uses: actions/download-artifact@v3
|
||||
# with:
|
||||
# name: soh.otr
|
||||
# - name: Upload build
|
||||
# uses: actions/upload-artifact@v3
|
||||
# with:
|
||||
# name: soh-wiiu
|
||||
# path: |
|
||||
# soh.rpx
|
||||
# soh.wuhb
|
||||
# soh.otr
|
||||
# readme.txt
|
||||
build-windows:
|
||||
runs-on: windows-latest
|
||||
needs: generate-soh-otr
|
||||
runs-on: ${{ (vars.WINDOWS_RUNNER && fromJSON(vars.WINDOWS_RUNNER)) || 'windows-latest' }}
|
||||
steps:
|
||||
- name: Install dependencies
|
||||
if: ${{ !vars.WINDOWS_RUNNER }}
|
||||
run: |
|
||||
choco install ninja
|
||||
Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force
|
||||
@@ -203,19 +288,29 @@ jobs:
|
||||
with:
|
||||
key: ${{ runner.os }}-ccache
|
||||
- uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: Setup 7-Zip
|
||||
run: |
|
||||
"C:\Program Files\7-Zip" >> $env:GITHUB_PATH
|
||||
- name: Build SoH
|
||||
run: |
|
||||
set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH"
|
||||
cmake -S . -B build-windows -G Ninja -DCMAKE_MAKE_PROGRAM=ninja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
cmake --build build-windows --target OTRGui --config Release --parallel 10
|
||||
cmake --build build-windows --config Release --parallel 10
|
||||
cd build-windows
|
||||
cpack -G ZIP
|
||||
|
||||
mkdir soh-windows
|
||||
mv ./x64/Release/soh.exe ./soh-windows/soh.exe
|
||||
mkdir soh-windows/debug
|
||||
mkdir soh-windows/mods
|
||||
New-Item soh-windows/mods/custom_otr_files_go_here.txt -type file
|
||||
mv ./x64/Release/soh.pdb ./soh-windows/debug/soh.pdb
|
||||
mv ./README.md ./soh-windows/readme.txt
|
||||
mv ./build-windows/gamecontrollerdb.txt ./soh-windows/gamecontrollerdb.txt
|
||||
mv ./build-windows/OTRGui/assets ./soh-windows
|
||||
mv ./build-windows/ZAPD/ZAPD.exe ./soh-windows/assets/extractor/ZAPD.exe
|
||||
- name: Download soh.otr
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: soh.otr
|
||||
path: soh-windows
|
||||
- name: Upload build
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: soh-windows
|
||||
path: _packages/*.zip
|
||||
path: soh-windows
|
||||
|
||||
@@ -7,7 +7,7 @@ __pycache__/
|
||||
.vscode/
|
||||
.vs/
|
||||
.idea/
|
||||
cmake-build-debug
|
||||
cmake-build-**
|
||||
venv/
|
||||
.cache/
|
||||
|
||||
@@ -409,8 +409,7 @@ DebugObj/*
|
||||
ReleaseObj/*
|
||||
.tags
|
||||
tags
|
||||
oot.otr
|
||||
oot-mq.otr
|
||||
*.otr
|
||||
*.sav
|
||||
shipofharkinian.ini
|
||||
shipofharkinian.json
|
||||
@@ -445,6 +444,9 @@ install_manifest.txt
|
||||
compile_commands.json
|
||||
CTestTestfile.cmake
|
||||
_deps
|
||||
_packages
|
||||
*/extract_assets_cmake*
|
||||
/build*
|
||||
build.c
|
||||
|
||||
soh/build.c
|
||||
soh/properties.h
|
||||
|
||||
@@ -3,10 +3,10 @@ cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
|
||||
set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE)
|
||||
set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
|
||||
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version")
|
||||
|
||||
project(Ship VERSION 6.1.2 LANGUAGES C CXX)
|
||||
set(PROJECT_BUILD_NAME "KHAN CHARLIE" CACHE STRING "")
|
||||
project(Ship VERSION 7.0.1 LANGUAGES C CXX)
|
||||
set(PROJECT_BUILD_NAME "Spock Bravo" CACHE STRING "")
|
||||
set(PROJECT_TEAM "github.com/harbourmasters" CACHE STRING "")
|
||||
|
||||
set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT soh)
|
||||
@@ -25,7 +25,7 @@ set(VCPKG_TRIPLET x64-windows-static)
|
||||
set(VCPKG_TARGET_TRIPLET x64-windows-static)
|
||||
|
||||
vcpkg_bootstrap()
|
||||
vcpkg_install_packages(zlib bzip2 libpng SDL2 SDL2-net GLEW glfw3)
|
||||
vcpkg_install_packages(zlib bzip2 libpng sdl2 sdl2-net glew glfw3)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
@@ -100,20 +100,31 @@ set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon
|
||||
|
||||
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
||||
install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage)
|
||||
install(FILES "${CMAKE_SOURCE_DIR}/soh.otr" DESTINATION . COMPONENT appimage)
|
||||
endif()
|
||||
|
||||
find_package(Python3 COMPONENTS Interpreter)
|
||||
|
||||
# Target to generate OTRs
|
||||
add_custom_target(
|
||||
ExtractAssets
|
||||
# CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions
|
||||
COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr oot-mq.otr
|
||||
COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr oot-mq.otr soh.otr
|
||||
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive
|
||||
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake
|
||||
COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$<TARGET_FILE_DIR:ZAPD>" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter
|
||||
COMMENT "Running asset extraction..."
|
||||
DEPENDS ZAPD
|
||||
BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr
|
||||
BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr ${CMAKE_SOURCE_DIR}/soh.otr
|
||||
)
|
||||
|
||||
# Target to generate headers
|
||||
add_custom_target(
|
||||
ExtractAssetHeaders
|
||||
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive --gen-headers
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter
|
||||
COMMENT "Generating asset headers..."
|
||||
DEPENDS ZAPD
|
||||
)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
|
||||
@@ -5,20 +5,20 @@ void OTRExporter_Animation::Save(ZResource* res, const fs::path& outPath, Binary
|
||||
{
|
||||
ZAnimation* anim = (ZAnimation*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Animation);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Animation);
|
||||
|
||||
ZNormalAnimation* normalAnim = dynamic_cast<ZNormalAnimation*>(anim);
|
||||
ZCurveAnimation* curveAnim = dynamic_cast<ZCurveAnimation*>(anim);
|
||||
ZLinkAnimation* linkAnim = dynamic_cast<ZLinkAnimation*>(anim);
|
||||
if (linkAnim != nullptr)
|
||||
{
|
||||
writer->Write((uint32_t)Ship::AnimationType::Link);
|
||||
writer->Write((uint32_t)LUS::AnimationType::Link);
|
||||
writer->Write((uint16_t)linkAnim->frameCount);
|
||||
writer->Write((uint32_t)linkAnim->segmentAddress);
|
||||
}
|
||||
else if (curveAnim != nullptr)
|
||||
{
|
||||
writer->Write((uint32_t)Ship::AnimationType::Curve);
|
||||
writer->Write((uint32_t)LUS::AnimationType::Curve);
|
||||
writer->Write((uint16_t)curveAnim->frameCount);
|
||||
|
||||
writer->Write((uint32_t)curveAnim->refIndexArr.size());
|
||||
@@ -44,7 +44,7 @@ void OTRExporter_Animation::Save(ZResource* res, const fs::path& outPath, Binary
|
||||
}
|
||||
else if (normalAnim != nullptr)
|
||||
{
|
||||
writer->Write((uint32_t)Ship::AnimationType::Normal);
|
||||
writer->Write((uint32_t)LUS::AnimationType::Normal);
|
||||
writer->Write((uint16_t)normalAnim->frameCount);
|
||||
|
||||
writer->Write((uint32_t)normalAnim->rotationValues.size());
|
||||
@@ -65,6 +65,6 @@ void OTRExporter_Animation::Save(ZResource* res, const fs::path& outPath, Binary
|
||||
}
|
||||
else
|
||||
{
|
||||
writer->Write((uint32_t)Ship::AnimationType::Legacy);
|
||||
writer->Write((uint32_t)LUS::AnimationType::Legacy);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Array::Save(ZResource* res, const fs::path& outPath, BinaryWrit
|
||||
{
|
||||
ZArray* arr = (ZArray*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::Array);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::Array);
|
||||
|
||||
writer->Write((uint32_t)arr->resList[0]->GetResourceType());
|
||||
writer->Write((uint32_t)arr->arrayCnt);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "Main.h"
|
||||
#include <Utils/MemoryStream.h>
|
||||
#include <Globals.h>
|
||||
#include <Utils/File.h>
|
||||
#include <Utils/DiskFile.h>
|
||||
#include "DisplayListExporter.h"
|
||||
|
||||
void OTRExporter_Audio::WriteSampleEntryReference(ZAudio* audio, SampleEntry* entry, std::map<uint32_t, SampleEntry*> samples, BinaryWriter* writer)
|
||||
@@ -29,7 +29,7 @@ void OTRExporter_Audio::WriteSampleEntryReference(ZAudio* audio, SampleEntry* en
|
||||
|
||||
void OTRExporter_Audio::WriteSampleEntry(SampleEntry* entry, BinaryWriter* writer)
|
||||
{
|
||||
WriteHeader(nullptr, "", writer, Ship::ResourceType::SOH_AudioSample, Ship::Version::Rachael);
|
||||
WriteHeader(nullptr, "", writer, LUS::ResourceType::SOH_AudioSample, 2);
|
||||
|
||||
writer->Write(entry->codec);
|
||||
writer->Write(entry->medium);
|
||||
@@ -81,7 +81,7 @@ void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWrit
|
||||
{
|
||||
ZAudio* audio = (ZAudio*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Audio, Ship::Version::Rachael);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Audio, 2);
|
||||
|
||||
// Write Samples as individual files
|
||||
for (auto pair : audio->samples)
|
||||
@@ -114,7 +114,7 @@ void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWrit
|
||||
MemoryStream* fntStream = new MemoryStream();
|
||||
BinaryWriter fntWriter = BinaryWriter(fntStream);
|
||||
|
||||
WriteHeader(nullptr, "", &fntWriter, Ship::ResourceType::SOH_AudioSoundFont, Ship::Version::Rachael);
|
||||
WriteHeader(nullptr, "", &fntWriter, LUS::ResourceType::SOH_AudioSoundFont, 2);
|
||||
|
||||
fntWriter.Write((uint32_t)i);
|
||||
fntWriter.Write(audio->soundFontTable[i].medium);
|
||||
@@ -173,7 +173,7 @@ void OTRExporter_Audio::Save(ZResource* res, const fs::path& outPath, BinaryWrit
|
||||
MemoryStream* seqStream = new MemoryStream();
|
||||
BinaryWriter seqWriter = BinaryWriter(seqStream);
|
||||
|
||||
WriteHeader(nullptr, "", &seqWriter, Ship::ResourceType::SOH_AudioSequence, Ship::Version::Rachael);
|
||||
WriteHeader(nullptr, "", &seqWriter, LUS::ResourceType::SOH_AudioSequence, 2);
|
||||
|
||||
seqWriter.Write((uint32_t)seq.size());
|
||||
seqWriter.Write(seq.data(), seq.size());
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Background::Save(ZResource* res, const fs::path& outPath, Binar
|
||||
{
|
||||
ZBackground* bg = (ZBackground*)res;
|
||||
|
||||
WriteHeader(bg, outPath, writer, Ship::ResourceType::SOH_Background);
|
||||
WriteHeader(bg, outPath, writer, LUS::ResourceType::SOH_Background);
|
||||
|
||||
writer->Write((uint32_t)bg->GetRawDataSize());
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Blob::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
{
|
||||
ZBlob* blob = (ZBlob*)res;
|
||||
|
||||
WriteHeader(blob, outPath, writer, Ship::ResourceType::Blob);
|
||||
WriteHeader(blob, outPath, writer, LUS::ResourceType::Blob);
|
||||
|
||||
auto start = std::chrono::steady_clock::now();
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Collision::Save(ZResource* res, const fs::path& outPath, Binary
|
||||
{
|
||||
ZCollisionHeader* col = (ZCollisionHeader*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_CollisionHeader);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_CollisionHeader);
|
||||
|
||||
writer->Write(col->absMinX);
|
||||
writer->Write(col->absMinY);
|
||||
@@ -32,16 +32,18 @@ void OTRExporter_Collision::Save(ZResource* res, const fs::path& outPath, Binary
|
||||
writer->Write(col->polygons[i].vtxA);
|
||||
writer->Write(col->polygons[i].vtxB);
|
||||
writer->Write(col->polygons[i].vtxC);
|
||||
writer->Write(col->polygons[i].a);
|
||||
writer->Write(col->polygons[i].b);
|
||||
writer->Write(col->polygons[i].c);
|
||||
writer->Write(col->polygons[i].d);
|
||||
writer->Write(col->polygons[i].normX);
|
||||
writer->Write(col->polygons[i].normY);
|
||||
writer->Write(col->polygons[i].normZ);
|
||||
writer->Write(col->polygons[i].dist);
|
||||
}
|
||||
|
||||
writer->Write((uint32_t)col->polygonTypes.size());
|
||||
writer->Write((uint32_t)col->PolygonTypes.size());
|
||||
|
||||
for (uint16_t i = 0; i < col->polygonTypes.size(); i++)
|
||||
writer->Write(col->polygonTypes[i]);
|
||||
for (uint16_t i = 0; i < col->PolygonTypes.size(); i++) {
|
||||
writer->Write(col->PolygonTypes[i].data[1]);
|
||||
writer->Write(col->PolygonTypes[i].data[0]);
|
||||
}
|
||||
|
||||
writer->Write((uint32_t)col->camData->entries.size());
|
||||
|
||||
|
||||
@@ -5,12 +5,11 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
{
|
||||
ZCutscene* cs = (ZCutscene*)res;
|
||||
|
||||
WriteHeader(cs, outPath, writer, Ship::ResourceType::SOH_Cutscene);
|
||||
WriteHeader(cs, outPath, writer, LUS::ResourceType::SOH_Cutscene);
|
||||
|
||||
//writer->Write((uint32_t)cs->commands.size() + 2 + 2);
|
||||
writer->Write((uint32_t)0);
|
||||
|
||||
int currentStream = writer->GetBaseAddress();
|
||||
const auto currentStream = writer->GetBaseAddress();
|
||||
|
||||
writer->Write(CS_BEGIN_CUTSCENE(cs->numCommands, cs->endFrame));
|
||||
|
||||
@@ -26,12 +25,13 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(CMD_HH(0x0001, ((CutsceneCommandSetCameraPos*)cs->commands[i])->startFrame));
|
||||
writer->Write(CMD_HH(cmdCamPos->endFrame, 0x0000));
|
||||
|
||||
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_BBH(e->continueFlag, e->cameraRoll, e->nextPointFrame));
|
||||
writer->Write(e->viewAngle);
|
||||
writer->Write(CMD_HH(e->posX, e->posY));
|
||||
writer->Write(CMD_HH(e->posZ, e->unused));
|
||||
CutsceneCameraPoint* point = (CutsceneCameraPoint*)e;
|
||||
writer->Write(CMD_BBH(point->continueFlag, point->cameraRoll, point->nextPointFrame));
|
||||
writer->Write(point->viewAngle);
|
||||
writer->Write(CMD_HH(point->posX, point->posY));
|
||||
writer->Write(CMD_HH(point->posZ, point->unused));
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -43,51 +43,54 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(CMD_HH(0x0001, cmdCamPos->startFrame));
|
||||
writer->Write(CMD_HH(cmdCamPos->endFrame, 0x0000));
|
||||
|
||||
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_BBH(e->continueFlag, e->cameraRoll, e->nextPointFrame));
|
||||
writer->Write(e->viewAngle);
|
||||
writer->Write(CMD_HH(e->posX, e->posY));
|
||||
writer->Write(CMD_HH(e->posZ, e->unused));
|
||||
CutsceneCameraPoint* point = (CutsceneCameraPoint*)e;
|
||||
writer->Write(CMD_BBH(point->continueFlag, point->cameraRoll, point->nextPointFrame));
|
||||
writer->Write(point->viewAngle);
|
||||
writer->Write(CMD_HH(point->posX, point->posY));
|
||||
writer->Write(CMD_HH(point->posZ, point->unused));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (uint32_t)CutsceneCommands::SpecialAction:
|
||||
case (uint32_t)CutsceneCommands::Misc:
|
||||
{
|
||||
writer->Write(CS_CMD_MISC);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandSpecialAction*)cs->commands[i])->entries.size()));
|
||||
for (auto& e : ((CutsceneCommandSpecialAction*)cs->commands[i])->entries) //All in OOT seem to only have 1 entry
|
||||
writer->Write((uint32_t)CMD_W((cs->commands[i])->entries.size()));
|
||||
for (const auto& e : cs->commands[i]->entries) //All in OOT seem to only have 1 entry
|
||||
{
|
||||
writer->Write(CMD_HH(e->base, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, e->unused0));
|
||||
writer->Write(CMD_W(e->unused1));
|
||||
writer->Write(CMD_W(e->unused2));
|
||||
writer->Write(CMD_W(e->unused3));
|
||||
writer->Write(CMD_W(e->unused4));
|
||||
writer->Write(CMD_W(e->unused5));
|
||||
writer->Write(CMD_W(e->unused6));
|
||||
writer->Write(CMD_W(e->unused7));
|
||||
writer->Write(CMD_W(e->unused8));
|
||||
writer->Write(CMD_W(e->unused9));
|
||||
writer->Write(CMD_W(e->unused10));
|
||||
CutsceneSubCommandEntry_GenericCmd* cmd = (CutsceneSubCommandEntry_GenericCmd*)e;
|
||||
writer->Write(CMD_HH(cmd->base, cmd->startFrame));
|
||||
writer->Write(CMD_HH(cmd->endFrame, cmd->pad));
|
||||
writer->Write(CMD_W(cmd->unused1));
|
||||
writer->Write(CMD_W(cmd->unused2));
|
||||
writer->Write(CMD_W(cmd->unused3));
|
||||
writer->Write(CMD_W(cmd->unused4));
|
||||
writer->Write(CMD_W(cmd->unused5));
|
||||
writer->Write(CMD_W(cmd->unused6));
|
||||
writer->Write(CMD_W(cmd->unused7));
|
||||
writer->Write(CMD_W(cmd->unused8));
|
||||
writer->Write(CMD_W(cmd->unused9));
|
||||
writer->Write(CMD_W(cmd->unused10));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (uint32_t)CutsceneCommands::SetLighting:
|
||||
{
|
||||
writer->Write(CS_CMD_SET_LIGHTING);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandEnvLighting*)cs->commands[i])->entries.size()));
|
||||
for (auto& e : ((CutsceneCommandEnvLighting*)cs->commands[i])->entries)
|
||||
writer->Write((uint32_t)CMD_W((cs->commands[i])->entries.size()));
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(e->setting, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, e->unused0));
|
||||
writer->Write(CMD_W(e->unused1));
|
||||
writer->Write(CMD_W(e->unused2));
|
||||
writer->Write(CMD_W(e->unused3));
|
||||
writer->Write(CMD_W(e->unused4));
|
||||
writer->Write(CMD_W(e->unused5));
|
||||
writer->Write(CMD_W(e->unused6));
|
||||
writer->Write(CMD_W(e->unused7));
|
||||
CutsceneSubCommandEntry_GenericCmd* cmd = (CutsceneSubCommandEntry_GenericCmd*)e;
|
||||
writer->Write(CMD_HH(cmd->base, cmd->startFrame));
|
||||
writer->Write(CMD_HH(cmd->endFrame, cmd->pad));
|
||||
writer->Write(CMD_W(cmd->unused1));
|
||||
writer->Write(CMD_W(cmd->unused2));
|
||||
writer->Write(CMD_W(cmd->unused3));
|
||||
writer->Write(CMD_W(cmd->unused4));
|
||||
writer->Write(CMD_W(cmd->unused5));
|
||||
writer->Write(CMD_W(cmd->unused6));
|
||||
writer->Write(CMD_W(cmd->unused7));
|
||||
writer->Write((uint32_t)0x0);
|
||||
writer->Write((uint32_t)0x0);
|
||||
writer->Write((uint32_t)0x0);
|
||||
@@ -102,12 +105,13 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(CMD_HH(0x0001, ((CutsceneCommandSetCameraPos*)cs->commands[i])->startFrame));
|
||||
writer->Write(CMD_HH(cmdCamPos->endFrame, 0x0000));
|
||||
|
||||
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_BBH(e->continueFlag, e->cameraRoll, e->nextPointFrame));
|
||||
writer->Write(e->viewAngle);
|
||||
writer->Write(CMD_HH(e->posX, e->posY));
|
||||
writer->Write(CMD_HH(e->posZ, e->unused));
|
||||
CutsceneCameraPoint* point = (CutsceneCameraPoint*)e;
|
||||
writer->Write(CMD_BBH(point->continueFlag, point->cameraRoll, point->nextPointFrame));
|
||||
writer->Write(point->viewAngle);
|
||||
writer->Write(CMD_HH(point->posX, point->posY));
|
||||
writer->Write(CMD_HH(point->posZ, point->unused));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -119,12 +123,13 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(CMD_HH(0x0001, ((CutsceneCommandSetCameraPos*)cs->commands[i])->startFrame));
|
||||
writer->Write(CMD_HH(cmdCamPos->endFrame, 0x0000));
|
||||
|
||||
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_BBH(e->continueFlag, e->cameraRoll, e->nextPointFrame));
|
||||
writer->Write(e->viewAngle);
|
||||
writer->Write(CMD_HH(e->posX, e->posY));
|
||||
writer->Write(CMD_HH(e->posZ, e->unused));
|
||||
CutsceneCameraPoint* point = (CutsceneCameraPoint*)e;
|
||||
writer->Write(CMD_BBH(point->continueFlag, point->cameraRoll, point->nextPointFrame));
|
||||
writer->Write(point->viewAngle);
|
||||
writer->Write(CMD_HH(point->posX, point->posY));
|
||||
writer->Write(CMD_HH(point->posZ, point->unused));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -137,24 +142,26 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
case (uint32_t)CutsceneCommands::Cmd09:
|
||||
{
|
||||
writer->Write(CS_CMD_09);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandUnknown9*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommand_Rumble*)cs->commands[i])->entries.size()));
|
||||
|
||||
for (auto& e : ((CutsceneCommandUnknown9*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(e->base, e->startFrame));
|
||||
writer->Write(CMD_HBB(e->endFrame, e->unk2, e->unk3));
|
||||
writer->Write(CMD_BBH(e->unk4, e->unused0, e->unused1));
|
||||
CutsceneSubCommandEntry_Rumble* r = (CutsceneSubCommandEntry_Rumble*)e;
|
||||
writer->Write(CMD_HH(r->base, r->startFrame));
|
||||
writer->Write(CMD_HBB(e->endFrame, r->unk_06, r->unk_07));
|
||||
writer->Write(CMD_BBH(r->unk_08, r->unk_09, r->unk_0A));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 0x15:
|
||||
case (uint32_t)CutsceneCommands::Unknown:
|
||||
case 0x15://Both unused in OoT
|
||||
case 0x1A://(uint32_t)CutsceneCommands::Unknown:
|
||||
{
|
||||
#if 0
|
||||
CutsceneCommandUnknown* cmdUnk = (CutsceneCommandUnknown*)cs->commands[i];
|
||||
writer->Write((uint32_t)cs->commands[i]->commandID);
|
||||
writer->Write((uint32_t)cmdUnk->entries.size());
|
||||
|
||||
for (auto e : cmdUnk->entries)
|
||||
for (const auto e : cmdUnk->entries)
|
||||
{
|
||||
writer->Write(CMD_W(e->unused0));
|
||||
writer->Write(CMD_W(e->unused1));
|
||||
@@ -169,31 +176,33 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(CMD_W(e->unused10));
|
||||
writer->Write(CMD_W(e->unused11));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
case (uint32_t)CutsceneCommands::Textbox:
|
||||
{
|
||||
writer->Write(CS_CMD_TEXTBOX);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandTextbox*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W((cs->commands[i])->entries.size()));
|
||||
|
||||
for (auto& e : ((CutsceneCommandTextbox*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
if (e->base == 0xFFFF) // CS_TEXT_NONE
|
||||
CutsceneSubCommandEntry_TextBox* textBox = (CutsceneSubCommandEntry_TextBox*)e;
|
||||
if (textBox->base == 0xFFFF) // CS_TEXT_NONE
|
||||
{
|
||||
writer->Write(CMD_HH(0xFFFF, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, 0xFFFF));
|
||||
writer->Write(CMD_HH(0xFFFF, textBox->startFrame));
|
||||
writer->Write(CMD_HH(textBox->endFrame, 0xFFFF));
|
||||
writer->Write(CMD_HH(0xFFFF, 0xFFFF));
|
||||
}
|
||||
else // CS_TEXT_DISPLAY_TEXTBOX
|
||||
{
|
||||
writer->Write(CMD_HH(e->base, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, e->type));
|
||||
writer->Write(CMD_HH(e->textID1, e->textID2));
|
||||
writer->Write(CMD_HH(textBox->base, textBox->startFrame));
|
||||
writer->Write(CMD_HH(textBox->endFrame, textBox->type));
|
||||
writer->Write(CMD_HH(textBox->textId1, textBox->textId2));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (uint32_t)CutsceneCommands::SetActorAction0:
|
||||
case 10: //ActorAction0
|
||||
case (uint32_t)CutsceneCommands::SetActorAction1:
|
||||
case 17:
|
||||
case 18:
|
||||
@@ -292,11 +301,12 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
case (uint32_t)CutsceneCommands::SetActorAction10:
|
||||
{
|
||||
writer->Write((uint32_t)(CutsceneCommands)cs->commands[i]->commandID);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandActorAction*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W(cs->commands[i]->entries.size()));
|
||||
|
||||
for (auto& actorAct : ((CutsceneCommandActorAction*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(actorAct->action, actorAct->startFrame));
|
||||
CutsceneSubCommandEntry_ActorAction* actorAct = (CutsceneSubCommandEntry_ActorAction*)e;
|
||||
writer->Write(CMD_HH(actorAct->base, actorAct->startFrame));
|
||||
writer->Write(CMD_HH(actorAct->endFrame, actorAct->rotX));
|
||||
writer->Write(CMD_HH(actorAct->rotY, actorAct->rotZ));
|
||||
writer->Write(CMD_W(actorAct->startPosX));
|
||||
@@ -322,24 +332,23 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(CMD_HH((((CutsceneCommandSceneTransFX*)cs->commands[i])->endFrame), ((CutsceneCommandSceneTransFX*)cs->commands[i])->endFrame));
|
||||
break;
|
||||
}
|
||||
case (uint32_t)CutsceneCommands::Nop: //Not used in OOT
|
||||
break;
|
||||
case (uint32_t)CutsceneCommands::PlayBGM:
|
||||
{
|
||||
writer->Write(CS_CMD_PLAYBGM);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandPlayBGM*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W(cs->commands[i]->entries.size()));
|
||||
|
||||
for (auto& e : ((CutsceneCommandPlayBGM*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(e->sequence, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, e->unknown0));
|
||||
writer->Write(CMD_W(e->unknown1));
|
||||
writer->Write(CMD_W(e->unknown2));
|
||||
writer->Write(CMD_W(e->unknown3));
|
||||
writer->Write(CMD_W(e->unknown4));
|
||||
writer->Write(CMD_W(e->unknown5));
|
||||
writer->Write(CMD_W(e->unknown6));
|
||||
writer->Write(CMD_W(e->unknown7));
|
||||
CutsceneSubCommandEntry_GenericCmd* cmd = (CutsceneSubCommandEntry_GenericCmd*)e;
|
||||
writer->Write(CMD_HH(cmd->base, cmd->startFrame));
|
||||
writer->Write(CMD_HH(cmd->endFrame, cmd->pad));
|
||||
writer->Write(CMD_W(cmd->unused1));
|
||||
writer->Write(CMD_W(cmd->unused2));
|
||||
writer->Write(CMD_W(cmd->unused3));
|
||||
writer->Write(CMD_W(cmd->unused4));
|
||||
writer->Write(CMD_W(cmd->unused5));
|
||||
writer->Write(CMD_W(cmd->unused6));
|
||||
writer->Write(CMD_W(cmd->unused7));
|
||||
writer->Write((uint32_t)0);
|
||||
writer->Write((uint32_t)0);
|
||||
writer->Write((uint32_t)0);
|
||||
@@ -349,19 +358,20 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
case (uint32_t)CutsceneCommands::StopBGM:
|
||||
{
|
||||
writer->Write(CS_CMD_STOPBGM);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandStopBGM*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W(cs->commands[i]->entries.size()));
|
||||
|
||||
for (auto& e : ((CutsceneCommandStopBGM*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(e->sequence, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, e->unknown0));
|
||||
writer->Write(CMD_W(e->unknown1));
|
||||
writer->Write(CMD_W(e->unknown2));
|
||||
writer->Write(CMD_W(e->unknown3));
|
||||
writer->Write(CMD_W(e->unknown4));
|
||||
writer->Write(CMD_W(e->unknown5));
|
||||
writer->Write(CMD_W(e->unknown6));
|
||||
writer->Write(CMD_W(e->unknown7));
|
||||
CutsceneSubCommandEntry_GenericCmd* cmd = (CutsceneSubCommandEntry_GenericCmd*)e;
|
||||
writer->Write(CMD_HH(cmd->base, cmd->startFrame));
|
||||
writer->Write(CMD_HH(cmd->endFrame, cmd->pad));
|
||||
writer->Write(CMD_W(cmd->unused1));
|
||||
writer->Write(CMD_W(cmd->unused2));
|
||||
writer->Write(CMD_W(cmd->unused3));
|
||||
writer->Write(CMD_W(cmd->unused4));
|
||||
writer->Write(CMD_W(cmd->unused5));
|
||||
writer->Write(CMD_W(cmd->unused6));
|
||||
writer->Write(CMD_W(cmd->unused7));
|
||||
writer->Write((uint32_t)0);
|
||||
writer->Write((uint32_t)0);
|
||||
writer->Write((uint32_t)0);
|
||||
@@ -371,19 +381,20 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
case (uint32_t)CutsceneCommands::FadeBGM:
|
||||
{
|
||||
writer->Write(CS_CMD_FADEBGM);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandFadeBGM*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W(cs->commands[i]->entries.size()));
|
||||
|
||||
for (auto& e : ((CutsceneCommandFadeBGM*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(e->base, e->startFrame));
|
||||
writer->Write(CMD_HH(e->endFrame, e->unknown0));
|
||||
writer->Write(CMD_W(e->unknown1));
|
||||
writer->Write(CMD_W(e->unknown2));
|
||||
writer->Write(CMD_W(e->unknown3));
|
||||
writer->Write(CMD_W(e->unknown4));
|
||||
writer->Write(CMD_W(e->unknown5));
|
||||
writer->Write(CMD_W(e->unknown6));
|
||||
writer->Write(CMD_W(e->unknown7));
|
||||
CutsceneSubCommandEntry_GenericCmd* cmd = (CutsceneSubCommandEntry_GenericCmd*)e;
|
||||
writer->Write(CMD_HH(cmd->base, cmd->startFrame));
|
||||
writer->Write(CMD_HH(cmd->endFrame, cmd->pad));
|
||||
writer->Write(CMD_W(cmd->unused1));
|
||||
writer->Write(CMD_W(cmd->unused2));
|
||||
writer->Write(CMD_W(cmd->unused3));
|
||||
writer->Write(CMD_W(cmd->unused4));
|
||||
writer->Write(CMD_W(cmd->unused5));
|
||||
writer->Write(CMD_W(cmd->unused6));
|
||||
writer->Write(CMD_W(cmd->unused7));
|
||||
writer->Write((uint32_t)0);
|
||||
writer->Write((uint32_t)0);
|
||||
writer->Write((uint32_t)0);
|
||||
@@ -393,22 +404,24 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
case (uint32_t)CutsceneCommands::SetTime:
|
||||
{
|
||||
writer->Write(CS_CMD_SETTIME);
|
||||
writer->Write((uint32_t)CMD_W(((CutsceneCommandDayTime*)cs->commands[i])->entries.size()));
|
||||
writer->Write((uint32_t)CMD_W(cs->commands[i]->entries.size()));
|
||||
|
||||
for (auto& e : ((CutsceneCommandDayTime*)cs->commands[i])->entries)
|
||||
for (const auto& e : cs->commands[i]->entries)
|
||||
{
|
||||
writer->Write(CMD_HH(e->base, e->startFrame));
|
||||
writer->Write(CMD_HBB(e->endFrame, e->hour, e->minute));
|
||||
writer->Write((uint32_t)CMD_W(e->unused));
|
||||
CutsceneSubCommandEntry_SetTime* t = (CutsceneSubCommandEntry_SetTime*)e;
|
||||
writer->Write(CMD_HH(t->base, t->startFrame));
|
||||
writer->Write(CMD_HBB(t->endFrame, t->hour, t->minute));
|
||||
writer->Write((uint32_t)CMD_W(t->unk_08));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case (uint32_t)CutsceneCommands::Terminator:
|
||||
{
|
||||
CutsceneCommand_Terminator* t = (CutsceneCommand_Terminator*)cs->commands[i];
|
||||
writer->Write(CS_CMD_TERMINATOR);
|
||||
writer->Write((uint32_t)1);
|
||||
writer->Write(CMD_HH(((CutsceneCommandTerminator*)cs->commands[i])->base, ((CutsceneCommandTerminator*)cs->commands[i])->startFrame));
|
||||
writer->Write(CMD_HH(((CutsceneCommandTerminator*)cs->commands[i])->endFrame, ((CutsceneCommandTerminator*)cs->commands[i])->endFrame));
|
||||
writer->Write(CMD_HH(t->base, t->startFrame));
|
||||
writer->Write(CMD_HH(t->endFrame, t->endFrame));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -424,8 +437,8 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(0xFFFFFFFF);
|
||||
writer->Write((uint32_t)0);
|
||||
|
||||
int endStream = writer->GetBaseAddress();
|
||||
writer->Seek(currentStream - 4, SeekOffsetType::Start);
|
||||
const auto endStream = writer->GetBaseAddress();
|
||||
writer->Seek((uint32_t)currentStream - 4, SeekOffsetType::Start);
|
||||
writer->Write((uint32_t)((endStream - currentStream) / 4));
|
||||
writer->Seek(endStream, SeekOffsetType::Start);
|
||||
writer->Seek((uint32_t)endStream, SeekOffsetType::Start);
|
||||
}
|
||||
@@ -10,12 +10,12 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include "MtxExporter.h"
|
||||
#include <Utils/File.h>
|
||||
#include <Utils/DiskFile.h>
|
||||
#include "VersionInfo.h"
|
||||
|
||||
#define GFX_SIZE 8
|
||||
|
||||
#define gsDPSetCombineLERP2(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
|
||||
#define gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
|
||||
a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
|
||||
{ \
|
||||
_SHIFTL(G_SETCOMBINE, 24, 8) | \
|
||||
@@ -50,7 +50,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
|
||||
//printf("Exporting DList %s\n", dList->GetName().c_str());
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::DisplayList);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::DisplayList);
|
||||
|
||||
while (writer->GetBaseAddress() % 8 != 0)
|
||||
writer->Write((uint8_t)0xFF);
|
||||
@@ -76,7 +76,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
F3DZEXOpcode opF3D = (F3DZEXOpcode)opcode;
|
||||
|
||||
if ((int)opF3D == G_DL)// || (int)opF3D == G_BRANCH_Z)
|
||||
opcode = (uint8_t)G_DL_OTR;
|
||||
opcode = (uint8_t)G_DL_OTR_HASH;
|
||||
|
||||
if ((int)opF3D == G_MTX)
|
||||
opcode = (uint8_t)G_MTX_OTR;
|
||||
@@ -85,10 +85,10 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
opcode = (uint8_t)G_BRANCH_Z_OTR;
|
||||
|
||||
if ((int)opF3D == G_VTX)
|
||||
opcode = (uint8_t)G_VTX_OTR;
|
||||
opcode = (uint8_t)G_VTX_OTR_HASH;
|
||||
|
||||
if ((int)opF3D == G_SETTIMG)
|
||||
opcode = (uint8_t)G_SETTIMG_OTR;
|
||||
opcode = (uint8_t)G_SETTIMG_OTR_HASH;
|
||||
|
||||
word0 += (opcode << 24);
|
||||
|
||||
@@ -356,7 +356,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
//std::string fName = StringHelper::Sprintf("%s\\%s", GetParentFolderName(res).c_str(), dListDecl2->varName.c_str());
|
||||
std::string fName = OTRExporter_DisplayList::GetPathToRes(res, dListDecl2->varName.c_str());
|
||||
|
||||
if (files.find(fName) == files.end() && !File::Exists("Extract/" + fName))
|
||||
if (files.find(fName) == files.end() && !DiskFile::Exists("Extract/" + fName))
|
||||
{
|
||||
MemoryStream* dlStream = new MemoryStream();
|
||||
BinaryWriter dlWriter = BinaryWriter(dlStream);
|
||||
@@ -442,7 +442,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
//std::string fName = StringHelper::Sprintf("%s\\%s", GetParentFolderName(res).c_str(), dListDecl2->varName.c_str());
|
||||
std::string fName = OTRExporter_DisplayList::GetPathToRes(res, dListDecl2->varName.c_str());
|
||||
|
||||
if (files.find(fName) == files.end() && !File::Exists("Extract/" + fName))
|
||||
if (files.find(fName) == files.end() && !DiskFile::Exists("Extract/" + fName))
|
||||
{
|
||||
MemoryStream* dlStream = new MemoryStream();
|
||||
BinaryWriter dlWriter = BinaryWriter(dlStream);
|
||||
@@ -607,7 +607,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
int32_t ab1 = (data & 0b00000000000000000000000000000000000000000000000000000000111000) >> 3;
|
||||
int32_t ad1 = (data & 0b00000000000000000000000000000000000000000000000000000000000111) >> 0;
|
||||
|
||||
Gfx value = {gsDPSetCombineLERP2(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
|
||||
Gfx value = { gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
|
||||
word0 = value.words.w0;
|
||||
word1 = value.words.w1;
|
||||
}
|
||||
@@ -686,7 +686,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
|
||||
Gfx value = {gsDPSetTextureImage(fmt, siz, www + 1, __)};
|
||||
word0 = value.words.w0 & 0x00FFFFFF;
|
||||
word0 += (G_SETTIMG_OTR << 24);
|
||||
word0 += (G_SETTIMG_OTR_HASH << 24);
|
||||
//word1 = value.words.w1;
|
||||
word1 = 0;
|
||||
|
||||
@@ -754,7 +754,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
|
||||
word0 = value.words.w0;
|
||||
word0 &= 0x00FFFFFF;
|
||||
word0 += (G_VTX_OTR << 24);
|
||||
word0 += (G_VTX_OTR_HASH << 24);
|
||||
word1 = value.words.w1;
|
||||
|
||||
writer->Write(word0);
|
||||
@@ -767,7 +767,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
word0 = hash >> 32;
|
||||
word1 = hash & 0xFFFFFFFF;
|
||||
|
||||
if (files.find(fName) == files.end() && !File::Exists("Extract/" + fName))
|
||||
if (files.find(fName) == files.end() && !DiskFile::Exists("Extract/" + fName))
|
||||
{
|
||||
// Write vertices to file
|
||||
MemoryStream* vtxStream = new MemoryStream();
|
||||
@@ -786,7 +786,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
}
|
||||
|
||||
// OTRTODO: Once we aren't relying on text representations, we should call ArrayExporter...
|
||||
OTRExporter::WriteHeader(nullptr, "", &vtxWriter, Ship::ResourceType::Array);
|
||||
OTRExporter::WriteHeader(nullptr, "", &vtxWriter, LUS::ResourceType::Array);
|
||||
|
||||
vtxWriter.Write((uint32_t)ZResourceType::Vertex);
|
||||
vtxWriter.Write((uint32_t)arrCnt);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "Exporter.h"
|
||||
#include "VersionInfo.h"
|
||||
|
||||
void OTRExporter::WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, Ship::ResourceType resType, Ship::Version resVersion)
|
||||
void OTRExporter::WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, LUS::ResourceType resType, int32_t resVersion)
|
||||
{
|
||||
writer->Write((uint8_t)Endianness::Little); // 0x00
|
||||
writer->Write((uint8_t)0); // 0x01
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include "ZResource.h"
|
||||
#include "ZArray.h"
|
||||
#include "stdint.h"
|
||||
//#include "OTRExporter.h"
|
||||
#include <Utils/BinaryWriter.h>
|
||||
#include <libultraship/bridge.h>
|
||||
@@ -9,5 +10,5 @@
|
||||
class OTRExporter : public ZResourceExporter
|
||||
{
|
||||
protected:
|
||||
static void WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, Ship::ResourceType resType, Ship::Version resVersion = MAJOR_VERSION);
|
||||
static void WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, LUS::ResourceType resType, int32_t resVersion = 0);
|
||||
};
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "Main.h"
|
||||
#include "Exporter.h"
|
||||
#include "BackgroundExporter.h"
|
||||
#include "TextureExporter.h"
|
||||
#include "RoomExporter.h"
|
||||
@@ -17,7 +18,7 @@
|
||||
#include "MtxExporter.h"
|
||||
#include "AudioExporter.h"
|
||||
#include <Globals.h>
|
||||
#include <Utils/File.h>
|
||||
#include <Utils/DiskFile.h>
|
||||
#include <Utils/Directory.h>
|
||||
#include <Utils/MemoryStream.h>
|
||||
#include <Utils/BinaryWriter.h>
|
||||
@@ -25,7 +26,7 @@
|
||||
#include <mutex>
|
||||
|
||||
std::string otrFileName = "oot.otr";
|
||||
std::shared_ptr<Ship::Archive> otrArchive;
|
||||
std::shared_ptr<LUS::Archive> otrArchive;
|
||||
BinaryWriter* fileWriter;
|
||||
std::chrono::steady_clock::time_point fileStart, resStart;
|
||||
std::map<std::string, std::vector<char>> files;
|
||||
@@ -46,16 +47,16 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM
|
||||
|
||||
printf("BOTR: Generating OTR Archive...\n");
|
||||
|
||||
if (File::Exists(otrFileName))
|
||||
otrArchive = std::shared_ptr<Ship::Archive>(new Ship::Archive(otrFileName, true));
|
||||
if (DiskFile::Exists(otrFileName))
|
||||
otrArchive = std::shared_ptr<LUS::Archive>(new LUS::Archive(otrFileName, true));
|
||||
else
|
||||
otrArchive = Ship::Archive::CreateArchive(otrFileName, 40000);
|
||||
otrArchive = LUS::Archive::CreateArchive(otrFileName, 40000);
|
||||
|
||||
auto lst = Directory::ListFiles("Extract");
|
||||
|
||||
for (auto item : lst)
|
||||
{
|
||||
auto fileData = File::ReadAllBytes(item);
|
||||
auto fileData = DiskFile::ReadAllBytes(item);
|
||||
otrArchive->AddFile(StringHelper::Split(item, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
|
||||
}
|
||||
}
|
||||
@@ -63,35 +64,34 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM
|
||||
|
||||
static void ExporterProgramEnd()
|
||||
{
|
||||
uint32_t crc = 0xFFFFFFFF;
|
||||
const uint8_t endianness = (uint8_t)Endianness::Big;
|
||||
|
||||
if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory)
|
||||
{
|
||||
std::string romPath = Globals::Instance->baseRomPath.string();
|
||||
const std::vector<uint8_t>& romData = DiskFile::ReadAllBytes(romPath);
|
||||
crc = BitConverter::ToUInt32BE(romData, 0x10);
|
||||
printf("Creating version file...\n");
|
||||
|
||||
// Get crc from rom
|
||||
std::string romPath = Globals::Instance->baseRomPath.string();
|
||||
std::vector<uint8_t> romData = File::ReadAllBytes(romPath);
|
||||
uint32_t crc = BitConverter::ToUInt32BE(romData, 0x10);
|
||||
uint8_t endianness = (uint8_t)Endianness::Big;
|
||||
|
||||
// Write crc to version file
|
||||
fs::path versionPath("Extract/version");
|
||||
MemoryStream* versionStream = new MemoryStream();
|
||||
BinaryWriter writer(versionStream);
|
||||
writer.SetEndianness(Endianness::Big);
|
||||
writer.Write(endianness);
|
||||
writer.Write(crc);
|
||||
std::ofstream versionFile(versionPath.c_str(), std::ios::out | std::ios::binary);
|
||||
versionFile.write(versionStream->ToVector().data(), versionStream->GetLength());
|
||||
versionFile.flush();
|
||||
versionFile.close();
|
||||
writer.Close();
|
||||
MemoryStream *versionStream = new MemoryStream();
|
||||
BinaryWriter writer(versionStream);
|
||||
writer.SetEndianness(Endianness::Big);
|
||||
writer.Write(endianness);
|
||||
writer.Write(crc);
|
||||
writer.Close();
|
||||
|
||||
printf("Created version file.\n");
|
||||
|
||||
printf("Generating OTR Archive...\n");
|
||||
otrArchive = Ship::Archive::CreateArchive(otrFileName, 40000);
|
||||
otrArchive = LUS::Archive::CreateArchive(otrFileName, 40000);
|
||||
|
||||
for (auto item : files) {
|
||||
otrArchive->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength());
|
||||
|
||||
for (const auto& item : files)
|
||||
{
|
||||
std::string fName = item.first;
|
||||
if (fName.find("gTitleZeldaShieldLogoMQTex") != std::string::npos && !ZRom(romPath).IsMQ())
|
||||
{
|
||||
@@ -101,46 +101,76 @@ static void ExporterProgramEnd()
|
||||
fName.replace(pos, 27, "gTitleZeldaShieldLogoTex");
|
||||
}
|
||||
}
|
||||
auto fileData = item.second;
|
||||
const auto& fileData = item.second;
|
||||
otrArchive->AddFile(fName, (uintptr_t)fileData.data(),
|
||||
fileData.size());
|
||||
fileData.size());
|
||||
}
|
||||
|
||||
// Add any additional files that need to be manually copied...
|
||||
auto lst = Directory::ListFiles("Extract");
|
||||
|
||||
for (auto item : lst)
|
||||
{
|
||||
std::vector<std::string> splitPath = StringHelper::Split(item, ".");
|
||||
|
||||
if (splitPath.size() >= 3) {
|
||||
std::string extension = splitPath.at(splitPath.size() - 1);
|
||||
std::string format = splitPath.at(splitPath.size() - 2);
|
||||
splitPath.pop_back();
|
||||
splitPath.pop_back();
|
||||
std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string(""));
|
||||
if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) {
|
||||
Globals::Instance->buildRawTexture = true;
|
||||
Globals::Instance->BuildAssetTexture(item, ZTexture::GetTextureTypeFromString(format), afterPath);
|
||||
Globals::Instance->buildRawTexture = false;
|
||||
|
||||
auto fileData = File::ReadAllBytes(afterPath);
|
||||
printf("otrArchive->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str());
|
||||
otrArchive->AddFile(StringHelper::Split(afterPath, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
|
||||
}
|
||||
}
|
||||
|
||||
auto fileData = File::ReadAllBytes(item);
|
||||
printf("otrArchive->AddFile(%s)\n", StringHelper::Split(item, "Extract/")[1].c_str());
|
||||
otrArchive->AddFile(StringHelper::Split(item, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
|
||||
}
|
||||
|
||||
//otrArchive->AddFile("Audiobank", (uintptr_t)Globals::Instance->GetBaseromFile("Audiobank").data(), Globals::Instance->GetBaseromFile("Audiobank").size());
|
||||
//otrArchive->AddFile("Audioseq", (uintptr_t)Globals::Instance->GetBaseromFile("Audioseq").data(), Globals::Instance->GetBaseromFile("Audioseq").size());
|
||||
//otrArchive->AddFile("Audiotable", (uintptr_t)Globals::Instance->GetBaseromFile("Audiotable").data(), Globals::Instance->GetBaseromFile("Audiotable").size());
|
||||
}
|
||||
}
|
||||
otrArchive = nullptr;
|
||||
delete fileWriter;
|
||||
files.clear();
|
||||
|
||||
// Add any additional files that need to be manually copied...
|
||||
if (DiskFile::Exists("soh.otr")) {
|
||||
return;
|
||||
}
|
||||
const auto& lst = Directory::ListFiles("Extract");
|
||||
std::shared_ptr<LUS::Archive> sohOtr = LUS::Archive::CreateArchive("soh.otr", 4096);
|
||||
//sohOtr->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength());
|
||||
|
||||
for (const auto& item : lst)
|
||||
{
|
||||
std::vector<std::string> splitPath = StringHelper::Split(item, ".");
|
||||
|
||||
if (splitPath.size() >= 3)
|
||||
{
|
||||
const std::string extension = splitPath.at(splitPath.size() - 1);
|
||||
const std::string format = splitPath.at(splitPath.size() - 2);
|
||||
splitPath.pop_back();
|
||||
splitPath.pop_back();
|
||||
std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string(""));
|
||||
if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8"))
|
||||
{
|
||||
ZTexture tex(nullptr);
|
||||
Globals::Instance->buildRawTexture = true;
|
||||
tex.FromPNG(item, ZTexture::GetTextureTypeFromString(format));
|
||||
printf("sohOtr->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str());
|
||||
|
||||
OTRExporter_Texture exporter;
|
||||
|
||||
MemoryStream* stream = new MemoryStream();
|
||||
BinaryWriter writer(stream);
|
||||
|
||||
exporter.Save(&tex, "", &writer);
|
||||
|
||||
std::string src = tex.GetBodySourceCode();
|
||||
writer.Write((char *)src.c_str(), src.size());
|
||||
|
||||
std::vector<char> fileData = stream->ToVector();
|
||||
sohOtr->AddFile(StringHelper::Split(afterPath, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size());
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (item.find("accessibility") != std::string::npos)
|
||||
{
|
||||
std::string extension = splitPath.at(splitPath.size() - 1);
|
||||
splitPath.pop_back();
|
||||
if (extension == "json")
|
||||
{
|
||||
const auto &fileData = DiskFile::ReadAllBytes(item);
|
||||
printf("Adding accessibility texts %s\n", StringHelper::Split(item, "texts/")[1].c_str());
|
||||
sohOtr->AddFile(StringHelper::Split(item, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
const auto& fileData = DiskFile::ReadAllBytes(item);
|
||||
printf("sohOtr->AddFile(%s)\n", StringHelper::Split(item, "Extract/")[1].c_str());
|
||||
sohOtr->AddFile(StringHelper::Split(item, item.find("Extract/assets/") != std::string::npos ? "Extract/assets/" : "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
|
||||
}
|
||||
sohOtr = nullptr;
|
||||
}
|
||||
|
||||
static void ExporterParseArgs(int argc, char* argv[], int& i)
|
||||
{
|
||||
@@ -219,7 +249,7 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
|
||||
files[fName] = strem->ToVector();
|
||||
}
|
||||
else
|
||||
File::WriteAllBytes("Extract/" + fName, strem->ToVector());
|
||||
DiskFile::WriteAllBytes("Extract/" + fName, strem->ToVector());
|
||||
}
|
||||
|
||||
auto end = std::chrono::steady_clock::now();
|
||||
@@ -229,6 +259,11 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
|
||||
//printf("Exported Resource End %s in %zums\n", res->GetName().c_str(), diff);
|
||||
}
|
||||
|
||||
static void ExporterProcessCompilable(tinyxml2::XMLElement* reader)
|
||||
{
|
||||
std::string nodeName = reader->Name();
|
||||
}
|
||||
|
||||
static void ExporterXMLBegin()
|
||||
{
|
||||
}
|
||||
@@ -240,7 +275,7 @@ static void ExporterXMLEnd()
|
||||
void AddFile(std::string fName, std::vector<char> data)
|
||||
{
|
||||
if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
|
||||
File::WriteAllBytes("Extract/" + fName, data);
|
||||
DiskFile::WriteAllBytes("Extract/" + fName, data);
|
||||
else
|
||||
{
|
||||
std::unique_lock Lock(fileMutex);
|
||||
@@ -248,13 +283,14 @@ void AddFile(std::string fName, std::vector<char> data)
|
||||
}
|
||||
}
|
||||
|
||||
static void ImportExporters()
|
||||
void ImportExporters()
|
||||
{
|
||||
// In this example we set up a new exporter called "EXAMPLE".
|
||||
// By running ZAPD with the argument -se EXAMPLE, we tell it that we want to use this exporter for our resources.
|
||||
ExporterSet* exporterSet = new ExporterSet();
|
||||
exporterSet->processFileModeFunc = ExporterProcessFileMode;
|
||||
exporterSet->parseFileModeFunc = ExporterParseFileMode;
|
||||
exporterSet->processCompilableFunc = ExporterProcessCompilable;
|
||||
exporterSet->parseArgsFunc = ExporterParseArgs;
|
||||
exporterSet->beginFileFunc = ExporterFileBegin;
|
||||
exporterSet->endFileFunc = ExporterFileEnd;
|
||||
@@ -287,6 +323,3 @@ static void ImportExporters()
|
||||
|
||||
InitVersionInfo();
|
||||
}
|
||||
|
||||
// When ZAPD starts up, it will automatically call the below function, which in turn sets up our exporters.
|
||||
REGISTER_EXPORTER(ImportExporters);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
#include <libultraship/bridge.h>
|
||||
|
||||
extern std::shared_ptr<Ship::Archive> otrArchive;
|
||||
extern std::shared_ptr<LUS::Archive> otrArchive;
|
||||
extern std::map<std::string, std::vector<char>> files;
|
||||
|
||||
void AddFile(std::string fName, std::vector<char> data);
|
||||
@@ -4,7 +4,7 @@ void OTRExporter_MtxExporter::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
{
|
||||
ZMtx* mtx = (ZMtx*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::Matrix);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::Matrix);
|
||||
|
||||
for (size_t i = 0; i < 4; i++)
|
||||
for (size_t j = 0; j < 4; j++)
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Path::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
{
|
||||
ZPath* path = (ZPath*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Path);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Path);
|
||||
|
||||
writer->Write((uint32_t)path->pathways.size());
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_PlayerAnimationExporter::Save(ZResource* res, const fs::path& o
|
||||
{
|
||||
ZPlayerAnimationData* anim = (ZPlayerAnimationData*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_PlayerAnimation);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_PlayerAnimation);
|
||||
|
||||
auto start = std::chrono::steady_clock::now();
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "RoomExporter.h"
|
||||
#include "Utils/BinaryWriter.h"
|
||||
#include "Utils/MemoryStream.h"
|
||||
#include "Utils/File.h"
|
||||
#include <Utils/DiskFile.h>
|
||||
#include <ZRoom/Commands/SetMesh.h>
|
||||
#include <ZRoom/Commands/SetWind.h>
|
||||
#include <ZRoom/Commands/SetTimeSettings.h>
|
||||
@@ -39,7 +39,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
{
|
||||
ZRoom* room = (ZRoom*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Room);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Room);
|
||||
|
||||
writer->Write((uint32_t)room->commands.size());
|
||||
|
||||
@@ -80,10 +80,8 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
// This can cause issues if we export actors with garbage data, so let's trust the command size
|
||||
writer->Write((uint32_t)cmdSetActorList->numActors);
|
||||
|
||||
for (int i = 0; i < cmdSetActorList->numActors; i++)
|
||||
for (const auto& entry : cmdSetActorList->actorList->actors)
|
||||
{
|
||||
const ActorSpawnEntry& entry = cmdSetActorList->actors[i];
|
||||
|
||||
writer->Write(entry.actorNum);
|
||||
writer->Write(entry.posX);
|
||||
writer->Write(entry.posY);
|
||||
@@ -91,7 +89,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
writer->Write(entry.rotX);
|
||||
writer->Write(entry.rotY);
|
||||
writer->Write(entry.rotZ);
|
||||
writer->Write(entry.initVar);
|
||||
writer->Write(entry.params);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -393,7 +391,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
writer->Write(entry.rotX);
|
||||
writer->Write(entry.rotY);
|
||||
writer->Write(entry.rotZ);
|
||||
writer->Write(entry.initVar);
|
||||
writer->Write(entry.params);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -441,18 +439,18 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
case RoomCommand::SetCutscenes:
|
||||
{
|
||||
SetCutscenes* cmdSetCutscenes = (SetCutscenes*)cmd;
|
||||
|
||||
|
||||
std::string listName;
|
||||
Globals::Instance->GetSegmentedPtrName(cmdSetCutscenes->cmdArg2, room->parent, "CutsceneData", listName, res->parent->workerID);
|
||||
std::string fName = OTRExporter_DisplayList::GetPathToRes(room, listName);
|
||||
//std::string fName = StringHelper::Sprintf("%s\\%s", OTRExporter_DisplayList::GetParentFolderName(room).c_str(), listName.c_str());
|
||||
writer->Write(fName);
|
||||
|
||||
|
||||
MemoryStream* csStream = new MemoryStream();
|
||||
BinaryWriter csWriter = BinaryWriter(csStream);
|
||||
OTRExporter_Cutscene cs;
|
||||
cs.Save(cmdSetCutscenes->cutscenes[0], "", &csWriter);
|
||||
|
||||
|
||||
AddFile(fName, csStream->ToVector());
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -7,7 +7,7 @@ void OTRExporter_Skeleton::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
{
|
||||
ZSkeleton* skel = (ZSkeleton*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Skeleton);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Skeleton);
|
||||
|
||||
writer->Write((uint8_t)skel->type);
|
||||
writer->Write((uint8_t)skel->limbType);
|
||||
@@ -15,15 +15,15 @@ void OTRExporter_Skeleton::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write((uint32_t)skel->limbCount);
|
||||
writer->Write((uint32_t)skel->dListCount);
|
||||
|
||||
writer->Write((uint8_t)skel->limbsTable.limbType);
|
||||
writer->Write((uint32_t)skel->limbsTable.count);
|
||||
writer->Write((uint8_t)skel->limbsTable->limbType);
|
||||
writer->Write((uint32_t)skel->limbsTable->count);
|
||||
|
||||
for (size_t i = 0; i < skel->limbsTable.count; i++)
|
||||
for (size_t i = 0; i < skel->limbsTable->count; i++)
|
||||
{
|
||||
Declaration* skelDecl = skel->parent->GetDeclarationRanged(GETSEGOFFSET(skel->limbsTable.limbsAddresses[i]));
|
||||
Declaration* skelDecl = skel->parent->GetDeclarationRanged(GETSEGOFFSET(skel->limbsTable->limbsAddresses[i]));
|
||||
|
||||
std::string name;
|
||||
bool foundDecl = Globals::Instance->GetSegmentedPtrName(skel->limbsTable.limbsAddresses[i], skel->parent, "", name, res->parent->workerID);
|
||||
bool foundDecl = Globals::Instance->GetSegmentedPtrName(skel->limbsTable->limbsAddresses[i], skel->parent, "", name, res->parent->workerID);
|
||||
if (foundDecl)
|
||||
{
|
||||
if (name.at(0) == '&')
|
||||
|
||||
@@ -7,7 +7,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin
|
||||
{
|
||||
ZLimb* limb = (ZLimb*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_SkeletonLimb);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_SkeletonLimb);
|
||||
|
||||
writer->Write((uint8_t)limb->type);
|
||||
writer->Write((uint8_t)limb->skinSegmentType);
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Text::Save(ZResource* res, const fs::path& outPath, BinaryWrite
|
||||
{
|
||||
ZText* txt = (ZText*)res;
|
||||
|
||||
WriteHeader(txt, outPath, writer, Ship::ResourceType::SOH_Text);
|
||||
WriteHeader(txt, outPath, writer, LUS::ResourceType::SOH_Text);
|
||||
|
||||
writer->Write((uint32_t)txt->messages.size());
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ void OTRExporter_Texture::Save(ZResource* res, const fs::path& outPath, BinaryWr
|
||||
{
|
||||
ZTexture* tex = (ZTexture*)res;
|
||||
|
||||
WriteHeader(tex, outPath, writer, Ship::ResourceType::Texture);
|
||||
WriteHeader(tex, outPath, writer, LUS::ResourceType::Texture);
|
||||
|
||||
auto start = std::chrono::steady_clock::now();
|
||||
|
||||
@@ -17,9 +17,10 @@ void OTRExporter_Texture::Save(ZResource* res, const fs::path& outPath, BinaryWr
|
||||
|
||||
writer->Write((uint32_t)tex->GetRawDataSize());
|
||||
|
||||
auto data = tex->parent->GetRawData();
|
||||
|
||||
writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize());
|
||||
if (tex->parent != nullptr) {
|
||||
auto data = tex->parent->GetRawData();
|
||||
writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize());
|
||||
}
|
||||
|
||||
auto end = std::chrono::steady_clock::now();
|
||||
size_t diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
#include "VersionInfo.h"
|
||||
#include <libultraship/bridge.h>
|
||||
|
||||
std::map<Ship::ResourceType, uint32_t> resourceVersions;
|
||||
std::map<LUS::ResourceType, uint32_t> resourceVersions;
|
||||
|
||||
void InitVersionInfo()
|
||||
{
|
||||
resourceVersions = std::map<Ship::ResourceType, uint32_t> {
|
||||
{ Ship::ResourceType::SOH_Animation, 0 },
|
||||
{ Ship::ResourceType::Texture, 0 },
|
||||
{ Ship::ResourceType::SOH_PlayerAnimation, 0 },
|
||||
{ Ship::ResourceType::DisplayList, 0 },
|
||||
{ Ship::ResourceType::SOH_Room, 0 },
|
||||
{ Ship::ResourceType::SOH_CollisionHeader, 0 },
|
||||
{ Ship::ResourceType::SOH_Skeleton, 0 },
|
||||
{ Ship::ResourceType::SOH_SkeletonLimb, 0 },
|
||||
{ Ship::ResourceType::Matrix, 0 },
|
||||
{ Ship::ResourceType::SOH_Path, 0 },
|
||||
{ Ship::ResourceType::Vertex, 0 },
|
||||
{ Ship::ResourceType::SOH_Cutscene, 0 },
|
||||
{ Ship::ResourceType::Array, 0 },
|
||||
{ Ship::ResourceType::SOH_Text, 0 },
|
||||
{ Ship::ResourceType::Blob, 0 },
|
||||
resourceVersions = std::map<LUS::ResourceType, uint32_t> {
|
||||
{ LUS::ResourceType::SOH_Animation, 0 },
|
||||
{ LUS::ResourceType::Texture, 0 },
|
||||
{ LUS::ResourceType::SOH_PlayerAnimation, 0 },
|
||||
{ LUS::ResourceType::DisplayList, 0 },
|
||||
{ LUS::ResourceType::SOH_Room, 0 },
|
||||
{ LUS::ResourceType::SOH_CollisionHeader, 0 },
|
||||
{ LUS::ResourceType::SOH_Skeleton, 0 },
|
||||
{ LUS::ResourceType::SOH_SkeletonLimb, 0 },
|
||||
{ LUS::ResourceType::Matrix, 0 },
|
||||
{ LUS::ResourceType::SOH_Path, 0 },
|
||||
{ LUS::ResourceType::Vertex, 0 },
|
||||
{ LUS::ResourceType::SOH_Cutscene, 0 },
|
||||
{ LUS::ResourceType::Array, 0 },
|
||||
{ LUS::ResourceType::SOH_Text, 0 },
|
||||
{ LUS::ResourceType::Blob, 0 },
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4,6 +4,4 @@
|
||||
#include <vector>
|
||||
#include "src/resource/Resource.h"
|
||||
|
||||
#define MAJOR_VERSION Ship::Version::Deckard
|
||||
|
||||
extern std::map<Ship::ResourceType, uint32_t> resourceVersions;
|
||||
extern std::map<LUS::ResourceType, uint32_t> resourceVersions;
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
void OTRExporter_Vtx::SaveArr(ZResource* res, const fs::path& outPath, const std::vector<ZResource*>& vec, BinaryWriter* writer)
|
||||
{
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::Vertex);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::Vertex);
|
||||
|
||||
for (auto& res: vec) {
|
||||
ZVtx* vtx = (ZVtx*)res;
|
||||
@@ -27,7 +27,7 @@ void OTRExporter_Vtx::Save(ZResource* res, const fs::path& outPath, BinaryWriter
|
||||
{
|
||||
ZVtx* vtx = (ZVtx*)res;
|
||||
|
||||
WriteHeader(res, outPath, writer, Ship::ResourceType::Vertex);
|
||||
WriteHeader(res, outPath, writer, LUS::ResourceType::Vertex);
|
||||
|
||||
writer->Write((uint32_t)1); //Yes I'm hard coding it to one, it *should* be fine.
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"file1": "File 1",
|
||||
"file2": "File 2",
|
||||
"file3": "File 3",
|
||||
"options": "Options",
|
||||
"copy": "Copy",
|
||||
"erase": "Erase",
|
||||
"quit": "Quit",
|
||||
"confirm": "Yes",
|
||||
"audio_stereo": "Sound - Stereo",
|
||||
"audio_mono": "Sound - Mono",
|
||||
"audio_headset": "Sound - Headset",
|
||||
"audio_surround": "Sound - Surround",
|
||||
"target_switch": "Targetting Mode - Switch",
|
||||
"target_hold": "Targetting Mode - Hold"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"file1": "Fichier 1",
|
||||
"file2": "Fichier 2",
|
||||
"file3": "Fichier 3",
|
||||
"options": "Options",
|
||||
"copy": "Copier",
|
||||
"erase": "Effacer",
|
||||
"quit": "Retour",
|
||||
"confirm": "Oui",
|
||||
"audio_stereo": "Son - Stéréo",
|
||||
"audio_mono": "Son - Mono",
|
||||
"audio_headset": "Son - Casque",
|
||||
"audio_surround": "Son - Surround",
|
||||
"target_switch": "Visée - Fixe",
|
||||
"target_hold": "Visée - Maintenue"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"file1": "Datei 1",
|
||||
"file2": "Datei 2",
|
||||
"file3": "Datei 3",
|
||||
"options": "Optionen",
|
||||
"copy": "Kopieren",
|
||||
"erase": "Löschen",
|
||||
"quit": "Zurück",
|
||||
"confirm": "Ja",
|
||||
"audio_stereo": "Sound - Stereo",
|
||||
"audio_mono": "Sound - Mono",
|
||||
"audio_headset": "Sound - Kopfhörer",
|
||||
"audio_surround": "Sound - Surround",
|
||||
"target_switch": "Zielerfassung - Einmal drücken",
|
||||
"target_hold": "Zielerfassung - Trigger halten"
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
{
|
||||
"health": "health $0",
|
||||
"magic": "magic $0",
|
||||
"rupees": "rupees $0",
|
||||
"0": "Deku Stick $0",
|
||||
"1": "Deku Nut $0",
|
||||
"2": "Bomb $0",
|
||||
"3": "Fairy Bow $0",
|
||||
"4": "Fire Arrow",
|
||||
"5": "Din's Fire",
|
||||
"6": "Fairy Slingshot $0",
|
||||
"7": "Fairy Ocarina",
|
||||
"8": "Ocarina of Time",
|
||||
"9": "Bombchu $0",
|
||||
"10": "Hookshot",
|
||||
"11": "Longshot",
|
||||
"12": "Ice Arrow",
|
||||
"13": "Farore's Wind",
|
||||
"14": "Boomerang",
|
||||
"15": "Lens of Truth",
|
||||
"16": "Magic Beans $0",
|
||||
"17": "Megaton Hammer",
|
||||
"18": "Light Arrow",
|
||||
"19": "Nayru's Love",
|
||||
"20": "Empty Bottle",
|
||||
"21": "Red Potion",
|
||||
"22": "Green Potion",
|
||||
"23": "Blue Potion",
|
||||
"24": "Fairy",
|
||||
"25": "Fish",
|
||||
"26": "Milk Bottle",
|
||||
"27": "Ruto's Letter",
|
||||
"28": "Blue Fire",
|
||||
"29": "Bugs",
|
||||
"30": "Big Poe",
|
||||
"31": "Milk Bottle (Half)",
|
||||
"32": "Poe",
|
||||
"33": "Weird Egg",
|
||||
"34": "Chicken",
|
||||
"35": "Zelda's Letter",
|
||||
"36": "Keaton Mask",
|
||||
"37": "Skull Mask",
|
||||
"38": "Spooky Mask",
|
||||
"39": "Bunny Mask",
|
||||
"40": "Goron Mask",
|
||||
"41": "Zora Mask",
|
||||
"42": "Gerudo Mask",
|
||||
"43": "Mask of Truth",
|
||||
"44": "Sold Out",
|
||||
"45": "Pocket Egg",
|
||||
"46": "Pocket Cucco",
|
||||
"47": "Cojiro",
|
||||
"48": "Odd Mushroom",
|
||||
"49": "Odd Potion",
|
||||
"50": "Saw",
|
||||
"51": "Broken Sword",
|
||||
"52": "Prescription",
|
||||
"53": "Eyeball Frog",
|
||||
"54": "Eyedrops",
|
||||
"55": "Claim Check",
|
||||
"56": "Bow Fire Arrow",
|
||||
"57": "Bow Ice Arrow",
|
||||
"58": "Bow Light Arrow",
|
||||
"59": "Kokiri Sword",
|
||||
"60": "Master Sword",
|
||||
"61": "Giant's Knife",
|
||||
"62": "Deku Shield",
|
||||
"63": "Hylian Shield",
|
||||
"64": "Mirror Shield",
|
||||
"65": "Kokiri Tunic",
|
||||
"66": "Goron Tunic",
|
||||
"67": "Zora Tunic",
|
||||
"68": "Kokiri Boots",
|
||||
"69": "Iron Boots",
|
||||
"70": "Hover Boots",
|
||||
"71": "Bullet Bag (Holds 30)",
|
||||
"72": "Bullet Bag (Holds 40)",
|
||||
"73": "Bullet Bag (Holds 50)",
|
||||
"74": "Quiver (Holds 30)",
|
||||
"75": "Quiver (Holds 40)",
|
||||
"76": "Quiver (Holds 50)",
|
||||
"77": "Bomb Bag (Holds 20)",
|
||||
"78": "Bomb Bag (Holds 30)",
|
||||
"79": "Bomb Bag (Holds 40)",
|
||||
"80": "Goron's Bracelet",
|
||||
"81": "Silver Gauntlets",
|
||||
"82": "Golden Gauntlets",
|
||||
"83": "Silver Scale",
|
||||
"84": "Golden Scale",
|
||||
"85": "Giant's Knife (Broken)",
|
||||
"86": "WALLET ADULT",
|
||||
"87": "Giant's Wallet",
|
||||
"88": "Deku Seeds",
|
||||
"89": "Fishing Pole",
|
||||
"90": "Minuet of Forest",
|
||||
"91": "Bolero of Fire",
|
||||
"92": "Serenade of Water",
|
||||
"93": "Requiem of Spirit",
|
||||
"94": "Nocturne of Shadow",
|
||||
"95": "Prelude of Light",
|
||||
"96": "Zelda's Lullaby",
|
||||
"97": "Epona's Song",
|
||||
"98": "Saria's Song",
|
||||
"99": "Sun's Song",
|
||||
"100": "Song of Time",
|
||||
"101": "Song of Storms",
|
||||
"102": "Forest Medallion",
|
||||
"103": "Fire Medallion",
|
||||
"104": "Water Medallion",
|
||||
"105": "Spirit Medallion",
|
||||
"106": "Shadow Medallion",
|
||||
"107": "Light Medallion",
|
||||
"108": "Kokiri's Emerald",
|
||||
"109": "Goron's Ruby",
|
||||
"110": "Zora Sapphire",
|
||||
"111": "Stone of Agony",
|
||||
"112": "Gerudo's Card",
|
||||
"113": "Skulltula Token $0",
|
||||
"114": "Heart Container $0",
|
||||
"115": "Piece of Heart",
|
||||
"116": "Boss Key",
|
||||
"117": "Compass",
|
||||
"118": "Dungeon Map",
|
||||
"119": "Small Key",
|
||||
"120": "MAGIC SMALL",
|
||||
"121": "MAGIC LARGE",
|
||||
"122": "PIECE OF HEART 2",
|
||||
"123": "INVALID 1",
|
||||
"124": "INVALID 2",
|
||||
"125": "INVALID 3",
|
||||
"126": "INVALID 4",
|
||||
"127": "INVALID 5",
|
||||
"128": "INVALID 6",
|
||||
"129": "INVALID 7",
|
||||
"130": "Milk",
|
||||
"131": "Recovery Heart",
|
||||
"132": "Green Rupee",
|
||||
"133": "Blue Rupee",
|
||||
"134": "Red Rupee",
|
||||
"135": "Purple Rupee",
|
||||
"136": "Gold Rupee",
|
||||
"137": "INVALID 8",
|
||||
"138": "STICKS 5",
|
||||
"139": "STICKS 10",
|
||||
"140": "NUTS 5",
|
||||
"141": "NUTS 10",
|
||||
"142": "BOMBS 5",
|
||||
"143": "BOMBS 10",
|
||||
"144": "BOMBS 20",
|
||||
"145": "BOMBS 30",
|
||||
"146": "ARROWS SMALL",
|
||||
"147": "ARROWS MEDIUM",
|
||||
"148": "ARROWS LARGE",
|
||||
"149": "SEEDS 30",
|
||||
"150": "BOMBCHUS 5",
|
||||
"151": "BOMBCHUS 20",
|
||||
"152": "STICK UPGRADE 20",
|
||||
"153": "STICK UPGRADE 30",
|
||||
"154": "NUT UPGRADE 30",
|
||||
"155": "NUT UPGRADE 40",
|
||||
"255": "",
|
||||
"256": "Haunted Wasteland",
|
||||
"257": "Gerudos Fortress",
|
||||
"258": "Gerudo Valley",
|
||||
"259": "Hylia Lakeside",
|
||||
"260": "Lon Lon Ranch",
|
||||
"261": "Market",
|
||||
"262": "Hyrule Field",
|
||||
"263": "Death Mountain",
|
||||
"264": "Kakariko Village",
|
||||
"265": "Lost Woods",
|
||||
"266": "Kokiri Forest",
|
||||
"267": "Zoras Domain",
|
||||
"268": "",
|
||||
"269": "",
|
||||
"270": "",
|
||||
"271": "",
|
||||
"272": "",
|
||||
"273": "",
|
||||
"274": "",
|
||||
"275": "",
|
||||
"276": "",
|
||||
"277": "",
|
||||
"278": "",
|
||||
"279": "",
|
||||
"280": "",
|
||||
"281": "",
|
||||
"282": "",
|
||||
"283": "",
|
||||
"284": "",
|
||||
"285": "",
|
||||
"286": "",
|
||||
"287": "",
|
||||
"288": "",
|
||||
"289": "",
|
||||
"290": "",
|
||||
"291": "",
|
||||
"292": "Hyrule Field",
|
||||
"293": "Kakariko Village",
|
||||
"294": "Graveyard",
|
||||
"295": "Zoras River",
|
||||
"296": "Kokiri Forest",
|
||||
"297": "Sacred Forest Meadow",
|
||||
"298": "Lake Hylia",
|
||||
"299": "Zoras Domain",
|
||||
"300": "Zoras Fountain",
|
||||
"301": "Gerudo Valley",
|
||||
"302": "Lost Woods",
|
||||
"303": "Desert Colossus",
|
||||
"304": "Gerudo's Fortress",
|
||||
"305": "Haunted Wasteland",
|
||||
"306": "Market",
|
||||
"307": "Hyrule Castle",
|
||||
"308": "Death Mountain Trail",
|
||||
"309": "Death Mountain Crater",
|
||||
"310": "Goron City",
|
||||
"311": "Lon Lon Ranch",
|
||||
"312": "Question Mark",
|
||||
"313": "Ganon's Castle"
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
{
|
||||
"health": "vie $0",
|
||||
"magic": "magie $0",
|
||||
"rupees": "rubis $0",
|
||||
"0": "Bâton Mojo $0",
|
||||
"1": "Noix Mojo $0",
|
||||
"2": "Bombes $0",
|
||||
"3": "Arc des Fées $0",
|
||||
"4": "Flèche de Feu",
|
||||
"5": "Feu de Din",
|
||||
"6": "Lance-Pierre des Fées $0",
|
||||
"7": "Ocarina des Fées",
|
||||
"8": "Ocarina of Temps",
|
||||
"9": "Missiles Teigneux $0",
|
||||
"10": "Grappin",
|
||||
"11": "Super Grappin",
|
||||
"12": "Flèche de Glace",
|
||||
"13": "Vent de Farore",
|
||||
"14": "Boomerang",
|
||||
"15": "Monocle de Vérité",
|
||||
"16": "Haricot Magique $0",
|
||||
"17": "Masse des Titans",
|
||||
"18": "Flèche de Lumière",
|
||||
"19": "Amour de Nayru",
|
||||
"20": "Bouteille Vide",
|
||||
"21": "Potion Rouge",
|
||||
"22": "Potion Verte",
|
||||
"23": "Potion Bleue",
|
||||
"24": "Fée",
|
||||
"25": "Poisson",
|
||||
"26": "Lait de Lon Lon",
|
||||
"27": "Lettre de Ruto",
|
||||
"28": "Flammme Bleue",
|
||||
"29": "Insectes",
|
||||
"30": "Âme",
|
||||
"31": "Lait de Lon Lon (moitié)",
|
||||
"32": "Esprit",
|
||||
"33": "Oeuf Curieux",
|
||||
"34": "Poulet",
|
||||
"35": "Lettre de Zelda",
|
||||
"36": "Masque du Renard",
|
||||
"37": "Masque de Mort",
|
||||
"38": "Masque d'Effroi",
|
||||
"39": "Masque du Lapin",
|
||||
"40": "Masque de Goron",
|
||||
"41": "Masque de Zora",
|
||||
"42": "Masque de Gerudo",
|
||||
"43": "Masque de Vérité",
|
||||
"44": "VENDU",
|
||||
"45": "Oeuf de Poche",
|
||||
"46": "Cocotte de poche",
|
||||
"47": "P'tit Poulet",
|
||||
"48": "Champignon suspect",
|
||||
"49": "Mixture suspecte",
|
||||
"50": "Scie du chasseur",
|
||||
"51": "Épée de Goron (brisée)",
|
||||
"52": "Ordonnance",
|
||||
"53": "Crapaud-qui-louche",
|
||||
"54": "Gouttes",
|
||||
"55": "Certificat",
|
||||
"56": "Arc et Flèche de Feu",
|
||||
"57": "Arc et Flèche de Glace",
|
||||
"58": "Arc et Flèche de Lumière",
|
||||
"59": "Épée Kokiri",
|
||||
"60": "Épée de Légende",
|
||||
"61": "Lame des Géants",
|
||||
"62": "Bouclier Mojo",
|
||||
"63": "Bouclier Hylien",
|
||||
"64": "Bouclier Miroir",
|
||||
"65": "Tunique Kokiri",
|
||||
"66": "Tunique Goron",
|
||||
"67": "Tunique Zora",
|
||||
"68": "Bottes Kokiri",
|
||||
"69": "Bottes de plomb",
|
||||
"70": "Bottes des airs",
|
||||
"71": "Sac de graines (Contient 30)",
|
||||
"72": "Sac de graines (Contient 40)",
|
||||
"73": "Sac de graines (Contient 50)",
|
||||
"74": "Carquois (Contient 30)",
|
||||
"75": "Carquois (Contient 40)",
|
||||
"76": "Carquois (Contient 50)",
|
||||
"77": "Sac de bombes (Contient 20)",
|
||||
"78": "Sac de bombes (Contient 30)",
|
||||
"79": "Sac de bombes (Contient 40)",
|
||||
"80": "Bracelet Goron",
|
||||
"81": "Gantelets d'argent",
|
||||
"82": "Gentelets d'or",
|
||||
"83": "Écaille d'argent",
|
||||
"84": "Écaille d'or",
|
||||
"85": "Lame des Géants (Brisée)",
|
||||
"86": "GRANDE BOURSE",
|
||||
"87": "Bourse de Géant",
|
||||
"88": "Deku Seeds",
|
||||
"89": "Canne à pèche",
|
||||
"90": "Menuet des Bois",
|
||||
"91": "Boléro du Feu",
|
||||
"92": "Sérénade de l'Eau",
|
||||
"93": "Requiem des Esprits",
|
||||
"94": "Nocturne de l'Ombre",
|
||||
"95": "Prélude de la Lumière",
|
||||
"96": "Berceuse de Zelda",
|
||||
"97": "Chant d'Epona",
|
||||
"98": "Chant de Saria",
|
||||
"99": "Chant du Soleil",
|
||||
"100": "Chant du Temps",
|
||||
"101": "Chant des Tempêtes",
|
||||
"102": "Médaillon de la Forêt",
|
||||
"103": "Médaillon du Feu",
|
||||
"104": "Médaillon de l'Eau",
|
||||
"105": "Médaillon de l'Esprit",
|
||||
"106": "Médaillon de l'Ombre",
|
||||
"107": "Médaillon de la Lumière",
|
||||
"108": "Émeraude Kokiri",
|
||||
"109": "Rubis Goron",
|
||||
"110": "Saphir Zora",
|
||||
"111": "Pierre de Souffrance",
|
||||
"112": "Carte Gerudo",
|
||||
"113": "Skulltula d'or $0",
|
||||
"114": "Coeur d'Énergie $0",
|
||||
"115": "Quart de Coeur",
|
||||
"116": "Clé d'or",
|
||||
"117": "Boussole",
|
||||
"118": "Carte du Donjon",
|
||||
"119": "Petite Clé",
|
||||
"120": "PETITE BOUTEILLE DE MAGIE",
|
||||
"121": "GRANDE BOUTEILLE DE MAGIE",
|
||||
"122": "QUART DE COEUR 2",
|
||||
"123": "INVALIDE 1",
|
||||
"124": "INVALIDE 2",
|
||||
"125": "INVALIDE 3",
|
||||
"126": "INVALIDE 4",
|
||||
"127": "INVALIDE 5",
|
||||
"128": "INVALIDE 6",
|
||||
"129": "INVALIDE 7",
|
||||
"130": "Lait de Lon Lon",
|
||||
"131": "Coeur de Vie",
|
||||
"132": "Rubis Vert",
|
||||
"133": "Rubis Bleu",
|
||||
"134": "Rubis Rouge",
|
||||
"135": "Rubis Pourpre",
|
||||
"136": "Énorme Rubis",
|
||||
"137": "INVALIDE 8",
|
||||
"138": "BÂTON MOJO 5",
|
||||
"139": "BÂTON MOJO 10",
|
||||
"140": "NOIX MOJO 5",
|
||||
"141": "NOIX MOJO 10",
|
||||
"142": "BOMBES 5",
|
||||
"143": "BOMBES 10",
|
||||
"144": "BOMBES 20",
|
||||
"145": "BOMBES 30",
|
||||
"146": "ARROWS SMALL",
|
||||
"147": "ARROWS MEDIUM",
|
||||
"148": "ARROWS LARGE",
|
||||
"149": "GRAINES MOJO 30",
|
||||
"150": "MISSILES TEIGNEUX 5",
|
||||
"151": "MISSILES TEIGNEUX 20",
|
||||
"152": "AMÉLIORATION BÂTON MOJO 20",
|
||||
"153": "AMÉLIORATION BÂTON MOJO 30",
|
||||
"154": "AMÉLIORATION NOIX MOJO 30",
|
||||
"155": "AMÉLIORATION NOIX MOJO 40",
|
||||
"255": "",
|
||||
"256": "Désert Hanté",
|
||||
"257": "Forteresse Gerudo",
|
||||
"258": "Vallée Gerudo",
|
||||
"259": "Laboratoire du Lac",
|
||||
"260": "Ranch Lon Lon",
|
||||
"261": "Place du Marché",
|
||||
"262": "Plaine d'Hyrule",
|
||||
"263": "Montagne du Péril",
|
||||
"264": "Village Cocorico",
|
||||
"265": "Bois Perdus",
|
||||
"266": "Forêt Kokiri",
|
||||
"267": "Domaine Zora",
|
||||
"268": "",
|
||||
"269": "",
|
||||
"270": "",
|
||||
"271": "",
|
||||
"272": "",
|
||||
"273": "",
|
||||
"274": "",
|
||||
"275": "",
|
||||
"276": "",
|
||||
"277": "",
|
||||
"278": "",
|
||||
"279": "",
|
||||
"280": "",
|
||||
"281": "",
|
||||
"282": "",
|
||||
"283": "",
|
||||
"284": "",
|
||||
"285": "",
|
||||
"286": "",
|
||||
"287": "",
|
||||
"288": "",
|
||||
"289": "",
|
||||
"290": "",
|
||||
"291": "",
|
||||
"292": "Plaine d'Hyrule",
|
||||
"293": "Village Cocorico",
|
||||
"294": "Cimetière",
|
||||
"295": "Rivière Zora",
|
||||
"296": "Forêt Kokiri",
|
||||
"297": "Bosquet Sacré",
|
||||
"298": "Lac Hylia",
|
||||
"299": "Domaine Zora",
|
||||
"300": "Fountaine Zora",
|
||||
"301": "Vallée Gerudo",
|
||||
"302": "Bois Perdus",
|
||||
"303": "Colosse du Désert",
|
||||
"304": "Forteresse Gerudo",
|
||||
"305": "Désert Hanté",
|
||||
"306": "Place du Marché",
|
||||
"307": "Château d'Hyrule",
|
||||
"308": "Chemin du Péril",
|
||||
"309": "Cratère du Péril",
|
||||
"310": "Village Goron",
|
||||
"311": "Ranch Lon Lon",
|
||||
"312": "Point d'interrogation",
|
||||
"313": "Château de Ganon"
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
{
|
||||
"health": "Energie $0",
|
||||
"magic": "Magie $0",
|
||||
"rupees": "Rubine $0",
|
||||
"0": "Deku-Stab $0",
|
||||
"1": "Deku-Nuß $0",
|
||||
"2": "Bombe $0",
|
||||
"3": "Feen-Bogen $0",
|
||||
"4": "Feuer-Pfeil",
|
||||
"5": "Dins Feuerinferno",
|
||||
"6": "Feen-Schleuder $0",
|
||||
"7": "Feen-Okarina",
|
||||
"8": "Okarina der Zeit",
|
||||
"9": "Krabbelmine $0",
|
||||
"10": "Fanghaken",
|
||||
"11": "Enterhaken",
|
||||
"12": "Eis-Pfeil",
|
||||
"13": "Farores Donnersturm",
|
||||
"14": "Bumerang",
|
||||
"15": "Auge der Wahrheit",
|
||||
"16": "Wundererbsen $0",
|
||||
"17": "Stahlhammer",
|
||||
"18": "Licht-Pfeil",
|
||||
"19": "Nayrus Umarmung",
|
||||
"20": "Flasche",
|
||||
"21": "Rotes Elixier",
|
||||
"22": "Grünes Elixier",
|
||||
"23": "Blaues Elixier",
|
||||
"24": "Fee",
|
||||
"25": "Fisch",
|
||||
"26": "Milch",
|
||||
"27": "Brief",
|
||||
"28": "Blaues Feuer",
|
||||
"29": "Käfer",
|
||||
"30": "Nachtschwärmer",
|
||||
"31": "Milch (1/2)",
|
||||
"32": "Irrlicht",
|
||||
"33": "Seltsames Ei",
|
||||
"34": "Huhn",
|
||||
"35": "Zeldas Brief",
|
||||
"36": "Fuchs-Maske",
|
||||
"37": "Schädel-Maske",
|
||||
"38": "Geister-Maske",
|
||||
"39": "Hasenohren",
|
||||
"40": "Goronen-Maske",
|
||||
"41": "Zora-Maske",
|
||||
"42": "Gerudo-Maske",
|
||||
"43": "Maske des Wissens",
|
||||
"44": "Verkauft",
|
||||
"45": "Ei",
|
||||
"46": "Kiki",
|
||||
"47": "Henni",
|
||||
"48": "Schimmelpilz",
|
||||
"49": "Modertrank",
|
||||
"50": "Säge",
|
||||
"51": "Goronen-Schwert (zerbrochen)",
|
||||
"52": "Rezept",
|
||||
"53": "Glotzfrosch",
|
||||
"54": "Augentropfen",
|
||||
"55": "Zertifikat",
|
||||
"56": "Bogen Feuer-Pfeil",
|
||||
"57": "Bogen Eis-Pfeil",
|
||||
"58": "Bogen Licht-Pfeil",
|
||||
"59": "Kokiri-Schwert",
|
||||
"60": "Master-Schwert",
|
||||
"61": "Langschwert",
|
||||
"62": "Deku-schild",
|
||||
"63": "Hylia-Schild",
|
||||
"64": "Spiegel-Schild",
|
||||
"65": "Kokiri-Rüstung",
|
||||
"66": "Goronen-Rüstung",
|
||||
"67": "Zora-Rüstung",
|
||||
"68": "Lederstiefel",
|
||||
"69": "Eisenstiefel",
|
||||
"70": "Gleitstiefel",
|
||||
"71": "Munitionstasche (30)",
|
||||
"72": "Munitionstasche (40)",
|
||||
"73": "Munitionstasche (50)",
|
||||
"74": "Köcher (30)",
|
||||
"75": "Köcher (40)",
|
||||
"76": "Köcher (50)",
|
||||
"77": "Bombentasche (20)",
|
||||
"78": "Bombentasche (30)",
|
||||
"79": "Bombentasche (40)",
|
||||
"80": "Goronen-Armband",
|
||||
"81": "Krafthandschuh",
|
||||
"82": "Titanhandschuh",
|
||||
"83": "Silberschuppe",
|
||||
"84": "Goldschuppe",
|
||||
"85": "Langschwert (gebrochen)",
|
||||
"86": "Große Börse",
|
||||
"87": "Riesenbörse",
|
||||
"88": "Deku-Kerne",
|
||||
"89": "Angel",
|
||||
"90": "Menuett des Waldes",
|
||||
"91": "Bolero des Feuers",
|
||||
"92": "Serenade des Wassers",
|
||||
"93": "Requiem der Geister",
|
||||
"94": "Nocturne des Schattens",
|
||||
"95": "Kantate des Lichts",
|
||||
"96": "Zeldas Wiegenlied",
|
||||
"97": "Eponas Lied",
|
||||
"98": "Salias Lied",
|
||||
"99": "Hymne der Sonne",
|
||||
"100": "Hymne der Zeit",
|
||||
"101": "Song of Storms",
|
||||
"102": "Amulett des Waldes",
|
||||
"103": "Amulett des Feuers",
|
||||
"104": "Amulett des Wassers",
|
||||
"105": "Amulett der Geister",
|
||||
"106": "Amulett des Schattens",
|
||||
"107": "Amulett des Lichts",
|
||||
"108": "Kokiri-Smaragd",
|
||||
"109": "Goronen-Opal",
|
||||
"110": "Zora-Saphir",
|
||||
"111": "Stein des Wissens",
|
||||
"112": "Gerudo-Paß",
|
||||
"113": "Skulltula-Symbol $0",
|
||||
"114": "Herzcontainer $0",
|
||||
"115": "Herzteil",
|
||||
"116": "Master-Schlüssel",
|
||||
"117": "Kompaß",
|
||||
"118": "Labyrinth-Karte",
|
||||
"119": "Kleiner Schlüssel",
|
||||
"120": "MAGIE KLEIN",
|
||||
"121": "MAGIE GROß",
|
||||
"122": "HERZTEIL 2",
|
||||
"123": "UNGÜLTIG 1",
|
||||
"124": "UNGÜLTIG 2",
|
||||
"125": "UNGÜLTIG 3",
|
||||
"126": "UNGÜLTIG 4",
|
||||
"127": "UNGÜLTIG 5",
|
||||
"128": "UNGÜLTIG 6",
|
||||
"129": "UNGÜLTIG 7",
|
||||
"130": "Milch",
|
||||
"131": "Herz",
|
||||
"132": "ein Rubin",
|
||||
"133": "5 Rubine",
|
||||
"134": "20 Rubine",
|
||||
"135": "50 Rubine",
|
||||
"136": "200 Rubine",
|
||||
"137": "UNGÜLTIG 8",
|
||||
"138": "STÄBE 5",
|
||||
"139": "STÄBE 10",
|
||||
"140": "NÜSSE 5",
|
||||
"141": "NÜSSE 10",
|
||||
"142": "BOMBEN 5",
|
||||
"143": "BOMBEN 10",
|
||||
"144": "BOMBEN 20",
|
||||
"145": "BOMBEN 30",
|
||||
"146": "PFEILE KLEIN",
|
||||
"147": "PFEILE MITTEL",
|
||||
"148": "PFEILE GROß",
|
||||
"149": "KERNE 30",
|
||||
"150": "KRABBELMINEN 5",
|
||||
"151": "KRABBELMINEN 20",
|
||||
"152": "STAB UPGRADE 20",
|
||||
"153": "STAB UPGRADE 30",
|
||||
"154": "NUß UPGRADE 30",
|
||||
"155": "NUß UPGRADE 40",
|
||||
"255": "",
|
||||
"256": "Gespensterwüste",
|
||||
"257": "Gerudo-Festung",
|
||||
"258": "Gerudotal",
|
||||
"259": "Hylia-See",
|
||||
"260": "Lon Lon-Farm",
|
||||
"261": "Marktplatz",
|
||||
"262": "Hylianische Steppe",
|
||||
"263": "Todesberg",
|
||||
"264": "Kakariko",
|
||||
"265": "Verlorene Wälder",
|
||||
"266": "Kokiri-Wald",
|
||||
"267": "Zoras Reich",
|
||||
"268": "",
|
||||
"269": "",
|
||||
"270": "",
|
||||
"271": "",
|
||||
"272": "",
|
||||
"273": "",
|
||||
"274": "",
|
||||
"275": "",
|
||||
"276": "",
|
||||
"277": "",
|
||||
"278": "",
|
||||
"279": "",
|
||||
"280": "",
|
||||
"281": "",
|
||||
"282": "",
|
||||
"283": "",
|
||||
"284": "",
|
||||
"285": "",
|
||||
"286": "",
|
||||
"287": "",
|
||||
"288": "",
|
||||
"289": "",
|
||||
"290": "",
|
||||
"291": "",
|
||||
"292": "Hylianische Steppe",
|
||||
"293": "Kakariko",
|
||||
"294": "Friedhof",
|
||||
"295": "Zora-Fluss",
|
||||
"296": "Kokiri-Wald",
|
||||
"297": "Heilige Lichtung",
|
||||
"298": "Hylia-See",
|
||||
"299": "Zoras Reich",
|
||||
"300": "Zoras Quelle",
|
||||
"301": "Gerudotal",
|
||||
"302": "Verlorene Wälder",
|
||||
"303": "Wüstenkoloss",
|
||||
"304": "Gerudo-Festung",
|
||||
"305": "Gespensterwüste",
|
||||
"306": "Marktplatz",
|
||||
"307": "Schloß Hyrule",
|
||||
"308": "Pfad zum Todesberg",
|
||||
"309": "Todeskrater",
|
||||
"310": "Goronia",
|
||||
"311": "Lon Lon-Farm",
|
||||
"312": "Fragezeichen",
|
||||
"313": "Teufelsturm"
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"minutes_plural" : "$0 minutes",
|
||||
"minutes_singular" : "$0 minute",
|
||||
"seconds_plural" : "$0 seconds",
|
||||
"seconds_singular" : "$0 second",
|
||||
"input_button_a": "the A button",
|
||||
"input_button_b": "the B button",
|
||||
"input_button_c": "the C button",
|
||||
"input_button_l": "the L button",
|
||||
"input_button_r": "the R button",
|
||||
"input_button_z": "the Z button",
|
||||
"input_button_c_up": "C Up",
|
||||
"input_button_c_down": "C Down",
|
||||
"input_button_c_left": "C Left",
|
||||
"input_button_c_right": "C Right",
|
||||
"input_analog_stick": "the Analog Stick",
|
||||
"input_d_pad": "the D-Pad"
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"minutes_plural" : "$0 minutes",
|
||||
"minutes_singular" : "$0 minute",
|
||||
"seconds_plural" : "$0 secondes",
|
||||
"seconds_singular" : "$0 seconde",
|
||||
"input_button_a": "le bouton A",
|
||||
"input_button_b": "le bouton B",
|
||||
"input_button_c": "le bouton C",
|
||||
"input_button_l": "le bouton L",
|
||||
"input_button_r": "le bouton R",
|
||||
"input_button_z": "le bouton Z",
|
||||
"input_button_c_up": "C Haut",
|
||||
"input_button_c_down": "C Bas",
|
||||
"input_button_c_left": "C Gauche",
|
||||
"input_button_c_right": "C Droit",
|
||||
"input_analog_stick": "le Stick Analogique",
|
||||
"input_d_pad": "D-Pad"
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"minutes_plural" : "$0 Minuten",
|
||||
"minutes_singular" : "eine Minute",
|
||||
"seconds_plural" : "$0 Sekunden",
|
||||
"seconds_singular" : "eine Sekunde",
|
||||
"input_button_a": "den A-Knopf",
|
||||
"input_button_b": "den B-Knopf",
|
||||
"input_button_c": "den C-Knopf",
|
||||
"input_button_l": "den L-Knopf",
|
||||
"input_button_r": "den R-Knopf",
|
||||
"input_button_z": "den Z-Knopf",
|
||||
"input_button_c_up": "C Oben",
|
||||
"input_button_c_down": "C Unten",
|
||||
"input_button_c_left": "C Links",
|
||||
"input_button_c_right": "C Rechts",
|
||||
"input_analog_stick": "den Analog-Stick",
|
||||
"input_d_pad": "das Steuerkreuz"
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"0": "Inside the Deku Tree",
|
||||
"1": "Dodongo's Cavern",
|
||||
"2": "Inside Jabu-Jabu's Belly",
|
||||
"3": "Forest Temple",
|
||||
"4": "Fire Temple",
|
||||
"5": "Water Temple",
|
||||
"6": "Spirit Temple",
|
||||
"7": "Shadow Temple",
|
||||
"8": "Bottom of The Well",
|
||||
"9": "Ice Cavern",
|
||||
"10": "", // Stairs to Ganondorf's Lair (No title card)
|
||||
"11": "Gerudo Training Ground",
|
||||
"12": "Thieves' Hideout",
|
||||
"13": "Ganon's Castle",
|
||||
"14": "", // Escape from Ganon's Castle (No title card)
|
||||
"15": "", // Escape from Ganon's Castle 5 (No title card)x
|
||||
"16": "Treasure Box Shop",
|
||||
"17": "Parasitic Armored Arachnid - Gohma",
|
||||
"18": "Infernal Dinosaur - King Dodongo",
|
||||
"19": "Bio-electric Anemone - Barinade",
|
||||
"20": "Evil Spirit from Beyond - Phantom Ganon",
|
||||
"21": "Subterranean Lava Dragon - Volvagia",
|
||||
"22": "Giant Aquatic Amoeba - Morpha",
|
||||
"23": "Sorceress Sisters - Twinrova",
|
||||
"24": "Phantom Shadow Beast - Bongo Bongo",
|
||||
"25": "Great King of Evil - Ganondorf",
|
||||
"26": "",
|
||||
"27": "", // Entrance to Market (No title card)
|
||||
"28": "",
|
||||
"29": "",
|
||||
"30": "Back Alley",
|
||||
"31": "Back Alley",
|
||||
"32": "Market",
|
||||
"33": "Market",
|
||||
"34": "Market",
|
||||
"35": "", // Temple of Time Exterior (No title card)
|
||||
"36": "SCENE_SHRINE_N",
|
||||
"37": "SCENE_SHRINE_R",
|
||||
"38": "", // House of the Know-it-All Brothers (No title card)
|
||||
"39": "", // House of Twins (No title card)
|
||||
"40": "", // House of the Great Mido (No title card)
|
||||
"41": "", // Saria's House (No title card)
|
||||
"42": "", // Kakariko House 1 (No title card)
|
||||
"43": "", // Back Alley House 1 (No title card)
|
||||
"44": "Bazaar",
|
||||
"45": "Kokiri Shop",
|
||||
"46": "Goron Shop",
|
||||
"47": "Zora Shop",
|
||||
"48": "", // Closed Shop (No title card)
|
||||
"49": "Potion Shop",
|
||||
"50": "", // Bombchu Shop (No title card)
|
||||
"51": "Happy Mask Shop",
|
||||
"52": "", // Link's House (No title card)
|
||||
"53": "", // Dog Lady's House (No title card)
|
||||
"54": "Stable",
|
||||
"55": "", // Impa's House (No title card)
|
||||
"56": "Lakeside Laboratory",
|
||||
"57": "", // Running Man's Tent (No title card)
|
||||
"58": "Gravekeepers Hut",
|
||||
"59": "Great Fairy's Fountain",
|
||||
"60": "Fairy's Fountain",
|
||||
"61": "Great Fairy's Fountain",
|
||||
"62": "", // Grottos (No title card)
|
||||
"63": "", // Tomb 1 (No title card)
|
||||
"64": "", // Tomb 2 (No title card)
|
||||
"65": "Royal Family's Tomb",
|
||||
"66": "Shooting Gallery",
|
||||
"67": "Temple of Time",
|
||||
"68": "Chamber of The Sages",
|
||||
"69": "Castle Courtyard",
|
||||
"70": "Castle Courtyard",
|
||||
"71": "", // Goddesses Cutscene (No title card)
|
||||
"72": "Unknown Place",
|
||||
"73": "Fishing Pond",
|
||||
"74": "Castle Courtyard",
|
||||
"75": "Bombchu Bowling Alley",
|
||||
"76": "", // Lon Lon Ranch House/Silo (No title card)
|
||||
"77": "", // Guard House (No title card)
|
||||
"78": "", // Potion Shop (No title card)
|
||||
"79": "Ganon",
|
||||
"80": "House of Skulltula",
|
||||
"81": "Hyrule Field",
|
||||
"82": "Kakariko Village",
|
||||
"83": "Graveyard",
|
||||
"84": "Zora's River",
|
||||
"85": "Kokiri Forest",
|
||||
"86": "Sacred Forest Meadow",
|
||||
"87": "Lake Hylia",
|
||||
"88": "Zoras Domain",
|
||||
"89": "Zoras Fountain",
|
||||
"90": "Gerudo Valley",
|
||||
"91": "Lost Woods",
|
||||
"92": "Desert Colossus",
|
||||
"93": "Gerudo's Fortress",
|
||||
"94": "Haunted Wasteland",
|
||||
"95": "Hyrule Castle",
|
||||
"96": "Death Mountain Trail",
|
||||
"97": "Death Mountain Crater",
|
||||
"98": "Goron City",
|
||||
"99": "Lon Lon Ranch",
|
||||
"100": "",
|
||||
"101": "", // Debug: Test Map (No title card)
|
||||
"102": "", // Debug: Test Room (No title card)
|
||||
"103": "", // Debug: Depth Test (No title card)
|
||||
"104": "", // Debug: Stalfos Miniboss Room (No title card)
|
||||
"105": "", // Debug: Stalfos Boss Room (No title card)
|
||||
"106": "", // Debug: Dark Link Room (No title card)
|
||||
"107": "",
|
||||
"108": "", // Debug: SRD Room (No title card)
|
||||
"109": "" // Debug: Treasure Chest Warp (No title card)
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"0": "Abre Mojo",
|
||||
"1": "Caverne Dodongo",
|
||||
"2": "Ventre de Jabu-Jabu",
|
||||
"3": "Temple de la Forêt",
|
||||
"4": "Temple du Feu",
|
||||
"5": "Temple de l'Eau",
|
||||
"6": "Temple de l'Esprit",
|
||||
"7": "Temple de l'Ombre",
|
||||
"8": "Puits",
|
||||
"9": "Caverne Polaire",
|
||||
"10": "", // Escaliers vers le Repaire de Ganondorf (No title card)
|
||||
"11": "Gymnase Gerudo",
|
||||
"12": "Repaire des Voleurs",
|
||||
"13": "Tour de Ganon",
|
||||
"14": "", // Fuite du Château de Ganon (No title card)
|
||||
"15": "", // Fuite du Château de Ganon 5 (No title card)
|
||||
"16": "Chasse aux Trésors",
|
||||
"17": "Monstre Insectoide Géant - Gohma",
|
||||
"18": "Dinosaure Infernal - King Dodongo",
|
||||
"19": "Anémone Bio-Electrique - Barinade",
|
||||
"20": "Esprit Maléfique de l'Au-Delà - Ganon Spectral",
|
||||
"21": "Dragon des Profondeurs - Volcania",
|
||||
"22": "Amibe Aquatique Géante - Morpha",
|
||||
"23": "Sorcières Jumelles - Duo Maléfique",
|
||||
"24": "Monstre de l'Ombre - Bongo Bongo",
|
||||
"25": "Seigneur du Malin - Ganondorf",
|
||||
"26": "",
|
||||
"27": "", // Entrée vers le Marché (No title card)
|
||||
"28": "",
|
||||
"29": "",
|
||||
"30": "Ruelle",
|
||||
"31": "Ruelle",
|
||||
"32": "Place du Marché",
|
||||
"33": "Place du Marché",
|
||||
"34": "Place du Marché",
|
||||
"35": "", // Extérieur du Temple du Temps (No title card)
|
||||
"36": "SCENE_SHRINE_N",
|
||||
"37": "SCENE_SHRINE_R",
|
||||
"38": "", // Cabane des Frères Je-Sais-Tout (No title card)
|
||||
"39": "", // Cabane des Jumelles (No title card)
|
||||
"40": "", // Cabane du Grand Mido (No title card)
|
||||
"41": "", // Cabane de Saria (No title card)
|
||||
"42": "", // Maison du Village Cocorico 1 (No title card)
|
||||
"43": "", // Maison de la Ruelle 1 (No title card)
|
||||
"44": "Bazar",
|
||||
"45": "Boutique Kokiri",
|
||||
"46": "Boutique Goron",
|
||||
"47": "Boutique Zora",
|
||||
"48": "", // Magasin Fermé (No title card)
|
||||
"49": "Apothicaire",
|
||||
"50": "", // Magasin de Missiles (No title card)
|
||||
"51": "Foire aux Masques",
|
||||
"52": "", // Cabane de Link (No title card)
|
||||
"53": "", // Dog Lady's House (No title card)
|
||||
"54": "Étable",
|
||||
"55": "", // Maison d'Impa (No title card)
|
||||
"56": "Laboratoire du Lac",
|
||||
"57": "", // Tente du Marathonien (No title card)
|
||||
"58": "Cabane du fossoyeur",
|
||||
"59": "Fountaine Royale des Fées",
|
||||
"60": "Fountaine des Fées",
|
||||
"61": "Fountaine Royale des Fées",
|
||||
"62": "", // Grottes (No title card)
|
||||
"63": "", // Tombe 1 (No title card)
|
||||
"64": "", // Tombe 2 (No title card)
|
||||
"65": "Tombe Royale",
|
||||
"66": "Jeu d'adresse",
|
||||
"67": "Temple du Temps",
|
||||
"68": "Sanctuaire des Sages",
|
||||
"69": "Cour du Château",
|
||||
"70": "Cour du Château",
|
||||
"71": "", // Goddesses Cutscene (No title card)
|
||||
"72": "Endroit Inconnu",
|
||||
"73": "Étang",
|
||||
"74": "Cour du Château",
|
||||
"75": "Bowling Teigneux",
|
||||
"76": "", // Lon Lon Ranch House/Silo (No title card)
|
||||
"77": "", // Guard House (No title card)
|
||||
"78": "", // Potion Shop (No title card)
|
||||
"79": "Ganon",
|
||||
"80": "Maison des Araignées",
|
||||
"81": "Plaine d'Hyrule",
|
||||
"82": "Village Cocorico",
|
||||
"83": "Cimetière",
|
||||
"84": "Fleuve Zora",
|
||||
"85": "Forêt Kokiri",
|
||||
"86": "Bosquet Sacré",
|
||||
"87": "Lac Hylia",
|
||||
"88": "Domaine Zora",
|
||||
"89": "Fontaine Zora",
|
||||
"90": "Vallée Gerudo",
|
||||
"91": "Bois Perdu",
|
||||
"92": "Colosse du Désert",
|
||||
"93": "Forteresse Gerudo",
|
||||
"94": "Désert Hanté",
|
||||
"95": "Château d'Hyrule",
|
||||
"96": "Chemin du Péril",
|
||||
"97": "Cratère du Péril",
|
||||
"98": "Village Goron",
|
||||
"99": "Ranch Lon Lon",
|
||||
"100": "",
|
||||
"101": "", // Debug: Test Map (No title card)
|
||||
"102": "", // Debug: Test Room (No title card)
|
||||
"103": "", // Debug: Depth Test (No title card)
|
||||
"104": "", // Debug: Stalfos Miniboss Room (No title card)
|
||||
"105": "", // Debug: Stalfos Boss Room (No title card)
|
||||
"106": "", // Debug: Dark Link Room (No title card)
|
||||
"107": "",
|
||||
"108": "", // Debug: SRD Room (No title card)
|
||||
"109": "" // Debug: Treasure Chest Warp (No title card)
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"0": "Im Deku-Baum",
|
||||
"1": "Dodongos Höhle",
|
||||
"2": "Jabu-Jabus Bauch",
|
||||
"3": "Waldtempel",
|
||||
"4": "Feuertempel",
|
||||
"5": "Wassertempel",
|
||||
"6": "Geistertempel",
|
||||
"7": "Schattentempel",
|
||||
"8": "Grund des Brunnens",
|
||||
"9": "Eishöhle",
|
||||
"10": "", // Treppe zu Ganondorfs Verließ (Keine Title-Card)
|
||||
"11": "Gerudo-Arena",
|
||||
"12": "Diebesversteck",
|
||||
"13": "Ganons Schloß",
|
||||
"14": "", // Flucht aus Ganons Schloß (Keine Title-Card)
|
||||
"15": "", // Flucht aus Ganons Schloß 5 (Keine Title-Card)
|
||||
"16": "Truhenlotterie",
|
||||
"17": "Gepanzerter Spinnenparasit - Gohma",
|
||||
"18": "Infernosaurus - King Dodongo",
|
||||
"19": "Elektroterristrisches Biotentakel - Barinade",
|
||||
"20": "Reitendes Unheil - Phantom-Ganon",
|
||||
"21": "Subterraner Lavadrachoid - Volvagia",
|
||||
"22": "Aquamöbes Wassertentakel - Morpha",
|
||||
"23": "Höllische Hexenarmada - Killa Ohmaz",
|
||||
"24": "Bestialische Schattenmonstrosität - Bongo Bongo",
|
||||
"25": "Großmeister des Bösen - Ganondorf",
|
||||
"26": "",
|
||||
"27": "", // Eingang zum Marktplatz (Keine Title-Card)
|
||||
"28": "",
|
||||
"29": "",
|
||||
"30": "Seitenstraße",
|
||||
"31": "Seitenstraße",
|
||||
"32": "Marktplatz",
|
||||
"33": "Marktplatz",
|
||||
"34": "Marktplatz",
|
||||
"35": "", // Vor der Zitadelle der Zeit (Keine Title-Card)
|
||||
"36": "SCENE_SHRINE_N",
|
||||
"37": "SCENE_SHRINE_R",
|
||||
"38": "", // Haus der Allwissenden Brüder (Keine Title-Card)
|
||||
"39": "", // Haus der Zwillinge (Keine Title-Card)
|
||||
"40": "", // Midos Haus (Keine Title-Card)
|
||||
"41": "", // Salias Haus (Keine Title-Card)
|
||||
"42": "", // Kakariko Haus 1 (Keine Title-Card)
|
||||
"43": "", // Steinstraßen Haus 1 (Keine Title-Card)
|
||||
"44": "Basar",
|
||||
"45": "Kokiri-Laden",
|
||||
"46": "Goronen-Laden",
|
||||
"47": "Zora-Laden",
|
||||
"48": "", // Geschlossener Laden (Keine Title-Card)
|
||||
"49": "Magie-Laden",
|
||||
"50": "", // Krabbelminen-Laden (Keine Title-Card)
|
||||
"51": "Maskenhändler",
|
||||
"52": "", // Links Haus (Keine Title-Card)
|
||||
"53": "", // Haus der Hunde-Dame (Keine Title-Card)
|
||||
"54": "Stall",
|
||||
"55": "", // Impas Haus (Keine Title-Card)
|
||||
"56": "Hylia-See Laboratorium",
|
||||
"57": "", // Zelt des Rennläufers (Keine Title-Card)
|
||||
"58": "Hütte des Totengräbers",
|
||||
"59": "Feen-Quelle",
|
||||
"60": "Feen-Brunnen",
|
||||
"61": "Feen-Quelle",
|
||||
"62": "", // Grotten (Keine Title-Card)
|
||||
"63": "", // Grab 1 (Keine Title-Card)
|
||||
"64": "", // Grab 2 (Keine Title-Card)
|
||||
"65": "Königsgrab",
|
||||
"66": "Schießbude",
|
||||
"67": "Zitadelle der Zeit",
|
||||
"68": "Halle der Weisen",
|
||||
"69": "Burghof",
|
||||
"70": "Burghof",
|
||||
"71": "", // Göttinnen Cutscene (Keine Title-Card)
|
||||
"72": "Unbekannter Ort",
|
||||
"73": "Fischweiher",
|
||||
"74": "Burghof",
|
||||
"75": "Minenbowlingbahn",
|
||||
"76": "", // Lon Lon-Farm Haus/Silo (Keine Title-Card)
|
||||
"77": "", // Wachposten (Keine Title-Card)
|
||||
"78": "", // Magie-Laden (Keine Title-Card)
|
||||
"79": "Ganon",
|
||||
"80": "Skulltulas Haus",
|
||||
"81": "Hylianische Steppe",
|
||||
"82": "Kakariko",
|
||||
"83": "Friedhof",
|
||||
"84": "Zora-Fluß",
|
||||
"85": "Kokiri-Wald",
|
||||
"86": "Waldlichtung",
|
||||
"87": "Hylia-See",
|
||||
"88": "Zoras Reich",
|
||||
"89": "Zoras Quelle",
|
||||
"90": "Gerudotal",
|
||||
"91": "Verlorene Wälder",
|
||||
"92": "Wüstenkoloss",
|
||||
"93": "Gerudo-Festung",
|
||||
"94": "Geisterwüste",
|
||||
"95": "Schloß Hyrule",
|
||||
"96": "Pfad zum Todesberg",
|
||||
"97": "Todeskrater",
|
||||
"98": "Goronia",
|
||||
"99": "Lon Lon-Farm",
|
||||
"100": "",
|
||||
"101": "", // Debug: Test Karte (Keine Title-Card)
|
||||
"102": "", // Debug: Test Raum (Keine Title-Card)
|
||||
"103": "", // Debug: Tiefen Test (Keine Title-Card)
|
||||
"104": "", // Debug: Stalfos-Ritter Miniboss Raum (Keine Title-Card)
|
||||
"105": "", // Debug: Stalfos-Ritter Boss Raum (Keine Title-Card)
|
||||
"106": "", // Debug: Schwarzer Link Raum (Keine Title-Card)
|
||||
"107": "",
|
||||
"108": "", // Debug: SRD Raum (Keine Title-Card)
|
||||
"109": "" // Debug: Schatzkisten Teleport (Keine Title-Card)
|
||||
}
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 355 B After Width: | Height: | Size: 355 B |
|
Before Width: | Height: | Size: 379 B After Width: | Height: | Size: 379 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@@ -0,0 +1,21 @@
|
||||
<DisplayList Version="0">
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_0"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_1"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_2"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_3"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001"/>
|
||||
<PipeSync/>
|
||||
<SetGeometryMode G_LIGHTING="1" />
|
||||
<ClearGeometryMode G_TEXTURE_GEN="1" />
|
||||
<SetCombineLERP A0="G_CCMUX_0" B0="G_CCMUX_0" C0="G_CCMUX_0" D0="G_CCMUX_SHADE" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_ENVIRONMENT" A1="G_CCMUX_0" B1="G_CCMUX_0" C1="G_CCMUX_0" D1="G_CCMUX_SHADE" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_ENVIRONMENT"/>
|
||||
<Texture S="65535" T="65535" Level="0" Tile="0" On="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,241 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="13" V02="12"/>
|
||||
<Triangle1 V00="11" V01="14" V02="13"/>
|
||||
<Triangle1 V00="11" V01="15" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="7" V01="10" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="8"/>
|
||||
<Triangle1 V00="10" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="7" V01="10" V02="8"/>
|
||||
<Triangle1 V00="11" V01="8" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="48" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="4" V01="7" V02="8"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="62" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="78" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="7" V01="8" V02="5"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="94" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="110" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="9" V01="10" V02="7"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="11" V01="13" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="124" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="140" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="1" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="5" V02="3"/>
|
||||
<Triangle1 V00="7" V01="6" V02="3"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="6" V01="9" V02="5"/>
|
||||
<Triangle1 V00="5" V01="9" V02="10"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="10" V01="12" V02="5"/>
|
||||
<Triangle1 V00="5" V01="12" V02="13"/>
|
||||
<Triangle1 V00="4" V01="5" V02="13"/>
|
||||
<Triangle1 V00="13" V01="14" V02="4"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="155" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="171" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="0" V01="5" V02="4"/>
|
||||
<Triangle1 V00="0" V01="6" V02="5"/>
|
||||
<Triangle1 V00="4" V01="7" V02="3"/>
|
||||
<Triangle1 V00="8" V01="7" V02="4"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="9" V02="8"/>
|
||||
<Triangle1 V00="8" V01="11" V02="10"/>
|
||||
<Triangle1 V00="8" V01="12" V02="11"/>
|
||||
<Triangle1 V00="10" V01="13" V02="9"/>
|
||||
<Triangle1 V00="14" V01="13" V02="10"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="187" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="2" V01="4" V02="3"/>
|
||||
<Triangle1 V00="0" V01="5" V02="1"/>
|
||||
<Triangle1 V00="6" V01="5" V02="0"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="11" V02="8"/>
|
||||
<Triangle1 V00="12" V01="13" V02="11"/>
|
||||
<Triangle1 V00="14" V01="13" V02="12"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="203" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="0" V01="4" V02="3"/>
|
||||
<Triangle1 V00="0" V01="5" V02="4"/>
|
||||
<Triangle1 V00="5" V01="6" V02="4"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="9" V02="6"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="12" V01="13" V02="10"/>
|
||||
<Triangle1 V00="13" V01="14" V02="10"/>
|
||||
<Triangle1 V00="15" V01="14" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="219" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="3" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="233" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="249" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="265" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="9" V01="11" V02="12"/>
|
||||
<Triangle1 V00="9" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="15" V02="7"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="281" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="8" V02="6"/>
|
||||
<Triangle1 V00="10" V01="9" V02="6"/>
|
||||
<Triangle1 V00="10" V01="11" V02="9"/>
|
||||
<Triangle1 V00="9" V01="12" V02="8"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="297" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="5" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="7" V02="6"/>
|
||||
<Triangle1 V00="6" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="11" V01="13" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="311" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="7" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="10" V02="12"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="12" V01="8" V02="13"/>
|
||||
<Triangle1 V00="12" V01="6" V02="8"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="325" Count="8"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="0" V01="7" V02="6"/>
|
||||
<Triangle1 V00="0" V01="2" V02="7"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="7" V01="8" V02="5"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="6" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="8" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="12" V02="13"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="2" V01="4" V02="3"/>
|
||||
<Triangle1 V00="2" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="8" V01="9" V02="6"/>
|
||||
<Triangle1 V00="9" V01="10" V02="6"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="10" V01="12" V02="13"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="0" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="7" V01="10" V02="9"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="11" V02="13"/>
|
||||
<Triangle1 V00="15" V01="14" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="80" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="2" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="1" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="5" V02="7"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="8" V02="9"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="10" V01="12" V02="13"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,259 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<Triangle1 V00="13" V01="10" V02="14"/>
|
||||
<Triangle1 V00="15" V01="14" V02="10"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="4" V01="3" V02="2"/>
|
||||
<Triangle1 V00="4" V01="2" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="5" V01="8" V02="7"/>
|
||||
<Triangle1 V00="8" V01="5" V02="9"/>
|
||||
<Triangle1 V00="5" V01="10" V02="9"/>
|
||||
<Triangle1 V00="5" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="8" V02="9"/>
|
||||
<Triangle1 V00="12" V01="9" V02="13"/>
|
||||
<Triangle1 V00="14" V01="12" V02="13"/>
|
||||
<Triangle1 V00="13" V01="15" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="2" V02="4"/>
|
||||
<Triangle1 V00="4" V01="2" V02="5"/>
|
||||
<Triangle1 V00="5" V01="2" V02="6"/>
|
||||
<Triangle1 V00="2" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="11" V01="5" V02="6"/>
|
||||
<Triangle1 V00="11" V01="6" V02="12"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="0" V02="4"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="4" V01="6" V02="5"/>
|
||||
<Triangle1 V00="3" V01="5" V02="7"/>
|
||||
<Triangle1 V00="3" V01="7" V02="8"/>
|
||||
<Triangle1 V00="8" V01="9" V02="3"/>
|
||||
<Triangle1 V00="10" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="8" V02="11"/>
|
||||
<Triangle1 V00="12" V01="9" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="9"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="12" V01="15" V02="14"/>
|
||||
<Triangle1 V00="14" V01="1" V02="13"/>
|
||||
<Triangle1 V00="14" V01="2" V02="1"/>
|
||||
<Triangle1 V00="13" V01="1" V02="3"/>
|
||||
<Triangle1 V00="13" V01="3" V02="9"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="3" V01="2" V02="4"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="3" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="10" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="80" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="7" V01="6" V02="3"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="11" V01="10" V02="9"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="11" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="96" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="0"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="110" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="6" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="6" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="15" V01="12" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="126" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="7" V01="6" V02="5"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="7" V02="9"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="10" V02="12"/>
|
||||
<Triangle1 V00="13" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="142" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="0" V02="3"/>
|
||||
<Triangle1 V00="1" V01="3" V02="4"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="4" V01="6" V02="1"/>
|
||||
<Triangle1 V00="6" V01="7" V02="1"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="158" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="4"/>
|
||||
<Triangle1 V00="7" V01="4" V02="8"/>
|
||||
<Triangle1 V00="9" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="7"/>
|
||||
<Triangle1 V00="10" V01="9" V02="11"/>
|
||||
<Triangle1 V00="12" V01="10" V02="11"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="11" V02="14"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="174" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="3" V02="5"/>
|
||||
<Triangle1 V00="7" V01="6" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="11" V01="10" V02="9"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="11" V01="14" V02="13"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="190" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="4" V01="6" V02="5"/>
|
||||
<Triangle1 V00="4" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="13" V01="12" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="206" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="3" V02="2"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="4"/>
|
||||
<Triangle1 V00="7" V01="8" V02="5"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="7" V02="10"/>
|
||||
<Triangle1 V00="11" V01="9" V02="10"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="222" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="5" V01="4" V02="3"/>
|
||||
<Triangle1 V00="5" V01="3" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="9" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="8" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="11" V01="13" V02="14"/>
|
||||
<Triangle1 V00="11" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="238" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="6" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="252" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="4" V01="3" V02="2"/>
|
||||
<Triangle1 V00="2" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="7" V02="10"/>
|
||||
<Triangle1 V00="7" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="15" V01="12" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="268" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="3" V02="2"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="11"/>
|
||||
<Triangle1 V00="8" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="8" V02="12"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="284" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="6" V01="7" V02="3"/>
|
||||
<Triangle1 V00="8" V01="3" V02="7"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="7" V01="10" V02="9"/>
|
||||
<Triangle1 V00="10" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="10" V02="13"/>
|
||||
<Triangle1 V00="14" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="300" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="9" V02="6"/>
|
||||
<Triangle1 V00="11" V01="10" V02="6"/>
|
||||
<Triangle1 V00="11" V01="6" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="6"/>
|
||||
<Triangle1 V00="13" V01="6" V02="8"/>
|
||||
<Triangle1 V00="10" V01="14" V02="9"/>
|
||||
<Triangle1 V00="9" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="316" Count="5"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="0" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="12"/>
|
||||
<Triangle1 V00="8" V01="12" V02="13"/>
|
||||
<Triangle1 V00="6" V01="8" V02="13"/>
|
||||
<Triangle1 V00="6" V01="13" V02="14"/>
|
||||
<Triangle1 V00="1" V01="6" V02="14"/>
|
||||
<Triangle1 V00="1" V01="3" V02="6"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="15" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="9" V01="8" V02="10"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="10" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="31" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="1"/>
|
||||
<Triangle1 V00="4" V01="6" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="7" V01="10" V02="11"/>
|
||||
<Triangle1 V00="7" V01="11" V02="12"/>
|
||||
<Triangle1 V00="5" V01="7" V02="12"/>
|
||||
<Triangle1 V00="5" V01="12" V02="13"/>
|
||||
<Triangle1 V00="2" V01="5" V02="13"/>
|
||||
<Triangle1 V00="2" V01="1" V02="5"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="45" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="3" V01="5" V02="6"/>
|
||||
<Triangle1 V00="3" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="1" V02="3"/>
|
||||
<Triangle1 V00="7" V01="8" V02="1"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="10" V02="13"/>
|
||||
<Triangle1 V00="14" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="61" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="5" V02="0"/>
|
||||
<Triangle1 V00="6" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="11" V02="8"/>
|
||||
<Triangle1 V00="12" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="75" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="3" V01="6" V02="8"/>
|
||||
<Triangle1 V00="3" V01="8" V02="1"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="9"/>
|
||||
<Triangle1 V00="13" V01="14" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="90" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="9"/>
|
||||
<Triangle1 V00="13" V01="14" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="105" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="3" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="3" V02="6"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="1" V01="3" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="10" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="121" Count="5"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,335 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="0" Y="-5" Z="11" S="391" T="-468" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="-6" Z="13" S="391" T="-447" R="162" G="39" B="76" A="255"/>
|
||||
<Vtx X="0" Y="-6" Z="13" S="408" T="-447" R="94" G="39" B="76" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="120" T="-327" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="1" Y="0" Z="-21" S="171" T="-251" R="185" G="93" B="49" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-27" S="181" T="-327" R="175" G="50" B="84" A="255"/>
|
||||
<Vtx X="-2" Y="0" Z="-21" S="130" T="-251" R="71" G="93" B="49" A="255"/>
|
||||
<Vtx X="2" Y="0" Z="-20" S="185" T="-228" R="188" G="87" B="63" A="255"/>
|
||||
<Vtx X="-3" Y="0" Z="-20" S="116" T="-228" R="68" G="87" B="63" A="255"/>
|
||||
<Vtx X="-5" Y="-1" Z="-17" S="83" T="-191" R="88" G="79" B="46" A="255"/>
|
||||
<Vtx X="5" Y="-1" Z="-17" S="218" T="-191" R="168" G="79" B="46" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="-11" S="70" T="-103" R="92" G="87" B="7" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="-11" S="231" T="-103" R="164" G="87" B="7" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="151" T="35" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="139" T="48" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="70" T="94" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="1" S="151" T="60" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="139" T="48" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="70" T="94" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="3" S="231" T="94" R="181" G="78" B="190" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="0" S="162" T="48" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="-11" S="231" T="-103" R="164" G="87" B="7" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="151" T="35" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="-6" Z="13" S="65" T="-396" R="162" G="39" B="76" A="255"/>
|
||||
<Vtx X="0" Y="-8" Z="12" S="48" T="-424" R="114" G="12" B="55" A="255"/>
|
||||
<Vtx X="0" Y="-6" Z="13" S="49" T="-396" R="94" G="39" B="76" A="255"/>
|
||||
<Vtx X="-1" Y="-8" Z="12" S="65" T="-424" R="142" G="12" B="55" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="49" T="-483" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="-1" Y="-12" Z="14" S="65" T="-483" R="173" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-34" T="-437" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-55" T="-468" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="3" Z="11" S="-55" T="-437" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-34" T="-437" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="12" S="-34" T="-468" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-55" T="-468" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="2" Z="12" S="20" T="-447" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="6" Y="3" Z="11" S="-1" T="-478" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-1" T="-447" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="6" Y="2" Z="12" S="20" T="-478" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="-12" Z="14" S="-372" T="-427" R="173" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="-13" Z="13" S="-389" T="-438" R="84" G="161" B="250" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="-389" T="-427" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="-1" Y="-13" Z="13" S="-372" T="-438" R="172" G="161" B="250" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="-389" T="-468" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="-1" Y="2" Z="12" S="221" T="-475" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="11" S="200" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="12" S="221" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="3" Z="11" S="200" T="-476" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="3" Z="11" S="186" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-6" Y="2" Z="12" S="165" T="-476" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="165" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-6" Y="3" Z="11" S="186" T="-475" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="-8" Z="12" S="212" T="-395" R="142" G="12" B="55" A="255"/>
|
||||
<Vtx X="-1" Y="-6" Z="13" S="221" T="-422" R="162" G="39" B="76" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="206" T="-444" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="186" T="-357" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="-1" Y="-12" Z="14" S="221" T="-333" R="173" G="232" B="94" A="255"/>
|
||||
<Vtx X="-1" Y="-13" Z="13" S="207" T="-327" R="172" G="161" B="250" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="20" T="-494" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="28" T="-447" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="28" T="-494" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="20" T="-447" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="1" Y="4" Z="0" S="427" T="389" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="415" T="495" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="0" S="427" T="495" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="415" T="377" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="-343" T="-272" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="-330" T="-71" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="-330" T="-272" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-343" T="-71" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="-132" T="-270" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="1" Y="5" Z="0" S="-144" T="-69" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="-132" T="-69" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="0" S="-144" T="-270" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-431" T="-469" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="1" Y="28" Z="0" S="-441" T="-456" R="68" G="149" B="0" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-431" T="-456" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-1" S="-441" T="-469" R="0" G="149" B="188" A="255"/>
|
||||
<Vtx X="-1" Y="28" Z="0" S="-431" T="-469" R="188" G="149" B="0" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-421" T="-456" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-421" T="-469" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-1" S="-431" T="-456" R="0" G="149" B="188" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-5" T="-177" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-2" T="-148" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-2" T="-178" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-5" T="-148" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-2" T="-105" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-5" T="-104" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-2" T="-96" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-5" T="-96" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="2" Y="28" Z="0" S="35" T="-483" R="107" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="-3" S="48" T="-447" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="2" Y="29" Z="0" S="48" T="-483" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-3" S="35" T="-447" R="0" G="188" B="149" A="255"/>
|
||||
<Vtx X="2" Y="28" Z="0" S="-330" T="-475" R="107" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="3" S="-344" T="-439" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="3" S="-330" T="-438" R="0" G="188" B="107" A="255"/>
|
||||
<Vtx X="2" Y="29" Z="0" S="-344" T="-475" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="-3" Y="29" Z="0" S="200" T="-444" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-3" S="186" T="-481" R="0" G="188" B="149" A="255"/>
|
||||
<Vtx X="-3" Y="28" Z="0" S="186" T="-444" R="149" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="-3" S="200" T="-481" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="3" S="165" T="-445" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="-3" Y="28" Z="0" S="152" T="-481" R="149" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="3" S="152" T="-444" R="0" G="188" B="107" A="255"/>
|
||||
<Vtx X="-3" Y="29" Z="0" S="165" T="-481" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-2" T="-14" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="31" Z="0" S="-5" T="-43" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="-1" Y="29" Z="0" S="-5" T="-14" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-2" T="-43" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-2" T="-43" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="34" Z="0" S="-5" T="-87" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="-1" Y="31" Z="0" S="-5" T="-43" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-2" T="-87" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="35" Z="0" S="-5" T="-96" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-2" T="-96" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="-1" Y="29" Z="0" S="-2" T="68" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-5" T="39" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-5" T="68" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="31" Z="0" S="-2" T="39" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-5" T="-5" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="-1" Y="34" Z="0" S="-2" T="-5" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-5" T="-14" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="-1" Y="35" Z="0" S="-2" T="-14" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-1" T="-221" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-4" T="-251" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-4" T="-222" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-1" T="-251" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="-1" Y="35" Z="0" S="-350" T="-271" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-345" T="-266" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-345" T="-271" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-350" T="-266" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-1" T="-251" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-4" T="-260" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-4" T="-251" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-1" T="-260" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="0" S="434" T="-341" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="445" T="-447" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="0" S="434" T="-447" R="73" G="183" B="74" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="445" T="-329" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="391" T="-393" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="379" T="-287" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="0" S="391" T="-287" R="183" G="74" B="73" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="379" T="-405" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="371" T="-287" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="371" T="-405" R="0" G="127" B="0" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="379" T="-524" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="1" Y="21" Z="0" S="391" T="-418" R="87" G="61" B="69" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="0" S="391" T="-524" R="73" G="74" B="73" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="371" T="-524" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="363" T="-464" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-2" S="363" T="-524" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-2" S="363" T="-405" R="0" G="97" B="82" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="363" T="-346" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-2" S="363" T="-287" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="-55" T="-437" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="-31" T="-331" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-31" T="-437" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="0" S="-55" T="-331" R="183" G="74" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="427" T="389" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="439" T="495" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="439" T="377" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="427" T="495" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="-461" T="-495" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="0" S="-473" T="-427" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="-461" T="-427" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="1" Y="4" Z="0" S="-473" T="-496" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="281" T="-423" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="293" T="-492" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="281" T="-491" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="293" T="-423" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="1" Y="4" Z="0" S="-29" T="-262" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="1" S="-17" T="-331" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="0" S="-29" T="-331" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="1" S="-17" T="-263" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="5" Z="0" S="-29" T="-250" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="0" S="-132" T="-251" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="0" S="-132" T="-262" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="1" S="-17" T="-251" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="0" S="-29" T="-50" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="1" S="-17" T="-50" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="21" Z="0" S="-29" T="-25" R="87" G="61" B="69" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="0" S="-132" T="-25" R="73" G="74" B="73" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="0" S="-132" T="-50" R="73" G="183" B="74" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="1" S="-17" T="-26" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-29" T="50" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-17" T="50" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-29" T="58" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-17" T="50" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-29" T="50" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-75" T="58" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-75" T="50" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-17" T="57" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="28" Z="0" S="-29" T="68" R="68" G="149" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="1" S="-17" T="68" R="0" G="149" B="68" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="1" S="-5" T="0" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="-17" T="68" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="1" S="-5" T="68" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="-17" T="0" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="1" S="-5" T="-12" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="-17" T="-12" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="1" S="-5" T="-213" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-17" T="-213" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="1" S="-5" T="-238" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-17" T="-213" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="1" S="-5" T="-213" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="-17" T="-238" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-17" T="-313" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-5" T="-313" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-17" T="-321" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-5" T="-321" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="1" S="-5" T="-331" R="0" G="149" B="68" A="255"/>
|
||||
<Vtx X="-1" Y="28" Z="0" S="-17" T="-331" R="188" G="149" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-436" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-2" S="-431" T="-427" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="-407" T="-427" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="-407" T="-444" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-444" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="-407" T="-456" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="-407" T="-456" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="0" S="-431" T="-456" R="183" G="74" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-444" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="-431" T="-456" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-2" S="-455" T="-456" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="-455" T="-448" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="-431" T="-439" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="-455" T="-439" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="0" S="-431" T="-427" R="73" G="183" B="74" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="0" S="-455" T="-427" R="73" G="74" B="73" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="-418" T="-468" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="0" S="-407" T="-456" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="-407" T="-468" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="0" S="-418" T="-456" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="1" Y="5" Z="0" S="457" T="-341" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="445" T="-447" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="445" T="-329" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="0" S="457" T="-447" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="0" S="-133" T="-291" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="-144" T="-303" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="0" S="-144" T="-291" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="-133" T="-303" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="450" T="389" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="439" T="495" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="0" S="450" T="495" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="439" T="377" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="434" T="-341" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="422" T="-447" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="422" T="-329" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="0" S="434" T="-447" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="-125" T="-521" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="0" S="-113" T="-415" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="-113" T="-521" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="0" S="-125" T="-415" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-15" T="-417" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="1" Y="21" Z="0" S="-3" T="-492" R="87" G="61" B="69" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="-15" T="-493" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-3" T="-417" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="-27" T="-492" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-15" T="-417" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="-15" T="-492" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-27" T="-417" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-137" T="-282" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-144" T="-270" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-137" T="-270" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-282" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-137" T="-282" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-291" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-282" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-137" T="-291" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-348" T="-474" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-360" T="-427" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-348" T="-427" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-360" T="-486" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="408" T="-468" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="415" T="-456" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="415" T="-468" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="408" T="-456" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="408" T="-447" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="415" T="-447" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-372" T="-474" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-360" T="-427" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-372" T="-474" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="-372" T="-427" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-360" T="-427" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-156" T="-378" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-144" T="-425" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="-156" T="-425" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-144" T="-366" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-136" T="-425" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-136" T="-366" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-307" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-156" T="-354" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-156" T="-307" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-136" T="-307" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="-13" Z="13" S="173" T="-444" R="84" G="161" B="250" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="151" T="-415" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="186" T="-438" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="-8" Z="12" S="177" T="-376" R="114" G="12" B="55" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="186" T="-438" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="151" T="-415" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="171" T="-327" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="-6" Z="13" S="186" T="-349" R="94" G="39" B="76" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-2" S="495" T="-143" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="471" T="-143" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="495" T="-83" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="487" T="-78" R="11" G="222" B="134" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-2" S="471" T="-24" R="0" G="31" B="133" A="255"/>
|
||||
<Vtx X="-4" Y="21" Z="-2" S="488" T="31" R="243" G="222" B="134" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="471" T="94" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="495" T="35" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-2" S="495" T="94" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="450" T="436" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="450" T="495" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="458" T="495" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="458" T="436" R="0" G="51" B="140" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="450" T="377" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="458" T="377" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="-1" Y="28" Z="0" S="269" T="-389" R="188" G="149" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="3" S="253" T="-423" R="0" G="188" B="107" A="255"/>
|
||||
<Vtx X="-3" Y="28" Z="0" S="253" T="-373" R="149" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="1" S="269" T="-407" R="0" G="149" B="68" A="255"/>
|
||||
<Vtx X="1" Y="28" Z="0" S="285" T="-407" R="68" G="149" B="0" A="255"/>
|
||||
<Vtx X="2" Y="28" Z="0" S="302" T="-423" R="107" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-1" S="285" T="-389" R="0" G="149" B="188" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-3" S="302" T="-373" R="0" G="188" B="149" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="26" T="-419" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="2" Y="29" Z="0" S="-1" T="-396" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="-3" S="48" T="-396" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="22" T="-419" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="3" S="-1" T="-447" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="22" T="-424" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="29" Z="0" S="26" T="-424" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="-3" Y="29" Z="0" S="48" T="-447" R="152" G="73" B="0" A="255"/>
|
||||
</Vertex>
|
||||
@@ -0,0 +1,98 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="3" Y="34" Z="-1" S="302" T="-467" R="72" G="84" B="194" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="293" T="-423" R="64" G="160" B="202" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="302" T="-423" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="293" T="-467" R="64" G="96" B="202" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-128" T="-469" R="64" G="96" B="202" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-135" T="-425" R="23" G="154" B="183" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-128" T="-425" R="64" G="160" B="202" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-135" T="-469" R="23" G="102" B="183" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="0" S="-147" T="-425" R="234" G="160" B="176" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="0" S="-147" T="-469" R="234" G="96" B="176" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="0" S="-156" T="-425" R="59" G="186" B="168" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="0" S="-156" T="-469" R="59" G="70" B="168" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="112" T="-416" R="183" G="171" B="61" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="104" T="-460" R="193" G="96" B="54" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="104" T="-416" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="112" T="-460" R="183" G="85" B="61" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="260" T="-423" R="226" G="175" B="94" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="253" T="-467" R="183" G="85" B="61" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="253" T="-423" R="183" G="171" B="61" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="260" T="-467" R="226" G="81" B="94" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="1" S="271" T="-423" R="25" G="172" B="92" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="1" S="271" T="-467" R="25" G="84" B="92" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="1" S="281" T="-423" R="84" G="178" B="56" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="1" S="281" T="-467" R="84" G="78" B="56" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="1" S="-401" T="-471" R="84" G="78" B="56" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="0" S="-389" T="-427" R="59" G="186" B="168" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="0" S="-389" T="-471" R="59" G="70" B="168" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="1" S="-401" T="-427" R="84" G="178" B="56" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-1" T="-178" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-5" T="-221" R="171" G="82" B="209" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="-5" T="-178" R="171" G="174" B="210" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-1" T="-221" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="70" T="-417" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="74" T="-460" R="34" G="89" B="84" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="70" T="-460" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="74" T="-417" R="33" G="166" B="84" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="0" S="82" T="-461" R="12" G="97" B="81" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="0" S="82" T="-417" R="12" G="159" B="81" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="94" T="-417" R="227" G="157" B="75" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="94" T="-461" R="227" G="99" B="75" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="104" T="-416" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="104" T="-460" R="193" G="96" B="54" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="151" T="-416" R="171" G="174" B="210" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="151" T="-460" R="171" G="82" B="209" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="143" T="-460" R="205" G="85" B="177" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="143" T="-416" R="205" G="171" B="177" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="-1" S="135" T="-460" R="242" G="84" B="161" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="-1" S="135" T="-416" R="242" G="172" B="161" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="-1" S="135" T="-416" R="242" G="172" B="161" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="-1" S="135" T="-460" R="242" G="84" B="161" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="-1" S="123" T="-460" R="35" G="83" B="166" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="-1" S="123" T="-416" R="35" G="173" B="166" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="113" T="-416" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="-1" S="113" T="-460" R="72" G="84" B="194" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="0" S="-72" T="-478" R="234" G="160" B="176" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="0" S="-64" T="-485" R="59" G="186" B="168" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="1" S="-76" T="-489" R="84" G="178" B="56" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="1" S="-84" T="-481" R="25" G="172" B="92" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-77" T="-467" R="23" G="154" B="183" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="-89" T="-471" R="226" G="175" B="94" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="-86" T="-461" R="183" G="171" B="61" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-74" T="-458" R="64" G="160" B="202" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="-79" T="-454" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="-67" T="-450" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="-76" T="-441" R="227" G="157" B="75" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="-67" T="-450" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="-79" T="-454" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="-1" S="-64" T="-438" R="35" G="173" B="166" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="-1" S="-67" T="-426" R="242" G="172" B="161" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="0" S="-79" T="-430" R="12" G="159" B="81" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="-73" T="-419" R="205" G="171" B="177" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-85" T="-423" R="33" G="166" B="84" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="-83" T="-415" R="171" G="174" B="210" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-86" T="-415" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-88" T="-420" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-111" T="-488" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-113" T="-484" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-110" T="-481" R="34" G="89" B="84" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-107" T="-489" R="171" G="82" B="209" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-98" T="-484" R="205" G="85" B="177" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-110" T="-481" R="34" G="89" B="84" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="0" S="-104" T="-474" R="12" G="97" B="81" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-98" T="-484" R="205" G="85" B="177" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="-1" S="-92" T="-477" R="242" G="84" B="161" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="-1" S="-89" T="-466" R="35" G="83" B="166" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="-101" T="-462" R="227" G="99" B="75" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="-1" S="-92" T="-453" R="72" G="84" B="194" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="-104" T="-450" R="193" G="96" B="54" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-98" T="-446" R="64" G="96" B="202" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="-110" T="-442" R="183" G="85" B="61" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-101" T="-436" R="23" G="102" B="183" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="-113" T="-433" R="226" G="81" B="94" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="1" S="-109" T="-422" R="25" G="84" B="92" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="0" S="-97" T="-426" R="234" G="96" B="176" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="1" S="-101" T="-415" R="84" G="78" B="56" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="0" S="-89" T="-418" R="59" G="70" B="168" A="255"/>
|
||||
</Vertex>
|
||||
@@ -0,0 +1,323 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="-2" Y="1" Z="-22" S="-343" T="-266" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-350" T="-196" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-343" T="-169" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-343" T="-71" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-343" T="-169" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="-350" T="-141" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-348" T="-432" R="82" G="187" B="69" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-343" T="-368" R="82" G="185" B="66" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-343" T="-432" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-348" T="-367" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-528" T="-505" R="4" G="95" B="85" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-522" T="-510" R="85" G="196" B="73" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-529" T="-510" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-522" T="-506" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="6" Y="3" Z="11" S="-510" T="-495" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-510" T="-452" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-528" T="-505" R="4" G="95" B="85" A="255"/>
|
||||
<Vtx X="0" Y="3" Z="11" S="-510" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="3" Z="11" S="-510" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-528" T="-314" R="252" G="95" B="85" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="11" S="-510" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="3" Z="11" S="-510" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-6" Y="3" Z="11" S="-510" T="-324" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-522" T="-314" R="203" G="243" B="115" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-522" T="-309" R="171" G="196" B="73" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-529" T="-310" R="185" G="88" B="58" A="255"/>
|
||||
<Vtx X="-6" Y="2" Z="12" S="-489" T="-324" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="12" S="-473" T="-309" R="156" G="221" B="70" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="12" S="-473" T="-409" R="0" G="215" B="120" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="12" S="-489" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="12" S="-473" T="-409" R="0" G="215" B="120" A="255"/>
|
||||
<Vtx X="-1" Y="2" Z="12" S="-489" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-489" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="12" S="-489" T="-452" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="2" Z="12" S="-489" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="12" S="-473" T="-510" R="100" G="221" B="70" A="255"/>
|
||||
<Vtx X="6" Y="2" Z="12" S="-489" T="-495" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-522" T="-506" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="6" Y="3" Z="11" S="-510" T="-495" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-510" T="-452" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="-10" S="70" T="194" R="104" G="186" B="237" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="136" T="95" R="21" G="160" B="176" A="255"/>
|
||||
<Vtx X="6" Y="-8" Z="-17" S="85" T="94" R="92" G="201" B="188" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="-10" S="70" T="194" R="104" G="186" B="237" A="255"/>
|
||||
<Vtx X="2" Y="-13" Z="-10" S="137" T="196" R="26" G="134" B="231" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="136" T="95" R="21" G="160" B="176" A="255"/>
|
||||
<Vtx X="2" Y="-13" Z="4" S="137" T="393" R="27" G="132" B="9" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="4" S="70" T="391" R="106" G="186" B="6" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="11" S="137" T="495" R="19" G="169" B="91" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="74" T="494" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="175" T="495" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="-2" Y="-11" Z="11" S="196" T="495" R="237" G="169" B="91" A="255"/>
|
||||
<Vtx X="-2" Y="-13" Z="4" S="195" T="393" R="229" G="132" B="9" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="4" S="263" T="391" R="150" G="186" B="6" A="255"/>
|
||||
<Vtx X="-7" Y="-9" Z="11" S="259" T="494" R="172" G="207" B="82" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="-10" S="263" T="194" R="152" G="186" B="237" A="255"/>
|
||||
<Vtx X="-2" Y="-13" Z="-10" S="195" T="196" R="230" G="134" B="231" A="255"/>
|
||||
<Vtx X="-3" Y="-9" Z="-17" S="197" T="95" R="235" G="160" B="176" A="255"/>
|
||||
<Vtx X="-6" Y="-8" Z="-17" S="248" T="94" R="164" G="201" B="188" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="335" T="-265" R="74" G="215" B="161" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="346" T="-287" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="330" T="-265" R="70" G="191" B="172" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="306" T="-211" R="81" G="166" B="218" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="302" T="-211" R="89" G="177" B="211" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="305" T="-112" R="95" G="172" B="248" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="309" T="-112" R="91" G="168" B="248" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="342" T="94" R="82" G="185" B="66" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="346" T="94" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="140" T="-416" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-28" S="140" T="-327" R="29" G="191" B="151" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="-28" S="151" T="-328" R="93" G="233" B="172" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="-22" S="133" T="-416" R="29" G="170" B="168" A="255"/>
|
||||
<Vtx X="-2" Y="2" Z="-28" S="81" T="-327" R="227" G="191" B="151" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="88" T="-416" R="227" G="170" B="168" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="81" T="-416" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="81" T="-416" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-28" S="70" T="-328" R="163" G="233" B="172" A="255"/>
|
||||
<Vtx X="-2" Y="2" Z="-28" S="81" T="-327" R="227" G="191" B="151" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-380" T="405" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="-28" S="-366" T="495" R="93" G="233" B="172" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-330" T="488" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="-403" T="409" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="-395" T="385" R="74" G="215" B="161" A="255"/>
|
||||
<Vtx X="3" Y="-2" Z="-21" S="-414" T="398" R="81" G="253" B="159" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="-398" T="338" R="81" G="166" B="218" A="255"/>
|
||||
<Vtx X="6" Y="-8" Z="-17" S="-495" T="336" R="92" G="201" B="188" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="-397" T="239" R="91" G="168" B="248" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="-10" S="-529" T="237" R="104" G="186" B="237" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="4" S="-525" T="39" R="106" G="186" B="6" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-398" T="30" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="-509" T="-64" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="11" S="-387" T="-61" R="102" G="218" B="66" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="-509" T="-64" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-398" T="30" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-335" T="33" R="82" G="187" B="69" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-330" T="-61" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="12" S="-378" T="-71" R="100" G="221" B="70" A="255"/>
|
||||
<Vtx X="-4" Y="3" Z="11" S="-510" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="12" S="-489" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="11" S="-510" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="5" S="-55" T="-479" R="174" G="187" B="69" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="5" S="-59" T="-415" R="174" G="185" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="5" S="-55" T="-415" R="138" G="226" B="35" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="5" S="-59" T="-480" R="138" G="227" B="38" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-11" S="412" T="-103" R="174" G="97" B="6" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="3" S="418" T="93" R="181" G="78" B="190" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="3" S="431" T="94" R="223" G="119" B="228" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="-11" S="399" T="-103" R="164" G="87" B="7" A="255"/>
|
||||
<Vtx X="5" Y="0" Z="-17" S="404" T="-191" R="185" G="99" B="36" A="255"/>
|
||||
<Vtx X="5" Y="-1" Z="-17" S="391" T="-191" R="168" G="79" B="46" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-20" S="404" T="-228" R="186" G="82" B="68" A="255"/>
|
||||
<Vtx X="2" Y="0" Z="-20" S="391" T="-229" R="188" G="87" B="63" A="255"/>
|
||||
<Vtx X="1" Y="0" Z="-21" S="395" T="-252" R="185" G="93" B="49" A="255"/>
|
||||
<Vtx X="1" Y="1" Z="-21" S="408" T="-252" R="167" G="83" B="38" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-27" S="418" T="-329" R="175" G="50" B="84" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="431" T="-328" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-2" T="134" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="0" T="68" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="1" Y="1" Z="-21" S="-11" T="144" R="167" G="83" B="38" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
|
||||
<Vtx X="1" Y="1" Z="-21" S="-11" T="144" R="167" G="83" B="38" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-20" S="3" T="167" R="186" G="82" B="68" A="255"/>
|
||||
<Vtx X="5" Y="0" Z="-17" S="36" T="204" R="185" G="99" B="36" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="51" T="200" R="254" G="127" B="6" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-11" S="50" T="292" R="174" G="97" B="6" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="65" T="495" R="246" G="89" B="166" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="3" S="50" T="489" R="223" G="119" B="228" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="-31" T="495" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="-31" T="492" R="0" G="104" B="183" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="3" S="-112" T="489" R="33" G="119" B="228" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="4" S="-128" T="495" R="10" G="89" B="166" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-11" S="-112" T="292" R="82" G="97" B="6" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="-113" T="200" R="2" G="127" B="6" A="255"/>
|
||||
<Vtx X="-5" Y="0" Z="-17" S="-99" T="204" R="71" G="99" B="36" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="-76" T="159" R="251" G="126" B="18" A="255"/>
|
||||
<Vtx X="-3" Y="1" Z="-20" S="-66" T="167" R="70" G="82" B="68" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="-76" T="159" R="251" G="126" B="18" A="255"/>
|
||||
<Vtx X="-5" Y="0" Z="-17" S="-99" T="204" R="71" G="99" B="36" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-21" S="-52" T="144" R="89" G="83" B="38" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="-60" T="134" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-62" T="68" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="-80" T="158" R="199" G="109" B="224" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="-113" T="200" R="2" G="127" B="6" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="-117" T="199" R="170" G="85" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="-10" S="-132" T="297" R="165" G="88" B="250" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="4" S="-128" T="495" R="10" G="89" B="166" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="-132" T="494" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-68" T="-341" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-89" T="-415" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-89" T="-331" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="-68" T="-404" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="-55" T="-341" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="-68" T="-404" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-68" T="-341" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-27" S="-55" T="-404" R="175" G="50" B="84" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="255" T="70" R="57" G="109" B="224" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="246" T="76" R="70" G="191" B="172" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="261" T="94" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="242" T="29" R="89" G="177" B="211" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="252" T="29" R="86" G="85" B="216" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="-10" S="251" T="-70" R="91" G="88" B="250" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="239" T="-70" R="95" G="172" B="248" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="248" T="-267" R="112" G="45" B="216" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="231" T="-279" R="82" G="185" B="66" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="294" T="-278" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="302" T="-268" R="65" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="302" T="-372" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="302" T="-372" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="295" T="-373" R="85" G="196" B="73" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="294" T="-278" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="-343" T="-272" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="3" S="-330" T="-272" R="33" G="119" B="228" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="-331" T="-355" R="0" G="104" B="183" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="3" S="-343" T="-438" R="181" G="78" B="190" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="3" S="-330" T="-438" R="223" G="119" B="228" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-2" T="134" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="18" T="158" R="57" G="109" B="224" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="51" T="200" R="254" G="127" B="6" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="55" T="199" R="86" G="85" B="216" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="-10" S="70" T="297" R="91" G="88" B="250" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="65" T="495" R="246" G="89" B="166" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="70" T="494" R="112" G="45" B="216" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="264" T="101" R="242" G="91" B="168" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="363" T="100" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="263" T="97" R="65" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="364" T="105" R="4" G="95" B="85" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="4" S="264" T="300" R="14" G="91" B="168" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="364" T="296" R="252" G="95" B="85" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="363" T="301" R="185" G="88" B="58" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="4" S="263" T="304" R="191" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-59" T="-509" R="82" G="187" B="69" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-64" T="-416" R="85" G="196" B="73" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-59" T="-415" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-64" T="-510" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="11" S="415" T="370" R="19" G="169" B="91" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="327" T="391" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="415" T="391" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="385" T="304" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="385" T="304" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="11" S="263" T="305" R="102" G="218" B="66" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="327" T="391" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="11" S="263" T="400" R="0" G="205" B="116" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="379" T="72" R="182" G="215" B="161" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="375" T="72" R="186" G="191" B="172" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="391" T="94" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="351" T="18" R="175" G="166" B="218" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="346" T="18" R="167" G="177" B="211" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="-10" S="349" T="-81" R="161" G="172" B="248" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="-10" S="354" T="-81" R="165" G="168" B="248" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="5" S="386" T="-287" R="174" G="185" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="5" S="391" T="-287" R="138" G="226" B="35" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-21" S="448" T="16" R="89" G="83" B="38" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="458" T="94" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="471" T="93" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-21" S="448" T="16" R="89" G="83" B="38" A="255"/>
|
||||
<Vtx X="-2" Y="0" Z="-21" S="435" T="17" R="71" G="93" B="49" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="458" T="94" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="-3" Y="1" Z="-20" S="444" T="-6" R="70" G="82" B="68" A="255"/>
|
||||
<Vtx X="-3" Y="0" Z="-20" S="431" T="-6" R="68" G="87" B="63" A="255"/>
|
||||
<Vtx X="-5" Y="-1" Z="-17" S="431" T="-43" R="88" G="79" B="46" A="255"/>
|
||||
<Vtx X="-5" Y="0" Z="-17" S="444" T="-43" R="71" G="99" B="36" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="-11" S="439" T="-130" R="92" G="87" B="7" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-11" S="452" T="-131" R="82" G="97" B="6" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="458" T="-327" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="3" S="471" T="-327" R="33" G="119" B="228" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="23" T="-373" R="199" G="109" B="224" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="29" T="-396" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="14" T="-379" R="186" G="191" B="172" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="10" T="-333" R="167" G="177" B="211" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="20" T="-333" R="170" G="85" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="-10" S="19" T="-235" R="165" G="88" B="250" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="20" T="-333" R="170" G="85" B="216" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="10" T="-333" R="167" G="177" B="211" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="-10" S="7" T="-235" R="161" G="172" B="248" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="16" T="-37" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="5" S="-1" T="-26" R="174" G="185" B="66" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="5" S="62" T="-26" R="138" G="227" B="38" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="4" S="70" T="-36" R="191" G="75" B="176" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="70" T="67" R="185" G="88" B="58" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="63" T="68" R="171" G="196" B="73" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-348" T="-366" R="171" G="196" B="73" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="5" S="-343" T="-273" R="174" G="187" B="69" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-343" T="-367" R="203" G="243" B="115" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="5" S="-348" T="-272" R="138" G="227" B="38" A="255"/>
|
||||
<Vtx X="-2" Y="-11" Z="11" S="415" T="430" R="237" G="169" B="91" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="415" T="409" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="327" T="409" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="-7" Y="-9" Z="11" S="385" T="495" R="172" G="207" B="82" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="11" S="263" T="495" R="154" G="218" B="66" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="11" S="263" T="400" R="0" G="205" B="116" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="12" S="230" T="-327" R="100" G="221" B="70" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="12" S="230" T="-428" R="0" G="215" B="120" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="11" S="221" T="-332" R="102" G="218" B="66" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="11" S="221" T="-428" R="0" G="205" B="116" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="11" S="221" T="-523" R="154" G="218" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="12" S="230" T="-529" R="156" G="221" B="70" A="255"/>
|
||||
<Vtx X="-2" Y="2" Z="-28" S="-89" T="-403" R="227" G="191" B="151" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-28" S="-96" T="-415" R="163" G="233" B="172" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-415" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-28" S="-89" T="-343" R="29" G="191" B="151" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-415" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-132" T="-331" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-28" S="-89" T="-343" R="29" G="191" B="151" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="-28" S="-96" T="-331" R="93" G="233" B="172" A="255"/>
|
||||
<Vtx X="-1" Y="3" Z="11" S="-510" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="2" Z="12" S="-489" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-489" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="3" Z="11" S="-510" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="364" T="300" R="242" G="91" B="168" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="364" T="304" R="65" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="418" T="304" R="112" G="45" B="216" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="418" T="300" R="246" G="89" B="166" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="418" T="201" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="4" S="364" T="101" R="14" G="91" B="168" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="4" S="418" T="101" R="10" G="89" B="166" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="418" T="97" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="418" T="97" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="4" S="364" T="97" R="191" G="75" B="176" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="4" S="364" T="101" R="14" G="91" B="168" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="11" S="-189" T="486" R="154" G="218" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="12" S="-180" T="495" R="156" G="221" B="70" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-132" T="486" R="203" G="243" B="115" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="5" S="-137" T="392" R="174" G="187" B="69" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="5" S="-199" T="395" R="138" G="226" B="35" A="255"/>
|
||||
<Vtx X="-7" Y="-9" Z="11" S="-311" T="488" R="172" G="207" B="82" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="4" S="-327" T="385" R="150" G="186" B="6" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="-10" S="-199" T="185" R="165" G="168" B="248" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="-10" S="-330" T="188" R="152" G="186" B="237" A="255"/>
|
||||
<Vtx X="-6" Y="-8" Z="-17" S="-297" T="89" R="164" G="201" B="188" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="-200" T="87" R="175" G="166" B="218" A="255"/>
|
||||
<Vtx X="-4" Y="-2" Z="-21" S="-216" T="29" R="175" G="253" B="159" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="-197" T="41" R="182" G="215" B="161" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="-205" T="18" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-4" Y="-2" Z="-21" S="-216" T="29" R="175" G="253" B="159" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="-197" T="41" R="182" G="215" B="161" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="-182" T="22" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-28" S="-168" T="-69" R="163" G="233" B="172" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-62" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="-2" Y="-2" Z="-22" S="-313" T="-419" R="232" G="199" B="145" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="-213" T="-360" R="21" G="160" B="176" A="255"/>
|
||||
<Vtx X="-3" Y="-9" Z="-17" S="-213" T="-423" R="235" G="160" B="176" A="255"/>
|
||||
<Vtx X="2" Y="-2" Z="-22" S="-313" T="-360" R="24" G="199" B="145" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="-326" T="-412" R="227" G="170" B="168" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="-330" T="-419" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-4" Y="-2" Z="-21" S="-319" T="-435" R="175" G="253" B="159" A="255"/>
|
||||
<Vtx X="-6" Y="-8" Z="-17" S="-237" T="-475" R="164" G="201" B="188" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="-22" S="-326" T="-366" R="29" G="170" B="168" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="-330" T="-359" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="2" Y="-2" Z="-22" S="-313" T="-360" R="24" G="199" B="145" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="-330" T="-359" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="3" Y="-2" Z="-21" S="-319" T="-343" R="81" G="253" B="159" A="255"/>
|
||||
<Vtx X="6" Y="-8" Z="-17" S="-237" T="-307" R="92" G="201" B="188" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="-213" T="-360" R="21" G="160" B="176" A="255"/>
|
||||
</Vertex>
|
||||
@@ -0,0 +1,128 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="0" Y="19" Z="-1" S="-529" T="-189" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="-493" T="-308" R="93" G="215" B="77" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="-529" T="-308" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="0" Y="17" Z="-3" S="-493" T="-190" R="0" G="195" B="112" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="-529" T="-71" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-493" T="-71" R="163" G="215" B="77" A="255"/>
|
||||
<Vtx X="0" Y="13" Z="-4" S="-444" T="-190" R="0" G="233" B="125" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-4" S="-444" T="-72" R="159" G="241" B="81" A="255"/>
|
||||
<Vtx X="0" Y="9" Z="-4" S="-390" T="-190" R="0" G="28" B="124" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-4" S="-390" T="-72" R="160" G="18" B="82" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="-350" T="-190" R="0" G="86" B="94" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-350" T="-72" R="156" G="53" B="58" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="-350" T="-308" R="100" G="53" B="58" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-4" S="-390" T="-309" R="96" G="18" B="82" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-4" S="-444" T="-309" R="97" G="241" B="81" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="-172" T="-520" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-181" T="-481" R="163" G="215" B="77" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="-156" T="-520" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-190" T="-485" R="168" G="39" B="174" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-4" S="-202" T="-430" R="159" G="241" B="81" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-5" S="-213" T="-430" R="172" G="17" B="162" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-5" S="-211" T="-375" R="171" G="236" B="163" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-4" S="-201" T="-375" R="160" G="18" B="82" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-191" T="-328" R="173" G="195" B="181" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-183" T="-334" R="156" G="53" B="58" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-2" S="-171" T="-313" R="169" G="174" B="212" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="-156" T="-319" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="-156" T="-307" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-2" S="-330" T="-189" R="0" G="31" B="133" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-297" T="-306" R="168" G="39" B="174" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="-330" T="-307" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-2" S="-330" T="-189" R="0" G="31" B="133" A="255"/>
|
||||
<Vtx X="0" Y="17" Z="-3" S="-297" T="-188" R="0" G="54" B="141" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-297" T="-306" R="168" G="39" B="174" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="-330" T="-70" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="-297" T="-70" R="88" G="39" B="174" A="255"/>
|
||||
<Vtx X="0" Y="13" Z="-5" S="-243" T="-187" R="0" G="22" B="131" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-5" S="-243" T="-69" R="84" G="17" B="162" A="255"/>
|
||||
<Vtx X="0" Y="9" Z="-5" S="-189" T="-188" R="0" G="229" B="132" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-5" S="-189" T="-69" R="85" G="236" B="163" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="-144" T="-70" R="83" G="195" B="181" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="-144" T="-188" R="0" G="176" B="157" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-144" T="-306" R="173" G="195" B="181" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-5" S="-189" T="-306" R="171" G="236" B="163" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-5" S="-243" T="-306" R="172" G="17" B="162" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="455" T="215" R="0" G="176" B="157" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-2" S="433" T="333" R="169" G="174" B="212" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="455" T="333" R="173" G="195" B="181" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-2" S="433" T="215" R="0" G="144" B="195" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="455" T="97" R="83" G="195" B="181" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-2" S="433" T="97" R="87" G="174" B="212" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="418" T="97" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="418" T="215" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="418" T="333" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="358" T="-499" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-2" S="344" T="-494" R="87" G="174" B="212" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="358" T="-488" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="332" T="-472" R="100" G="53" B="58" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="323" T="-478" R="83" G="195" B="181" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-4" S="314" T="-431" R="96" G="18" B="82" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-5" S="304" T="-432" R="85" G="236" B="163" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-4" S="312" T="-376" R="97" G="241" B="81" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-4" S="314" T="-431" R="96" G="18" B="82" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-5" S="304" T="-432" R="85" G="236" B="163" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-5" S="302" T="-377" R="84" G="17" B="162" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="324" T="-321" R="88" G="39" B="174" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="334" T="-325" R="93" G="215" B="77" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="342" T="-287" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="358" T="-287" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="455" T="215" R="0" G="86" B="94" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="483" T="97" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="455" T="97" R="100" G="53" B="58" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="483" T="215" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="455" T="333" R="156" G="53" B="58" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="483" T="333" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-2" S="-407" T="-368" R="0" G="191" B="109" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-383" T="-427" R="96" G="254" B="83" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-2" S="-407" T="-427" R="99" G="216" B="69" A="255"/>
|
||||
<Vtx X="0" Y="24" Z="-3" S="-383" T="-368" R="0" G="252" B="127" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-2" S="-407" T="-309" R="157" G="216" B="69" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="-383" T="-309" R="160" G="254" B="83" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-2" S="-348" T="-368" R="0" G="97" B="82" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="-348" T="-309" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-348" T="-427" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="407" T="-388" R="0" G="51" B="140" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-3" S="422" T="-447" R="174" G="49" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="407" T="-447" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-3" S="422" T="-388" R="0" G="65" B="147" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="407" T="-329" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="422" T="-329" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="245" T="-456" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-2" S="240" T="-439" R="157" G="216" B="69" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="253" T="-457" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-3" S="232" T="-437" R="174" G="49" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="239" T="-413" R="160" G="254" B="83" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="231" T="-412" R="171" G="3" B="161" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-3" S="243" T="-380" R="172" G="209" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="251" T="-380" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="-4" Y="21" Z="-2" S="253" T="-373" R="243" G="222" B="134" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="391" T="-388" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-2" S="407" T="-447" R="99" G="216" B="69" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="391" T="-447" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-2" S="407" T="-388" R="0" G="191" B="109" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="391" T="-329" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-2" S="407" T="-329" R="157" G="216" B="69" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-3" S="-473" T="-368" R="0" G="65" B="147" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="-449" T="-427" R="171" G="3" B="161" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-3" S="-473" T="-427" R="174" G="49" B="172" A="255"/>
|
||||
<Vtx X="0" Y="24" Z="-3" S="-449" T="-368" R="0" G="4" B="129" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="-473" T="-309" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-449" T="-309" R="85" G="3" B="161" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-3" S="-416" T="-309" R="84" G="209" B="173" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-3" S="-416" T="-427" R="172" G="209" B="172" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-407" T="-314" R="11" G="222" B="134" A="255"/>
|
||||
<Vtx X="-4" Y="21" Z="-2" S="-407" T="-424" R="243" G="222" B="134" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-6" T="-408" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-5" T="-417" R="11" G="222" B="134" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-3" S="-15" T="-408" R="84" G="209" B="173" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-19" T="-375" R="96" G="254" B="83" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-27" T="-377" R="85" G="3" B="161" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="-26" T="-351" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="-26" T="-351" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-2" S="-18" T="-349" R="99" G="216" B="69" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-19" T="-375" R="96" G="254" B="83" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-13" T="-333" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-5" T="-331" R="102" G="185" B="27" A="255"/>
|
||||
</Vertex>
|
||||
@@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="158" G="66" B="3" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="124" G="127" B="126" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="7" B="0" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_TEXEL0" B0="G_CCMUX_0" C0="G_CCMUX_SHADE" D0="G_CCMUX_0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_PRIMITIVE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="88" G="46" B="16" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
||||
|
After Width: | Height: | Size: 194 B |
@@ -8,16 +8,22 @@ import struct
|
||||
import subprocess
|
||||
import argparse
|
||||
|
||||
def BuildOTR(xmlPath, rom, zapd_exe=None):
|
||||
def BuildOTR(xmlPath, rom, zapd_exe=None, genHeaders=None):
|
||||
shutil.copytree("assets", "Extract/assets")
|
||||
|
||||
if not zapd_exe:
|
||||
zapd_exe = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPDTR/ZAPD.out"
|
||||
|
||||
exec_cmd = [zapd_exe, "ed", "-i", xmlPath, "-b", rom, "-fl", "CFG/filelists",
|
||||
"-o", "placeholder", "-osf", "placeholder", "-gsf", "1",
|
||||
"-rconf", "CFG/Config.xml", "-se", "OTR", "--otrfile",
|
||||
"oot-mq.otr" if Z64Rom.isMqRom(rom) else "oot.otr"]
|
||||
"-o", "placeholder", "-osf", "placeholder", "-rconf", "CFG/Config.xml"]
|
||||
|
||||
# generate headers, but not otrs by excluding the otr exporter
|
||||
if genHeaders:
|
||||
exec_cmd.extend(["-gsf", "1"])
|
||||
else:
|
||||
# generate otrs, but not headers
|
||||
exec_cmd.extend(["-gsf", "0", "-se", "OTR", "--otrfile",
|
||||
"oot-mq.otr" if Z64Rom.isMqRom(rom) else "oot.otr"])
|
||||
|
||||
print(exec_cmd)
|
||||
exitValue = subprocess.call(exec_cmd)
|
||||
@@ -33,6 +39,7 @@ def main():
|
||||
parser.add_argument("rom", help="Path to the rom", type=str, nargs="?")
|
||||
parser.add_argument("--non-interactive", help="Runs the script non-interactively for use in build scripts.", dest="non_interactive", action="store_true")
|
||||
parser.add_argument("-v", "--verbose", help="Display rom's header checksums and their corresponding xml folder", dest="verbose", action="store_true")
|
||||
parser.add_argument("--gen-headers", help="Generate source headers to be checked in", dest="gen_headers", action="store_true")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@@ -41,7 +48,7 @@ def main():
|
||||
if (os.path.exists("Extract")):
|
||||
shutil.rmtree("Extract")
|
||||
|
||||
BuildOTR("../soh/assets/xml/" + rom.version.xml_ver + "/", rom.file_path, zapd_exe=args.zapd_exe)
|
||||
BuildOTR("../soh/assets/xml/" + rom.version.xml_ver + "/", rom.file_path, zapd_exe=args.zapd_exe, genHeaders=args.gen_headers)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
@@ -18,17 +18,14 @@ def chooseROM(verbose=False, non_interactive=False):
|
||||
return roms
|
||||
|
||||
if non_interactive:
|
||||
romsToExtract = []
|
||||
foundMq = False
|
||||
foundOot = False
|
||||
mq_rom = None
|
||||
non_mq_rom = None
|
||||
for rom in roms:
|
||||
if rom.isMq and not foundMq:
|
||||
romsToExtract.append(rom)
|
||||
foundMq = True
|
||||
elif not rom.isMq and not foundOot:
|
||||
romsToExtract.append(rom)
|
||||
foundOot = True
|
||||
return romsToExtract
|
||||
if rom.isMq and mq_rom is None:
|
||||
mq_rom = rom
|
||||
elif not rom.isMq and non_mq_rom is None:
|
||||
non_mq_rom = rom
|
||||
return [rom for rom in [non_mq_rom, mq_rom] if rom is not None]
|
||||
|
||||
print(f"{len(roms)} roms found, please select one by pressing 1-{len(roms)}")
|
||||
print()
|
||||
|
||||
@@ -56,19 +56,19 @@ RomVersion GetVersion(FILE* rom) {
|
||||
|
||||
version.crc = __bswap_32(version.crc);
|
||||
switch (version.crc) {
|
||||
case OOT_NTSC_10:
|
||||
case OOT_NTSC_US_10:
|
||||
version.version = "N64 NTSC 1.0";
|
||||
version.listPath = "ntsc_oot.txt";
|
||||
version.offset = OOT_OFF_NTSC_10;
|
||||
version.isMQ = false;
|
||||
break;
|
||||
case OOT_NTSC_11:
|
||||
case OOT_NTSC_US_11:
|
||||
version.version = "N64 NTSC 1.1";
|
||||
version.listPath = "ntsc_oot.txt";
|
||||
version.offset = OOT_OFF_NTSC_11;
|
||||
version.isMQ = false;
|
||||
break;
|
||||
case OOT_NTSC_12:
|
||||
case OOT_NTSC_US_12:
|
||||
version.version = "N64 NTSC 1.2";
|
||||
version.listPath = "ntsc_oot.txt";
|
||||
version.offset = OOT_OFF_NTSC_12;
|
||||
|
||||
@@ -1,191 +1,110 @@
|
||||
# Welcome to the Ship of Harkinian!
|
||||

|
||||

|
||||
|
||||
A PC port of OoT allowing you to enjoy the game with modern controls, widescreen, high-resolution, gyroscopy and other great features! Setup is simple, let's get started!
|
||||
## Website
|
||||
|
||||
The Ship does not include assets and as such requires a prior copy of the game to play.
|
||||
Official Website: https://www.shipofharkinian.com/
|
||||
|
||||
## Discord
|
||||
|
||||
Official Discord: https://discord.com/invite/BtBmd55HVH
|
||||
Official Discord: https://discord.com/invite/shipofharkinian
|
||||
|
||||
## Quick Start (Windows)
|
||||
If you're having any trouble after reading through this `README`, feel free ask for help in the Support text channels. Please keep in mind that we do not condone piracy.
|
||||
|
||||
1) Download The Ship of Harkinian from [Discord](https://discord.com/invite/BtBmd55HVH).
|
||||
2) Requires a supported copy of the game (See supported games below).
|
||||
3) Use the OTRGui to generate an `oot.otr` archive file.
|
||||
4) Launch `soh.exe`
|
||||
# Quick Start
|
||||
|
||||
### Supported Games
|
||||
#### Ocarina of Time Debug PAL GC (not Master Quest)
|
||||
> Currently the recommended option
|
||||
The Ship does not include any copyrighted assets. You are required to provide a supported copy of the game.
|
||||
|
||||
### 1. Check your `sha1`
|
||||
You can verify you have a supported copy of the game by checking the `sha1` hash. There are many ways to do this, one of the simplest is using the [`hasher-js`](https://github.com/snarfblam/hasher-js) webapp hosted at https://www.romhacking.net/hash/.
|
||||
|
||||
| Supported Version | `sha1` |
|
||||
| - | - |
|
||||
| PAL GC | `0227d7c0074f2d0ac935631990da8ec5914597b4` |
|
||||
| PAL GC (Debug) | `cee6bc3c2a634b41728f2af8da54d9bf8cc14099` |
|
||||
| PAL MQ (Debug) | `079b855b943d6ad8bd1eb026c0ed169ecbdac7da` |
|
||||
| PAL MQ (Debug) | `50bebedad9e0f10746a52b07239e47fa6c284d03` |
|
||||
|
||||
### 2. Download The Ship of Harkinian from [Discord](https://discord.com/invite/shipofharkinian)
|
||||
The latest release is available in the most recent post in the `#downloads` channel.
|
||||
|
||||
### 3. Launch the Game!
|
||||
#### Windows
|
||||
* Extract the zip
|
||||
* Launch `soh.exe`
|
||||
|
||||
#### Linux
|
||||
* Place your supported copy of the game in the same folder as the appimage.
|
||||
* Execute `soh.appimage`. You may have to `chmod +x` the appimage via terminal.
|
||||
|
||||
#### macOS
|
||||
* Run `soh.app`. When prompted, select your supported copy of the game.
|
||||
* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start.
|
||||
|
||||
#### Nintendo Switch
|
||||
* Run one of the PC releases to generate an `oot.otr` and/or `oot-mq.otr` file. After launching the game on PC, you will be able to find these files in the same directory as `soh.exe` or `soh.appimage`. On macOS, these files can be found in `/Users/<username>/Library/Application Support/com.shipofharkinian.soh/`
|
||||
* Copy the files to your sd card
|
||||
```
|
||||
Build team: `zelda@srd022j`
|
||||
Build date: `03-02-21 00:49:18` (year-month-day)
|
||||
sha1: cee6bc3c2a634b41728f2af8da54d9bf8cc14099
|
||||
```
|
||||
#### Ocarina of Time PAL GameCube
|
||||
> May lead to crashes and instability
|
||||
```
|
||||
sha1: 0227d7c0074f2d0ac935631990da8ec5914597b4
|
||||
```
|
||||
#### Ocarina of Time Debug PAL GC MQ (Dungeons will be Master Quest)
|
||||
```
|
||||
Build team: `zelda@srd022j`
|
||||
Build date: `03-02-21 00:16:31` (year-month-day)
|
||||
sha1: 079b855b943d6ad8bd1eb026c0ed169ecbdac7da (Produced by decomp)
|
||||
sha1: 50bebedad9e0f10746a52b07239e47fa6c284d03 (Alternate)
|
||||
sdcard
|
||||
└── switch
|
||||
└── soh
|
||||
├── oot-mq.otr
|
||||
├── oot.otr
|
||||
├── soh.nro
|
||||
└── soh.otr
|
||||
```
|
||||
* Launch via Atmosphere's `Game+R` launcher method.
|
||||
|
||||
### 4. Play!
|
||||
|
||||
Congratulations, you are now sailing with the Ship of Harkinian! Have fun!
|
||||
|
||||
## Additional Setup Information
|
||||
# Configuration
|
||||
|
||||
The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`.
|
||||
|
||||
### Windows Rom Extraction
|
||||
|
||||
* Open OTRGui.exe, and select one of the supported roms listed above, to generate the `oot.otr` archive file.
|
||||
* If a second button already exits then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error.
|
||||
* When the process completes, place `oot.otr` beside `soh.exe` if it is not already.
|
||||
|
||||
This packaging process can take up to **5 minutes**.
|
||||
|
||||
Close the OTRGui when the `Done!` message appears.
|
||||
If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum.
|
||||
|
||||
### Linux Rom Extraction
|
||||
|
||||
* Place one of the supported roms in the same folder as the appimage.
|
||||
* When you run the soh appimage, it should begin generating the `oot.otr` archive file.
|
||||
* When the process completes, place `oot.otr` in the same folder as the appimage, if it is not already, then run the appimage.
|
||||
|
||||
The packaging process can take up to **5 minutes**.
|
||||
|
||||
If you get any errors, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum.
|
||||
|
||||
### MacOS Rom Extraction
|
||||
|
||||
* Run `soh.app`, and when prompted, select one of the supported roms listed above.
|
||||
* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start.
|
||||
|
||||
The packing process can take up to **5 minutes**.
|
||||
|
||||
If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom, make sure the checksum matches one of the ones listed above.
|
||||
|
||||
### Nintendo Switch Rom Extraction
|
||||
|
||||
* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform.
|
||||
* Place the `.nro` and the `oot.otr` archive into a folder called `soh` in your Switch folder on your Switch
|
||||
|
||||
### Nintendo Wii U Rom Extraction
|
||||
|
||||
* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform.
|
||||
* Copy the `.rpx` and the `oot.otr` archive to `wiiu/apps/soh`
|
||||
|
||||
---
|
||||
|
||||
If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way.
|
||||
|
||||
### Running The Ship of Harkinian
|
||||
|
||||
Launch the game. If the window immediately closes, or if there are visual artifacts, you may have selected the wrong rom in the OTRGui tool.
|
||||
|
||||
Default keyboard configuration:
|
||||
### Default keyboard configuration
|
||||
| N64 | A | B | Z | Start | Analog stick | C buttons | D-Pad |
|
||||
| - | - | - | - | - | - | - | - |
|
||||
| Keyboard | X | C | Z | Space | WASD | Arrow keys | TFGH |
|
||||
|
||||
Other shortcuts:
|
||||
### Other shortcuts
|
||||
| Keys | Action |
|
||||
| - | - |
|
||||
| F1 | Toggle menubar |
|
||||
| F5 | Save state |
|
||||
| F6 | Change state |
|
||||
| F7 | Load state |
|
||||
| F9 | Toggle Text-to-Speech (Windows and Mac only) |
|
||||
| F10 | Fullscreen (OpenGL) |
|
||||
| Tab | Toggle Alternate assets |
|
||||
| Alt+Enter | Fullscreen (DirectX) |
|
||||
| Ctrl+R | Reset |
|
||||
|
||||
Currently, DirectX 11 and OpenGL are supported. Change the renderer by opening the `shipofharkinian.json` configuration file in notepad and add `sdl` to the quotes in `"GfxBackend": ""` for OpenGL or leave blank for DirectX.
|
||||
### Graphics Backends
|
||||
Currently, there are three rendering APIs supported: DirectX11 (Windows), OpenGL (all platforms), and Metal (MacOS). You can change which API to use in the `Settings` menu of the menubar, which requires a restart. If you're having an issue with crashing, you can change the API in the `shipofharkinian.json` file by finding the line `gfxbackend:""` and changing the value to `sdl` for OpenGL. DirectX 11 is the default on Windows.
|
||||
|
||||
### Custom Music
|
||||
# Custom Assets
|
||||
|
||||
We support importing custom [Seq64](https://github.com/sauraen/seq64) files to replace the in game music and fanfares (Not sound effects yet currently).
|
||||
Custom assets are packed in `.otr` files. To use custom assets, place them in the `mods` folder.
|
||||
|
||||
First you will need to prepare a folder with the desired sequences, in which every sequence will have two files with the same name and different extensions, a `.seq` Seq64 file and a `.meta` plaintext file. These files can be categorically nested in folders if desired, they will still be consumed as if they were all at the top level.
|
||||
If you're interested in creating and/or packing your own custom asset `.otr` files, check out [**retro**](https://github.com/HarbourMasters64/retro)!
|
||||
|
||||
The meta file will have two lines, the first line is the name that will be displayed in the SFX editor, and the second line will be the instrument set number, in base 16. For example, if there is a sequence file `Foo.seq` then you need a meta file `Foo.meta` that could contain:
|
||||
```
|
||||
Awesome Name
|
||||
C
|
||||
```
|
||||
# Development
|
||||
### Building
|
||||
|
||||
Once you have prepared your sequences folder:
|
||||
1. Download and open [Retro](https://github.com/HarbourMasters/retro/releases).
|
||||
1. Choose the "Create OTR" option
|
||||
1. Choose the "Custom Sequences" option
|
||||
1. Using the file select, choose the sequences folder you prepared in the previous instructions.
|
||||
1. Click the "Stage Files" button (Reminder: SoH can handle 1024 custom sequence in total, this number include the count of the original music with it so be sure to take this into account)
|
||||
1. Click the "Finalize OTR" text in the green footer.
|
||||
1. Finally click "Generate OTR" and for the source destination it needs to go in the `mods` folder of your SoH installation.
|
||||
- This `mods` folder should be a sibling of your `oot.otr` file.
|
||||
If you want to manually compile SoH, please consult the [building instructions](docs/BUILDING.md).
|
||||
|
||||
Assuming you have done everything correctly, boot up SoH and open up the SFX Editor (In the Enhancements dropdown). You should now be able to swap out any of the in game sequences/fanfares for the sequences added in your newly generated OTR file. If you have any trouble with this process please reach out in the support section of the Discord
|
||||
### Playtesting
|
||||
If you want to playtest a continuous integration build, you can find them at the links below. Keep in mind that these are for playtesting only, and you will likely encounter bugs and possibly crashes.
|
||||
|
||||
## Building The Ship of Harkinian
|
||||
* [Windows](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-windows.zip)
|
||||
* [macOS](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-mac.zip)
|
||||
* [Linux (performance)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-performance.zip) _(requires `glibc 2.35` or newer, but will be more performant than the compatibility build.)_
|
||||
* [Linux (compatibility)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-compatiblity.zip) _(compatible with most Linux distributions, but may not be as performant as the performance build.)_
|
||||
* [Switch](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-switch.zip)
|
||||
|
||||
Refer to the [building instructions](BUILDING.md) to compile SoH.
|
||||
|
||||
## Nightly Builds
|
||||
Nightly builds of Ship of Harkinian are available here: [Windows](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-windows.zip), [macOS](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-mac.zip), [Linux (compatibility*)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-compatiblity.zip), [Linux (performance*)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-performance.zip), [Switch](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-switch.zip), [Wii U](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-wiiu.zip)
|
||||
|
||||
_*compatibility: compatible with most Linux distributions, but may not be as performant as the perf build._\
|
||||
_*performance: requires glibc 2.35 or newer, but will be more performant than the compat build._
|
||||
|
||||
## Take The Survey
|
||||
Want to use cartridge readers in tandem with the OTRGui?
|
||||
Take [this survey](https://retroarchopenhardware.com/survey.php) to increase chances of this becoming reality.
|
||||
|
||||
## The Harbour Masters Are...
|
||||
|
||||
Kenix | Lead Developer/Public Relations - Resource Management Programmer, Audio System Programmer, and General Programmer
|
||||
Jack Walker | Lead Developer - OTR Format Programmer, Resource Load Programmer, and General Programmer
|
||||
Louist103 | Developer - Save System Programmer and General Programmer
|
||||
Emil | Developer - Fast3D Programmer
|
||||
m4xw | Developer - Shipwright, Throwing Baguettes, and General Programmer
|
||||
MelonSpeedruns | Developer - General Programmer
|
||||
Rozlette | Developer - General Programmer
|
||||
JoshDuMan | Developer - General Programmer
|
||||
KiritoDev/Lywx | Developer - General Programmer
|
||||
Theo3 | Developer - General Programmer
|
||||
Random06457 | Developer - Linux Build
|
||||
|
||||
## Special Thanks
|
||||
|
||||
Decomp & ZAPD | Made this project even possible in the first place!
|
||||
MNGoldenEagle | Patiently explained audio data formats, encouragement, and founding ZSO which was the first source of the game's code and resource format documentation.
|
||||
Rrrrry123 | Speedbunner, encouragement, and community moderation
|
||||
Fierce deity | Encouragement and community moderation
|
||||
mzxrules | For his contributions to decomp
|
||||
zel. | For his contributions to decomp
|
||||
Aloxado | Developer - General Programmer
|
||||
MegaMech | Developer - General Programmer
|
||||
Revo | Tester - GCC support and General Testing
|
||||
zfg | Tester - General Testing
|
||||
Horseless Headman | Tester - General Testing
|
||||
Steven Pritchett | Tester - General Testing
|
||||
Trenton May | Tester - General Testing
|
||||
Zeldaboy14 | Tester - General Testing, encouragement, and community moderation
|
||||
Koby Howell | Tester - General Testing
|
||||
Logg | Tester - General Testing
|
||||
Taylor Daley | Graphic Design
|
||||
Can't Sleep | Graphic Design
|
||||
|
||||
## Video Credits
|
||||
Kenix | Producer / Writer
|
||||
briaguya | Writer
|
||||
rainbow_fash | Executive Producer
|
||||
ReveriePass | Editor
|
||||
MicTheMicrophone | Gwonam / The King
|
||||
Amphibibro | Link
|
||||
AceHeart | Zelda
|
||||
<a href="https://github.com/Kenix3/libultraship/">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="./docs/poweredbylus.darkmode.png">
|
||||
<img alt="Powered by libultraship" src="./docs/poweredbylus.lightmode.png">
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
|
||||
;
|
||||
[subrepo]
|
||||
remote = https://github.com/HarbourMasters/ZAPDTR.git
|
||||
remote = https://github.com/harbourmasters/ZAPDTR
|
||||
branch = master
|
||||
commit = e23b125d89bd973998d2eb00896bcbaf1b53a329
|
||||
parent = 17b1a8e7fd5517f9232e531da0fed6ef80a87f04
|
||||
commit = d4c35b90aed66eeed61066b4b76e488bfab52b4d
|
||||
parent = 9d17e19a1dcf2b5c6cef0d3c93816f98a280eb58
|
||||
method = rebase
|
||||
cmdver = 0.4.3
|
||||
|
||||
@@ -50,17 +50,19 @@ void ExporterExample_Collision::Save(ZResource* res, [[maybe_unused]] const fs::
|
||||
writer->Write(col->polygons[i].vtxA);
|
||||
writer->Write(col->polygons[i].vtxB);
|
||||
writer->Write(col->polygons[i].vtxC);
|
||||
writer->Write(col->polygons[i].a);
|
||||
writer->Write(col->polygons[i].b);
|
||||
writer->Write(col->polygons[i].c);
|
||||
writer->Write(col->polygons[i].d);
|
||||
writer->Write(col->polygons[i].normX);
|
||||
writer->Write(col->polygons[i].normY);
|
||||
writer->Write(col->polygons[i].normZ);
|
||||
writer->Write(col->polygons[i].dist);
|
||||
}
|
||||
|
||||
writer->Seek(col->polyTypeDefSegmentOffset, SeekOffsetType::Start);
|
||||
|
||||
for (uint16_t i = 0; i < col->polygonTypes.size(); i++)
|
||||
writer->Write(col->polygonTypes[i]);
|
||||
|
||||
for (const auto& poly : col->polygonTypes)
|
||||
{
|
||||
writer->Write(poly.data[0]);
|
||||
writer->Write(poly.data[1]);
|
||||
}
|
||||
writer->Seek(col->camDataSegmentOffset, SeekOffsetType::Start);
|
||||
|
||||
for (auto entry : col->camData->entries)
|
||||
|
||||
@@ -1,160 +1,160 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{65608eb0-1a47-45ad-ab66-192fb64c762c}</ProjectGuid>
|
||||
<RootNamespace>ExporterTest</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>ExporterExample</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(ProjectDir)..\ZAPD\;$(ProjectDir)..\ZAPDUtils;$(ProjectDir)..\lib\tinyxml2;$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\lib\elfio;$(ProjectDir)..\lib\stb;$(ProjectDir);$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<LanguageStandard_C>stdc11</LanguageStandard_C>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="CollisionExporter.h" />
|
||||
<ClInclude Include="TextureExporter.h" />
|
||||
<ClInclude Include="RoomExporter.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="CollisionExporter.cpp" />
|
||||
<ClCompile Include="TextureExporter.cpp" />
|
||||
<ClCompile Include="Main.cpp" />
|
||||
<ClCompile Include="RoomExporter.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<ProjectGuid>{65608eb0-1a47-45ad-ab66-192fb64c762c}</ProjectGuid>
|
||||
<RootNamespace>ExporterTest</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
<ProjectName>ExporterExample</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IncludePath>$(ProjectDir)..\ZAPD\;$(ProjectDir)..\ZAPDUtils;$(ProjectDir)..\lib\tinyxml2;$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\lib\elfio;$(ProjectDir)..\lib\stb;$(ProjectDir);$(IncludePath)</IncludePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||
<LanguageStandard_C>stdc11</LanguageStandard_C>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<SDLCheck>true</SDLCheck>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="CollisionExporter.h" />
|
||||
<ClInclude Include="TextureExporter.h" />
|
||||
<ClInclude Include="RoomExporter.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="CollisionExporter.cpp" />
|
||||
<ClCompile Include="TextureExporter.cpp" />
|
||||
<ClCompile Include="Main.cpp" />
|
||||
<ClCompile Include="RoomExporter.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -1,7 +1,7 @@
|
||||
#include "RoomExporter.h"
|
||||
#include "CollisionExporter.h"
|
||||
#include "Utils/BinaryWriter.h"
|
||||
#include "Utils/File.h"
|
||||
#include <Utils/DiskFile.h>
|
||||
#include "Utils/MemoryStream.h"
|
||||
#include "ZRoom/Commands/SetCameraSettings.h"
|
||||
#include "ZRoom/Commands/SetCollisionHeader.h"
|
||||
@@ -334,7 +334,7 @@ void ExporterExample_Room::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
writer->Write(entry.rotX);
|
||||
writer->Write(entry.rotY);
|
||||
writer->Write(entry.rotZ);
|
||||
writer->Write(entry.initVar);
|
||||
writer->Write(entry.params);
|
||||
}
|
||||
|
||||
writer->Seek(oldOffset, SeekOffsetType::Start);
|
||||
@@ -367,6 +367,6 @@ void ExporterExample_Room::Save(ZResource* res, const fs::path& outPath, BinaryW
|
||||
}
|
||||
|
||||
// writer->Close();
|
||||
// File::WriteAllBytes(StringHelper::Sprintf("%s", res->GetName().c_str()),
|
||||
// DiskFile::WriteAllBytes(StringHelper::Sprintf("%s", res->GetName().c_str()),
|
||||
// memStream->ToVector());
|
||||
}
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
pipeline {
|
||||
agent {
|
||||
label 'ZAPD'
|
||||
}
|
||||
|
||||
stages {
|
||||
// Non-parallel ZAPD stage
|
||||
stage('Build ZAPD') {
|
||||
steps {
|
||||
sh 'make -j WERROR=1'
|
||||
}
|
||||
}
|
||||
|
||||
// CHECKOUT THE REPOS
|
||||
stage('Checkout Repos') {
|
||||
parallel {
|
||||
stage('Checkout oot') {
|
||||
steps {
|
||||
dir('oot') {
|
||||
git url: 'https://github.com/zeldaret/oot.git'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Checkout mm') {
|
||||
steps{
|
||||
dir('mm') {
|
||||
git url: 'https://github.com/zeldaret/mm.git'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SETUP THE REPOS
|
||||
stage('Set up repos') {
|
||||
parallel {
|
||||
stage('Setup OOT') {
|
||||
steps {
|
||||
dir('oot') {
|
||||
sh 'cp /usr/local/etc/roms/baserom_oot.z64 baserom_original.z64'
|
||||
|
||||
// Identical to `make setup` except for copying our newer ZAPD.out into oot
|
||||
sh 'git submodule update --init --recursive'
|
||||
sh 'make -C tools'
|
||||
sh 'cp ../ZAPD.out tools/ZAPD/'
|
||||
sh 'python3 fixbaserom.py'
|
||||
sh 'python3 extract_baserom.py'
|
||||
sh 'python3 extract_assets.py'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('Setup MM') {
|
||||
steps {
|
||||
dir('mm') {
|
||||
sh 'cp /usr/local/etc/roms/mm.us.rev1.z64 baserom.mm.us.rev1.z64'
|
||||
|
||||
// Identical to `make setup` except for copying our newer ZAPD.out into mm
|
||||
sh 'make -C tools'
|
||||
sh 'cp ../ZAPD.out tools/ZAPD/'
|
||||
sh 'python3 tools/fixbaserom.py'
|
||||
sh 'python3 tools/extract_baserom.py'
|
||||
sh 'python3 extract_assets.py -t$(nproc)'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// BUILD THE REPOS
|
||||
stage('Build repos') {
|
||||
parallel {
|
||||
stage('Build oot') {
|
||||
steps {
|
||||
dir('oot') {
|
||||
sh 'make -j'
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Build mm') {
|
||||
steps {
|
||||
dir('mm') {
|
||||
sh 'make -j disasm'
|
||||
sh 'make -j all'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
cleanWs()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
# use variables in submakes
|
||||
export
|
||||
OPTIMIZATION_ON ?= 1
|
||||
ASAN ?= 0
|
||||
DEPRECATION_ON ?= 1
|
||||
DEBUG ?= 0
|
||||
COPYCHECK_ARGS ?=
|
||||
LLD ?= 0
|
||||
WERROR ?= 0
|
||||
|
||||
# Use clang++ if available, else use g++
|
||||
ifeq ($(shell command -v clang++ >/dev/null 2>&1; echo $$?),0)
|
||||
CXX := clang++
|
||||
else
|
||||
CXX := g++
|
||||
endif
|
||||
|
||||
INC := -I ZAPD -I lib/libgfxd -I lib/tinyxml2 -I ZAPDUtils
|
||||
CXXFLAGS := -fpic -std=c++17 -Wall -Wextra -fno-omit-frame-pointer
|
||||
OPTFLAGS :=
|
||||
|
||||
ifneq ($(DEBUG),0)
|
||||
OPTIMIZATION_ON = 0
|
||||
CXXFLAGS += -g3 -DDEVELOPMENT -D_DEBUG
|
||||
COPYCHECK_ARGS += --devel
|
||||
DEPRECATION_ON = 0
|
||||
endif
|
||||
|
||||
ifneq ($(WERROR),0)
|
||||
CXXFLAGS += -Werror
|
||||
endif
|
||||
|
||||
ifeq ($(OPTIMIZATION_ON),0)
|
||||
OPTFLAGS := -O0
|
||||
else
|
||||
OPTFLAGS := -O2
|
||||
endif
|
||||
|
||||
ifneq ($(ASAN),0)
|
||||
CXXFLAGS += -fsanitize=address -fsanitize=pointer-compare -fsanitize=pointer-subtract -fsanitize=undefined
|
||||
endif
|
||||
ifneq ($(DEPRECATION_ON),0)
|
||||
CXXFLAGS += -DDEPRECATION_ON
|
||||
endif
|
||||
# CXXFLAGS += -DTEXTURE_DEBUG
|
||||
|
||||
LDFLAGS := -lm -ldl -lpng
|
||||
|
||||
# Use LLD if available. Set LLD=0 to not use it
|
||||
ifeq ($(shell command -v ld.lld >/dev/null 2>&1; echo $$?),0)
|
||||
LLD := 1
|
||||
endif
|
||||
|
||||
ifneq ($(LLD),0)
|
||||
LDFLAGS += -fuse-ld=lld
|
||||
endif
|
||||
|
||||
UNAME := $(shell uname)
|
||||
UNAMEM := $(shell uname -m)
|
||||
ifneq ($(UNAME), Darwin)
|
||||
LDFLAGS += -Wl,-export-dynamic -lstdc++fs
|
||||
EXPORTERS := -Wl,--whole-archive ExporterTest/ExporterTest.a -Wl,--no-whole-archive
|
||||
else
|
||||
EXPORTERS := -Wl,-force_load ExporterTest/ExporterTest.a
|
||||
ifeq ($(UNAMEM),arm64)
|
||||
ifeq ($(shell brew list libpng > /dev/null 2>&1; echo $$?),0)
|
||||
LDFLAGS += -L $(shell brew --prefix)/lib
|
||||
INC += -I $(shell brew --prefix)/include
|
||||
else
|
||||
$(error Please install libpng via Homebrew)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
ZAPD_SRC_DIRS := $(shell find ZAPD -type d)
|
||||
SRC_DIRS = $(ZAPD_SRC_DIRS) lib/tinyxml2
|
||||
|
||||
ZAPD_CPP_FILES := $(foreach dir,$(ZAPD_SRC_DIRS),$(wildcard $(dir)/*.cpp))
|
||||
ZAPD_H_FILES := $(foreach dir,$(ZAPD_SRC_DIRS),$(wildcard $(dir)/*.h))
|
||||
|
||||
CPP_FILES += $(ZAPD_CPP_FILES) lib/tinyxml2/tinyxml2.cpp
|
||||
O_FILES := $(foreach f,$(CPP_FILES:.cpp=.o),build/$f)
|
||||
O_FILES += build/ZAPD/BuildInfo.o
|
||||
|
||||
# create build directories
|
||||
$(shell mkdir -p $(foreach dir,$(SRC_DIRS),build/$(dir)))
|
||||
|
||||
|
||||
# Main targets
|
||||
all: ZAPD.out copycheck
|
||||
|
||||
build/ZAPD/BuildInfo.o:
|
||||
python3 ZAPD/genbuildinfo.py $(COPYCHECK_ARGS)
|
||||
$(CXX) $(CXXFLAGS) $(OPTFLAGS) $(INC) -c $(OUTPUT_OPTION) build/ZAPD/BuildInfo.cpp
|
||||
|
||||
copycheck: ZAPD.out
|
||||
python3 copycheck.py
|
||||
|
||||
clean:
|
||||
rm -rf build ZAPD.out
|
||||
$(MAKE) -C lib/libgfxd clean
|
||||
$(MAKE) -C ZAPDUtils clean
|
||||
$(MAKE) -C ExporterTest clean
|
||||
|
||||
rebuild: clean all
|
||||
|
||||
format:
|
||||
clang-format-11 -i $(ZAPD_CPP_FILES) $(ZAPD_H_FILES)
|
||||
$(MAKE) -C ZAPDUtils format
|
||||
$(MAKE) -C ExporterTest format
|
||||
|
||||
.PHONY: all build/ZAPD/BuildInfo.o copycheck clean rebuild format
|
||||
|
||||
build/%.o: %.cpp
|
||||
$(CXX) $(CXXFLAGS) $(OPTFLAGS) $(INC) -c $(OUTPUT_OPTION) $<
|
||||
|
||||
|
||||
# Submakes
|
||||
lib/libgfxd/libgfxd.a:
|
||||
$(MAKE) -C lib/libgfxd
|
||||
|
||||
.PHONY: ExporterTest
|
||||
ExporterTest:
|
||||
$(MAKE) -C ExporterTest
|
||||
|
||||
.PHONY: ZAPDUtils
|
||||
ZAPDUtils:
|
||||
$(MAKE) -C ZAPDUtils
|
||||
|
||||
|
||||
# Linking
|
||||
ZAPD.out: $(O_FILES) lib/libgfxd/libgfxd.a ExporterTest ZAPDUtils
|
||||
$(CXX) $(CXXFLAGS) $(O_FILES) lib/libgfxd/libgfxd.a ZAPDUtils/ZAPDUtils.a $(EXPORTERS) $(LDFLAGS) $(OUTPUT_OPTION)
|
||||
@@ -71,9 +71,6 @@ ZAPD needs a _File parsing mode_ to be passed as first parameter. The options ar
|
||||
- `blb`: "Build blob" mode.
|
||||
- In this mode, ZAPD expects a BIN file as input and a filename as ouput.
|
||||
- ZAPD will try to convert the given BIN into the contents of a `uint8_t` C array.
|
||||
- `bovl`: "Build overlay" mode.
|
||||
- In this mode, ZAPD expects an overlay C file as input, a filename as ouput and an overlay configuration path (`-cfg`).
|
||||
- ZAPD will generate a reloc `.s` file.
|
||||
|
||||
ZAPD also accepts the following list of extra parameters:
|
||||
|
||||
@@ -102,8 +99,6 @@ ZAPD also accepts the following list of extra parameters:
|
||||
- `ia16`
|
||||
- `ci4`
|
||||
- `ci8`
|
||||
- `-cfg PATH`: Set cfg path (for overlays).
|
||||
- Can be used only in `bovl` mode.
|
||||
- `-rconf PATH` Read Config File.
|
||||
- `-eh`: Enable error handler.
|
||||
- Only available in non-Windows environments.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
set(PROJECT_NAME ZAPD)
|
||||
set(PROJECT_NAME ZAPDLib)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 20 CACHE STRING "The C++ standard to use")
|
||||
#set(CMAKE_C_STANDARD 11 CACHE STRING "The C standard to use")
|
||||
@@ -17,6 +17,7 @@ set(Header_Files
|
||||
"ImageBackend.h"
|
||||
"OutputFormatter.h"
|
||||
"WarningHandler.h"
|
||||
"CrashHandler.h"
|
||||
)
|
||||
source_group("Header Files" FILES ${Header_Files})
|
||||
|
||||
@@ -27,22 +28,6 @@ set(Header_Files__Libraries
|
||||
)
|
||||
source_group("Header Files\\Libraries" FILES ${Header_Files__Libraries})
|
||||
|
||||
set(Header_Files__Libraries__elfio
|
||||
"../lib/elfio/elfio/elf_types.hpp"
|
||||
"../lib/elfio/elfio/elfio.hpp"
|
||||
"../lib/elfio/elfio/elfio_dump.hpp"
|
||||
"../lib/elfio/elfio/elfio_dynamic.hpp"
|
||||
"../lib/elfio/elfio/elfio_header.hpp"
|
||||
"../lib/elfio/elfio/elfio_note.hpp"
|
||||
"../lib/elfio/elfio/elfio_relocation.hpp"
|
||||
"../lib/elfio/elfio/elfio_section.hpp"
|
||||
"../lib/elfio/elfio/elfio_segment.hpp"
|
||||
"../lib/elfio/elfio/elfio_strings.hpp"
|
||||
"../lib/elfio/elfio/elfio_symbols.hpp"
|
||||
"../lib/elfio/elfio/elfio_utils.hpp"
|
||||
)
|
||||
source_group("Header Files\\Libraries\\elfio" FILES ${Header_Files__Libraries__elfio})
|
||||
|
||||
set(Header_Files__Libraries__libgfxd
|
||||
"../lib/libgfxd/gbi.h"
|
||||
"../lib/libgfxd/gfxd.h"
|
||||
@@ -58,15 +43,17 @@ source_group("Header Files\\Yaz0" FILES ${Header_Files__Yaz0})
|
||||
|
||||
set(Header_Files__Z64
|
||||
"OtherStructs/SkinLimbStructs.h"
|
||||
"Overlays/ZOverlay.h"
|
||||
"OtherStructs/CutsceneMM_Commands.h"
|
||||
"OtherStructs/Cutscene_Commands.h"
|
||||
"ZAnimation.h"
|
||||
"ZActorList.h"
|
||||
"ZArray.h"
|
||||
"ZAudio.h"
|
||||
"ZBackground.h"
|
||||
"ZBlob.h"
|
||||
"ZCollision.h"
|
||||
"ZCollisionPoly.h"
|
||||
"ZCutscene.h"
|
||||
"ZCutsceneMM.h"
|
||||
"ZDisplayList.h"
|
||||
"ZFile.h"
|
||||
"ZLimb.h"
|
||||
@@ -77,6 +64,7 @@ set(Header_Files__Z64
|
||||
"ZRom.h"
|
||||
"ZScalar.h"
|
||||
"ZSkeleton.h"
|
||||
"ZSurfaceType.h"
|
||||
"ZString.h"
|
||||
"ZSymbol.h"
|
||||
"ZText.h"
|
||||
@@ -136,6 +124,7 @@ set(Resource_Files
|
||||
source_group("Resource Files" FILES ${Resource_Files})
|
||||
|
||||
set(Source_Files
|
||||
"CrashHandler.cpp"
|
||||
"Declaration.cpp"
|
||||
"FileWorker.cpp"
|
||||
"GameConfig.cpp"
|
||||
@@ -165,16 +154,18 @@ source_group("Source Files\\Yaz0" FILES ${Source_Files__Yaz0})
|
||||
|
||||
set(Source_Files__Z64
|
||||
"OtherStructs/SkinLimbStructs.cpp"
|
||||
"Overlays/ZOverlay.cpp"
|
||||
"OtherStructs/CutsceneMM_Commands.cpp"
|
||||
"OtherStructs/Cutscene_Commands.cpp"
|
||||
"ZAnimation.cpp"
|
||||
"ZActorList.cpp"
|
||||
"ZArray.cpp"
|
||||
"ZAudio.cpp"
|
||||
"ZAudioDecode.cpp"
|
||||
"ZBackground.cpp"
|
||||
"ZBlob.cpp"
|
||||
"ZCollision.cpp"
|
||||
"ZCollisionPoly.cpp"
|
||||
"ZCutscene.cpp"
|
||||
"ZCutsceneMM.cpp"
|
||||
"ZDisplayList.cpp"
|
||||
"ZFile.cpp"
|
||||
"ZLimb.cpp"
|
||||
@@ -185,6 +176,7 @@ set(Source_Files__Z64
|
||||
"ZRom.cpp"
|
||||
"ZScalar.cpp"
|
||||
"ZSkeleton.cpp"
|
||||
"ZSurfaceType.cpp"
|
||||
"ZString.cpp"
|
||||
"ZSymbol.cpp"
|
||||
"ZText.cpp"
|
||||
@@ -241,7 +233,6 @@ source_group("Source Files\\Z64\\ZRoom\\Commands" FILES ${Source_Files__Z64__ZRo
|
||||
set(ALL_FILES
|
||||
${Header_Files}
|
||||
${Header_Files__Libraries}
|
||||
${Header_Files__Libraries__elfio}
|
||||
${Header_Files__Libraries__libgfxd}
|
||||
${Header_Files__Yaz0}
|
||||
${Header_Files__Z64}
|
||||
@@ -260,10 +251,17 @@ set(ALL_FILES
|
||||
################################################################################
|
||||
# Target
|
||||
################################################################################
|
||||
add_executable(${PROJECT_NAME} ${ALL_FILES})
|
||||
|
||||
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
|
||||
|
||||
add_executable(ZAPD ExecutableMain.cpp)
|
||||
target_link_libraries(ZAPD ${PROJECT_NAME})
|
||||
|
||||
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
|
||||
use_props(ZAPD "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
|
||||
endif()
|
||||
################################################################################
|
||||
# Includes for CMake from *.props
|
||||
@@ -282,7 +280,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
)
|
||||
endif()
|
||||
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
set_target_properties(ZAPD PROPERTIES
|
||||
OUTPUT_NAME "ZAPD.out"
|
||||
)
|
||||
endif()
|
||||
@@ -290,7 +288,8 @@ endif()
|
||||
# MSVC runtime library
|
||||
################################################################################
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY)
|
||||
foreach(ZTarget ${PROJECT_NAME} ZAPD)
|
||||
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${ZTarget} PROPERTY MSVC_RUNTIME_LIBRARY)
|
||||
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
|
||||
string(CONCAT "MSVC_RUNTIME_LIBRARY_STR"
|
||||
$<$<CONFIG:Debug>:
|
||||
@@ -302,7 +301,8 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||
$<$<NOT:$<OR:$<CONFIG:Debug>,$<CONFIG:Release>>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}>
|
||||
)
|
||||
endif()
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
|
||||
set_target_properties(${ZTarget} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
|
||||
endforeach()
|
||||
endif()
|
||||
################################################################################
|
||||
# Compile definitions
|
||||
@@ -404,7 +404,7 @@ if(MSVC)
|
||||
endif()
|
||||
|
||||
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang")
|
||||
target_compile_options(${PROJECT_NAME} PRIVATE
|
||||
target_compile_options(${PROJECT_NAME} PUBLIC
|
||||
-Wall -Wextra -Wno-error
|
||||
-Wno-unused-parameter
|
||||
-Wno-unused-function
|
||||
@@ -417,11 +417,11 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang")
|
||||
)
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
target_link_options(${PROJECT_NAME} PRIVATE
|
||||
target_link_options(${PROJECT_NAME} PUBLIC
|
||||
-pthread
|
||||
)
|
||||
else()
|
||||
target_link_options(${PROJECT_NAME} PRIVATE
|
||||
target_link_options(${PROJECT_NAME} PUBLIC
|
||||
-pthread
|
||||
-Wl,-export-dynamic
|
||||
)
|
||||
@@ -491,7 +491,7 @@ endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS")
|
||||
add_library(pathconf OBJECT pathconf.c)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}" $<TARGET_OBJECTS:pathconf> )
|
||||
target_link_libraries(${PROJECT_NAME} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}" $<TARGET_OBJECTS:pathconf> )
|
||||
else()
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
|
||||
target_link_libraries(${PROJECT_NAME} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
#include "CrashHandler.h"
|
||||
#include "Utils/StringHelper.h"
|
||||
|
||||
#if __has_include(<unistd.h>)
|
||||
#define HAS_POSIX 1
|
||||
#else
|
||||
#define HAS_POSIX 0
|
||||
#endif
|
||||
|
||||
#include <array>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
#if HAS_POSIX == 1
|
||||
#include <csignal>
|
||||
#include <cxxabi.h> // for __cxa_demangle
|
||||
#include <dlfcn.h> // for dladdr
|
||||
#include <execinfo.h>
|
||||
#include <unistd.h>
|
||||
#elif defined(_MSC_VER)
|
||||
#include <Windows.h>
|
||||
#include <DbgHelp.h>
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#pragma comment(lib, "Dbghelp.lib")
|
||||
#endif
|
||||
|
||||
// Feel free to add more crash messages.
|
||||
static std::array<const char* const, 14> crashEasterEgg = {
|
||||
"\tYou've met with a terrible fate, haven't you?",
|
||||
"\tSEA BEARS FOAM. SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY: CRASSSH!",
|
||||
"\tZAPD has fallen and cannot get up.",
|
||||
"\tIT'S A SECRET TO EVERYBODY. \n\tBut it shouldn't be, you'd better ask about it!",
|
||||
"\tI AM ERROR.",
|
||||
"\tGRUMBLE,GRUMBLE...",
|
||||
"\tDODONGO DISLIKES SMOKE \n\tAnd ZAPD dislikes whatever you fed it.",
|
||||
"\tMay the way of the Hero lead \n\tto the debugger.",
|
||||
"\tTHE WIND FISH SLUMBERS LONG... \n\tTHE HERO'S LIFE GONE... ",
|
||||
"\tSEA BEARS FOAM, SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY CRASSSH!",
|
||||
"\tYou've met with a terrible fate, haven't you?",
|
||||
"\tMaster, I calculate a 100% probability that ZAPD has crashed. \n\tAdditionally, the "
|
||||
"batteries in your Wii Remote are nearly depleted.",
|
||||
"\t CONGRATURATIONS! \n"
|
||||
"\tAll Pages are displayed.\n"
|
||||
"\t THANK YOU! \n"
|
||||
"\t You are great debugger!",
|
||||
"\tRCP is HUNG UP!!\n"
|
||||
"\tOh! MY GOD!!",
|
||||
};
|
||||
|
||||
#if HAS_POSIX == 1
|
||||
void ErrorHandler(int sig)
|
||||
{
|
||||
std::array<void*, 4096> arr;
|
||||
constexpr size_t nMaxFrames = arr.size();
|
||||
size_t size = backtrace(arr.data(), nMaxFrames);
|
||||
char** symbols = backtrace_symbols(arr.data(), nMaxFrames);
|
||||
|
||||
fprintf(stderr, "\nZAPD crashed. (Signal: %i)\n", sig);
|
||||
|
||||
srand(time(nullptr));
|
||||
auto easterIndex = rand() % crashEasterEgg.size();
|
||||
|
||||
fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]);
|
||||
|
||||
fprintf(stderr, "Traceback:\n");
|
||||
for (size_t i = 1; i < size; i++)
|
||||
{
|
||||
Dl_info info;
|
||||
uint32_t gotAddress = dladdr(arr[i], &info);
|
||||
std::string functionName(symbols[i]);
|
||||
|
||||
if (gotAddress != 0 && info.dli_sname != nullptr)
|
||||
{
|
||||
int32_t status;
|
||||
char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status);
|
||||
const char* nameFound = info.dli_sname;
|
||||
|
||||
if (status == 0)
|
||||
{
|
||||
nameFound = demangled;
|
||||
}
|
||||
|
||||
functionName = StringHelper::Sprintf("%s (+0x%X)", nameFound,
|
||||
(char*)arr[i] - (char*)info.dli_saddr);
|
||||
free(demangled);
|
||||
}
|
||||
|
||||
fprintf(stderr, "%-3zd %s\n", i, functionName.c_str());
|
||||
}
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
free(symbols);
|
||||
exit(1);
|
||||
}
|
||||
#elif defined(_MSC_VER)
|
||||
|
||||
void printStack(CONTEXT* ctx)
|
||||
{
|
||||
BOOL result;
|
||||
HANDLE process;
|
||||
HANDLE thread;
|
||||
HMODULE hModule;
|
||||
ULONG frame;
|
||||
DWORD64 displacement;
|
||||
DWORD disp;
|
||||
|
||||
srand(time(nullptr));
|
||||
auto easterIndex = rand() % crashEasterEgg.size();
|
||||
|
||||
fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]);
|
||||
|
||||
#if defined(_M_AMD64)
|
||||
STACKFRAME64 stack;
|
||||
memset(&stack, 0, sizeof(STACKFRAME64));
|
||||
#else
|
||||
STACKFRAME stack;
|
||||
memset(&stack, 0, sizeof(STACKFRAME));
|
||||
#endif
|
||||
|
||||
char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME + sizeof(TCHAR)];
|
||||
char module[512];
|
||||
|
||||
PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer;
|
||||
|
||||
CONTEXT ctx2;
|
||||
memcpy(&ctx2, ctx, sizeof(CONTEXT));
|
||||
|
||||
process = GetCurrentProcess();
|
||||
thread = GetCurrentThread();
|
||||
SymInitialize(process, nullptr, TRUE);
|
||||
|
||||
constexpr DWORD machineType =
|
||||
#if defined(_M_AMD64)
|
||||
IMAGE_FILE_MACHINE_AMD64;
|
||||
#else
|
||||
IMAGE_FILE_MACHINE_I386;
|
||||
#endif
|
||||
|
||||
displacement = 0;
|
||||
|
||||
for (frame = 0;; frame++)
|
||||
{
|
||||
result = StackWalk(machineType, process, thread, &stack, &ctx2, nullptr,
|
||||
SymFunctionTableAccess, SymGetModuleBase, nullptr);
|
||||
if (!result)
|
||||
{
|
||||
break;
|
||||
}
|
||||
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
|
||||
symbol->MaxNameLen = MAX_SYM_NAME;
|
||||
SymFromAddr(process, (ULONG64)stack.AddrPC.Offset, &displacement, symbol);
|
||||
#if defined(_M_AMD64)
|
||||
IMAGEHLP_LINE64 line;
|
||||
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
|
||||
#else
|
||||
IMAGEHLP_LINE line;
|
||||
line.SizeOfStruct = sizeof(IMAGEHLP_LINE);
|
||||
#endif
|
||||
if (SymGetLineFromAddr(process, stack.AddrPC.Offset, &disp, &line))
|
||||
{
|
||||
fprintf(stderr, "%u\t %s in %s: line: %lu: \n", frame, symbol->Name, line.FileName,
|
||||
line.LineNumber);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "%u\tat % s\n", frame, symbol->Name);
|
||||
hModule = nullptr;
|
||||
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
|
||||
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||
(LPCTSTR)(stack.AddrPC.Offset), &hModule);
|
||||
|
||||
if (hModule != nullptr)
|
||||
{
|
||||
GetModuleFileNameA(hModule, module, 512 - 1);
|
||||
}
|
||||
fprintf(stderr, "%u\tIn %s\n", frame, module);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LONG seh_filter(_EXCEPTION_POINTERS* ex)
|
||||
{
|
||||
fprintf(stderr, "EXCEPTION 0x%x occured\n", ex->ExceptionRecord->ExceptionCode);
|
||||
printStack(ex->ContextRecord);
|
||||
return EXCEPTION_EXECUTE_HANDLER;
|
||||
}
|
||||
#endif
|
||||
|
||||
void CrashHandler_Init()
|
||||
{
|
||||
#if HAS_POSIX == 1
|
||||
signal(SIGSEGV, ErrorHandler);
|
||||
signal(SIGABRT, ErrorHandler);
|
||||
#elif defined(_MSC_VER)
|
||||
SetUnhandledExceptionFilter(seh_filter);
|
||||
#else
|
||||
HANDLE_WARNING(WarningType::Always,
|
||||
"tried to set error handler, but this ZAPD build lacks support for one", "");
|
||||
#endif
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef CRASH_HANDLER_H
|
||||
#define CRASH_HANDLER_H
|
||||
|
||||
void CrashHandler_Init();
|
||||
|
||||
#endif
|
||||
@@ -178,7 +178,7 @@ std::string Declaration::GetExternalDeclarationStr() const
|
||||
|
||||
std::string Declaration::GetExternStr() const
|
||||
{
|
||||
if (IsStatic() || varType == "")
|
||||
if (IsStatic() || varType == "" || isUnaccounted)
|
||||
{
|
||||
return "";
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <cstdint>
|
||||
|
||||
// TODO: should we drop the `_t` suffix because of UNIX compliance?
|
||||
typedef uint32_t segptr_t;
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
extern "C" int zapd_main(int argc, char* argv[]);
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
return zapd_main(argc, argv);
|
||||
}
|
||||
@@ -2,9 +2,10 @@
|
||||
|
||||
#include <functional>
|
||||
#include <string_view>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "Utils/Directory.h"
|
||||
#include "Utils/File.h"
|
||||
#include <Utils/DiskFile.h>
|
||||
#include "Utils/Path.h"
|
||||
#include "ZFile.h"
|
||||
#include "tinyxml2.h"
|
||||
@@ -56,7 +57,7 @@ void GameConfig::ReadTexturePool(const fs::path& texturePoolXmlPath)
|
||||
|
||||
void GameConfig::GenSymbolMap(const fs::path& symbolMapPath)
|
||||
{
|
||||
auto symbolLines = File::ReadAllLines(symbolMapPath);
|
||||
auto symbolLines = DiskFile::ReadAllLines(symbolMapPath);
|
||||
|
||||
for (std::string& symbolLine : symbolLines)
|
||||
{
|
||||
@@ -78,7 +79,7 @@ void GameConfig::ConfigFunc_ActorList(const tinyxml2::XMLElement& element)
|
||||
{
|
||||
std::string fileName = element.Attribute("File");
|
||||
std::vector<std::string> lines =
|
||||
File::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
|
||||
DiskFile::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
|
||||
|
||||
for (auto& line : lines)
|
||||
actorList.emplace_back(std::move(line));
|
||||
@@ -88,12 +89,32 @@ void GameConfig::ConfigFunc_ObjectList(const tinyxml2::XMLElement& element)
|
||||
{
|
||||
std::string fileName = element.Attribute("File");
|
||||
std::vector<std::string> lines =
|
||||
File::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
|
||||
DiskFile::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
|
||||
|
||||
for (auto& line : lines)
|
||||
objectList.emplace_back(std::move(line));
|
||||
}
|
||||
|
||||
void GameConfig::ConfigFunc_EntranceList(const tinyxml2::XMLElement& element)
|
||||
{
|
||||
std::string fileName = element.Attribute("File");
|
||||
std::vector<std::string> lines =
|
||||
DiskFile::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
|
||||
|
||||
for (auto& line : lines)
|
||||
entranceList.emplace_back(std::move(line));
|
||||
}
|
||||
|
||||
void GameConfig::ConfigFunc_specialEntranceList(const tinyxml2::XMLElement& element)
|
||||
{
|
||||
std::string fileName = element.Attribute("File");
|
||||
std::vector<std::string> lines =
|
||||
DiskFile::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
|
||||
|
||||
for (auto& line : lines)
|
||||
specialEntranceList.emplace_back(std::move(line));
|
||||
}
|
||||
|
||||
void GameConfig::ConfigFunc_TexturePool(const tinyxml2::XMLElement& element)
|
||||
{
|
||||
std::string fileName = element.Attribute("File");
|
||||
@@ -145,10 +166,12 @@ void GameConfig::ConfigFunc_ExternalFile(const tinyxml2::XMLElement& element)
|
||||
|
||||
void GameConfig::ReadConfigFile(const fs::path& argConfigFilePath)
|
||||
{
|
||||
static const std::map<std::string, ConfigFunc> ConfigFuncDictionary = {
|
||||
static const std::unordered_map<std::string, ConfigFunc> ConfigFuncDictionary = {
|
||||
{"SymbolMap", &GameConfig::ConfigFunc_SymbolMap},
|
||||
{"ActorList", &GameConfig::ConfigFunc_ActorList},
|
||||
{"ObjectList", &GameConfig::ConfigFunc_ObjectList},
|
||||
{"EntranceList", &GameConfig::ConfigFunc_EntranceList},
|
||||
{"SpecialEntranceList", &GameConfig::ConfigFunc_specialEntranceList},
|
||||
{"TexturePool", &GameConfig::ConfigFunc_TexturePool},
|
||||
{"BGConfig", &GameConfig::ConfigFunc_BGConfig},
|
||||
{"ExternalXMLFolder", &GameConfig::ConfigFunc_ExternalXMLFolder},
|
||||
|
||||
@@ -31,6 +31,8 @@ public:
|
||||
std::map<uint32_t, std::string> symbolMap;
|
||||
std::vector<std::string> actorList;
|
||||
std::vector<std::string> objectList;
|
||||
std::vector<std::string> entranceList;
|
||||
std::vector<std::string> specialEntranceList;
|
||||
std::map<uint32_t, TexturePoolEntry> texturePool; // Key = CRC
|
||||
|
||||
// ZBackground
|
||||
@@ -49,6 +51,8 @@ public:
|
||||
void ConfigFunc_SymbolMap(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_ActorList(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_ObjectList(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_EntranceList(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_specialEntranceList(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_TexturePool(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_BGConfig(const tinyxml2::XMLElement& element);
|
||||
void ConfigFunc_ExternalXMLFolder(const tinyxml2::XMLElement& element);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#include <algorithm>
|
||||
#include <string_view>
|
||||
|
||||
#include "Utils/File.h"
|
||||
#include <Utils/DiskFile.h>
|
||||
#include "Utils/Path.h"
|
||||
#include "WarningHandler.h"
|
||||
#include "tinyxml2.h"
|
||||
@@ -27,11 +27,14 @@ Globals::Globals()
|
||||
|
||||
Globals::~Globals()
|
||||
{
|
||||
auto& exporters = GetExporterMap();
|
||||
|
||||
for (auto& it : exporters)
|
||||
for (const auto& w : workerData)
|
||||
{
|
||||
delete it.second;
|
||||
delete w.second;
|
||||
}
|
||||
|
||||
if (rom != nullptr)
|
||||
{
|
||||
delete rom;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,12 +134,12 @@ void Globals::BuildAssetTexture(const fs::path& pngFilePath, TextureType texType
|
||||
tex.FromPNG(pngFilePath.string(), texType);
|
||||
std::string cfgPath = StringHelper::Split(pngFilePath.string(), ".")[0] + ".cfg";
|
||||
|
||||
if (File::Exists(cfgPath))
|
||||
name = File::ReadAllText(cfgPath);
|
||||
if (DiskFile::Exists(cfgPath))
|
||||
name = DiskFile::ReadAllText(cfgPath);
|
||||
|
||||
std::string src = tex.GetBodySourceCode();
|
||||
|
||||
File::WriteAllBytes(outPath.string(), src.c_str(), src.size());
|
||||
DiskFile::WriteAllBytes(outPath.string(), src.c_str(), src.size());
|
||||
}
|
||||
|
||||
std::map<std::string, ExporterSet*>& Globals::GetExporterMap()
|
||||
@@ -183,7 +186,7 @@ std::vector<uint8_t> Globals::GetBaseromFile(std::string fileName)
|
||||
|
||||
}
|
||||
else
|
||||
return File::ReadAllBytes(fileName);
|
||||
return DiskFile::ReadAllBytes(fileName);
|
||||
}
|
||||
|
||||
bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile,
|
||||
|
||||
@@ -22,6 +22,7 @@ typedef bool (*ExporterSetFuncBool)(ZFileMode fileMode);
|
||||
typedef void (*ExporterSetFuncVoid)(int argc, char* argv[], int& i);
|
||||
typedef void (*ExporterSetFuncVoid2)(const std::string& buildMode, ZFileMode& fileMode);
|
||||
typedef void (*ExporterSetFuncVoid3)();
|
||||
typedef void (*ExporterSetFuncVoid4)(tinyxml2::XMLElement* reader);
|
||||
typedef void (*ExporterSetResSave)(ZResource* res, BinaryWriter& writer);
|
||||
|
||||
class ExporterSet
|
||||
@@ -39,6 +40,8 @@ public:
|
||||
ExporterSetFuncVoid3 endXMLFunc = nullptr;
|
||||
ExporterSetResSave resSaveFunc = nullptr;
|
||||
ExporterSetFuncVoid3 endProgramFunc = nullptr;
|
||||
|
||||
ExporterSetFuncVoid4 processCompilableFunc = nullptr;
|
||||
};
|
||||
|
||||
class Globals
|
||||
@@ -54,7 +57,7 @@ public:
|
||||
bool useLegacyZDList;
|
||||
bool singleThreaded;
|
||||
VerbosityLevel verbosity; // ZAPD outputs additional information
|
||||
ZFileMode fileMode;
|
||||
ZFileMode fileMode = ZFileMode::Invalid;
|
||||
fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath, fileListPath;
|
||||
TextureType texType;
|
||||
ZGame game;
|
||||
@@ -65,8 +68,9 @@ public:
|
||||
bool forceUnaccountedStatic = false;
|
||||
bool otrMode = true;
|
||||
bool buildRawTexture = false;
|
||||
bool onlyGenSohOtr = false;
|
||||
|
||||
ZRom* rom;
|
||||
ZRom* rom = nullptr;
|
||||
std::vector<ZFile*> files;
|
||||
std::vector<ZFile*> externalFiles;
|
||||
std::vector<int32_t> segments;
|
||||
|
||||
@@ -398,7 +398,7 @@ void ImageBackend::SetPaletteIndex(size_t index, uint8_t nR, uint8_t nG, uint8_t
|
||||
alphaPalette[index] = nA;
|
||||
}
|
||||
|
||||
void ImageBackend::SetPalette(const ImageBackend& pal)
|
||||
void ImageBackend::SetPalette(const ImageBackend& pal, uint32_t offset)
|
||||
{
|
||||
assert(isColorIndexed);
|
||||
size_t bytePerPixel = pal.GetBytesPerPixel();
|
||||
@@ -422,7 +422,7 @@ void ImageBackend::SetPalette(const ImageBackend& pal)
|
||||
uint8_t g = pal.pixelMatrix[y][x * bytePerPixel + 1];
|
||||
uint8_t b = pal.pixelMatrix[y][x * bytePerPixel + 2];
|
||||
uint8_t a = pal.pixelMatrix[y][x * bytePerPixel + 3];
|
||||
SetPaletteIndex(index, r, g, b, a);
|
||||
SetPaletteIndex(index + offset, r, g, b, a);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,8 +42,9 @@ public:
|
||||
void SetGrayscalePixel(size_t y, size_t x, uint8_t grayscale, uint8_t alpha = 0);
|
||||
|
||||
void SetIndexedPixel(size_t y, size_t x, uint8_t index, uint8_t grayscale);
|
||||
void SetIndexedPixel(size_t y, size_t x, uint8_t index, RGBAPixel pixel);
|
||||
void SetPaletteIndex(size_t index, uint8_t nR, uint8_t nG, uint8_t nB, uint8_t nA);
|
||||
void SetPalette(const ImageBackend& pal);
|
||||
void SetPalette(const ImageBackend& pal, uint32_t offset = 0);
|
||||
|
||||
uint32_t GetWidth() const;
|
||||
uint32_t GetHeight() const;
|
||||
|
||||
@@ -1,24 +1,77 @@
|
||||
#include "Globals.h"
|
||||
#include "Overlays/ZOverlay.h"
|
||||
#include "Utils/Directory.h"
|
||||
#include "Utils/File.h"
|
||||
#include <Utils/DiskFile.h>
|
||||
#include "Utils/Path.h"
|
||||
#include "WarningHandler.h"
|
||||
|
||||
#include "ZAnimation.h"
|
||||
ZNormalAnimation nAnim(nullptr);
|
||||
ZCurveAnimation cAnim(nullptr);
|
||||
ZLinkAnimation lAnim(nullptr);
|
||||
ZLegacyAnimation lAnim2(nullptr);
|
||||
|
||||
#include "ZArray.h"
|
||||
ZArray arr(nullptr);
|
||||
|
||||
#include "ZAudio.h"
|
||||
ZAudio audio(nullptr);
|
||||
|
||||
#include "ZBackground.h"
|
||||
ZBackground back(nullptr);
|
||||
|
||||
#include "ZBlob.h"
|
||||
ZBlob blob(nullptr);
|
||||
|
||||
#include "ZCollision.h"
|
||||
ZCollisionHeader colHeader(nullptr);
|
||||
|
||||
#include "ZCutscene.h"
|
||||
ZCutscene cs(nullptr);
|
||||
|
||||
#include "ZLimb.h"
|
||||
ZLimb limb(nullptr);
|
||||
|
||||
#include "ZMtx.h"
|
||||
ZMtx mtx(nullptr);
|
||||
|
||||
#include "ZPath.h"
|
||||
ZPath path(nullptr);
|
||||
|
||||
#include "ZPlayerAnimationData.h"
|
||||
ZPlayerAnimationData pAnimData(nullptr);
|
||||
|
||||
#include "ZScalar.h"
|
||||
ZScalar scalar(nullptr);
|
||||
|
||||
#include "ZSkeleton.h"
|
||||
ZLimbTable limbTbl(nullptr);
|
||||
ZSkeleton skel(nullptr);
|
||||
|
||||
#include "ZString.h"
|
||||
ZString str(nullptr);
|
||||
|
||||
#include "ZSymbol.h"
|
||||
ZSymbol sym(nullptr);
|
||||
|
||||
#include "ZText.h"
|
||||
ZText txt(nullptr);
|
||||
|
||||
#include "ZTexture.h"
|
||||
ZTexture tex(nullptr);
|
||||
|
||||
#include "ZVector.h"
|
||||
ZVector vec(nullptr);
|
||||
|
||||
#include "ZVtx.h"
|
||||
ZVtx vtx(nullptr);
|
||||
|
||||
#include "ZRoom/ZRoom.h"
|
||||
ZRoom room(nullptr);
|
||||
|
||||
#include "ZFile.h"
|
||||
#include "ZTexture.h"
|
||||
|
||||
#ifdef __linux__
|
||||
#include <csignal>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
#include <cxxabi.h> // for __cxa_demangle
|
||||
#include <dlfcn.h> // for dladdr
|
||||
#include <execinfo.h>
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include "CrashHandler.h"
|
||||
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
@@ -28,31 +81,6 @@
|
||||
//extern const char gBuildHash[];
|
||||
const char gBuildHash[] = "";
|
||||
|
||||
// LINUX_TODO: remove, those are because of soh <-> lus dependency problems
|
||||
float divisor_num = 0.0f;
|
||||
|
||||
extern "C" void Audio_SetGameVolume(int player_id, float volume)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
extern "C" int ResourceMgr_OTRSigCheck(char* imgData)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void DebugConsole_SaveCVars()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DebugConsole_LoadCVars()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath,
|
||||
ZFileMode fileMode, int workerID);
|
||||
|
||||
@@ -63,63 +91,9 @@ int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileM
|
||||
|
||||
volatile int numWorkersLeft = 0;
|
||||
|
||||
#ifdef __linux__
|
||||
#define ARRAY_COUNT(arr) (sizeof(arr) / sizeof(arr[0]))
|
||||
void ErrorHandler(int sig)
|
||||
{
|
||||
void* array[4096];
|
||||
const size_t nMaxFrames = sizeof(array) / sizeof(array[0]);
|
||||
size_t size = backtrace(array, nMaxFrames);
|
||||
char** symbols = backtrace_symbols(array, nMaxFrames);
|
||||
extern void ImportExporters();
|
||||
|
||||
fprintf(stderr, "\nZAPD crashed. (Signal: %i)\n", sig);
|
||||
|
||||
// Feel free to add more crash messages.
|
||||
const char* crashEasterEgg[] = {
|
||||
"\tYou've met with a terrible fate, haven't you?",
|
||||
"\tSEA BEARS FOAM. SLEEP BEARS DREAMS. \n\tBOTH END IN THE SAME WAY: CRASSSH!",
|
||||
"\tZAPD has fallen and cannot get up.",
|
||||
};
|
||||
|
||||
srand(time(nullptr));
|
||||
auto easterIndex = rand() % ARRAY_COUNT(crashEasterEgg);
|
||||
|
||||
fprintf(stderr, "\n%s\n\n", crashEasterEgg[easterIndex]);
|
||||
|
||||
fprintf(stderr, "Traceback:\n");
|
||||
for (size_t i = 1; i < size; i++)
|
||||
{
|
||||
Dl_info info;
|
||||
uint32_t gotAddress = dladdr(array[i], &info);
|
||||
std::string functionName(symbols[i]);
|
||||
|
||||
if (gotAddress != 0 && info.dli_sname != nullptr)
|
||||
{
|
||||
int32_t status;
|
||||
char* demangled = abi::__cxa_demangle(info.dli_sname, nullptr, nullptr, &status);
|
||||
const char* nameFound = info.dli_sname;
|
||||
|
||||
if (status == 0)
|
||||
{
|
||||
nameFound = demangled;
|
||||
}
|
||||
|
||||
functionName = StringHelper::Sprintf("%s (+0x%X)", nameFound,
|
||||
(char*)array[i] - (char*)info.dli_saddr);
|
||||
free(demangled);
|
||||
}
|
||||
|
||||
fprintf(stderr, "%-3zd %s\n", i, functionName.c_str());
|
||||
}
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
|
||||
free(symbols);
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
extern "C" int zapd_main(int argc, char* argv[])
|
||||
{
|
||||
// Syntax: ZAPD.out [mode (btex/bovl/e)] (Arbritrary Number of Arguments)
|
||||
|
||||
@@ -205,12 +179,6 @@ int main(int argc, char* argv[])
|
||||
{
|
||||
Globals::Instance->texType = ZTexture::GetTextureTypeFromString(argv[++i]);
|
||||
}
|
||||
else if (arg == "-cfg") // Set cfg path (for overlays)
|
||||
// TODO: Change the name of this to something else so it doesn't
|
||||
// get confused with XML config files.
|
||||
{
|
||||
Globals::Instance->cfgPath = argv[++i];
|
||||
}
|
||||
else if (arg == "-fl") // Set baserom filelist path
|
||||
{
|
||||
Globals::Instance->fileListPath = argv[++i];
|
||||
@@ -221,16 +189,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else if (arg == "-eh") // Enable Error Handler
|
||||
{
|
||||
#ifdef __linux__
|
||||
signal(SIGSEGV, ErrorHandler);
|
||||
signal(SIGABRT, ErrorHandler);
|
||||
#else
|
||||
// HANDLE_WARNING(WarningType::Always,
|
||||
// "tried to set error handler, but this ZAPD build lacks support for one",
|
||||
// "");
|
||||
#endif
|
||||
|
||||
|
||||
CrashHandler_Init();
|
||||
}
|
||||
else if (arg == "-v") // Verbose
|
||||
{
|
||||
@@ -242,6 +201,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else if (arg == "-se" || arg == "--set-exporter") // Set Current Exporter
|
||||
{
|
||||
ImportExporters();
|
||||
Globals::Instance->currentExporter = argv[++i];
|
||||
}
|
||||
else if (arg == "--gcc-compat") // GCC compatibility
|
||||
@@ -260,10 +220,23 @@ int main(int argc, char* argv[])
|
||||
{
|
||||
Globals::Instance->buildRawTexture = true;
|
||||
}
|
||||
else if (arg == "--norom")
|
||||
{
|
||||
Globals::Instance->onlyGenSohOtr = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Parse File Mode
|
||||
ExporterSet* exporterSet = Globals::Instance->GetExporterSet();
|
||||
|
||||
if(Globals::Instance->onlyGenSohOtr) {
|
||||
exporterSet->endProgramFunc();
|
||||
|
||||
delete g;
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string buildMode = argv[1];
|
||||
ZFileMode fileMode = ZFileMode::Invalid;
|
||||
|
||||
@@ -271,8 +244,6 @@ int main(int argc, char* argv[])
|
||||
fileMode = ZFileMode::BuildTexture;
|
||||
else if (buildMode == "bren")
|
||||
fileMode = ZFileMode::BuildBackground;
|
||||
else if (buildMode == "bovl")
|
||||
fileMode = ZFileMode::BuildOverlay;
|
||||
else if (buildMode == "bsf")
|
||||
fileMode = ZFileMode::BuildSourceFile;
|
||||
else if (buildMode == "bblb")
|
||||
@@ -420,6 +391,11 @@ int main(int argc, char* argv[])
|
||||
if (exporterSet != nullptr && exporterSet->endProgramFunc != nullptr)
|
||||
exporterSet->endProgramFunc();
|
||||
|
||||
end:
|
||||
delete exporterSet;
|
||||
|
||||
//Globals::Instance->GetExporterSet() = nullptr; //TODO NULL this out. Compiler complains about lvalue assignment.
|
||||
|
||||
delete g;
|
||||
return 0;
|
||||
}
|
||||
@@ -602,7 +578,7 @@ void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath
|
||||
ZBackground background(nullptr);
|
||||
background.ParseBinaryFile(imageFilePath.string(), false);
|
||||
|
||||
File::WriteAllText(outPath.string(), background.GetBodySourceCode());
|
||||
DiskFile::WriteAllText(outPath.string(), background.GetBodySourceCode());
|
||||
}
|
||||
|
||||
void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath)
|
||||
@@ -612,7 +588,7 @@ void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath)
|
||||
|
||||
std::string src = blob->GetBodySourceCode();
|
||||
|
||||
File::WriteAllText(outPath.string(), src);
|
||||
DiskFile::WriteAllText(outPath.string(), src);
|
||||
|
||||
delete blob;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,213 @@
|
||||
#include "CutsceneMM_Commands.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "Utils/BitConverter.h"
|
||||
#include "Utils/StringHelper.h"
|
||||
|
||||
// Specific for command lists where each entry has size 8 bytes
|
||||
const std::unordered_map<CutsceneMMCommands, CsCommandListDescriptor> csCommandsDescMM = {
|
||||
{CutsceneMMCommands::CS_CMD_MISC, {"CS_MISC", "(0x%02X, %i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_SET_LIGHTING, {"CS_LIGHTING", "(0x%02X, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_SCENE_TRANS_FX, {"CS_SCENE_TRANS_FX", "(%i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_MOTIONBLUR, {"CS_MOTIONBLUR", "(%i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_GIVETATL, {"CS_GIVETATL", "(%i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_PLAYSEQ, {"CS_PLAYSEQ", "(0x%04X, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_130, {"CS_SCENE_UNK_130", "(0x%04X, %i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_131, {"CS_SCENE_UNK_131", "(0x%04X, %i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_132, {"CS_SCENE_UNK_132", "(%i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_STOPSEQ, {"CS_STOPSEQ", "(0x%04X, %i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_PLAYAMBIENCE, {"CS_PLAYAMBIENCE", "(0x%04X, %i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_FADEAMBIENCE, {"CS_FADEAMBIENCE", "(0x%04X, %i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_TERMINATOR, {"CS_TERMINATOR", "(%i, %i, %i)"}},
|
||||
{CutsceneMMCommands::CS_CMD_CHOOSE_CREDITS_SCENES,
|
||||
{"CS_CHOOSE_CREDITS_SCENES", "(%i, %i, %i)"}},
|
||||
};
|
||||
|
||||
CutsceneSubCommandEntry_GenericMMCmd::CutsceneSubCommandEntry_GenericMMCmd(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex, CutsceneMMCommands cmdId)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex), commandId(cmdId)
|
||||
{
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_GenericMMCmd::GetBodySourceCode() const
|
||||
{
|
||||
const auto& element = csCommandsDescMM.find(commandId);
|
||||
std::string entryFmt = "CS_UNK_DATA(0x%02X, %i, %i, %i)";
|
||||
|
||||
if (element != csCommandsDescMM.end())
|
||||
{
|
||||
entryFmt = element->second.cmdMacro;
|
||||
entryFmt += element->second.args;
|
||||
}
|
||||
|
||||
return StringHelper::Sprintf(entryFmt.c_str(), base, startFrame, endFrame, pad);
|
||||
}
|
||||
|
||||
CutsceneMMCommand_GenericCmd::CutsceneMMCommand_GenericCmd(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex,
|
||||
CutsceneMMCommands cmdId)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
commandID = static_cast<uint32_t>(cmdId);
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_GenericMMCmd(rawData, rawDataIndex, cmdId);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneMMCommand_GenericCmd::GetCommandMacro() const
|
||||
{
|
||||
const auto& element = csCommandsDescMM.find(static_cast<CutsceneMMCommands>(commandID));
|
||||
|
||||
if (element != csCommandsDescMM.end())
|
||||
{
|
||||
return StringHelper::Sprintf("%s_LIST(%i)", element->second.cmdMacro, numEntries);
|
||||
}
|
||||
|
||||
return StringHelper::Sprintf("CS_UNK_DATA_LIST(0x%X, %i)", commandID, numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_Camera::CutsceneSubCommandEntry_Camera(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_Camera::GetBodySourceCode() const
|
||||
{
|
||||
return StringHelper::Sprintf("CMD_HH(0x%04X, 0x%04X)", base, startFrame);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_Camera::GetRawSize() const
|
||||
{
|
||||
return 0x04;
|
||||
}
|
||||
|
||||
CutsceneMMCommand_Camera::CutsceneMMCommand_Camera(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries / 4; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_Camera(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneMMCommand_Camera::GetCommandMacro() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_CAMERA_LIST(%i)", numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_FadeScreen::CutsceneSubCommandEntry_FadeScreen(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
unk_06 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x06);
|
||||
unk_07 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x07);
|
||||
unk_08 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x08);
|
||||
unk_09 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x09);
|
||||
unk_0A = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x0A);
|
||||
unk_0B = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x0B);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_FadeScreen::GetBodySourceCode() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_FADESCREEN(0x%02X, %i, %i, %i, %i, %i)", base, startFrame,
|
||||
endFrame, unk_06, unk_07, unk_08);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_FadeScreen::GetRawSize() const
|
||||
{
|
||||
return 0x0C;
|
||||
}
|
||||
|
||||
CutsceneMMCommand_FadeScreen::CutsceneMMCommand_FadeScreen(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_FadeScreen(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneMMCommand_FadeScreen::GetCommandMacro() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_FADESCREEN_LIST(%i)", numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_FadeSeq::CutsceneSubCommandEntry_FadeSeq(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
unk_08 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_FadeSeq::GetBodySourceCode() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_FADESEQ(%i, %i, %i)", base, startFrame, endFrame);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_FadeSeq::GetRawSize() const
|
||||
{
|
||||
return 0x0C;
|
||||
}
|
||||
|
||||
CutsceneMMCommand_FadeSeq::CutsceneMMCommand_FadeSeq(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_FadeSeq(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneMMCommand_FadeSeq::GetCommandMacro() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_FADESEQ_LIST(%i)", numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_NonImplemented::CutsceneSubCommandEntry_NonImplemented(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
}
|
||||
|
||||
CutsceneMMCommand_NonImplemented::CutsceneMMCommand_NonImplemented(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_NonImplemented(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,140 @@
|
||||
#pragma once
|
||||
|
||||
#include "Cutscene_Commands.h"
|
||||
|
||||
enum class CutsceneMMCommands
|
||||
{
|
||||
/* 0x00A */ CS_CMD_TEXTBOX = 0xA,
|
||||
/* 0x05A */ CS_CMD_CAMERA = 0x5A,
|
||||
/* 0x096 */ CS_CMD_MISC = 0x96,
|
||||
/* 0x097 */ CS_CMD_SET_LIGHTING,
|
||||
/* 0x098 */ CS_CMD_SCENE_TRANS_FX,
|
||||
/* 0x099 */ CS_CMD_MOTIONBLUR,
|
||||
/* 0x09A */ CS_CMD_GIVETATL,
|
||||
/* 0x09B */ CS_CMD_FADESCREEN,
|
||||
/* 0x09C */ CS_CMD_FADESEQ,
|
||||
/* 0x09D */ CS_CMD_SETTIME,
|
||||
/* 0x0C8 */ CS_CMD_SET_PLAYER_ACTION = 0xC8,
|
||||
/* 0x0FA */ CS_CMD_UNK_FA = 0xFA,
|
||||
/* 0x0FE */ CS_CMD_UNK_FE = 0xFE,
|
||||
/* 0x0FF */ CS_CMD_UNK_FF,
|
||||
/* 0x100 */ CS_CMD_UNK_100,
|
||||
/* 0x101 */ CS_CMD_UNK_101,
|
||||
/* 0x102 */ CS_CMD_UNK_102,
|
||||
/* 0x103 */ CS_CMD_UNK_103,
|
||||
/* 0x104 */ CS_CMD_UNK_104,
|
||||
/* 0x105 */ CS_CMD_UNK_105,
|
||||
/* 0x108 */ CS_CMD_UNK_108 = 0x108,
|
||||
/* 0x109 */ CS_CMD_UNK_109,
|
||||
/* 0x12C */ CS_CMD_PLAYSEQ = 0x12C,
|
||||
/* 0x12D */ CS_CMD_UNK_12D,
|
||||
/* 0x130 */ CS_CMD_130 = 0x130,
|
||||
/* 0x131 */ CS_CMD_131 = 0x131,
|
||||
/* 0x132 */ CS_CMD_132 = 0x132,
|
||||
/* 0x133 */ CS_CMD_STOPSEQ,
|
||||
/* 0x134 */ CS_CMD_PLAYAMBIENCE,
|
||||
/* 0x135 */ CS_CMD_FADEAMBIENCE,
|
||||
/* 0x15E */ CS_CMD_TERMINATOR = 0x15E,
|
||||
/* 0x15F */ CS_CMD_CHOOSE_CREDITS_SCENES,
|
||||
/* 0x190 */ CS_CMD_RUMBLE = 0x190,
|
||||
};
|
||||
|
||||
class CutsceneSubCommandEntry_GenericMMCmd : public CutsceneSubCommandEntry
|
||||
{
|
||||
public:
|
||||
CutsceneMMCommands commandId;
|
||||
|
||||
CutsceneSubCommandEntry_GenericMMCmd(const std::vector<uint8_t>& rawData, offset_t rawDataIndex,
|
||||
CutsceneMMCommands cmdId);
|
||||
|
||||
std::string GetBodySourceCode() const override;
|
||||
};
|
||||
|
||||
class CutsceneMMCommand_GenericCmd : public CutsceneCommand
|
||||
{
|
||||
public:
|
||||
CutsceneMMCommand_GenericCmd(const std::vector<uint8_t>& rawData, offset_t rawDataIndex,
|
||||
CutsceneMMCommands cmdId);
|
||||
|
||||
std::string GetCommandMacro() const override;
|
||||
};
|
||||
|
||||
// TODO: MM cutscene camera command is implemented as a placeholder until we better understand how
|
||||
// it works
|
||||
class CutsceneSubCommandEntry_Camera : public CutsceneSubCommandEntry
|
||||
{
|
||||
public:
|
||||
uint32_t unk_08;
|
||||
|
||||
CutsceneSubCommandEntry_Camera(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
|
||||
std::string GetBodySourceCode() const override;
|
||||
|
||||
size_t GetRawSize() const override;
|
||||
};
|
||||
|
||||
class CutsceneMMCommand_Camera : public CutsceneCommand
|
||||
{
|
||||
public:
|
||||
CutsceneMMCommand_Camera(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
|
||||
std::string GetCommandMacro() const override;
|
||||
};
|
||||
|
||||
class CutsceneSubCommandEntry_FadeScreen : public CutsceneSubCommandEntry
|
||||
{
|
||||
public:
|
||||
uint8_t unk_06;
|
||||
uint8_t unk_07;
|
||||
uint8_t unk_08;
|
||||
uint8_t unk_09;
|
||||
uint8_t unk_0A;
|
||||
uint8_t unk_0B;
|
||||
|
||||
CutsceneSubCommandEntry_FadeScreen(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
|
||||
std::string GetBodySourceCode() const override;
|
||||
|
||||
size_t GetRawSize() const override;
|
||||
};
|
||||
|
||||
class CutsceneMMCommand_FadeScreen : public CutsceneCommand
|
||||
{
|
||||
public:
|
||||
CutsceneMMCommand_FadeScreen(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
|
||||
std::string GetCommandMacro() const override;
|
||||
};
|
||||
|
||||
class CutsceneSubCommandEntry_FadeSeq : public CutsceneSubCommandEntry
|
||||
{
|
||||
public:
|
||||
uint32_t unk_08;
|
||||
|
||||
CutsceneSubCommandEntry_FadeSeq(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
|
||||
std::string GetBodySourceCode() const override;
|
||||
|
||||
size_t GetRawSize() const override;
|
||||
};
|
||||
|
||||
class CutsceneMMCommand_FadeSeq : public CutsceneCommand
|
||||
{
|
||||
public:
|
||||
CutsceneMMCommand_FadeSeq(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
|
||||
std::string GetCommandMacro() const override;
|
||||
};
|
||||
|
||||
class CutsceneSubCommandEntry_NonImplemented : public CutsceneSubCommandEntry
|
||||
{
|
||||
public:
|
||||
CutsceneSubCommandEntry_NonImplemented(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex);
|
||||
};
|
||||
|
||||
class CutsceneMMCommand_NonImplemented : public CutsceneCommand
|
||||
{
|
||||
public:
|
||||
CutsceneMMCommand_NonImplemented(const std::vector<uint8_t>& rawData, offset_t rawDataIndex);
|
||||
};
|
||||
@@ -0,0 +1,596 @@
|
||||
#include "Cutscene_Commands.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "CutsceneMM_Commands.h"
|
||||
#include "Globals.h"
|
||||
#include "Utils/BitConverter.h"
|
||||
#include "Utils/StringHelper.h"
|
||||
|
||||
/* CutsceneSubCommandEntry */
|
||||
|
||||
CutsceneSubCommandEntry::CutsceneSubCommandEntry(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
{
|
||||
base = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0);
|
||||
startFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
|
||||
endFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
|
||||
pad = BitConverter::ToUInt16BE(rawData, rawDataIndex + 6);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry::GetBodySourceCode() const
|
||||
{
|
||||
return StringHelper::Sprintf("CMD_HH(0x%04X, 0x%04X), CMD_HH(0x%04X, 0x%04X)", base, startFrame,
|
||||
endFrame, pad);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry::GetRawSize() const
|
||||
{
|
||||
return 0x08;
|
||||
}
|
||||
|
||||
/* CutsceneCommand */
|
||||
|
||||
CutsceneCommand::CutsceneCommand(const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
{
|
||||
numEntries = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0);
|
||||
}
|
||||
|
||||
CutsceneCommand::~CutsceneCommand()
|
||||
{
|
||||
for (auto& entry : entries)
|
||||
{
|
||||
delete entry;
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommand::GetCommandMacro() const
|
||||
{
|
||||
return StringHelper::Sprintf("CMD_W(0x%08X), CMD_W(0x%08X)", commandID, numEntries);
|
||||
}
|
||||
|
||||
std::string CutsceneCommand::GenerateSourceCode() const
|
||||
{
|
||||
std::string result;
|
||||
|
||||
result += GetCommandMacro();
|
||||
result += ",\n";
|
||||
|
||||
for (auto& entry : entries)
|
||||
{
|
||||
result += " ";
|
||||
result += entry->GetBodySourceCode();
|
||||
result += ",\n";
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t CutsceneCommand::GetCommandSize() const
|
||||
{
|
||||
size_t size = 0;
|
||||
if (entries.size() > 0)
|
||||
{
|
||||
size = entries.at(0)->GetRawSize() * entries.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
size = 0x08 * numEntries;
|
||||
}
|
||||
return 0x08 + size;
|
||||
}
|
||||
|
||||
void CutsceneCommand::SetCommandID(uint32_t nCommandID)
|
||||
{
|
||||
commandID = nCommandID;
|
||||
|
||||
for (auto& entry : entries)
|
||||
{
|
||||
entry->commandID = commandID;
|
||||
}
|
||||
}
|
||||
|
||||
// Specific for command lists where each entry has size 0x30 bytes
|
||||
const std::unordered_map<CutsceneCommands, CsCommandListDescriptor> csCommandsDesc = {
|
||||
{CutsceneCommands::Misc,
|
||||
{"CS_MISC", "(0x%04X, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i)"}},
|
||||
{CutsceneCommands::SetLighting,
|
||||
{"CS_LIGHTING", "(0x%02X, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i)"}},
|
||||
{CutsceneCommands::PlayBGM, {"CS_PLAY_BGM", "(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i)"}},
|
||||
{CutsceneCommands::StopBGM, {"CS_STOP_BGM", "(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i)"}},
|
||||
{CutsceneCommands::FadeBGM, {"CS_FADE_BGM", "(%i, %i, %i, %i, %i, %i, %i, %i, %i, %i, %i)"}},
|
||||
};
|
||||
|
||||
CutsceneSubCommandEntry_GenericCmd::CutsceneSubCommandEntry_GenericCmd(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex, CutsceneCommands cmdId)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex), commandId(cmdId)
|
||||
{
|
||||
word0 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x0);
|
||||
word1 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x4);
|
||||
|
||||
unused1 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x8);
|
||||
unused2 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0xC);
|
||||
unused3 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x10);
|
||||
unused4 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x14);
|
||||
unused5 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x18);
|
||||
unused6 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x1C);
|
||||
unused7 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x20);
|
||||
unused8 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x24);
|
||||
unused9 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x28);
|
||||
unused10 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 0x2C);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_GenericCmd::GetBodySourceCode() const
|
||||
{
|
||||
const auto& element = csCommandsDesc.find(commandId);
|
||||
|
||||
if (element != csCommandsDesc.end())
|
||||
{
|
||||
std::string entryFmt = element->second.cmdMacro;
|
||||
entryFmt += element->second.args;
|
||||
|
||||
return StringHelper::Sprintf(entryFmt.c_str(), base, startFrame, endFrame, pad, unused1,
|
||||
unused2, unused3, unused4, unused5, unused6, unused7, unused8,
|
||||
unused9, unused10);
|
||||
}
|
||||
|
||||
return StringHelper::Sprintf("CS_UNK_DATA(0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, "
|
||||
"0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X)",
|
||||
word0, word1, unused1, unused2, unused3, unused4, unused5, unused6,
|
||||
unused7, unused8, unused9, unused10);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_GenericCmd::GetRawSize() const
|
||||
{
|
||||
return 0x30;
|
||||
}
|
||||
|
||||
CutsceneCommand_GenericCmd::CutsceneCommand_GenericCmd(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex,
|
||||
CutsceneCommands cmdId)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
commandID = static_cast<uint32_t>(cmdId);
|
||||
entries.reserve(numEntries);
|
||||
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_GenericCmd(rawData, rawDataIndex, cmdId);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommand_GenericCmd::GetCommandMacro() const
|
||||
{
|
||||
const auto& element = csCommandsDesc.find(static_cast<CutsceneCommands>(commandID));
|
||||
|
||||
if (element != csCommandsDesc.end())
|
||||
{
|
||||
return StringHelper::Sprintf("%s_LIST(%i)", element->second.cmdMacro, numEntries);
|
||||
}
|
||||
|
||||
return StringHelper::Sprintf("CS_UNK_DATA_LIST(0x%X, %i)", commandID, numEntries);
|
||||
}
|
||||
|
||||
CutsceneCameraPoint::CutsceneCameraPoint(const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
continueFlag = BitConverter::ToInt8BE(rawData, rawDataIndex + 0);
|
||||
cameraRoll = BitConverter::ToInt8BE(rawData, rawDataIndex + 1);
|
||||
nextPointFrame = BitConverter::ToInt16BE(rawData, rawDataIndex + 2);
|
||||
viewAngle = BitConverter::ToFloatBE(rawData, rawDataIndex + 4);
|
||||
|
||||
posX = BitConverter::ToInt16BE(rawData, rawDataIndex + 8);
|
||||
posY = BitConverter::ToInt16BE(rawData, rawDataIndex + 10);
|
||||
posZ = BitConverter::ToInt16BE(rawData, rawDataIndex + 12);
|
||||
|
||||
unused = BitConverter::ToInt16BE(rawData, rawDataIndex + 14);
|
||||
}
|
||||
|
||||
std::string CutsceneCameraPoint::GetBodySourceCode() const
|
||||
{
|
||||
std::string result = "";
|
||||
|
||||
if (commandID == (int32_t)CutsceneCommands::SetCameraFocus)
|
||||
{
|
||||
result += "CS_CAM_FOCUS_POINT";
|
||||
}
|
||||
else if (commandID == (int32_t)CutsceneCommands::SetCameraFocusLink)
|
||||
{
|
||||
result += "CS_CAM_FOCUS_POINT_PLAYER";
|
||||
}
|
||||
else if (commandID == (int32_t)CutsceneCommands::SetCameraPosLink)
|
||||
{
|
||||
result += "CS_CAM_POS_PLAYER";
|
||||
}
|
||||
else
|
||||
{
|
||||
result += "CS_CAM_POS";
|
||||
}
|
||||
|
||||
std::string continueMacro = "CS_CMD_CONTINUE";
|
||||
if (continueFlag != 0)
|
||||
continueMacro = "CS_CMD_STOP";
|
||||
|
||||
result +=
|
||||
StringHelper::Sprintf("(%s, 0x%02X, %i, %ff, %i, %i, %i, 0x%04X)", continueMacro.c_str(),
|
||||
cameraRoll, nextPointFrame, viewAngle, posX, posY, posZ, unused);
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t CutsceneCameraPoint::GetRawSize() const
|
||||
{
|
||||
return 0x10;
|
||||
}
|
||||
|
||||
CutsceneCommandSetCameraPos::CutsceneCommandSetCameraPos(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
base = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0);
|
||||
startFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
|
||||
endFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
|
||||
unused = BitConverter::ToUInt16BE(rawData, rawDataIndex + 6);
|
||||
|
||||
bool shouldContinue = true;
|
||||
|
||||
uint32_t currentPtr = rawDataIndex + 8;
|
||||
|
||||
while (shouldContinue)
|
||||
{
|
||||
CutsceneCameraPoint* camPoint = new CutsceneCameraPoint(rawData, currentPtr);
|
||||
entries.push_back(camPoint);
|
||||
|
||||
if (camPoint->continueFlag == -1)
|
||||
shouldContinue = false;
|
||||
|
||||
currentPtr += camPoint->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommandSetCameraPos::GetCommandMacro() const
|
||||
{
|
||||
std::string result;
|
||||
|
||||
std::string listStr;
|
||||
|
||||
if (commandID == (int32_t)CutsceneCommands::SetCameraFocus)
|
||||
{
|
||||
listStr = "CS_CAM_FOCUS_POINT_LIST";
|
||||
}
|
||||
else if (commandID == (int32_t)CutsceneCommands::SetCameraFocusLink)
|
||||
{
|
||||
listStr = "CS_CAM_FOCUS_POINT_PLAYER_LIST";
|
||||
}
|
||||
else if (commandID == (int32_t)CutsceneCommands::SetCameraPosLink)
|
||||
{
|
||||
listStr = "CS_CAM_POS_PLAYER_LIST";
|
||||
}
|
||||
else
|
||||
{
|
||||
listStr = "CS_CAM_POS_LIST";
|
||||
}
|
||||
|
||||
result += StringHelper::Sprintf("%s(%i, %i)", listStr.c_str(), startFrame, endFrame);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t CutsceneCommandSetCameraPos::GetCommandSize() const
|
||||
{
|
||||
return 0x0C + entries.at(0)->GetRawSize() * entries.size();
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_Rumble::CutsceneSubCommandEntry_Rumble(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
unk_06 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x06);
|
||||
unk_07 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x07);
|
||||
unk_08 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x08);
|
||||
unk_09 = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x09);
|
||||
unk_0A = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x0A);
|
||||
unk_0B = BitConverter::ToUInt8BE(rawData, rawDataIndex + 0x0B);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_Rumble::GetBodySourceCode() const
|
||||
{
|
||||
if (Globals::Instance->game == ZGame::MM_RETAIL)
|
||||
{
|
||||
return StringHelper::Sprintf("CS_RUMBLE(%i, %i, %i, 0x%02X, 0x%02X, 0x%02X)", base,
|
||||
startFrame, endFrame, unk_06, unk_07, unk_08);
|
||||
}
|
||||
|
||||
return StringHelper::Sprintf("CS_CMD_09(%i, %i, %i, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X)",
|
||||
base, startFrame, endFrame, unk_06, unk_07, unk_08, unk_09, unk_0A,
|
||||
unk_0B);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_Rumble::GetRawSize() const
|
||||
{
|
||||
return 0x0C;
|
||||
}
|
||||
|
||||
CutsceneCommand_Rumble::CutsceneCommand_Rumble(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_Rumble(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommand_Rumble::GetCommandMacro() const
|
||||
{
|
||||
if (Globals::Instance->game == ZGame::MM_RETAIL)
|
||||
{
|
||||
return StringHelper::Sprintf("CS_RUMBLE_LIST(%i)", numEntries);
|
||||
}
|
||||
return StringHelper::Sprintf("CS_CMD_09_LIST(%i)", numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_SetTime::CutsceneSubCommandEntry_SetTime(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
hour = BitConverter::ToUInt8BE(rawData, rawDataIndex + 6);
|
||||
minute = BitConverter::ToUInt8BE(rawData, rawDataIndex + 7);
|
||||
unk_08 = BitConverter::ToUInt32BE(rawData, rawDataIndex + 8);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_SetTime::GetBodySourceCode() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_TIME(%i, %i, %i, %i, %i, %i)", base, startFrame, endFrame,
|
||||
hour, minute, unk_08);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_SetTime::GetRawSize() const
|
||||
{
|
||||
return 0x0C;
|
||||
}
|
||||
|
||||
CutsceneCommand_SetTime::CutsceneCommand_SetTime(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_SetTime(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommand_SetTime::GetCommandMacro() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_TIME_LIST(%i)", numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_TextBox::CutsceneSubCommandEntry_TextBox(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
type = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0x6);
|
||||
textId1 = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0x8);
|
||||
textId2 = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0xA);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_TextBox::GetBodySourceCode() const
|
||||
{
|
||||
if (type == 0xFFFF)
|
||||
{
|
||||
return StringHelper::Sprintf("CS_TEXT_NONE(%i, %i)", startFrame, endFrame);
|
||||
}
|
||||
if (type == 2)
|
||||
{
|
||||
return StringHelper::Sprintf("CS_TEXT_LEARN_SONG(%i, %i, %i, 0x%X)", base, startFrame,
|
||||
endFrame, textId1);
|
||||
}
|
||||
|
||||
if (Globals::Instance->game == ZGame::MM_RETAIL)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case 0:
|
||||
return StringHelper::Sprintf("CS_TEXT_DEFAULT(0x%X, %i, %i, 0x%X, 0x%X)", base,
|
||||
startFrame, endFrame, textId1, textId2);
|
||||
|
||||
case 1:
|
||||
return StringHelper::Sprintf("CS_TEXT_TYPE_1(0x%X, %i, %i, 0x%X, 0x%X)", base,
|
||||
startFrame, endFrame, textId1, textId2);
|
||||
|
||||
case 3:
|
||||
return StringHelper::Sprintf("CS_TEXT_TYPE_3(0x%X, %i, %i, 0x%X, 0x%X)", base,
|
||||
startFrame, endFrame, textId1, textId2);
|
||||
|
||||
case 4:
|
||||
return StringHelper::Sprintf("CS_TEXT_BOSSES_REMAINS(0x%X, %i, %i, 0x%X)", base,
|
||||
startFrame, endFrame, textId1);
|
||||
|
||||
case 5:
|
||||
return StringHelper::Sprintf("CS_TEXT_ALL_NORMAL_MASKS(0x%X, %i, %i, 0x%X)", base,
|
||||
startFrame, endFrame, textId1);
|
||||
}
|
||||
}
|
||||
|
||||
return StringHelper::Sprintf("CS_TEXT_DISPLAY_TEXTBOX(0x%X, %i, %i, %i, 0x%X, 0x%X)", base,
|
||||
startFrame, endFrame, type, textId1, textId2);
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_TextBox::GetRawSize() const
|
||||
{
|
||||
return 0x0C;
|
||||
}
|
||||
|
||||
CutsceneCommand_TextBox::CutsceneCommand_TextBox(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_TextBox(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommand_TextBox::GetCommandMacro() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_TEXT_LIST(%i)", numEntries);
|
||||
}
|
||||
|
||||
CutsceneSubCommandEntry_ActorAction::CutsceneSubCommandEntry_ActorAction(
|
||||
const std::vector<uint8_t>& rawData, offset_t rawDataIndex)
|
||||
: CutsceneSubCommandEntry(rawData, rawDataIndex)
|
||||
{
|
||||
rotX = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0x6);
|
||||
rotY = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0x8);
|
||||
rotZ = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0xA);
|
||||
startPosX = BitConverter::ToInt32BE(rawData, rawDataIndex + 0xC);
|
||||
startPosY = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x10);
|
||||
startPosZ = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x14);
|
||||
endPosX = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x18);
|
||||
endPosY = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x1C);
|
||||
endPosZ = BitConverter::ToInt32BE(rawData, rawDataIndex + 0x20);
|
||||
normalX = BitConverter::ToFloatBE(rawData, rawDataIndex + 0x24);
|
||||
normalY = BitConverter::ToFloatBE(rawData, rawDataIndex + 0x28);
|
||||
normalZ = BitConverter::ToFloatBE(rawData, rawDataIndex + 0x2C);
|
||||
}
|
||||
|
||||
std::string CutsceneSubCommandEntry_ActorAction::GetBodySourceCode() const
|
||||
{
|
||||
std::string result;
|
||||
|
||||
if (Globals::Instance->game == ZGame::MM_RETAIL)
|
||||
{
|
||||
if (static_cast<CutsceneMMCommands>(commandID) ==
|
||||
CutsceneMMCommands::CS_CMD_SET_PLAYER_ACTION)
|
||||
{
|
||||
result = "CS_PLAYER_ACTION";
|
||||
}
|
||||
else
|
||||
{
|
||||
result = "CS_ACTOR_ACTION";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (static_cast<CutsceneCommands>(commandID) == CutsceneCommands::SetPlayerAction)
|
||||
{
|
||||
result = "CS_PLAYER_ACTION";
|
||||
}
|
||||
else
|
||||
{
|
||||
result = "CS_NPC_ACTION";
|
||||
}
|
||||
}
|
||||
|
||||
result +=
|
||||
StringHelper::Sprintf("(%i, %i, %i, 0x%04X, 0x%04X, 0x%04X, %i, %i, "
|
||||
"%i, %i, %i, %i, %.11ef, %.11ef, %.11ef)",
|
||||
base, startFrame, endFrame, rotX, rotY, rotZ, startPosX, startPosY,
|
||||
startPosZ, endPosX, endPosY, endPosZ, normalX, normalY, normalZ);
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t CutsceneSubCommandEntry_ActorAction::GetRawSize() const
|
||||
{
|
||||
return 0x30;
|
||||
}
|
||||
|
||||
CutsceneCommand_ActorAction::CutsceneCommand_ActorAction(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
entries.reserve(numEntries);
|
||||
for (size_t i = 0; i < numEntries; i++)
|
||||
{
|
||||
auto* entry = new CutsceneSubCommandEntry_ActorAction(rawData, rawDataIndex);
|
||||
entries.push_back(entry);
|
||||
rawDataIndex += entry->GetRawSize();
|
||||
}
|
||||
}
|
||||
|
||||
std::string CutsceneCommand_ActorAction::GetCommandMacro() const
|
||||
{
|
||||
if (Globals::Instance->game == ZGame::MM_RETAIL)
|
||||
{
|
||||
if (static_cast<CutsceneMMCommands>(commandID) ==
|
||||
CutsceneMMCommands::CS_CMD_SET_PLAYER_ACTION)
|
||||
{
|
||||
return StringHelper::Sprintf("CS_PLAYER_ACTION_LIST(%i)", numEntries);
|
||||
}
|
||||
return StringHelper::Sprintf("CS_ACTOR_ACTION_LIST(0x%03X, %i)", commandID, numEntries);
|
||||
}
|
||||
|
||||
if (static_cast<CutsceneCommands>(commandID) == CutsceneCommands::SetPlayerAction)
|
||||
{
|
||||
return StringHelper::Sprintf("CS_PLAYER_ACTION_LIST(%i)", entries.size());
|
||||
}
|
||||
return StringHelper::Sprintf("CS_NPC_ACTION_LIST(0x%03X, %i)", commandID, entries.size());
|
||||
}
|
||||
|
||||
CutsceneCommand_Terminator::CutsceneCommand_Terminator(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
base = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0);
|
||||
startFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
|
||||
endFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
|
||||
unknown = BitConverter::ToUInt16BE(rawData, rawDataIndex + 6); // endFrame duplicate
|
||||
}
|
||||
|
||||
std::string CutsceneCommand_Terminator::GenerateSourceCode() const
|
||||
{
|
||||
std::string result;
|
||||
|
||||
result += StringHelper::Sprintf("CS_TERMINATOR(%i, %i, %i),\n", base, startFrame, endFrame);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
size_t CutsceneCommand_Terminator::GetCommandSize() const
|
||||
{
|
||||
return 0x10;
|
||||
}
|
||||
|
||||
CutsceneCommandSceneTransFX::CutsceneCommandSceneTransFX(const std::vector<uint8_t>& rawData,
|
||||
offset_t rawDataIndex)
|
||||
: CutsceneCommand(rawData, rawDataIndex)
|
||||
{
|
||||
rawDataIndex += 4;
|
||||
|
||||
base = BitConverter::ToUInt16BE(rawData, rawDataIndex + 0);
|
||||
startFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 2);
|
||||
endFrame = BitConverter::ToUInt16BE(rawData, rawDataIndex + 4);
|
||||
}
|
||||
|
||||
std::string CutsceneCommandSceneTransFX::GenerateSourceCode() const
|
||||
{
|
||||
return StringHelper::Sprintf("CS_SCENE_TRANS_FX(%i, %i, %i),\n", base, startFrame, endFrame);
|
||||
}
|
||||
|
||||
size_t CutsceneCommandSceneTransFX::GetCommandSize() const
|
||||
{
|
||||
return 0x10;
|
||||
}
|
||||