Compare commits

..

18 Commits

Author SHA1 Message Date
aMannus a62f8edc7f Bump Version 2023-03-31 22:48:04 +02:00
aMannus 8fc9fc18ec Rig treasure chest minigame 2023-03-28 15:00:11 +02:00
aMannus f2a975872e Change wide link into sideways link while climbing 2023-03-28 14:34:04 +02:00
aMannus b5b0990e83 Wide Link while climbing 2023-03-28 14:19:32 +02:00
aMannus af3ebf9a08 Super heavy Iron Boots 2023-03-28 14:13:16 +02:00
aMannus 68b3de6aac Double Hover Boots duration 2023-03-28 13:18:26 +02:00
aMannus eace543250 Forced Hyper Bosses 2023-03-28 13:06:03 +02:00
aMannus dc8374830c Bunny hood backwards speed 2023-03-28 10:54:19 +02:00
aMannus 6721c2d791 Random bonks while rolling 2023-03-28 10:49:38 +02:00
aMannus c90b32231a Random Cucco Storms 2023-03-28 10:46:50 +02:00
aMannus 85ca3c9ea9 5x boomerang length 2023-03-28 10:34:20 +02:00
aMannus 679beee4f3 Random hookshot/longshot length 2023-03-28 10:32:17 +02:00
aMannus c18603d1c9 Slightly smaller Link 2023-03-28 10:10:24 +02:00
aMannus ae910355c6 Fake 999 prices with shops/scrubs 2023-03-28 10:00:17 +02:00
aMannus d7febc01b4 Randomly unequip c-buttons, shield, unequip ocarina on dpad down 2023-03-28 09:48:47 +02:00
aMannus 9088f0c38d Slow mweep 2023-03-28 09:46:49 +02:00
aMannus e8e8997fd8 Spicy dampe 2023-03-28 09:46:49 +02:00
aMannus 3a5ef24396 Hardcore enemy rando 2023-03-28 09:43:49 +02:00
1641 changed files with 135382 additions and 65226 deletions
-1
View File
@@ -1 +0,0 @@
* text=auto eol=lf
+48 -143
View File
@@ -6,59 +6,8 @@ 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:
needs: generate-soh-otr
runs-on: ${{ (vars.MAC_RUNNER && fromJSON(vars.MAC_RUNNER)) || 'macos-12' }}
runs-on: macos-12
steps:
- uses: actions/checkout@v3
with:
@@ -68,14 +17,12 @@ 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/
@@ -83,7 +30,6 @@ 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"
@@ -93,21 +39,15 @@ 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
@@ -120,7 +60,6 @@ jobs:
SoH.dmg
readme.txt
build-linux:
needs: generate-soh-otr
strategy:
fail-fast: true
matrix:
@@ -131,13 +70,12 @@ jobs:
- os: ubuntu-22.04
gcc: 12
archive-suffix: performance
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)) }}
runs-on: ${{ 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)
@@ -146,7 +84,6 @@ 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
@@ -157,7 +94,6 @@ 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
@@ -167,14 +103,11 @@ 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)
@@ -191,8 +124,7 @@ jobs:
soh.appimage
readme.txt
build-switch:
needs: generate-soh-otr
runs-on: ${{ (vars.LINUX_RUNNER && fromJSON(vars.LINUX_RUNNER)) || 'ubuntu-latest' }}
runs-on: ubuntu-latest
container:
image: devkitpro/devkita64:latest
steps:
@@ -200,9 +132,6 @@ 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
@@ -217,66 +146,52 @@ 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:
# 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: 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:
needs: generate-soh-otr
runs-on: ${{ (vars.WINDOWS_RUNNER && fromJSON(vars.WINDOWS_RUNNER)) || 'windows-latest' }}
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
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
build-windows:
runs-on: windows-latest
steps:
- name: Install dependencies
if: ${{ !vars.WINDOWS_RUNNER }}
run: |
choco install ninja
Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force
@@ -288,29 +203,19 @@ 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
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
cd build-windows
cpack -G ZIP
- name: Upload build
uses: actions/upload-artifact@v3
with:
name: soh-windows
path: soh-windows
path: _packages/*.zip
+4 -6
View File
@@ -7,7 +7,7 @@ __pycache__/
.vscode/
.vs/
.idea/
cmake-build-**
cmake-build-debug
venv/
.cache/
@@ -409,7 +409,8 @@ DebugObj/*
ReleaseObj/*
.tags
tags
*.otr
oot.otr
oot-mq.otr
*.sav
shipofharkinian.ini
shipofharkinian.json
@@ -444,9 +445,6 @@ install_manifest.txt
compile_commands.json
CTestTestfile.cmake
_deps
_packages
*/extract_assets_cmake*
/build*
soh/build.c
soh/properties.h
build.c
-9
View File
@@ -45,9 +45,6 @@ cd Shipwright
# If you need to clean the project you can run
& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target clean
# If you need to regenerate the asset headers to check them into source
& 'C:\Program Files\CMake\bin\cmake.exe' --build .\build\x64 --target ExtractAssetHeaders
```
### Developing SoH
@@ -107,9 +104,6 @@ cmake --build build-cmake # --config Release (if you're packaging)
# If you need to clean the project you can run
cmake --build build-cmake --target clean
# If you need to regenerate the asset headers to check them into source
cmake --build build-cmake --target ExtractAssetHeaders
```
### Generating a distributable
@@ -154,9 +148,6 @@ cp build-cmake/soh/oot.otr ~/Library/Application\ Support/com.shipofharkinian.so
# If you need to clean the project you can run
cmake --build build-cmake --target clean
# If you need to regenerate the asset headers to check them into source
cmake --build build-cmake --target ExtractAssetHeaders
```
### Generating a distributable
+7 -18
View File
@@ -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")
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15" CACHE STRING "Minimum OS X deployment version" FORCE)
project(Ship VERSION 7.0.1 LANGUAGES C CXX)
set(PROJECT_BUILD_NAME "Spock Bravo" CACHE STRING "")
project(Ship VERSION 42.0.69 LANGUAGES C CXX)
set(PROJECT_BUILD_NAME "GREG ALFA" 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,31 +100,20 @@ 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 soh.otr
COMMAND ${CMAKE_COMMAND} -E $<IF:$<VERSION_LESS:${CMAKE_VERSION},3.17>,remove,rm> -f oot.otr oot-mq.otr
COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$<TARGET_FILE:ZAPD>" --non-interactive
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
COMMAND ${CMAKE_COMMAND} -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 ${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
BYPRODUCTS oot.otr ${CMAKE_SOURCE_DIR}/oot.otr oot-mq.otr ${CMAKE_SOURCE_DIR}/oot-mq.otr
)
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, LUS::ResourceType::SOH_Animation);
WriteHeader(res, outPath, writer, Ship::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)LUS::AnimationType::Link);
writer->Write((uint32_t)Ship::AnimationType::Link);
writer->Write((uint16_t)linkAnim->frameCount);
writer->Write((uint32_t)linkAnim->segmentAddress);
}
else if (curveAnim != nullptr)
{
writer->Write((uint32_t)LUS::AnimationType::Curve);
writer->Write((uint32_t)Ship::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)LUS::AnimationType::Normal);
writer->Write((uint32_t)Ship::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)LUS::AnimationType::Legacy);
writer->Write((uint32_t)Ship::AnimationType::Legacy);
}
}
+1 -1
View File
@@ -5,7 +5,7 @@ void OTRExporter_Array::Save(ZResource* res, const fs::path& outPath, BinaryWrit
{
ZArray* arr = (ZArray*)res;
WriteHeader(res, outPath, writer, LUS::ResourceType::Array);
WriteHeader(res, outPath, writer, Ship::ResourceType::Array);
writer->Write((uint32_t)arr->resList[0]->GetResourceType());
writer->Write((uint32_t)arr->arrayCnt);
+5 -5
View File
@@ -2,7 +2,7 @@
#include "Main.h"
#include <Utils/MemoryStream.h>
#include <Globals.h>
#include <Utils/DiskFile.h>
#include <Utils/File.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, LUS::ResourceType::SOH_AudioSample, 2);
WriteHeader(nullptr, "", writer, Ship::ResourceType::SOH_AudioSample, Ship::Version::Rachael);
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, LUS::ResourceType::SOH_Audio, 2);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Audio, Ship::Version::Rachael);
// 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, LUS::ResourceType::SOH_AudioSoundFont, 2);
WriteHeader(nullptr, "", &fntWriter, Ship::ResourceType::SOH_AudioSoundFont, Ship::Version::Rachael);
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, LUS::ResourceType::SOH_AudioSequence, 2);
WriteHeader(nullptr, "", &seqWriter, Ship::ResourceType::SOH_AudioSequence, Ship::Version::Rachael);
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, LUS::ResourceType::SOH_Background);
WriteHeader(bg, outPath, writer, Ship::ResourceType::SOH_Background);
writer->Write((uint32_t)bg->GetRawDataSize());
+1 -1
View File
@@ -5,7 +5,7 @@ void OTRExporter_Blob::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
ZBlob* blob = (ZBlob*)res;
WriteHeader(blob, outPath, writer, LUS::ResourceType::Blob);
WriteHeader(blob, outPath, writer, Ship::ResourceType::Blob);
auto start = std::chrono::steady_clock::now();
+8 -10
View File
@@ -5,7 +5,7 @@ void OTRExporter_Collision::Save(ZResource* res, const fs::path& outPath, Binary
{
ZCollisionHeader* col = (ZCollisionHeader*)res;
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_CollisionHeader);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_CollisionHeader);
writer->Write(col->absMinX);
writer->Write(col->absMinY);
@@ -32,18 +32,16 @@ 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].normX);
writer->Write(col->polygons[i].normY);
writer->Write(col->polygons[i].normZ);
writer->Write(col->polygons[i].dist);
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((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].data[1]);
writer->Write(col->PolygonTypes[i].data[0]);
}
for (uint16_t i = 0; i < col->polygonTypes.size(); i++)
writer->Write(col->polygonTypes[i]);
writer->Write((uint32_t)col->camData->entries.size());
+114 -127
View File
@@ -5,11 +5,12 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
{
ZCutscene* cs = (ZCutscene*)res;
WriteHeader(cs, outPath, writer, LUS::ResourceType::SOH_Cutscene);
WriteHeader(cs, outPath, writer, Ship::ResourceType::SOH_Cutscene);
//writer->Write((uint32_t)cs->commands.size() + 2 + 2);
writer->Write((uint32_t)0);
const auto currentStream = writer->GetBaseAddress();
int currentStream = writer->GetBaseAddress();
writer->Write(CS_BEGIN_CUTSCENE(cs->numCommands, cs->endFrame));
@@ -25,13 +26,12 @@ 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 (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
{
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));
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));
}
}
break;
@@ -43,54 +43,51 @@ 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 (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
{
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));
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));
}
break;
}
case (uint32_t)CutsceneCommands::Misc:
case (uint32_t)CutsceneCommands::SpecialAction:
{
writer->Write(CS_CMD_MISC);
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((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
{
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));
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));
}
break;
}
case (uint32_t)CutsceneCommands::SetLighting:
{
writer->Write(CS_CMD_SET_LIGHTING);
writer->Write((uint32_t)CMD_W((cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
writer->Write((uint32_t)CMD_W(((CutsceneCommandEnvLighting*)cs->commands[i])->entries.size()));
for (auto& e : ((CutsceneCommandEnvLighting*)cs->commands[i])->entries)
{
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_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));
writer->Write((uint32_t)0x0);
writer->Write((uint32_t)0x0);
writer->Write((uint32_t)0x0);
@@ -105,13 +102,12 @@ 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 (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
{
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));
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));
}
break;
}
@@ -123,13 +119,12 @@ 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 (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandSetCameraPos*)cs->commands[i])->entries)
{
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));
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));
}
break;
}
@@ -142,26 +137,24 @@ 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(((CutsceneCommand_Rumble*)cs->commands[i])->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandUnknown9*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandUnknown9*)cs->commands[i])->entries)
{
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));
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));
}
break;
}
case 0x15://Both unused in OoT
case 0x1A://(uint32_t)CutsceneCommands::Unknown:
case 0x15:
case (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 (const auto e : cmdUnk->entries)
for (auto e : cmdUnk->entries)
{
writer->Write(CMD_W(e->unused0));
writer->Write(CMD_W(e->unused1));
@@ -176,33 +169,31 @@ 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((cs->commands[i])->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandTextbox*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandTextbox*)cs->commands[i])->entries)
{
CutsceneSubCommandEntry_TextBox* textBox = (CutsceneSubCommandEntry_TextBox*)e;
if (textBox->base == 0xFFFF) // CS_TEXT_NONE
if (e->base == 0xFFFF) // CS_TEXT_NONE
{
writer->Write(CMD_HH(0xFFFF, textBox->startFrame));
writer->Write(CMD_HH(textBox->endFrame, 0xFFFF));
writer->Write(CMD_HH(0xFFFF, e->startFrame));
writer->Write(CMD_HH(e->endFrame, 0xFFFF));
writer->Write(CMD_HH(0xFFFF, 0xFFFF));
}
else // CS_TEXT_DISPLAY_TEXTBOX
{
writer->Write(CMD_HH(textBox->base, textBox->startFrame));
writer->Write(CMD_HH(textBox->endFrame, textBox->type));
writer->Write(CMD_HH(textBox->textId1, textBox->textId2));
writer->Write(CMD_HH(e->base, e->startFrame));
writer->Write(CMD_HH(e->endFrame, e->type));
writer->Write(CMD_HH(e->textID1, e->textID2));
}
}
break;
}
case 10: //ActorAction0
case (uint32_t)CutsceneCommands::SetActorAction0:
case (uint32_t)CutsceneCommands::SetActorAction1:
case 17:
case 18:
@@ -301,12 +292,11 @@ 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(cs->commands[i]->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandActorAction*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& actorAct : ((CutsceneCommandActorAction*)cs->commands[i])->entries)
{
CutsceneSubCommandEntry_ActorAction* actorAct = (CutsceneSubCommandEntry_ActorAction*)e;
writer->Write(CMD_HH(actorAct->base, actorAct->startFrame));
writer->Write(CMD_HH(actorAct->action, actorAct->startFrame));
writer->Write(CMD_HH(actorAct->endFrame, actorAct->rotX));
writer->Write(CMD_HH(actorAct->rotY, actorAct->rotZ));
writer->Write(CMD_W(actorAct->startPosX));
@@ -332,23 +322,24 @@ 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(cs->commands[i]->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandPlayBGM*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandPlayBGM*)cs->commands[i])->entries)
{
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_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));
writer->Write((uint32_t)0);
writer->Write((uint32_t)0);
writer->Write((uint32_t)0);
@@ -358,20 +349,19 @@ 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(cs->commands[i]->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandStopBGM*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandStopBGM*)cs->commands[i])->entries)
{
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_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));
writer->Write((uint32_t)0);
writer->Write((uint32_t)0);
writer->Write((uint32_t)0);
@@ -381,20 +371,19 @@ 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(cs->commands[i]->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandFadeBGM*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandFadeBGM*)cs->commands[i])->entries)
{
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_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));
writer->Write((uint32_t)0);
writer->Write((uint32_t)0);
writer->Write((uint32_t)0);
@@ -404,24 +393,22 @@ 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(cs->commands[i]->entries.size()));
writer->Write((uint32_t)CMD_W(((CutsceneCommandDayTime*)cs->commands[i])->entries.size()));
for (const auto& e : cs->commands[i]->entries)
for (auto& e : ((CutsceneCommandDayTime*)cs->commands[i])->entries)
{
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));
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));
}
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(t->base, t->startFrame));
writer->Write(CMD_HH(t->endFrame, t->endFrame));
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));
break;
}
default:
@@ -437,8 +424,8 @@ void OTRExporter_Cutscene::Save(ZResource* res, const fs::path& outPath, BinaryW
writer->Write(0xFFFFFFFF);
writer->Write((uint32_t)0);
const auto endStream = writer->GetBaseAddress();
writer->Seek((uint32_t)currentStream - 4, SeekOffsetType::Start);
int endStream = writer->GetBaseAddress();
writer->Seek(currentStream - 4, SeekOffsetType::Start);
writer->Write((uint32_t)((endStream - currentStream) / 4));
writer->Seek((uint32_t)endStream, SeekOffsetType::Start);
writer->Seek(endStream, SeekOffsetType::Start);
}
+13 -13
View File
@@ -10,12 +10,12 @@
#include <iostream>
#include <string>
#include "MtxExporter.h"
#include <Utils/DiskFile.h>
#include <Utils/File.h>
#include "VersionInfo.h"
#define GFX_SIZE 8
#define gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
#define gsDPSetCombineLERP2(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, LUS::ResourceType::DisplayList);
WriteHeader(res, outPath, writer, Ship::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_HASH;
opcode = (uint8_t)G_DL_OTR;
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_HASH;
opcode = (uint8_t)G_VTX_OTR;
if ((int)opF3D == G_SETTIMG)
opcode = (uint8_t)G_SETTIMG_OTR_HASH;
opcode = (uint8_t)G_SETTIMG_OTR;
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() && !DiskFile::Exists("Extract/" + fName))
if (files.find(fName) == files.end() && !File::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() && !DiskFile::Exists("Extract/" + fName))
if (files.find(fName) == files.end() && !File::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 = { gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
Gfx value = {gsDPSetCombineLERP2(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_HASH << 24);
word0 += (G_SETTIMG_OTR << 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_HASH << 24);
word0 += (G_VTX_OTR << 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() && !DiskFile::Exists("Extract/" + fName))
if (files.find(fName) == files.end() && !File::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, LUS::ResourceType::Array);
OTRExporter::WriteHeader(nullptr, "", &vtxWriter, Ship::ResourceType::Array);
vtxWriter.Write((uint32_t)ZResourceType::Vertex);
vtxWriter.Write((uint32_t)arrCnt);
+1 -1
View File
@@ -1,7 +1,7 @@
#include "Exporter.h"
#include "VersionInfo.h"
void OTRExporter::WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, LUS::ResourceType resType, int32_t resVersion)
void OTRExporter::WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, Ship::ResourceType resType, Ship::Version resVersion)
{
writer->Write((uint8_t)Endianness::Little); // 0x00
writer->Write((uint8_t)0); // 0x01
+1 -2
View File
@@ -1,7 +1,6 @@
#pragma once
#include "ZResource.h"
#include "ZArray.h"
#include "stdint.h"
//#include "OTRExporter.h"
#include <Utils/BinaryWriter.h>
#include <libultraship/bridge.h>
@@ -10,5 +9,5 @@
class OTRExporter : public ZResourceExporter
{
protected:
static void WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, LUS::ResourceType resType, int32_t resVersion = 0);
static void WriteHeader(ZResource* res, const fs::path& outPath, BinaryWriter* writer, Ship::ResourceType resType, Ship::Version resVersion = MAJOR_VERSION);
};
+58 -91
View File
@@ -1,5 +1,4 @@
#include "Main.h"
#include "Exporter.h"
#include "BackgroundExporter.h"
#include "TextureExporter.h"
#include "RoomExporter.h"
@@ -18,7 +17,7 @@
#include "MtxExporter.h"
#include "AudioExporter.h"
#include <Globals.h>
#include <Utils/DiskFile.h>
#include <Utils/File.h>
#include <Utils/Directory.h>
#include <Utils/MemoryStream.h>
#include <Utils/BinaryWriter.h>
@@ -26,7 +25,7 @@
#include <mutex>
std::string otrFileName = "oot.otr";
std::shared_ptr<LUS::Archive> otrArchive;
std::shared_ptr<Ship::Archive> otrArchive;
BinaryWriter* fileWriter;
std::chrono::steady_clock::time_point fileStart, resStart;
std::map<std::string, std::vector<char>> files;
@@ -47,16 +46,16 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM
printf("BOTR: Generating OTR Archive...\n");
if (DiskFile::Exists(otrFileName))
otrArchive = std::shared_ptr<LUS::Archive>(new LUS::Archive(otrFileName, true));
if (File::Exists(otrFileName))
otrArchive = std::shared_ptr<Ship::Archive>(new Ship::Archive(otrFileName, true));
else
otrArchive = LUS::Archive::CreateArchive(otrFileName, 40000);
otrArchive = Ship::Archive::CreateArchive(otrFileName, 40000);
auto lst = Directory::ListFiles("Extract");
for (auto item : lst)
{
auto fileData = DiskFile::ReadAllBytes(item);
auto fileData = File::ReadAllBytes(item);
otrArchive->AddFile(StringHelper::Split(item, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
}
}
@@ -64,34 +63,35 @@ 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;
MemoryStream *versionStream = new MemoryStream();
BinaryWriter writer(versionStream);
writer.SetEndianness(Endianness::Big);
writer.Write(endianness);
writer.Write(crc);
writer.Close();
// 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();
printf("Created version file.\n");
printf("Generating OTR Archive...\n");
otrArchive = LUS::Archive::CreateArchive(otrFileName, 40000);
otrArchive = Ship::Archive::CreateArchive(otrFileName, 40000);
otrArchive->AddFile("version", (uintptr_t)versionStream->ToVector().data(), versionStream->GetLength());
for (const auto& item : files)
{
for (auto item : files) {
std::string fName = item.first;
if (fName.find("gTitleZeldaShieldLogoMQTex") != std::string::npos && !ZRom(romPath).IsMQ())
{
@@ -101,77 +101,47 @@ static void ExporterProgramEnd()
fName.replace(pos, 27, "gTitleZeldaShieldLogoTex");
}
}
const auto& fileData = item.second;
auto fileData = item.second;
otrArchive->AddFile(fName, (uintptr_t)fileData.data(),
fileData.size());
fileData.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());
// Add any additional files that need to be manually copied...
auto lst = Directory::ListFiles("Extract");
for (const auto& item : lst)
{
std::vector<std::string> splitPath = StringHelper::Split(item, ".");
if (splitPath.size() >= 3)
for (auto item : lst)
{
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());
std::vector<std::string> splitPath = StringHelper::Split(item, ".");
OTRExporter_Texture exporter;
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;
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;
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());
}
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());
//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());
}
sohOtr = nullptr;
}
static void ExporterParseArgs(int argc, char* argv[], int& i)
{
std::string arg = argv[i];
@@ -249,7 +219,7 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
files[fName] = strem->ToVector();
}
else
DiskFile::WriteAllBytes("Extract/" + fName, strem->ToVector());
File::WriteAllBytes("Extract/" + fName, strem->ToVector());
}
auto end = std::chrono::steady_clock::now();
@@ -259,11 +229,6 @@ 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()
{
}
@@ -275,7 +240,7 @@ static void ExporterXMLEnd()
void AddFile(std::string fName, std::vector<char> data)
{
if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
DiskFile::WriteAllBytes("Extract/" + fName, data);
File::WriteAllBytes("Extract/" + fName, data);
else
{
std::unique_lock Lock(fileMutex);
@@ -283,14 +248,13 @@ void AddFile(std::string fName, std::vector<char> data)
}
}
void ImportExporters()
static 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;
@@ -323,3 +287,6 @@ void ImportExporters()
InitVersionInfo();
}
// When ZAPD starts up, it will automatically call the below function, which in turn sets up our exporters.
REGISTER_EXPORTER(ImportExporters);
+1 -1
View File
@@ -2,7 +2,7 @@
#include <libultraship/bridge.h>
extern std::shared_ptr<LUS::Archive> otrArchive;
extern std::shared_ptr<Ship::Archive> otrArchive;
extern std::map<std::string, std::vector<char>> files;
void AddFile(std::string fName, std::vector<char> data);
+1 -1
View File
@@ -4,7 +4,7 @@ void OTRExporter_MtxExporter::Save(ZResource* res, const fs::path& outPath, Bina
{
ZMtx* mtx = (ZMtx*)res;
WriteHeader(res, outPath, writer, LUS::ResourceType::Matrix);
WriteHeader(res, outPath, writer, Ship::ResourceType::Matrix);
for (size_t i = 0; i < 4; i++)
for (size_t j = 0; j < 4; j++)
+1 -1
View File
@@ -5,7 +5,7 @@ void OTRExporter_Path::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
ZPath* path = (ZPath*)res;
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Path);
WriteHeader(res, outPath, writer, Ship::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, LUS::ResourceType::SOH_PlayerAnimation);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_PlayerAnimation);
auto start = std::chrono::steady_clock::now();
+10 -8
View File
@@ -1,7 +1,7 @@
#include "RoomExporter.h"
#include "Utils/BinaryWriter.h"
#include "Utils/MemoryStream.h"
#include <Utils/DiskFile.h>
#include "Utils/File.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, LUS::ResourceType::SOH_Room);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_Room);
writer->Write((uint32_t)room->commands.size());
@@ -80,8 +80,10 @@ 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 (const auto& entry : cmdSetActorList->actorList->actors)
for (int i = 0; i < cmdSetActorList->numActors; i++)
{
const ActorSpawnEntry& entry = cmdSetActorList->actors[i];
writer->Write(entry.actorNum);
writer->Write(entry.posX);
writer->Write(entry.posY);
@@ -89,7 +91,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.params);
writer->Write(entry.initVar);
}
}
break;
@@ -391,7 +393,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.params);
writer->Write(entry.initVar);
}
}
break;
@@ -439,18 +441,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;
+6 -6
View File
@@ -7,7 +7,7 @@ void OTRExporter_Skeleton::Save(ZResource* res, const fs::path& outPath, BinaryW
{
ZSkeleton* skel = (ZSkeleton*)res;
WriteHeader(res, outPath, writer, LUS::ResourceType::SOH_Skeleton);
WriteHeader(res, outPath, writer, Ship::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, LUS::ResourceType::SOH_SkeletonLimb);
WriteHeader(res, outPath, writer, Ship::ResourceType::SOH_SkeletonLimb);
writer->Write((uint8_t)limb->type);
writer->Write((uint8_t)limb->skinSegmentType);
+1 -1
View File
@@ -5,7 +5,7 @@ void OTRExporter_Text::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
ZText* txt = (ZText*)res;
WriteHeader(txt, outPath, writer, LUS::ResourceType::SOH_Text);
WriteHeader(txt, outPath, writer, Ship::ResourceType::SOH_Text);
writer->Write((uint32_t)txt->messages.size());
+4 -5
View File
@@ -5,7 +5,7 @@ void OTRExporter_Texture::Save(ZResource* res, const fs::path& outPath, BinaryWr
{
ZTexture* tex = (ZTexture*)res;
WriteHeader(tex, outPath, writer, LUS::ResourceType::Texture);
WriteHeader(tex, outPath, writer, Ship::ResourceType::Texture);
auto start = std::chrono::steady_clock::now();
@@ -17,10 +17,9 @@ void OTRExporter_Texture::Save(ZResource* res, const fs::path& outPath, BinaryWr
writer->Write((uint32_t)tex->GetRawDataSize());
if (tex->parent != nullptr) {
auto data = tex->parent->GetRawData();
writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize());
}
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();
+17 -17
View File
@@ -1,25 +1,25 @@
#include "VersionInfo.h"
#include <libultraship/bridge.h>
std::map<LUS::ResourceType, uint32_t> resourceVersions;
std::map<Ship::ResourceType, uint32_t> resourceVersions;
void InitVersionInfo()
{
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 },
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 },
};
}
+3 -1
View File
@@ -4,4 +4,6 @@
#include <vector>
#include "src/resource/Resource.h"
extern std::map<LUS::ResourceType, uint32_t> resourceVersions;
#define MAJOR_VERSION Ship::Version::Deckard
extern std::map<Ship::ResourceType, uint32_t> resourceVersions;
+2 -2
View File
@@ -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, LUS::ResourceType::Vertex);
WriteHeader(res, outPath, writer, Ship::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, LUS::ResourceType::Vertex);
WriteHeader(res, outPath, writer, Ship::ResourceType::Vertex);
writer->Write((uint32_t)1); //Yes I'm hard coding it to one, it *should* be fine.
@@ -1,16 +0,0 @@
{
"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"
}
@@ -1,16 +0,0 @@
{
"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"
}
@@ -1,16 +0,0 @@
{
"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"
}
@@ -1,220 +0,0 @@
{
"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"
}
@@ -1,220 +0,0 @@
{
"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"
}
@@ -1,220 +0,0 @@
{
"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"
}
@@ -1,18 +0,0 @@
{
"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"
}
@@ -1,18 +0,0 @@
{
"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"
}
@@ -1,18 +0,0 @@
{
"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"
}
@@ -1,112 +0,0 @@
{
"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)
}
@@ -1,112 +0,0 @@
{
"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)
}
@@ -1,112 +0,0 @@
{
"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

@@ -1,21 +0,0 @@
<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>
@@ -1,241 +0,0 @@
<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>
@@ -1,80 +0,0 @@
<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>
@@ -1,259 +0,0 @@
<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>
@@ -1,118 +0,0 @@
<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>
@@ -1,335 +0,0 @@
<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>
@@ -1,98 +0,0 @@
<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>
@@ -1,323 +0,0 @@
<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>
@@ -1,128 +0,0 @@
<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>
@@ -1,20 +0,0 @@
<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>
@@ -1,20 +0,0 @@
<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>
@@ -1,20 +0,0 @@
<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>
@@ -1,20 +0,0 @@
<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>
@@ -1,8 +0,0 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
@@ -1,8 +0,0 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
@@ -1,8 +0,0 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
@@ -1,8 +0,0 @@
<DisplayList Version="0">
<PipeSync/>
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
<SetCycleType G_CYC_1CYCLE="1"/>
<PipelineMode G_PM_1PRIMITIVE="1"/>
<EndDisplayList/>
</DisplayList>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 194 B

+5 -12
View File
@@ -8,22 +8,16 @@ import struct
import subprocess
import argparse
def BuildOTR(xmlPath, rom, zapd_exe=None, genHeaders=None):
def BuildOTR(xmlPath, rom, zapd_exe=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", "-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"])
"-o", "placeholder", "-osf", "placeholder", "-gsf", "1",
"-rconf", "CFG/Config.xml", "-se", "OTR", "--otrfile",
"oot-mq.otr" if Z64Rom.isMqRom(rom) else "oot.otr"]
print(exec_cmd)
exitValue = subprocess.call(exec_cmd)
@@ -39,7 +33,6 @@ 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()
@@ -48,7 +41,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, genHeaders=args.gen_headers)
BuildOTR("../soh/assets/xml/" + rom.version.xml_ver + "/", rom.file_path, zapd_exe=args.zapd_exe)
if __name__ == "__main__":
main()
+10 -7
View File
@@ -18,14 +18,17 @@ def chooseROM(verbose=False, non_interactive=False):
return roms
if non_interactive:
mq_rom = None
non_mq_rom = None
romsToExtract = []
foundMq = False
foundOot = False
for rom in roms:
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]
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
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_US_10:
case OOT_NTSC_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_US_11:
case OOT_NTSC_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_US_12:
case OOT_NTSC_12:
version.version = "N64 NTSC 1.2";
version.listPath = "ntsc_oot.txt";
version.offset = OOT_OFF_NTSC_12;
+155 -74
View File
@@ -1,110 +1,191 @@
![Ship of Harkinian](docs/shiptitle.darkmode.png#gh-dark-mode-only)
![Ship of Harkinian](docs/shiptitle.lightmode.png#gh-light-mode-only)
# Welcome to the Ship of Harkinian!
## Website
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!
Official Website: https://www.shipofharkinian.com/
The Ship does not include assets and as such requires a prior copy of the game to play.
## Discord
Official Discord: https://discord.com/invite/shipofharkinian
Official Discord: https://discord.com/invite/BtBmd55HVH
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.
## Quick Start (Windows)
# Quick Start
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`
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
### Supported Games
#### Ocarina of Time Debug PAL GC (not Master Quest)
> Currently the recommended option
```
sdcard
└── switch
└── soh
├── oot-mq.otr
├── oot.otr
├── soh.nro
└── soh.otr
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)
```
* Launch via Atmosphere's `Game+R` launcher method.
### 4. Play!
Congratulations, you are now sailing with the Ship of Harkinian! Have fun!
# Configuration
## Additional Setup Information
### Default keyboard 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:
| 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 |
### 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.
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.
# Custom Assets
### Custom Music
Custom assets are packed in `.otr` files. To use custom assets, place them in the `mods` folder.
We support importing custom [Seq64](https://github.com/sauraen/seq64) files to replace the in game music and fanfares (Not sound effects yet currently).
If you're interested in creating and/or packing your own custom asset `.otr` files, check out [**retro**](https://github.com/HarbourMasters64/retro)!
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.
# Development
### Building
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
```
If you want to manually compile SoH, please consult the [building instructions](docs/BUILDING.md).
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.
### 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.
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
* [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)
## Building The Ship of Harkinian
<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>
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
+3 -3
View File
@@ -4,9 +4,9 @@
; git-subrepo command. See https://github.com/git-commands/git-subrepo#readme
;
[subrepo]
remote = https://github.com/harbourmasters/ZAPDTR
remote = https://github.com/HarbourMasters/ZAPDTR.git
branch = master
commit = d4c35b90aed66eeed61066b4b76e488bfab52b4d
parent = 9d17e19a1dcf2b5c6cef0d3c93816f98a280eb58
commit = e23b125d89bd973998d2eb00896bcbaf1b53a329
parent = 17b1a8e7fd5517f9232e531da0fed6ef80a87f04
method = rebase
cmdver = 0.4.3
+7 -9
View File
@@ -50,19 +50,17 @@ 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].normX);
writer->Write(col->polygons[i].normY);
writer->Write(col->polygons[i].normZ);
writer->Write(col->polygons[i].dist);
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->Seek(col->polyTypeDefSegmentOffset, SeekOffsetType::Start);
for (const auto& poly : col->polygonTypes)
{
writer->Write(poly.data[0]);
writer->Write(poly.data[1]);
}
for (uint16_t i = 0; i < col->polygonTypes.size(); i++)
writer->Write(col->polygonTypes[i]);
writer->Seek(col->camDataSegmentOffset, SeekOffsetType::Start);
for (auto entry : col->camData->entries)
+159 -159
View File
@@ -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>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>
<?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>
</Project>
+3 -3
View File
@@ -1,7 +1,7 @@
#include "RoomExporter.h"
#include "CollisionExporter.h"
#include "Utils/BinaryWriter.h"
#include <Utils/DiskFile.h>
#include "Utils/File.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.params);
writer->Write(entry.initVar);
}
writer->Seek(oldOffset, SeekOffsetType::Start);
@@ -367,6 +367,6 @@ void ExporterExample_Room::Save(ZResource* res, const fs::path& outPath, BinaryW
}
// writer->Close();
// DiskFile::WriteAllBytes(StringHelper::Sprintf("%s", res->GetName().c_str()),
// File::WriteAllBytes(StringHelper::Sprintf("%s", res->GetName().c_str()),
// memStream->ToVector());
}
+97
View File
@@ -0,0 +1,97 @@
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()
}
}
}
-134
View File
@@ -1,134 +0,0 @@
# 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)
+5
View File
@@ -71,6 +71,9 @@ 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:
@@ -99,6 +102,8 @@ 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.
+31 -31
View File
@@ -1,4 +1,4 @@
set(PROJECT_NAME ZAPDLib)
set(PROJECT_NAME ZAPD)
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,7 +17,6 @@ set(Header_Files
"ImageBackend.h"
"OutputFormatter.h"
"WarningHandler.h"
"CrashHandler.h"
)
source_group("Header Files" FILES ${Header_Files})
@@ -28,6 +27,22 @@ 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"
@@ -43,17 +58,15 @@ source_group("Header Files\\Yaz0" FILES ${Header_Files__Yaz0})
set(Header_Files__Z64
"OtherStructs/SkinLimbStructs.h"
"OtherStructs/CutsceneMM_Commands.h"
"OtherStructs/Cutscene_Commands.h"
"Overlays/ZOverlay.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"
@@ -64,7 +77,6 @@ set(Header_Files__Z64
"ZRom.h"
"ZScalar.h"
"ZSkeleton.h"
"ZSurfaceType.h"
"ZString.h"
"ZSymbol.h"
"ZText.h"
@@ -124,7 +136,6 @@ set(Resource_Files
source_group("Resource Files" FILES ${Resource_Files})
set(Source_Files
"CrashHandler.cpp"
"Declaration.cpp"
"FileWorker.cpp"
"GameConfig.cpp"
@@ -154,18 +165,16 @@ source_group("Source Files\\Yaz0" FILES ${Source_Files__Yaz0})
set(Source_Files__Z64
"OtherStructs/SkinLimbStructs.cpp"
"OtherStructs/CutsceneMM_Commands.cpp"
"OtherStructs/Cutscene_Commands.cpp"
"Overlays/ZOverlay.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"
@@ -176,7 +185,6 @@ set(Source_Files__Z64
"ZRom.cpp"
"ZScalar.cpp"
"ZSkeleton.cpp"
"ZSurfaceType.cpp"
"ZString.cpp"
"ZSymbol.cpp"
"ZText.cpp"
@@ -233,6 +241,7 @@ 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}
@@ -251,17 +260,10 @@ set(ALL_FILES
################################################################################
# Target
################################################################################
add_library(${PROJECT_NAME} STATIC ${ALL_FILES})
add_executable(ZAPD ExecutableMain.cpp)
target_link_libraries(ZAPD ${PROJECT_NAME})
add_executable(${PROJECT_NAME} ${ALL_FILES})
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
@@ -280,7 +282,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
)
endif()
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux|Darwin")
set_target_properties(ZAPD PROPERTIES
set_target_properties(${PROJECT_NAME} PROPERTIES
OUTPUT_NAME "ZAPD.out"
)
endif()
@@ -288,8 +290,7 @@ endif()
# MSVC runtime library
################################################################################
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
foreach(ZTarget ${PROJECT_NAME} ZAPD)
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${ZTarget} PROPERTY MSVC_RUNTIME_LIBRARY)
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY)
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
string(CONCAT "MSVC_RUNTIME_LIBRARY_STR"
$<$<CONFIG:Debug>:
@@ -301,8 +302,7 @@ foreach(ZTarget ${PROJECT_NAME} ZAPD)
$<$<NOT:$<OR:$<CONFIG:Debug>,$<CONFIG:Release>>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}>
)
endif()
set_target_properties(${ZTarget} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
endforeach()
set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
endif()
################################################################################
# Compile definitions
@@ -404,7 +404,7 @@ if(MSVC)
endif()
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU|Clang|AppleClang")
target_compile_options(${PROJECT_NAME} PUBLIC
target_compile_options(${PROJECT_NAME} PRIVATE
-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} PUBLIC
target_link_options(${PROJECT_NAME} PRIVATE
-pthread
)
else()
target_link_options(${PROJECT_NAME} PUBLIC
target_link_options(${PROJECT_NAME} PRIVATE
-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} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}" $<TARGET_OBJECTS:pathconf> )
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}" $<TARGET_OBJECTS:pathconf> )
else()
target_link_libraries(${PROJECT_NAME} PUBLIC "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
endif()
-205
View File
@@ -1,205 +0,0 @@
#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
}
-6
View File
@@ -1,6 +0,0 @@
#ifndef CRASH_HANDLER_H
#define CRASH_HANDLER_H
void CrashHandler_Init();
#endif
+1 -1
View File
@@ -178,7 +178,7 @@ std::string Declaration::GetExternalDeclarationStr() const
std::string Declaration::GetExternStr() const
{
if (IsStatic() || varType == "" || isUnaccounted)
if (IsStatic() || varType == "")
{
return "";
}
-1
View File
@@ -2,7 +2,6 @@
#include <string>
#include <vector>
#include <cstdint>
// TODO: should we drop the `_t` suffix because of UNIX compliance?
typedef uint32_t segptr_t;
-5
View File
@@ -1,5 +0,0 @@
extern "C" int zapd_main(int argc, char* argv[]);
int main(int argc, char* argv[]) {
return zapd_main(argc, argv);
}
+5 -28
View File
@@ -2,10 +2,9 @@
#include <functional>
#include <string_view>
#include <unordered_map>
#include "Utils/Directory.h"
#include <Utils/DiskFile.h>
#include "Utils/File.h"
#include "Utils/Path.h"
#include "ZFile.h"
#include "tinyxml2.h"
@@ -57,7 +56,7 @@ void GameConfig::ReadTexturePool(const fs::path& texturePoolXmlPath)
void GameConfig::GenSymbolMap(const fs::path& symbolMapPath)
{
auto symbolLines = DiskFile::ReadAllLines(symbolMapPath);
auto symbolLines = File::ReadAllLines(symbolMapPath);
for (std::string& symbolLine : symbolLines)
{
@@ -79,7 +78,7 @@ void GameConfig::ConfigFunc_ActorList(const tinyxml2::XMLElement& element)
{
std::string fileName = element.Attribute("File");
std::vector<std::string> lines =
DiskFile::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
File::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
for (auto& line : lines)
actorList.emplace_back(std::move(line));
@@ -89,32 +88,12 @@ void GameConfig::ConfigFunc_ObjectList(const tinyxml2::XMLElement& element)
{
std::string fileName = element.Attribute("File");
std::vector<std::string> lines =
DiskFile::ReadAllLines(Path::GetDirectoryName(configFilePath) / fileName);
File::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");
@@ -166,12 +145,10 @@ void GameConfig::ConfigFunc_ExternalFile(const tinyxml2::XMLElement& element)
void GameConfig::ReadConfigFile(const fs::path& argConfigFilePath)
{
static const std::unordered_map<std::string, ConfigFunc> ConfigFuncDictionary = {
static const std::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},
-4
View File
@@ -31,8 +31,6 @@ 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
@@ -51,8 +49,6 @@ 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);
+9 -12
View File
@@ -3,7 +3,7 @@
#include <algorithm>
#include <string_view>
#include <Utils/DiskFile.h>
#include "Utils/File.h"
#include "Utils/Path.h"
#include "WarningHandler.h"
#include "tinyxml2.h"
@@ -27,14 +27,11 @@ Globals::Globals()
Globals::~Globals()
{
for (const auto& w : workerData)
auto& exporters = GetExporterMap();
for (auto& it : exporters)
{
delete w.second;
}
if (rom != nullptr)
{
delete rom;
delete it.second;
}
}
@@ -134,12 +131,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 (DiskFile::Exists(cfgPath))
name = DiskFile::ReadAllText(cfgPath);
if (File::Exists(cfgPath))
name = File::ReadAllText(cfgPath);
std::string src = tex.GetBodySourceCode();
DiskFile::WriteAllBytes(outPath.string(), src.c_str(), src.size());
File::WriteAllBytes(outPath.string(), src.c_str(), src.size());
}
std::map<std::string, ExporterSet*>& Globals::GetExporterMap()
@@ -186,7 +183,7 @@ std::vector<uint8_t> Globals::GetBaseromFile(std::string fileName)
}
else
return DiskFile::ReadAllBytes(fileName);
return File::ReadAllBytes(fileName);
}
bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile,
+2 -6
View File
@@ -22,7 +22,6 @@ 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
@@ -40,8 +39,6 @@ public:
ExporterSetFuncVoid3 endXMLFunc = nullptr;
ExporterSetResSave resSaveFunc = nullptr;
ExporterSetFuncVoid3 endProgramFunc = nullptr;
ExporterSetFuncVoid4 processCompilableFunc = nullptr;
};
class Globals
@@ -57,7 +54,7 @@ public:
bool useLegacyZDList;
bool singleThreaded;
VerbosityLevel verbosity; // ZAPD outputs additional information
ZFileMode fileMode = ZFileMode::Invalid;
ZFileMode fileMode;
fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath, fileListPath;
TextureType texType;
ZGame game;
@@ -68,9 +65,8 @@ public:
bool forceUnaccountedStatic = false;
bool otrMode = true;
bool buildRawTexture = false;
bool onlyGenSohOtr = false;
ZRom* rom = nullptr;
ZRom* rom;
std::vector<ZFile*> files;
std::vector<ZFile*> externalFiles;
std::vector<int32_t> segments;
+2 -2
View File
@@ -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, uint32_t offset)
void ImageBackend::SetPalette(const ImageBackend& pal)
{
assert(isColorIndexed);
size_t bytePerPixel = pal.GetBytesPerPixel();
@@ -422,7 +422,7 @@ void ImageBackend::SetPalette(const ImageBackend& pal, uint32_t offset)
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 + offset, r, g, b, a);
SetPaletteIndex(index, r, g, b, a);
}
}
}
+1 -2
View File
@@ -42,9 +42,8 @@ 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, uint32_t offset = 0);
void SetPalette(const ImageBackend& pal);
uint32_t GetWidth() const;
uint32_t GetHeight() const;
+112 -88
View File
@@ -1,77 +1,24 @@
#include "Globals.h"
#include "Overlays/ZOverlay.h"
#include "Utils/Directory.h"
#include <Utils/DiskFile.h>
#include "Utils/File.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"
#include "CrashHandler.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 <string>
#include <string_view>
@@ -81,6 +28,31 @@ ZRoom room(nullptr);
//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);
@@ -91,9 +63,63 @@ int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileM
volatile int numWorkersLeft = 0;
extern void ImportExporters();
#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 "C" int zapd_main(int argc, char* argv[])
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[])
{
// Syntax: ZAPD.out [mode (btex/bovl/e)] (Arbritrary Number of Arguments)
@@ -179,6 +205,12 @@ extern "C" int zapd_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];
@@ -189,7 +221,16 @@ extern "C" int zapd_main(int argc, char* argv[])
}
else if (arg == "-eh") // Enable Error Handler
{
CrashHandler_Init();
#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
}
else if (arg == "-v") // Verbose
{
@@ -201,7 +242,6 @@ extern "C" int zapd_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
@@ -220,23 +260,10 @@ extern "C" int zapd_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;
@@ -244,6 +271,8 @@ extern "C" int zapd_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")
@@ -391,11 +420,6 @@ extern "C" int zapd_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;
}
@@ -578,7 +602,7 @@ void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath
ZBackground background(nullptr);
background.ParseBinaryFile(imageFilePath.string(), false);
DiskFile::WriteAllText(outPath.string(), background.GetBodySourceCode());
File::WriteAllText(outPath.string(), background.GetBodySourceCode());
}
void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath)
@@ -588,7 +612,7 @@ void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath)
std::string src = blob->GetBodySourceCode();
DiskFile::WriteAllText(outPath.string(), src);
File::WriteAllText(outPath.string(), src);
delete blob;
}
@@ -1,213 +0,0 @@
#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();
}
}
@@ -1,140 +0,0 @@
#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);
};

Some files were not shown because too many files have changed in this diff Show More