mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-11-24 18:32:19 -05:00
spockalicious (#2751)
* Rough mockup of LUS XML loading * Updated code for merge * Loading from FS support and custom DList WIP implementation * Added current directory support to F3D and impl most of the dlist cmds * WIP Skeleton support * Almost done * Rebase fixes * Submodule updates * HD Texture Support * Fixes * bump lus * fix exporter build, header update * soh builds * setMesh image path cleanup * Update soh/src/overlays/actors/ovl_player_actor/z_player.c * Update soh/src/overlays/actors/ovl_player_actor/z_player.c * Update OTRExporter/OTRExporter/Main.cpp * Update ZAPDTR/ZAPD/ZResource.h * Update soh/src/code/z_skelanime.c * Update OTRExporter/OTRExporter/Main.cpp * Fixed jpeg backgrounds and decreased icon buffer size * Bump lus * Increased even more the buffer because it crashes on long texts * Removed print because sometimes the if is not triggered when the image is already byteswapped * fix non-windows build * fix build Co-authored-by: Kenix <kenixwhisperwind@gmail.com> * add hd checkbox * Various fixes for custom model support (#23) * Some fixes * Updated LUS Version * Fixed issue with Link Skirt on pause menu * Added CVar for custom link model changes * Fixed headers * Additional header fixes * Tweaks * Unload HD game assets on scene transition. (#16) * Unload game assets on scene transition. * Bump LUS * Unloads all HD assets on scene transition. * Only unload hd assets if hd assets are turned on. * Fixes issues on toggling between HD and non HD assets. --------- Co-authored-by: briaguya <briaguya@alice> * fix: actually load hd debug font (#27) * fix: actually load hd debug font * toggle debug text correctly --------- Co-authored-by: briaguya <briaguya> * Yes. (#28) * Merge branch 'develop' into dev-to-ghost * HD Skeleton Swapping and Language Fixes (#32) * Yes. * HD Skeleton Swapping and Language Fixes * Test * Fixed issues with ganon cape (#34) * Fixed Bongo Bongo Crash (#35) * Added HD Assets Toggle (#37) * Ivan the Fairy - Coop Mode (#36) * wip * hookshotable ivan * added hookshot item * new items & changes & fixes & restored navi * farore, din and nayru's spells are done * fixed slingshot & bow * added more items supported * done with all main items * bug fixes & ready * added imgui button * wip * hookshotable ivan * added hookshot item * new items & changes & fixes & restored navi * farore, din and nayru's spells are done * fixed slingshot & bow * added more items supported * fix own dungeon items on shuffled boss rooms (#2683) * bump lus (#2692) * fix: lowercase package names for vcpkg (#2693) vcpkg was throwing an error `error: invalid character in package name (must be lowercase, digits, '-')` this updates our calls to `vcpkg_install_packages` to use lowercase package names instead of uppercase * fix death mountain cloud in rando (#2691) * Fix: Switch Age No Longer Reloads Start Room (#2679) * [Reduced Clutter] Disable Hot/Underwater Warning Text (#2684) * Disable Warning Text * Moved to Reduced Clutter * done with all main items * bug fixes & ready * fix: process roms in consistent order (#2696) * chore: move rando savefile setup and document flags (#2697) * remove rando save init from sram * move rando savefile init logic and set more flags * document flags for rando save creation * Fix: Use correct fps value for frame interpolation with match refresh rate (#2694) * Fix: Kak GS placement on construction site (#2695) * added imgui button * addressed kenix's comments * fixed useless null * added rupee dash mode in extra modes * changed menu position --------- Co-authored-by: Adam Bird <Archez@users.noreply.github.com> Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com> Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com> * LUS Scancodes (#42) * Added HD Assets Toggle * Switched out SDL for LUS scancodes * Ivan tweaks (#45) * Magic consumption slowed down; Bosses now affected by Ivan's Din spell * Adjust magic timer * clean up imgui * model fixes/improvements (#50) * replace `gUseCustomLinkModel` with custom resource check * handle adult/child * bump lus * fix model switching with tab * use lus main * fix carpet man (#52) Co-authored-by: Rozelette <Rozelette@users.noreply.github.com> * get ship model and lus texture into soh.otr, use `gAuthenticLogo` to toggle between ship and authentic (#55) * Use libultra features for CPU-modified textures (#40) * Use libultra features for CPU-modified textures * Comment * bump lus on ghost (#58) * fix: properly use `Interface_LoadActionLabel` to display start button text (#61) * Changes hd -> alt for texture replacement. (#65) * Changes hd -> alt for texture replacement. * Renames variables in gfxprint for hd -> alt change. * Update soh/soh/resource/type/Skeleton.cpp --------- Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com> * Fixes kaleido dungeon maps (#67) * skeleton stuff (#69) * comment out wii u build (#70) * bump lus (#71) * Rework readme (#72) * Update README.md * docs * put custom music docs somewhere * Update README.md * Update README.md * Update README.md * Update README.md * dark/light title image * lus * Update README.md * Fixed vanilla minimap (#73) * Fixed vanilla minimap * Workaround for pulsing SD maps with non-broken HD maps. --------- Co-authored-by: Christopher Leggett <chris@leggett.dev> * Skeleton fix fixed (#75) * WIP skelton patcher fix * Fixes skeleton reference change. * Adds const back to name in ResourceMgr_LoadSkeletonByName --------- Co-authored-by: Christopher Leggett <chris@leggett.dev> Co-authored-by: Kenix <kenixwhisperwind@gmail.com> * Fixes z_message_otr memory leak. * Update soh/soh/z_message_OTR.cpp * Update soh/src/code/game.c * docs: add how to find otr files to switch instructions (#78) * bump lus (#79) * comment out RegisterBlendedTexture in king d (#80) --------- Co-authored-by: Nicholas Estelami <NEstelami@users.noreply.github.com> Co-authored-by: David Chavez <david@dcvz.io> Co-authored-by: briaguya <briaguya@alice> Co-authored-by: Kenix3 <kenixwhisperwind@gmail.com> Co-authored-by: KiritoDv <kiritodev01@gmail.com> Co-authored-by: briaguya <briaguya> Co-authored-by: Ralphie Morell <stratomaster64@gmail.com> Co-authored-by: MelonSpeedruns <melonspeedruns@outlook.com> Co-authored-by: Adam Bird <Archez@users.noreply.github.com> Co-authored-by: inspectredc <78732756+inspectredc@users.noreply.github.com> Co-authored-by: Patrick12115 <115201185+Patrick12115@users.noreply.github.com> Co-authored-by: Rozelette <Rozelette@users.noreply.github.com> Co-authored-by: Christopher Leggett <chris@leggett.dev> Co-authored-by: Lywx <36680385+KiritoDv@users.noreply.github.com>
This commit is contained in:
parent
2af99dfc3a
commit
4166dbf907
82
.github/workflows/generate-builds.yml
vendored
82
.github/workflows/generate-builds.yml
vendored
@ -229,48 +229,48 @@ jobs:
|
||||
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
|
||||
# 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
|
||||
# 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' }}
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
#define GFX_SIZE 8
|
||||
|
||||
#define gsDPSetCombineLERP2(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
|
||||
#define gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, Aa0, Ab0, Ac0, Ad0, \
|
||||
a1, b1, c1, d1, Aa1, Ab1, Ac1, Ad1) \
|
||||
{ \
|
||||
_SHIFTL(G_SETCOMBINE, 24, 8) | \
|
||||
@ -607,7 +607,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||
int32_t ab1 = (data & 0b00000000000000000000000000000000000000000000000000000000111000) >> 3;
|
||||
int32_t ad1 = (data & 0b00000000000000000000000000000000000000000000000000000000000111) >> 0;
|
||||
|
||||
Gfx value = {gsDPSetCombineLERP2(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
|
||||
Gfx value = { gsDPSetCombineLERP_NoMacros(a0, b0, c0, d0, aa0, ab0, ac0, ad0, a1, b1, c1, d1, aa1, ab1, ac1, ad1)};
|
||||
word0 = value.words.w0;
|
||||
word1 = value.words.w1;
|
||||
}
|
||||
|
@ -259,6 +259,11 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
|
||||
//printf("Exported Resource End %s in %zums\n", res->GetName().c_str(), diff);
|
||||
}
|
||||
|
||||
static void ExporterProcessCompilable(tinyxml2::XMLElement* reader)
|
||||
{
|
||||
std::string nodeName = reader->Name();
|
||||
}
|
||||
|
||||
static void ExporterXMLBegin()
|
||||
{
|
||||
}
|
||||
@ -285,6 +290,7 @@ void ImportExporters()
|
||||
ExporterSet* exporterSet = new ExporterSet();
|
||||
exporterSet->processFileModeFunc = ExporterProcessFileMode;
|
||||
exporterSet->parseFileModeFunc = ExporterParseFileMode;
|
||||
exporterSet->processCompilableFunc = ExporterProcessCompilable;
|
||||
exporterSet->parseArgsFunc = ExporterParseArgs;
|
||||
exporterSet->beginFileFunc = ExporterFileBegin;
|
||||
exporterSet->endFileFunc = ExporterFileEnd;
|
||||
|
BIN
OTRExporter/assets/textures/nintendo_rogo_static/SoHShiny
Normal file
BIN
OTRExporter/assets/textures/nintendo_rogo_static/SoHShiny
Normal file
Binary file not shown.
21
OTRExporter/assets/textures/nintendo_rogo_static/gShipLogoDL
Normal file
21
OTRExporter/assets/textures/nintendo_rogo_static/gShipLogoDL
Normal file
@ -0,0 +1,21 @@
|
||||
<DisplayList Version="0">
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_0"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_1"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_2"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/gShipLogoDL_tri_3"/>
|
||||
<CallDisplayList Path="textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001"/>
|
||||
<PipeSync/>
|
||||
<SetGeometryMode G_LIGHTING="1" />
|
||||
<ClearGeometryMode G_TEXTURE_GEN="1" />
|
||||
<SetCombineLERP A0="G_CCMUX_0" B0="G_CCMUX_0" C0="G_CCMUX_0" D0="G_CCMUX_SHADE" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_ENVIRONMENT" A1="G_CCMUX_0" B1="G_CCMUX_0" C1="G_CCMUX_0" D1="G_CCMUX_SHADE" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_ENVIRONMENT"/>
|
||||
<Texture S="65535" T="65535" Level="0" Tile="0" On="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,241 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="13" V02="12"/>
|
||||
<Triangle1 V00="11" V01="14" V02="13"/>
|
||||
<Triangle1 V00="11" V01="15" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="7" V01="10" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="8"/>
|
||||
<Triangle1 V00="10" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="7" V01="10" V02="8"/>
|
||||
<Triangle1 V00="11" V01="8" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="48" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="4" V01="7" V02="8"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="62" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="78" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="7" V01="8" V02="5"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="94" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="110" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="9" V01="10" V02="7"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="11" V01="13" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="124" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="140" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="1" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="5" V02="3"/>
|
||||
<Triangle1 V00="7" V01="6" V02="3"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="6" V01="9" V02="5"/>
|
||||
<Triangle1 V00="5" V01="9" V02="10"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="10" V01="12" V02="5"/>
|
||||
<Triangle1 V00="5" V01="12" V02="13"/>
|
||||
<Triangle1 V00="4" V01="5" V02="13"/>
|
||||
<Triangle1 V00="13" V01="14" V02="4"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="155" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="171" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="0" V01="5" V02="4"/>
|
||||
<Triangle1 V00="0" V01="6" V02="5"/>
|
||||
<Triangle1 V00="4" V01="7" V02="3"/>
|
||||
<Triangle1 V00="8" V01="7" V02="4"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="9" V02="8"/>
|
||||
<Triangle1 V00="8" V01="11" V02="10"/>
|
||||
<Triangle1 V00="8" V01="12" V02="11"/>
|
||||
<Triangle1 V00="10" V01="13" V02="9"/>
|
||||
<Triangle1 V00="14" V01="13" V02="10"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="187" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="2" V01="4" V02="3"/>
|
||||
<Triangle1 V00="0" V01="5" V02="1"/>
|
||||
<Triangle1 V00="6" V01="5" V02="0"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="11" V02="8"/>
|
||||
<Triangle1 V00="12" V01="13" V02="11"/>
|
||||
<Triangle1 V00="14" V01="13" V02="12"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="203" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="0" V01="4" V02="3"/>
|
||||
<Triangle1 V00="0" V01="5" V02="4"/>
|
||||
<Triangle1 V00="5" V01="6" V02="4"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="9" V02="6"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="12" V01="13" V02="10"/>
|
||||
<Triangle1 V00="13" V01="14" V02="10"/>
|
||||
<Triangle1 V00="15" V01="14" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="219" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="3" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="233" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="249" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="265" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="9" V01="11" V02="12"/>
|
||||
<Triangle1 V00="9" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="15" V02="7"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="281" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="8" V02="6"/>
|
||||
<Triangle1 V00="10" V01="9" V02="6"/>
|
||||
<Triangle1 V00="10" V01="11" V02="9"/>
|
||||
<Triangle1 V00="9" V01="12" V02="8"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="297" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="5" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="7" V02="6"/>
|
||||
<Triangle1 V00="6" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="11" V01="13" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="311" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="7" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="10" V02="12"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="12" V01="8" V02="13"/>
|
||||
<Triangle1 V00="12" V01="6" V02="8"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_0" VertexBufferIndex="0" VertexOffset="325" Count="8"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="0" V01="7" V02="6"/>
|
||||
<Triangle1 V00="0" V01="2" V02="7"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,80 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="7" V02="5"/>
|
||||
<Triangle1 V00="7" V01="8" V02="5"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="6" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="8" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="12" V02="13"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="2" V01="4" V02="3"/>
|
||||
<Triangle1 V00="2" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="8" V01="9" V02="6"/>
|
||||
<Triangle1 V00="9" V01="10" V02="6"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="10" V01="12" V02="13"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="0" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="7" V01="10" V02="9"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="11" V02="13"/>
|
||||
<Triangle1 V00="15" V01="14" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_1" VertexBufferIndex="0" VertexOffset="80" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="2" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="1" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="5" V02="7"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="8" V02="9"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="10" V01="12" V02="13"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,259 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="0" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<Triangle1 V00="13" V01="10" V02="14"/>
|
||||
<Triangle1 V00="15" V01="14" V02="10"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="16" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="4" V01="3" V02="2"/>
|
||||
<Triangle1 V00="4" V01="2" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="5" V01="8" V02="7"/>
|
||||
<Triangle1 V00="8" V01="5" V02="9"/>
|
||||
<Triangle1 V00="5" V01="10" V02="9"/>
|
||||
<Triangle1 V00="5" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="8" V02="9"/>
|
||||
<Triangle1 V00="12" V01="9" V02="13"/>
|
||||
<Triangle1 V00="14" V01="12" V02="13"/>
|
||||
<Triangle1 V00="13" V01="15" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="32" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="2" V02="4"/>
|
||||
<Triangle1 V00="4" V01="2" V02="5"/>
|
||||
<Triangle1 V00="5" V01="2" V02="6"/>
|
||||
<Triangle1 V00="2" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="11" V01="5" V02="6"/>
|
||||
<Triangle1 V00="11" V01="6" V02="12"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="48" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="0" V02="4"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="4" V01="6" V02="5"/>
|
||||
<Triangle1 V00="3" V01="5" V02="7"/>
|
||||
<Triangle1 V00="3" V01="7" V02="8"/>
|
||||
<Triangle1 V00="8" V01="9" V02="3"/>
|
||||
<Triangle1 V00="10" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="8" V02="11"/>
|
||||
<Triangle1 V00="12" V01="9" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="9"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="12" V01="15" V02="14"/>
|
||||
<Triangle1 V00="14" V01="1" V02="13"/>
|
||||
<Triangle1 V00="14" V01="2" V02="1"/>
|
||||
<Triangle1 V00="13" V01="1" V02="3"/>
|
||||
<Triangle1 V00="13" V01="3" V02="9"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="64" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="3" V01="2" V02="4"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="3" V02="5"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="10" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="80" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="3" V01="6" V02="4"/>
|
||||
<Triangle1 V00="7" V01="6" V02="3"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="11" V01="10" V02="9"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="11" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="96" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="2" V01="3" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="0"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="110" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="6" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="6" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="15" V01="12" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="126" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="6" V01="4" V02="5"/>
|
||||
<Triangle1 V00="7" V01="6" V02="5"/>
|
||||
<Triangle1 V00="8" V01="6" V02="7"/>
|
||||
<Triangle1 V00="8" V01="7" V02="9"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="11"/>
|
||||
<Triangle1 V00="11" V01="10" V02="12"/>
|
||||
<Triangle1 V00="13" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="142" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="0" V02="3"/>
|
||||
<Triangle1 V00="1" V01="3" V02="4"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="4" V01="6" V02="1"/>
|
||||
<Triangle1 V00="6" V01="7" V02="1"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="8" V01="9" V02="7"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="12" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="158" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="4"/>
|
||||
<Triangle1 V00="7" V01="4" V02="8"/>
|
||||
<Triangle1 V00="9" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="7"/>
|
||||
<Triangle1 V00="10" V01="9" V02="11"/>
|
||||
<Triangle1 V00="12" V01="10" V02="11"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="11" V02="14"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="174" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="6" V01="3" V02="5"/>
|
||||
<Triangle1 V00="7" V01="6" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="11" V01="10" V02="9"/>
|
||||
<Triangle1 V00="11" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="11"/>
|
||||
<Triangle1 V00="11" V01="14" V02="13"/>
|
||||
<Triangle1 V00="14" V01="15" V02="13"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="190" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="4" V01="6" V02="5"/>
|
||||
<Triangle1 V00="4" V01="7" V02="6"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="13" V01="12" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="206" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="3" V02="2"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="4"/>
|
||||
<Triangle1 V00="7" V01="8" V02="5"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="7" V02="10"/>
|
||||
<Triangle1 V00="11" V01="9" V02="10"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="222" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="5" V01="4" V02="3"/>
|
||||
<Triangle1 V00="5" V01="3" V02="6"/>
|
||||
<Triangle1 V00="7" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="9" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="8" V02="10"/>
|
||||
<Triangle1 V00="11" V01="12" V02="13"/>
|
||||
<Triangle1 V00="11" V01="13" V02="14"/>
|
||||
<Triangle1 V00="11" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="238" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="3" V02="5"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="6" V01="9" V02="8"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="10" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="252" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="4" V01="3" V02="2"/>
|
||||
<Triangle1 V00="2" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="9" V01="7" V02="10"/>
|
||||
<Triangle1 V00="7" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="13" V02="14"/>
|
||||
<Triangle1 V00="15" V01="12" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="268" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="1" V01="3" V02="2"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="6" V01="7" V02="4"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="11"/>
|
||||
<Triangle1 V00="8" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="8" V02="12"/>
|
||||
<Triangle1 V00="12" V01="14" V02="13"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="284" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="5"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="6" V01="7" V02="3"/>
|
||||
<Triangle1 V00="8" V01="3" V02="7"/>
|
||||
<Triangle1 V00="9" V01="8" V02="7"/>
|
||||
<Triangle1 V00="7" V01="10" V02="9"/>
|
||||
<Triangle1 V00="10" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="10" V02="13"/>
|
||||
<Triangle1 V00="14" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="300" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="8"/>
|
||||
<Triangle1 V00="6" V01="9" V02="7"/>
|
||||
<Triangle1 V00="10" V01="9" V02="6"/>
|
||||
<Triangle1 V00="11" V01="10" V02="6"/>
|
||||
<Triangle1 V00="11" V01="6" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="6"/>
|
||||
<Triangle1 V00="13" V01="6" V02="8"/>
|
||||
<Triangle1 V00="10" V01="14" V02="9"/>
|
||||
<Triangle1 V00="9" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_2" VertexBufferIndex="0" VertexOffset="316" Count="5"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="0" V02="2"/>
|
||||
<Triangle1 V00="3" V01="4" V02="0"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,118 @@
|
||||
<DisplayList Version="0">
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="0" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="7" V01="8" V02="6"/>
|
||||
<Triangle1 V00="7" V01="9" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="8"/>
|
||||
<Triangle1 V00="9" V01="11" V02="10"/>
|
||||
<Triangle1 V00="8" V01="10" V02="12"/>
|
||||
<Triangle1 V00="8" V01="12" V02="13"/>
|
||||
<Triangle1 V00="6" V01="8" V02="13"/>
|
||||
<Triangle1 V00="6" V01="13" V02="14"/>
|
||||
<Triangle1 V00="1" V01="6" V02="14"/>
|
||||
<Triangle1 V00="1" V01="3" V02="6"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="15" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="9" V01="8" V02="10"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="10" V01="12" V02="11"/>
|
||||
<Triangle1 V00="13" V01="14" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="31" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="4" V01="5" V02="1"/>
|
||||
<Triangle1 V00="4" V01="6" V02="5"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="6" V01="8" V02="7"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="7" V01="9" V02="10"/>
|
||||
<Triangle1 V00="7" V01="10" V02="11"/>
|
||||
<Triangle1 V00="7" V01="11" V02="12"/>
|
||||
<Triangle1 V00="5" V01="7" V02="12"/>
|
||||
<Triangle1 V00="5" V01="12" V02="13"/>
|
||||
<Triangle1 V00="2" V01="5" V02="13"/>
|
||||
<Triangle1 V00="2" V01="1" V02="5"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="45" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="3" V01="5" V02="6"/>
|
||||
<Triangle1 V00="3" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="1" V02="3"/>
|
||||
<Triangle1 V00="7" V01="8" V02="1"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="12" V01="11" V02="10"/>
|
||||
<Triangle1 V00="12" V01="10" V02="13"/>
|
||||
<Triangle1 V00="14" V01="12" V02="13"/>
|
||||
<Triangle1 V00="14" V01="13" V02="15"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="61" Count="14"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="2" V02="3"/>
|
||||
<Triangle1 V00="4" V01="0" V02="3"/>
|
||||
<Triangle1 V00="4" V01="5" V02="0"/>
|
||||
<Triangle1 V00="6" V01="5" V02="4"/>
|
||||
<Triangle1 V00="6" V01="7" V02="5"/>
|
||||
<Triangle1 V00="8" V01="9" V02="10"/>
|
||||
<Triangle1 V00="8" V01="11" V02="9"/>
|
||||
<Triangle1 V00="12" V01="11" V02="8"/>
|
||||
<Triangle1 V00="12" V01="13" V02="11"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="75" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="5" V01="6" V02="3"/>
|
||||
<Triangle1 V00="5" V01="7" V02="6"/>
|
||||
<Triangle1 V00="3" V01="6" V02="8"/>
|
||||
<Triangle1 V00="3" V01="8" V02="1"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="9"/>
|
||||
<Triangle1 V00="13" V01="14" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="90" Count="15"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<Triangle1 V00="3" V01="5" V02="4"/>
|
||||
<Triangle1 V00="4" V01="5" V02="6"/>
|
||||
<Triangle1 V00="4" V01="6" V02="7"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="9" V01="10" V02="11"/>
|
||||
<Triangle1 V00="9" V01="12" V02="10"/>
|
||||
<Triangle1 V00="13" V01="12" V02="9"/>
|
||||
<Triangle1 V00="13" V01="14" V02="12"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="105" Count="16"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="0" V01="3" V02="1"/>
|
||||
<Triangle1 V00="4" V01="3" V02="0"/>
|
||||
<Triangle1 V00="4" V01="5" V02="3"/>
|
||||
<Triangle1 V00="3" V01="5" V02="6"/>
|
||||
<Triangle1 V00="7" V01="3" V02="6"/>
|
||||
<Triangle1 V00="7" V01="6" V02="8"/>
|
||||
<Triangle1 V00="7" V01="8" V02="9"/>
|
||||
<Triangle1 V00="1" V01="3" V02="7"/>
|
||||
<Triangle1 V00="10" V01="11" V02="12"/>
|
||||
<Triangle1 V00="13" V01="10" V02="12"/>
|
||||
<Triangle1 V00="13" V01="12" V02="14"/>
|
||||
<Triangle1 V00="15" V01="13" V02="14"/>
|
||||
<LoadVertices Path="textures/nintendo_rogo_static/gShipLogoDL_vtx_3" VertexBufferIndex="0" VertexOffset="121" Count="5"/>
|
||||
<Triangle1 V00="0" V01="1" V02="2"/>
|
||||
<Triangle1 V00="3" V01="1" V02="0"/>
|
||||
<Triangle1 V00="3" V01="4" V02="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,335 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="0" Y="-5" Z="11" S="391" T="-468" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="-6" Z="13" S="391" T="-447" R="162" G="39" B="76" A="255"/>
|
||||
<Vtx X="0" Y="-6" Z="13" S="408" T="-447" R="94" G="39" B="76" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="120" T="-327" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="1" Y="0" Z="-21" S="171" T="-251" R="185" G="93" B="49" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-27" S="181" T="-327" R="175" G="50" B="84" A="255"/>
|
||||
<Vtx X="-2" Y="0" Z="-21" S="130" T="-251" R="71" G="93" B="49" A="255"/>
|
||||
<Vtx X="2" Y="0" Z="-20" S="185" T="-228" R="188" G="87" B="63" A="255"/>
|
||||
<Vtx X="-3" Y="0" Z="-20" S="116" T="-228" R="68" G="87" B="63" A="255"/>
|
||||
<Vtx X="-5" Y="-1" Z="-17" S="83" T="-191" R="88" G="79" B="46" A="255"/>
|
||||
<Vtx X="5" Y="-1" Z="-17" S="218" T="-191" R="168" G="79" B="46" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="-11" S="70" T="-103" R="92" G="87" B="7" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="-11" S="231" T="-103" R="164" G="87" B="7" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="151" T="35" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="139" T="48" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="70" T="94" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="1" S="151" T="60" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="139" T="48" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="70" T="94" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="3" S="231" T="94" R="181" G="78" B="190" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="0" S="162" T="48" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="-11" S="231" T="-103" R="164" G="87" B="7" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="151" T="35" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="-6" Z="13" S="65" T="-396" R="162" G="39" B="76" A="255"/>
|
||||
<Vtx X="0" Y="-8" Z="12" S="48" T="-424" R="114" G="12" B="55" A="255"/>
|
||||
<Vtx X="0" Y="-6" Z="13" S="49" T="-396" R="94" G="39" B="76" A="255"/>
|
||||
<Vtx X="-1" Y="-8" Z="12" S="65" T="-424" R="142" G="12" B="55" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="49" T="-483" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="-1" Y="-12" Z="14" S="65" T="-483" R="173" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-34" T="-437" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-55" T="-468" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="3" Z="11" S="-55" T="-437" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-34" T="-437" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="12" S="-34" T="-468" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-55" T="-468" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="2" Z="12" S="20" T="-447" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="6" Y="3" Z="11" S="-1" T="-478" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-1" T="-447" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="6" Y="2" Z="12" S="20" T="-478" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="-12" Z="14" S="-372" T="-427" R="173" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="-13" Z="13" S="-389" T="-438" R="84" G="161" B="250" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="-389" T="-427" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="-1" Y="-13" Z="13" S="-372" T="-438" R="172" G="161" B="250" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="-389" T="-468" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="-1" Y="2" Z="12" S="221" T="-475" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="11" S="200" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="12" S="221" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="3" Z="11" S="200" T="-476" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="3" Z="11" S="186" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-6" Y="2" Z="12" S="165" T="-476" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="165" T="-444" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-6" Y="3" Z="11" S="186" T="-475" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="-8" Z="12" S="212" T="-395" R="142" G="12" B="55" A="255"/>
|
||||
<Vtx X="-1" Y="-6" Z="13" S="221" T="-422" R="162" G="39" B="76" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="206" T="-444" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="186" T="-357" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="-1" Y="-12" Z="14" S="221" T="-333" R="173" G="232" B="94" A="255"/>
|
||||
<Vtx X="-1" Y="-13" Z="13" S="207" T="-327" R="172" G="161" B="250" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="20" T="-494" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="28" T="-447" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="28" T="-494" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="20" T="-447" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="1" Y="4" Z="0" S="427" T="389" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="415" T="495" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="0" S="427" T="495" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="415" T="377" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="-343" T="-272" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="-330" T="-71" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="-330" T="-272" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-343" T="-71" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="-132" T="-270" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="1" Y="5" Z="0" S="-144" T="-69" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="-132" T="-69" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="0" S="-144" T="-270" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-431" T="-469" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="1" Y="28" Z="0" S="-441" T="-456" R="68" G="149" B="0" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-431" T="-456" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-1" S="-441" T="-469" R="0" G="149" B="188" A="255"/>
|
||||
<Vtx X="-1" Y="28" Z="0" S="-431" T="-469" R="188" G="149" B="0" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-421" T="-456" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-421" T="-469" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-1" S="-431" T="-456" R="0" G="149" B="188" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-5" T="-177" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-2" T="-148" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-2" T="-178" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-5" T="-148" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-2" T="-105" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-5" T="-104" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-2" T="-96" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-5" T="-96" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="2" Y="28" Z="0" S="35" T="-483" R="107" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="-3" S="48" T="-447" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="2" Y="29" Z="0" S="48" T="-483" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-3" S="35" T="-447" R="0" G="188" B="149" A="255"/>
|
||||
<Vtx X="2" Y="28" Z="0" S="-330" T="-475" R="107" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="3" S="-344" T="-439" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="3" S="-330" T="-438" R="0" G="188" B="107" A="255"/>
|
||||
<Vtx X="2" Y="29" Z="0" S="-344" T="-475" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="-3" Y="29" Z="0" S="200" T="-444" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-3" S="186" T="-481" R="0" G="188" B="149" A="255"/>
|
||||
<Vtx X="-3" Y="28" Z="0" S="186" T="-444" R="149" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="-3" S="200" T="-481" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="3" S="165" T="-445" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="-3" Y="28" Z="0" S="152" T="-481" R="149" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="3" S="152" T="-444" R="0" G="188" B="107" A="255"/>
|
||||
<Vtx X="-3" Y="29" Z="0" S="165" T="-481" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-2" T="-14" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="31" Z="0" S="-5" T="-43" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="-1" Y="29" Z="0" S="-5" T="-14" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-2" T="-43" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-2" T="-43" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="34" Z="0" S="-5" T="-87" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="-1" Y="31" Z="0" S="-5" T="-43" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-2" T="-87" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="35" Z="0" S="-5" T="-96" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-2" T="-96" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="-1" Y="29" Z="0" S="-2" T="68" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-5" T="39" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-5" T="68" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="31" Z="0" S="-2" T="39" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-5" T="-5" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="-1" Y="34" Z="0" S="-2" T="-5" R="129" G="0" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-5" T="-14" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="-1" Y="35" Z="0" S="-2" T="-14" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-1" T="-221" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-4" T="-251" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="-4" T="-222" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-1" T="-251" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="-1" Y="35" Z="0" S="-350" T="-271" R="152" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-345" T="-266" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-345" T="-271" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-350" T="-266" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-1" T="-251" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-4" T="-260" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-4" T="-251" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="35" Z="0" S="-1" T="-260" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="0" S="434" T="-341" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="445" T="-447" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="0" S="434" T="-447" R="73" G="183" B="74" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="445" T="-329" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="391" T="-393" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="379" T="-287" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="0" S="391" T="-287" R="183" G="74" B="73" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="379" T="-405" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="371" T="-287" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="371" T="-405" R="0" G="127" B="0" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="379" T="-524" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="1" Y="21" Z="0" S="391" T="-418" R="87" G="61" B="69" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="0" S="391" T="-524" R="73" G="74" B="73" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="371" T="-524" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="363" T="-464" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-2" S="363" T="-524" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-2" S="363" T="-405" R="0" G="97" B="82" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="363" T="-346" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-2" S="363" T="-287" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="-55" T="-437" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="-31" T="-331" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-31" T="-437" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="0" S="-55" T="-331" R="183" G="74" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="427" T="389" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="439" T="495" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-1" S="439" T="377" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="427" T="495" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="-461" T="-495" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="0" S="-473" T="-427" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="-461" T="-427" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="1" Y="4" Z="0" S="-473" T="-496" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="281" T="-423" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="-1" S="293" T="-492" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="281" T="-491" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="293" T="-423" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="1" Y="4" Z="0" S="-29" T="-262" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="1" S="-17" T="-331" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="0" S="-29" T="-331" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="1" S="-17" T="-263" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="5" Z="0" S="-29" T="-250" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="0" S="-132" T="-251" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="0" S="-132" T="-262" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="1" S="-17" T="-251" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="19" Z="0" S="-29" T="-50" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="1" S="-17" T="-50" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="21" Z="0" S="-29" T="-25" R="87" G="61" B="69" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="0" S="-132" T="-25" R="73" G="74" B="73" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="0" S="-132" T="-50" R="73" G="183" B="74" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="1" S="-17" T="-26" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-29" T="50" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-17" T="50" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-29" T="58" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-17" T="50" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-29" T="50" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-75" T="58" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-75" T="50" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-17" T="57" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="1" Y="28" Z="0" S="-29" T="68" R="68" G="149" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="1" S="-17" T="68" R="0" G="149" B="68" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="1" S="-5" T="0" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="-1" Z="0" S="-17" T="68" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="-1" Z="1" S="-5" T="68" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="-17" T="0" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="1" S="-5" T="-12" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="-17" T="-12" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="1" S="-5" T="-213" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-17" T="-213" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="1" S="-5" T="-238" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="19" Z="0" S="-17" T="-213" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="1" S="-5" T="-213" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="-17" T="-238" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-17" T="-313" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-5" T="-313" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-17" T="-321" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="1" S="-5" T="-321" R="0" G="0" B="127" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="1" S="-5" T="-331" R="0" G="149" B="68" A="255"/>
|
||||
<Vtx X="-1" Y="28" Z="0" S="-17" T="-331" R="188" G="149" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-436" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-2" S="-431" T="-427" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="-407" T="-427" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="-407" T="-444" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-444" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="-407" T="-456" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="0" S="-407" T="-456" R="183" G="183" B="74" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="0" S="-431" T="-456" R="183" G="74" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-1" S="-431" T="-444" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="-431" T="-456" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-2" S="-455" T="-456" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="-455" T="-448" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="-431" T="-439" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-1" S="-455" T="-439" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="0" S="-431" T="-427" R="73" G="183" B="74" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="0" S="-455" T="-427" R="73" G="74" B="73" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="-418" T="-468" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="0" S="-407" T="-456" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="-407" T="-468" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="0" S="-418" T="-456" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="1" Y="5" Z="0" S="457" T="-341" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="445" T="-447" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="445" T="-329" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="0" S="457" T="-447" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="0" S="-133" T="-291" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="-144" T="-303" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="0" S="-144" T="-291" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="-133" T="-303" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="450" T="389" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="439" T="495" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="0" S="450" T="495" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="439" T="377" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="434" T="-341" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="422" T="-447" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="422" T="-329" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="0" S="434" T="-447" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="5" Z="0" S="-125" T="-521" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="0" S="-113" T="-415" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-1" Y="4" Z="0" S="-113" T="-521" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="0" S="-125" T="-415" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-15" T="-417" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="1" Y="21" Z="0" S="-3" T="-492" R="87" G="61" B="69" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="-15" T="-493" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-3" T="-417" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="-1" Y="21" Z="0" S="-27" T="-492" R="169" G="61" B="69" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-15" T="-417" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-1" S="-15" T="-492" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-27" T="-417" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-137" T="-282" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-144" T="-270" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-137" T="-270" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-282" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-137" T="-282" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-291" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-282" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-137" T="-291" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-348" T="-474" R="87" G="195" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-360" T="-427" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-348" T="-427" R="73" G="183" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-360" T="-486" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="408" T="-468" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="415" T="-456" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="415" T="-468" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="408" T="-456" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="408" T="-447" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="415" T="-447" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-372" T="-474" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-360" T="-427" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-372" T="-474" R="169" G="195" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="-372" T="-427" R="183" G="183" B="73" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-360" T="-427" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-1" Y="27" Z="0" S="-156" T="-378" R="169" G="61" B="70" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-144" T="-425" R="166" G="90" B="0" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="0" S="-156" T="-425" R="183" G="73" B="73" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-144" T="-366" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="-136" T="-425" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="-136" T="-366" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-144" T="-307" R="90" G="90" B="0" A="255"/>
|
||||
<Vtx X="1" Y="27" Z="0" S="-156" T="-354" R="87" G="61" B="70" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="0" S="-156" T="-307" R="73" G="73" B="73" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-136" T="-307" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="-13" Z="13" S="173" T="-444" R="84" G="161" B="250" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="151" T="-415" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="186" T="-438" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="-8" Z="12" S="177" T="-376" R="114" G="12" B="55" A="255"/>
|
||||
<Vtx X="0" Y="-12" Z="14" S="186" T="-438" R="83" G="232" B="94" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="151" T="-415" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="171" T="-327" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="-6" Z="13" S="186" T="-349" R="94" G="39" B="76" A="255"/>
|
||||
<Vtx X="8" Y="21" Z="-2" S="495" T="-143" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="471" T="-143" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="495" T="-83" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="487" T="-78" R="11" G="222" B="134" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-2" S="471" T="-24" R="0" G="31" B="133" A="255"/>
|
||||
<Vtx X="-4" Y="21" Z="-2" S="488" T="31" R="243" G="222" B="134" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="471" T="94" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="495" T="35" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="-9" Y="21" Z="-2" S="495" T="94" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="450" T="436" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="450" T="495" R="73" G="73" B="183" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="458" T="495" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="458" T="436" R="0" G="51" B="140" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="450" T="377" R="183" G="73" B="183" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="458" T="377" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="-1" Y="28" Z="0" S="269" T="-389" R="188" G="149" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="3" S="253" T="-423" R="0" G="188" B="107" A="255"/>
|
||||
<Vtx X="-3" Y="28" Z="0" S="253" T="-373" R="149" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="1" S="269" T="-407" R="0" G="149" B="68" A="255"/>
|
||||
<Vtx X="1" Y="28" Z="0" S="285" T="-407" R="68" G="149" B="0" A="255"/>
|
||||
<Vtx X="2" Y="28" Z="0" S="302" T="-423" R="107" G="188" B="0" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-1" S="285" T="-389" R="0" G="149" B="188" A="255"/>
|
||||
<Vtx X="0" Y="28" Z="-3" S="302" T="-373" R="0" G="188" B="149" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="26" T="-419" R="0" G="115" B="202" A="255"/>
|
||||
<Vtx X="2" Y="29" Z="0" S="-1" T="-396" R="104" G="73" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="-3" S="48" T="-396" R="0" G="73" B="152" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="22" T="-419" R="54" G="115" B="0" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="3" S="-1" T="-447" R="0" G="73" B="104" A="255"/>
|
||||
<Vtx X="0" Y="29" Z="0" S="22" T="-424" R="0" G="115" B="54" A="255"/>
|
||||
<Vtx X="-1" Y="29" Z="0" S="26" T="-424" R="202" G="115" B="0" A="255"/>
|
||||
<Vtx X="-3" Y="29" Z="0" S="48" T="-447" R="152" G="73" B="0" A="255"/>
|
||||
</Vertex>
|
@ -0,0 +1,98 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="3" Y="34" Z="-1" S="302" T="-467" R="72" G="84" B="194" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="293" T="-423" R="64" G="160" B="202" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="302" T="-423" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="293" T="-467" R="64" G="96" B="202" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-128" T="-469" R="64" G="96" B="202" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-135" T="-425" R="23" G="154" B="183" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-128" T="-425" R="64" G="160" B="202" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-135" T="-469" R="23" G="102" B="183" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="0" S="-147" T="-425" R="234" G="160" B="176" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="0" S="-147" T="-469" R="234" G="96" B="176" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="0" S="-156" T="-425" R="59" G="186" B="168" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="0" S="-156" T="-469" R="59" G="70" B="168" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="112" T="-416" R="183" G="171" B="61" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="104" T="-460" R="193" G="96" B="54" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="104" T="-416" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="112" T="-460" R="183" G="85" B="61" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="260" T="-423" R="226" G="175" B="94" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="253" T="-467" R="183" G="85" B="61" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="253" T="-423" R="183" G="171" B="61" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="260" T="-467" R="226" G="81" B="94" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="1" S="271" T="-423" R="25" G="172" B="92" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="1" S="271" T="-467" R="25" G="84" B="92" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="1" S="281" T="-423" R="84" G="178" B="56" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="1" S="281" T="-467" R="84" G="78" B="56" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="1" S="-401" T="-471" R="84" G="78" B="56" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="0" S="-389" T="-427" R="59" G="186" B="168" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="0" S="-389" T="-471" R="59" G="70" B="168" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="1" S="-401" T="-427" R="84" G="178" B="56" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-1" T="-178" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-5" T="-221" R="171" G="82" B="209" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="-5" T="-178" R="171" G="174" B="210" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-1" T="-221" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="70" T="-417" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="74" T="-460" R="34" G="89" B="84" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="70" T="-460" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="74" T="-417" R="33" G="166" B="84" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="0" S="82" T="-461" R="12" G="97" B="81" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="0" S="82" T="-417" R="12" G="159" B="81" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="94" T="-417" R="227" G="157" B="75" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="94" T="-461" R="227" G="99" B="75" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="104" T="-416" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="104" T="-460" R="193" G="96" B="54" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="151" T="-416" R="171" G="174" B="210" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="151" T="-460" R="171" G="82" B="209" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="143" T="-460" R="205" G="85" B="177" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="143" T="-416" R="205" G="171" B="177" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="-1" S="135" T="-460" R="242" G="84" B="161" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="-1" S="135" T="-416" R="242" G="172" B="161" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="-1" S="135" T="-416" R="242" G="172" B="161" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="-1" S="135" T="-460" R="242" G="84" B="161" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="-1" S="123" T="-460" R="35" G="83" B="166" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="-1" S="123" T="-416" R="35" G="173" B="166" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="113" T="-416" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="-1" S="113" T="-460" R="72" G="84" B="194" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="0" S="-72" T="-478" R="234" G="160" B="176" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="0" S="-64" T="-485" R="59" G="186" B="168" A="255"/>
|
||||
<Vtx X="5" Y="31" Z="1" S="-76" T="-489" R="84" G="178" B="56" A="255"/>
|
||||
<Vtx X="4" Y="31" Z="1" S="-84" T="-481" R="25" G="172" B="92" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-77" T="-467" R="23" G="154" B="183" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="-89" T="-471" R="226" G="175" B="94" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="1" S="-86" T="-461" R="183" G="171" B="61" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="0" S="-74" T="-458" R="64" G="160" B="202" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="-79" T="-454" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="-67" T="-450" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="-76" T="-441" R="227" G="157" B="75" A="255"/>
|
||||
<Vtx X="3" Y="31" Z="-1" S="-67" T="-450" R="72" G="172" B="194" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="0" S="-79" T="-454" R="193" G="160" B="54" A="255"/>
|
||||
<Vtx X="2" Y="31" Z="-1" S="-64" T="-438" R="35" G="173" B="166" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="-1" S="-67" T="-426" R="242" G="172" B="161" A="255"/>
|
||||
<Vtx X="1" Y="31" Z="0" S="-79" T="-430" R="12" G="159" B="81" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="-73" T="-419" R="205" G="171" B="177" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-85" T="-423" R="33" G="166" B="84" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="-1" S="-83" T="-415" R="171" G="174" B="210" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-86" T="-415" R="187" G="201" B="164" A="255"/>
|
||||
<Vtx X="0" Y="31" Z="0" S="-88" T="-420" R="97" G="206" B="66" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-111" T="-488" R="189" G="55" B="163" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-113" T="-484" R="98" G="50" B="64" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-110" T="-481" R="34" G="89" B="84" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-107" T="-489" R="171" G="82" B="209" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-98" T="-484" R="205" G="85" B="177" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="0" S="-110" T="-481" R="34" G="89" B="84" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="0" S="-104" T="-474" R="12" G="97" B="81" A="255"/>
|
||||
<Vtx X="0" Y="34" Z="-1" S="-98" T="-484" R="205" G="85" B="177" A="255"/>
|
||||
<Vtx X="1" Y="34" Z="-1" S="-92" T="-477" R="242" G="84" B="161" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="-1" S="-89" T="-466" R="35" G="83" B="166" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="-101" T="-462" R="227" G="99" B="75" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="-1" S="-92" T="-453" R="72" G="84" B="194" A="255"/>
|
||||
<Vtx X="2" Y="34" Z="0" S="-104" T="-450" R="193" G="96" B="54" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-98" T="-446" R="64" G="96" B="202" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="-110" T="-442" R="183" G="85" B="61" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="0" S="-101" T="-436" R="23" G="102" B="183" A="255"/>
|
||||
<Vtx X="3" Y="34" Z="1" S="-113" T="-433" R="226" G="81" B="94" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="1" S="-109" T="-422" R="25" G="84" B="92" A="255"/>
|
||||
<Vtx X="4" Y="34" Z="0" S="-97" T="-426" R="234" G="96" B="176" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="1" S="-101" T="-415" R="84" G="78" B="56" A="255"/>
|
||||
<Vtx X="5" Y="34" Z="0" S="-89" T="-418" R="59" G="70" B="168" A="255"/>
|
||||
</Vertex>
|
@ -0,0 +1,323 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="-2" Y="1" Z="-22" S="-343" T="-266" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-350" T="-196" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-343" T="-169" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-343" T="-71" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-343" T="-169" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="-350" T="-141" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-348" T="-432" R="82" G="187" B="69" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-343" T="-368" R="82" G="185" B="66" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-343" T="-432" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-348" T="-367" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-528" T="-505" R="4" G="95" B="85" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-522" T="-510" R="85" G="196" B="73" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-529" T="-510" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-522" T="-506" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="6" Y="3" Z="11" S="-510" T="-495" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-510" T="-452" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-528" T="-505" R="4" G="95" B="85" A="255"/>
|
||||
<Vtx X="0" Y="3" Z="11" S="-510" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="3" Z="11" S="-510" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-528" T="-314" R="252" G="95" B="85" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="11" S="-510" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="3" Z="11" S="-510" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-6" Y="3" Z="11" S="-510" T="-324" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-522" T="-314" R="203" G="243" B="115" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-522" T="-309" R="171" G="196" B="73" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-529" T="-310" R="185" G="88" B="58" A="255"/>
|
||||
<Vtx X="-6" Y="2" Z="12" S="-489" T="-324" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="12" S="-473" T="-309" R="156" G="221" B="70" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="12" S="-473" T="-409" R="0" G="215" B="120" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="12" S="-489" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="12" S="-473" T="-409" R="0" G="215" B="120" A="255"/>
|
||||
<Vtx X="-1" Y="2" Z="12" S="-489" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-489" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="12" S="-489" T="-452" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="2" Z="12" S="-489" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="12" S="-473" T="-510" R="100" G="221" B="70" A="255"/>
|
||||
<Vtx X="6" Y="2" Z="12" S="-489" T="-495" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-522" T="-506" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="6" Y="3" Z="11" S="-510" T="-495" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="3" Y="3" Z="11" S="-510" T="-452" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="4" Y="3" Z="11" S="-510" T="-464" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="-10" S="70" T="194" R="104" G="186" B="237" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="136" T="95" R="21" G="160" B="176" A="255"/>
|
||||
<Vtx X="6" Y="-8" Z="-17" S="85" T="94" R="92" G="201" B="188" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="-10" S="70" T="194" R="104" G="186" B="237" A="255"/>
|
||||
<Vtx X="2" Y="-13" Z="-10" S="137" T="196" R="26" G="134" B="231" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="136" T="95" R="21" G="160" B="176" A="255"/>
|
||||
<Vtx X="2" Y="-13" Z="4" S="137" T="393" R="27" G="132" B="9" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="4" S="70" T="391" R="106" G="186" B="6" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="11" S="137" T="495" R="19" G="169" B="91" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="74" T="494" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="175" T="495" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="-2" Y="-11" Z="11" S="196" T="495" R="237" G="169" B="91" A="255"/>
|
||||
<Vtx X="-2" Y="-13" Z="4" S="195" T="393" R="229" G="132" B="9" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="4" S="263" T="391" R="150" G="186" B="6" A="255"/>
|
||||
<Vtx X="-7" Y="-9" Z="11" S="259" T="494" R="172" G="207" B="82" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="-10" S="263" T="194" R="152" G="186" B="237" A="255"/>
|
||||
<Vtx X="-2" Y="-13" Z="-10" S="195" T="196" R="230" G="134" B="231" A="255"/>
|
||||
<Vtx X="-3" Y="-9" Z="-17" S="197" T="95" R="235" G="160" B="176" A="255"/>
|
||||
<Vtx X="-6" Y="-8" Z="-17" S="248" T="94" R="164" G="201" B="188" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="335" T="-265" R="74" G="215" B="161" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="346" T="-287" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="330" T="-265" R="70" G="191" B="172" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="306" T="-211" R="81" G="166" B="218" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="302" T="-211" R="89" G="177" B="211" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="305" T="-112" R="95" G="172" B="248" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="309" T="-112" R="91" G="168" B="248" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="342" T="94" R="82" G="185" B="66" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="346" T="94" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="140" T="-416" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-28" S="140" T="-327" R="29" G="191" B="151" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="-28" S="151" T="-328" R="93" G="233" B="172" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="-22" S="133" T="-416" R="29" G="170" B="168" A="255"/>
|
||||
<Vtx X="-2" Y="2" Z="-28" S="81" T="-327" R="227" G="191" B="151" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="88" T="-416" R="227" G="170" B="168" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="81" T="-416" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="81" T="-416" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-28" S="70" T="-328" R="163" G="233" B="172" A="255"/>
|
||||
<Vtx X="-2" Y="2" Z="-28" S="81" T="-327" R="227" G="191" B="151" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-380" T="405" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="-28" S="-366" T="495" R="93" G="233" B="172" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-330" T="488" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="-403" T="409" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="-395" T="385" R="74" G="215" B="161" A="255"/>
|
||||
<Vtx X="3" Y="-2" Z="-21" S="-414" T="398" R="81" G="253" B="159" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="-398" T="338" R="81" G="166" B="218" A="255"/>
|
||||
<Vtx X="6" Y="-8" Z="-17" S="-495" T="336" R="92" G="201" B="188" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="-397" T="239" R="91" G="168" B="248" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="-10" S="-529" T="237" R="104" G="186" B="237" A="255"/>
|
||||
<Vtx X="7" Y="-10" Z="4" S="-525" T="39" R="106" G="186" B="6" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-398" T="30" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="-509" T="-64" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="11" S="-387" T="-61" R="102" G="218" B="66" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="-509" T="-64" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="-398" T="30" R="118" G="226" B="35" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-335" T="33" R="82" G="187" B="69" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-330" T="-61" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="12" S="-378" T="-71" R="100" G="221" B="70" A="255"/>
|
||||
<Vtx X="-4" Y="3" Z="11" S="-510" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="12" S="-489" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="11" S="-510" T="-367" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-4" Y="2" Z="12" S="-489" T="-355" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="5" S="-55" T="-479" R="174" G="187" B="69" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="5" S="-59" T="-415" R="174" G="185" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="5" S="-55" T="-415" R="138" G="226" B="35" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="5" S="-59" T="-480" R="138" G="227" B="38" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-11" S="412" T="-103" R="174" G="97" B="6" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="3" S="418" T="93" R="181" G="78" B="190" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="3" S="431" T="94" R="223" G="119" B="228" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="-11" S="399" T="-103" R="164" G="87" B="7" A="255"/>
|
||||
<Vtx X="5" Y="0" Z="-17" S="404" T="-191" R="185" G="99" B="36" A="255"/>
|
||||
<Vtx X="5" Y="-1" Z="-17" S="391" T="-191" R="168" G="79" B="46" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-20" S="404" T="-228" R="186" G="82" B="68" A="255"/>
|
||||
<Vtx X="2" Y="0" Z="-20" S="391" T="-229" R="188" G="87" B="63" A="255"/>
|
||||
<Vtx X="1" Y="0" Z="-21" S="395" T="-252" R="185" G="93" B="49" A="255"/>
|
||||
<Vtx X="1" Y="1" Z="-21" S="408" T="-252" R="167" G="83" B="38" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-27" S="418" T="-329" R="175" G="50" B="84" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="431" T="-328" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-2" T="134" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="0" T="68" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="1" Y="1" Z="-21" S="-11" T="144" R="167" G="83" B="38" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
|
||||
<Vtx X="1" Y="1" Z="-21" S="-11" T="144" R="167" G="83" B="38" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-20" S="3" T="167" R="186" G="82" B="68" A="255"/>
|
||||
<Vtx X="5" Y="0" Z="-17" S="36" T="204" R="185" G="99" B="36" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="51" T="200" R="254" G="127" B="6" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-11" S="50" T="292" R="174" G="97" B="6" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="65" T="495" R="246" G="89" B="166" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="3" S="50" T="489" R="223" G="119" B="228" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="-31" T="495" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="-31" T="492" R="0" G="104" B="183" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="3" S="-112" T="489" R="33" G="119" B="228" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="4" S="-128" T="495" R="10" G="89" B="166" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-11" S="-112" T="292" R="82" G="97" B="6" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="-113" T="200" R="2" G="127" B="6" A="255"/>
|
||||
<Vtx X="-5" Y="0" Z="-17" S="-99" T="204" R="71" G="99" B="36" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="-76" T="159" R="251" G="126" B="18" A="255"/>
|
||||
<Vtx X="-3" Y="1" Z="-20" S="-66" T="167" R="70" G="82" B="68" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="-76" T="159" R="251" G="126" B="18" A="255"/>
|
||||
<Vtx X="-5" Y="0" Z="-17" S="-99" T="204" R="71" G="99" B="36" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-21" S="-52" T="144" R="89" G="83" B="38" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="-60" T="134" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-62" T="68" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="-80" T="158" R="199" G="109" B="224" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="-113" T="200" R="2" G="127" B="6" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="-117" T="199" R="170" G="85" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="-10" S="-132" T="297" R="165" G="88" B="250" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="4" S="-128" T="495" R="10" G="89" B="166" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="-132" T="494" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-68" T="-341" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-89" T="-415" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-89" T="-331" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="-68" T="-404" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="-55" T="-341" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="2" Y="3" Z="-26" S="-68" T="-404" R="185" G="66" B="82" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="-68" T="-341" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-27" S="-55" T="-404" R="175" G="50" B="84" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="255" T="70" R="57" G="109" B="224" A="255"/>
|
||||
<Vtx X="3" Y="0" Z="-21" S="246" T="76" R="70" G="191" B="172" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="261" T="94" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="242" T="29" R="89" G="177" B="211" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="252" T="29" R="86" G="85" B="216" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="-10" S="251" T="-70" R="91" G="88" B="250" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="-10" S="239" T="-70" R="95" G="172" B="248" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="248" T="-267" R="112" G="45" B="216" A="255"/>
|
||||
<Vtx X="7" Y="-1" Z="5" S="231" T="-279" R="82" G="185" B="66" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="294" T="-278" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="302" T="-268" R="65" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="302" T="-372" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="302" T="-372" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="295" T="-373" R="85" G="196" B="73" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="294" T="-278" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="-343" T="-272" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="3" S="-330" T="-272" R="33" G="119" B="228" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="-331" T="-355" R="0" G="104" B="183" A="255"/>
|
||||
<Vtx X="6" Y="-1" Z="3" S="-343" T="-438" R="181" G="78" B="190" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="3" S="-330" T="-438" R="223" G="119" B="228" A="255"/>
|
||||
<Vtx X="2" Y="1" Z="-22" S="-2" T="134" R="101" G="77" B="11" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="14" T="159" R="5" G="126" B="18" A="255"/>
|
||||
<Vtx X="3" Y="1" Z="-20" S="18" T="158" R="57" G="109" B="224" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="51" T="200" R="254" G="127" B="6" A="255"/>
|
||||
<Vtx X="6" Y="0" Z="-17" S="55" T="199" R="86" G="85" B="216" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="-10" S="70" T="297" R="91" G="88" B="250" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="65" T="495" R="246" G="89" B="166" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="70" T="494" R="112" G="45" B="216" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="264" T="101" R="242" G="91" B="168" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="363" T="100" R="71" G="88" B="58" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="263" T="97" R="65" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="364" T="105" R="4" G="95" B="85" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="4" S="264" T="300" R="14" G="91" B="168" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="364" T="296" R="252" G="95" B="85" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="363" T="301" R="185" G="88" B="58" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="4" S="263" T="304" R="191" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-59" T="-509" R="82" G="187" B="69" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-64" T="-416" R="85" G="196" B="73" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="11" S="-59" T="-415" R="53" G="243" B="115" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="5" S="-64" T="-510" R="118" G="227" B="38" A="255"/>
|
||||
<Vtx X="2" Y="-11" Z="11" S="415" T="370" R="19" G="169" B="91" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="327" T="391" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="415" T="391" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="385" T="304" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="-9" Z="11" S="385" T="304" R="84" G="207" B="82" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="11" S="263" T="305" R="102" G="218" B="66" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="327" T="391" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="11" S="263" T="400" R="0" G="205" B="116" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="379" T="72" R="182" G="215" B="161" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="375" T="72" R="186" G="191" B="172" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="391" T="94" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="351" T="18" R="175" G="166" B="218" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="346" T="18" R="167" G="177" B="211" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="-10" S="349" T="-81" R="161" G="172" B="248" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="-10" S="354" T="-81" R="165" G="168" B="248" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="5" S="386" T="-287" R="174" G="185" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="5" S="391" T="-287" R="138" G="226" B="35" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-21" S="448" T="16" R="89" G="83" B="38" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="458" T="94" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="-3" Y="3" Z="-26" S="471" T="93" R="71" G="66" B="82" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-21" S="448" T="16" R="89" G="83" B="38" A="255"/>
|
||||
<Vtx X="-2" Y="0" Z="-21" S="435" T="17" R="71" G="93" B="49" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-27" S="458" T="94" R="81" G="50" B="84" A="255"/>
|
||||
<Vtx X="-3" Y="1" Z="-20" S="444" T="-6" R="70" G="82" B="68" A="255"/>
|
||||
<Vtx X="-3" Y="0" Z="-20" S="431" T="-6" R="68" G="87" B="63" A="255"/>
|
||||
<Vtx X="-5" Y="-1" Z="-17" S="431" T="-43" R="88" G="79" B="46" A="255"/>
|
||||
<Vtx X="-5" Y="0" Z="-17" S="444" T="-43" R="71" G="99" B="36" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="-11" S="439" T="-130" R="92" G="87" B="7" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-11" S="452" T="-131" R="82" G="97" B="6" A="255"/>
|
||||
<Vtx X="-6" Y="-1" Z="3" S="458" T="-327" R="75" G="78" B="190" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="3" S="471" T="-327" R="33" G="119" B="228" A="255"/>
|
||||
<Vtx X="-4" Y="1" Z="-20" S="23" T="-373" R="199" G="109" B="224" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="29" T="-396" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="14" T="-379" R="186" G="191" B="172" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="10" T="-333" R="167" G="177" B="211" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="20" T="-333" R="170" G="85" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="-10" S="19" T="-235" R="165" G="88" B="250" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="20" T="-333" R="170" G="85" B="216" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="-17" S="10" T="-333" R="167" G="177" B="211" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="-10" S="7" T="-235" R="161" G="172" B="248" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="16" T="-37" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="-1" Z="5" S="-1" T="-26" R="174" G="185" B="66" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="5" S="62" T="-26" R="138" G="227" B="38" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="4" S="70" T="-36" R="191" G="75" B="176" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="70" T="67" R="185" G="88" B="58" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="63" T="68" R="171" G="196" B="73" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-348" T="-366" R="171" G="196" B="73" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="5" S="-343" T="-273" R="174" G="187" B="69" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-343" T="-367" R="203" G="243" B="115" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="5" S="-348" T="-272" R="138" G="227" B="38" A="255"/>
|
||||
<Vtx X="-2" Y="-11" Z="11" S="415" T="430" R="237" G="169" B="91" A="255"/>
|
||||
<Vtx X="0" Y="-11" Z="11" S="415" T="409" R="0" G="146" B="64" A="255"/>
|
||||
<Vtx X="0" Y="-5" Z="11" S="327" T="409" R="0" G="10" B="127" A="255"/>
|
||||
<Vtx X="-7" Y="-9" Z="11" S="385" T="495" R="172" G="207" B="82" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="11" S="263" T="495" R="154" G="218" B="66" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="11" S="263" T="400" R="0" G="205" B="116" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="12" S="230" T="-327" R="100" G="221" B="70" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="12" S="230" T="-428" R="0" G="215" B="120" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="11" S="221" T="-332" R="102" G="218" B="66" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="11" S="221" T="-428" R="0" G="205" B="116" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="11" S="221" T="-523" R="154" G="218" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="12" S="230" T="-529" R="156" G="221" B="70" A="255"/>
|
||||
<Vtx X="-2" Y="2" Z="-28" S="-89" T="-403" R="227" G="191" B="151" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-28" S="-96" T="-415" R="163" G="233" B="172" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-415" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-28" S="-89" T="-343" R="29" G="191" B="151" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-415" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="3" Y="5" Z="-28" S="-132" T="-331" R="73" G="100" B="227" A="255"/>
|
||||
<Vtx X="2" Y="2" Z="-28" S="-89" T="-343" R="29" G="191" B="151" A="255"/>
|
||||
<Vtx X="3" Y="2" Z="-28" S="-96" T="-331" R="93" G="233" B="172" A="255"/>
|
||||
<Vtx X="-1" Y="3" Z="11" S="-510" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="-1" Y="2" Z="12" S="-489" T="-398" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="2" Z="12" S="-489" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="0" Y="3" Z="11" S="-510" T="-421" R="0" G="21" B="125" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="364" T="300" R="242" G="91" B="168" A="255"/>
|
||||
<Vtx X="7" Y="4" Z="4" S="364" T="304" R="65" G="75" B="176" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="418" T="304" R="112" G="45" B="216" A="255"/>
|
||||
<Vtx X="7" Y="0" Z="4" S="418" T="300" R="246" G="89" B="166" A="255"/>
|
||||
<Vtx X="0" Y="0" Z="4" S="418" T="201" R="0" G="90" B="166" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="4" S="364" T="101" R="14" G="91" B="168" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="4" S="418" T="101" R="10" G="89" B="166" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="418" T="97" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="0" Z="4" S="418" T="97" R="144" G="45" B="216" A="255"/>
|
||||
<Vtx X="-8" Y="4" Z="4" S="364" T="97" R="191" G="75" B="176" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="4" S="364" T="101" R="14" G="91" B="168" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="11" S="-189" T="486" R="154" G="218" B="66" A="255"/>
|
||||
<Vtx X="-7" Y="0" Z="12" S="-180" T="495" R="156" G="221" B="70" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="11" S="-132" T="486" R="203" G="243" B="115" A="255"/>
|
||||
<Vtx X="-7" Y="4" Z="5" S="-137" T="392" R="174" G="187" B="69" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="5" S="-199" T="395" R="138" G="226" B="35" A="255"/>
|
||||
<Vtx X="-7" Y="-9" Z="11" S="-311" T="488" R="172" G="207" B="82" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="4" S="-327" T="385" R="150" G="186" B="6" A="255"/>
|
||||
<Vtx X="-7" Y="-1" Z="-10" S="-199" T="185" R="165" G="168" B="248" A="255"/>
|
||||
<Vtx X="-7" Y="-10" Z="-10" S="-330" T="188" R="152" G="186" B="237" A="255"/>
|
||||
<Vtx X="-6" Y="-8" Z="-17" S="-297" T="89" R="164" G="201" B="188" A="255"/>
|
||||
<Vtx X="-6" Y="0" Z="-17" S="-200" T="87" R="175" G="166" B="218" A="255"/>
|
||||
<Vtx X="-4" Y="-2" Z="-21" S="-216" T="29" R="175" G="253" B="159" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="-197" T="41" R="182" G="215" B="161" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="-205" T="18" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-4" Y="-2" Z="-21" S="-216" T="29" R="175" G="253" B="159" A="255"/>
|
||||
<Vtx X="-4" Y="0" Z="-21" S="-197" T="41" R="182" G="215" B="161" A="255"/>
|
||||
<Vtx X="-2" Y="1" Z="-22" S="-182" T="22" R="155" G="77" B="11" A="255"/>
|
||||
<Vtx X="-3" Y="2" Z="-28" S="-168" T="-69" R="163" G="233" B="172" A="255"/>
|
||||
<Vtx X="-3" Y="5" Z="-28" S="-132" T="-62" R="183" G="100" B="227" A="255"/>
|
||||
<Vtx X="-2" Y="-2" Z="-22" S="-313" T="-419" R="232" G="199" B="145" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="-213" T="-360" R="21" G="160" B="176" A="255"/>
|
||||
<Vtx X="-3" Y="-9" Z="-17" S="-213" T="-423" R="235" G="160" B="176" A="255"/>
|
||||
<Vtx X="2" Y="-2" Z="-22" S="-313" T="-360" R="24" G="199" B="145" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="-326" T="-412" R="227" G="170" B="168" A="255"/>
|
||||
<Vtx X="-2" Y="-1" Z="-22" S="-330" T="-419" R="156" G="222" B="185" A="255"/>
|
||||
<Vtx X="-4" Y="-2" Z="-21" S="-319" T="-435" R="175" G="253" B="159" A="255"/>
|
||||
<Vtx X="-6" Y="-8" Z="-17" S="-237" T="-475" R="164" G="201" B="188" A="255"/>
|
||||
<Vtx X="1" Y="-1" Z="-22" S="-326" T="-366" R="29" G="170" B="168" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="-330" T="-359" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="2" Y="-2" Z="-22" S="-313" T="-360" R="24" G="199" B="145" A="255"/>
|
||||
<Vtx X="2" Y="-1" Z="-22" S="-330" T="-359" R="100" G="222" B="185" A="255"/>
|
||||
<Vtx X="3" Y="-2" Z="-21" S="-319" T="-343" R="81" G="253" B="159" A="255"/>
|
||||
<Vtx X="6" Y="-8" Z="-17" S="-237" T="-307" R="92" G="201" B="188" A="255"/>
|
||||
<Vtx X="2" Y="-9" Z="-17" S="-213" T="-360" R="21" G="160" B="176" A="255"/>
|
||||
</Vertex>
|
@ -0,0 +1,128 @@
|
||||
<Vertex Version="0">
|
||||
<Vtx X="0" Y="19" Z="-1" S="-529" T="-189" R="0" G="130" B="15" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="-493" T="-308" R="93" G="215" B="77" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="-529" T="-308" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="0" Y="17" Z="-3" S="-493" T="-190" R="0" G="195" B="112" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="-529" T="-71" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-493" T="-71" R="163" G="215" B="77" A="255"/>
|
||||
<Vtx X="0" Y="13" Z="-4" S="-444" T="-190" R="0" G="233" B="125" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-4" S="-444" T="-72" R="159" G="241" B="81" A="255"/>
|
||||
<Vtx X="0" Y="9" Z="-4" S="-390" T="-190" R="0" G="28" B="124" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-4" S="-390" T="-72" R="160" G="18" B="82" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="-350" T="-190" R="0" G="86" B="94" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-350" T="-72" R="156" G="53" B="58" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="-350" T="-308" R="100" G="53" B="58" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-4" S="-390" T="-309" R="96" G="18" B="82" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-4" S="-444" T="-309" R="97" G="241" B="81" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="-172" T="-520" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-181" T="-481" R="163" G="215" B="77" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-1" S="-156" T="-520" R="151" G="193" B="33" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-190" T="-485" R="168" G="39" B="174" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-4" S="-202" T="-430" R="159" G="241" B="81" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-5" S="-213" T="-430" R="172" G="17" B="162" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-5" S="-211" T="-375" R="171" G="236" B="163" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-4" S="-201" T="-375" R="160" G="18" B="82" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-191" T="-328" R="173" G="195" B="181" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-183" T="-334" R="156" G="53" B="58" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-2" S="-171" T="-313" R="169" G="174" B="212" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="-156" T="-319" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="-156" T="-307" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-2" S="-330" T="-189" R="0" G="31" B="133" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-297" T="-306" R="168" G="39" B="174" A="255"/>
|
||||
<Vtx X="-9" Y="19" Z="-2" S="-330" T="-307" R="158" G="20" B="177" A="255"/>
|
||||
<Vtx X="0" Y="19" Z="-2" S="-330" T="-189" R="0" G="31" B="133" A="255"/>
|
||||
<Vtx X="0" Y="17" Z="-3" S="-297" T="-188" R="0" G="54" B="141" A="255"/>
|
||||
<Vtx X="-9" Y="17" Z="-3" S="-297" T="-306" R="168" G="39" B="174" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="-330" T="-70" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="-297" T="-70" R="88" G="39" B="174" A="255"/>
|
||||
<Vtx X="0" Y="13" Z="-5" S="-243" T="-187" R="0" G="22" B="131" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-5" S="-243" T="-69" R="84" G="17" B="162" A="255"/>
|
||||
<Vtx X="0" Y="9" Z="-5" S="-189" T="-188" R="0" G="229" B="132" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-5" S="-189" T="-69" R="85" G="236" B="163" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="-144" T="-70" R="83" G="195" B="181" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="-144" T="-188" R="0" G="176" B="157" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="-144" T="-306" R="173" G="195" B="181" A="255"/>
|
||||
<Vtx X="-9" Y="9" Z="-5" S="-189" T="-306" R="171" G="236" B="163" A="255"/>
|
||||
<Vtx X="-9" Y="13" Z="-5" S="-243" T="-306" R="172" G="17" B="162" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="455" T="215" R="0" G="176" B="157" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-2" S="433" T="333" R="169" G="174" B="212" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="455" T="333" R="173" G="195" B="181" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-2" S="433" T="215" R="0" G="144" B="195" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="455" T="97" R="83" G="195" B="181" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-2" S="433" T="97" R="87" G="174" B="212" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="418" T="97" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="0" Y="4" Z="-1" S="418" T="215" R="0" G="155" B="179" A="255"/>
|
||||
<Vtx X="-9" Y="4" Z="-1" S="418" T="333" R="171" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="4" Z="-1" S="358" T="-499" R="85" G="163" B="239" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-2" S="344" T="-494" R="87" G="174" B="212" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="358" T="-488" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="332" T="-472" R="100" G="53" B="58" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="323" T="-478" R="83" G="195" B="181" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-4" S="314" T="-431" R="96" G="18" B="82" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-5" S="304" T="-432" R="85" G="236" B="163" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-4" S="312" T="-376" R="97" G="241" B="81" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-4" S="314" T="-431" R="96" G="18" B="82" A="255"/>
|
||||
<Vtx X="8" Y="9" Z="-5" S="304" T="-432" R="85" G="236" B="163" A="255"/>
|
||||
<Vtx X="8" Y="13" Z="-5" S="302" T="-377" R="84" G="17" B="162" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="324" T="-321" R="88" G="39" B="174" A="255"/>
|
||||
<Vtx X="8" Y="17" Z="-3" S="334" T="-325" R="93" G="215" B="77" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-2" S="342" T="-287" R="98" G="20" B="177" A="255"/>
|
||||
<Vtx X="8" Y="19" Z="-1" S="358" T="-287" R="105" G="193" B="33" A="255"/>
|
||||
<Vtx X="0" Y="6" Z="-3" S="455" T="215" R="0" G="86" B="94" A="255"/>
|
||||
<Vtx X="8" Y="5" Z="-1" S="483" T="97" R="98" G="79" B="20" A="255"/>
|
||||
<Vtx X="8" Y="6" Z="-3" S="455" T="97" R="100" G="53" B="58" A="255"/>
|
||||
<Vtx X="0" Y="5" Z="-1" S="483" T="215" R="0" G="125" B="236" A="255"/>
|
||||
<Vtx X="-9" Y="6" Z="-3" S="455" T="333" R="156" G="53" B="58" A="255"/>
|
||||
<Vtx X="-9" Y="5" Z="-1" S="483" T="333" R="158" G="79" B="20" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-2" S="-407" T="-368" R="0" G="191" B="109" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-383" T="-427" R="96" G="254" B="83" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-2" S="-407" T="-427" R="99" G="216" B="69" A="255"/>
|
||||
<Vtx X="0" Y="24" Z="-3" S="-383" T="-368" R="0" G="252" B="127" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-2" S="-407" T="-309" R="157" G="216" B="69" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="-383" T="-309" R="160" G="254" B="83" A="255"/>
|
||||
<Vtx X="0" Y="21" Z="-2" S="-348" T="-368" R="0" G="97" B="82" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="-348" T="-309" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-348" T="-427" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="407" T="-388" R="0" G="51" B="140" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-3" S="422" T="-447" R="174" G="49" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="407" T="-447" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-3" S="422" T="-388" R="0" G="65" B="147" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="407" T="-329" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="422" T="-329" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="245" T="-456" R="153" G="30" B="188" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-2" S="240" T="-439" R="157" G="216" B="69" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="253" T="-457" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-3" S="232" T="-437" R="174" G="49" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="239" T="-413" R="160" G="254" B="83" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="231" T="-412" R="171" G="3" B="161" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-3" S="243" T="-380" R="172" G="209" B="172" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-2" S="251" T="-380" R="165" G="87" B="236" A="255"/>
|
||||
<Vtx X="-4" Y="21" Z="-2" S="253" T="-373" R="243" G="222" B="134" A="255"/>
|
||||
<Vtx X="0" Y="27" Z="-1" S="391" T="-388" R="0" G="129" B="253" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-2" S="407" T="-447" R="99" G="216" B="69" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="391" T="-447" R="102" G="185" B="27" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-2" S="407" T="-388" R="0" G="191" B="109" A="255"/>
|
||||
<Vtx X="-5" Y="27" Z="-1" S="391" T="-329" R="154" G="185" B="27" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-2" S="407" T="-329" R="157" G="216" B="69" A="255"/>
|
||||
<Vtx X="0" Y="25" Z="-3" S="-473" T="-368" R="0" G="65" B="147" A="255"/>
|
||||
<Vtx X="-5" Y="24" Z="-3" S="-449" T="-427" R="171" G="3" B="161" A="255"/>
|
||||
<Vtx X="-5" Y="25" Z="-3" S="-473" T="-427" R="174" G="49" B="172" A="255"/>
|
||||
<Vtx X="0" Y="24" Z="-3" S="-449" T="-368" R="0" G="4" B="129" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="-473" T="-309" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-449" T="-309" R="85" G="3" B="161" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-3" S="-416" T="-309" R="84" G="209" B="173" A="255"/>
|
||||
<Vtx X="-5" Y="21" Z="-3" S="-416" T="-427" R="172" G="209" B="172" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-407" T="-314" R="11" G="222" B="134" A="255"/>
|
||||
<Vtx X="-4" Y="21" Z="-2" S="-407" T="-424" R="243" G="222" B="134" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-6" T="-408" R="91" G="85" B="231" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-2" S="-5" T="-417" R="11" G="222" B="134" A="255"/>
|
||||
<Vtx X="4" Y="21" Z="-3" S="-15" T="-408" R="84" G="209" B="173" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-19" T="-375" R="96" G="254" B="83" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-27" T="-377" R="85" G="3" B="161" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="-26" T="-351" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-3" S="-26" T="-351" R="82" G="49" B="172" A="255"/>
|
||||
<Vtx X="4" Y="25" Z="-2" S="-18" T="-349" R="99" G="216" B="69" A="255"/>
|
||||
<Vtx X="4" Y="24" Z="-3" S="-19" T="-375" R="96" G="254" B="83" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-13" T="-333" R="103" G="30" B="188" A="255"/>
|
||||
<Vtx X="4" Y="27" Z="-1" S="-5" T="-331" R="102" G="185" B="27" A="255"/>
|
||||
</Vertex>
|
@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="158" G="66" B="3" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="124" G="127" B="126" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_1" B0="G_CCMUX_TEXEL0" C0="G_CCMUX_PRIMITIVE" D0="G_CCMUX_TEXEL0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_SHADE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="255" G="7" B="0" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,20 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<SetCombineLERP A0="G_CCMUX_TEXEL0" B0="G_CCMUX_0" C0="G_CCMUX_SHADE" D0="G_CCMUX_0" Aa0="G_ACMUX_0" Ab0="G_ACMUX_0" Ac0="G_ACMUX_0" Ad0="G_ACMUX_1" A1="G_CCMUX_COMBINED" B1="G_CCMUX_0" C1="G_CCMUX_PRIMITIVE" D1="G_CCMUX_0" Aa1="G_ACMUX_0" Ab1="G_ACMUX_0" Ac1="G_ACMUX_0" Ad1="G_ACMUX_COMBINED"/>
|
||||
<SetGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_2CYCLE="1"/>
|
||||
<PipelineMode G_PM_NPRIMITIVE="1"/>
|
||||
<SetRenderMode Mode1="G_RM_FOG_SHADE_A" Mode2="G_RM_AA_ZB_OPA_SURF2" />
|
||||
<Texture S="1984" T="1984" Level="0" Tile="0" On="1"/>
|
||||
<TileSync/>
|
||||
<SetTextureImage Path="textures/nintendo_rogo_static/SoHShiny" Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Width="1"/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b_LOAD_BLOCK" Line="0" TMem="0" Tile="7" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<LoadSync/>
|
||||
<LoadBlock Tile="7" Uls="0" Ult="0" Lrs="511" Dxt="512"/>
|
||||
<PipeSync/>
|
||||
<SetTile Format="G_IM_FMT_I" Size="G_IM_SIZ_8b" Line="4" TMem="0" Tile="0" Palette="0" Cms0="G_TX_WRAP" Cms1="G_TX_NOMIRROR" Cmt0="G_TX_WRAP" Cmt1="G_TX_NOMIRROR" MaskS="5" ShiftS="0" MaskT="5" ShiftT="0"/>
|
||||
<SetTileSize T="0" Uls="0" Ult="0" Lrs="124" Lrt="124"/>
|
||||
<SetPrimColor M="0" L="0" R="88" G="46" B="16" A="255"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
@ -0,0 +1,8 @@
|
||||
<DisplayList Version="0">
|
||||
<PipeSync/>
|
||||
<ClearGeometryMode G_FOG="1" G_TEXTURE_GEN="1" />
|
||||
<SetCycleType G_CYC_1CYCLE="1"/>
|
||||
<PipelineMode G_PM_1PRIMITIVE="1"/>
|
||||
<EndDisplayList/>
|
||||
</DisplayList>
|
||||
|
Binary file not shown.
BIN
OTRExporter/assets/textures/virtual/gEmptyTexture.rgba32.png
Normal file
BIN
OTRExporter/assets/textures/virtual/gEmptyTexture.rgba32.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 194 B |
232
README.md
232
README.md
@ -1,105 +1,72 @@
|
||||
# Welcome to the Ship of Harkinian!
|
||||
![Ship of Harkinian](docs/shiptitle.darkmode.png#gh-dark-mode-only)
|
||||
![Ship of Harkinian](docs/shiptitle.lightmode.png#gh-light-mode-only)
|
||||
|
||||
A PC port of OoT allowing you to enjoy the game with modern controls, widescreen, high-resolution, gyroscopy and other great features! Setup is simple, let's get started!
|
||||
## Website
|
||||
|
||||
The Ship does not include any copyrighted assets. You are required to provide a supported copy of the game.
|
||||
Official Website: https://www.shipofharkinian.com/
|
||||
|
||||
## Discord
|
||||
|
||||
Official Discord: https://discord.com/invite/BtBmd55HVH
|
||||
Official Discord: https://discord.com/invite/shipofharkinian
|
||||
|
||||
## Quick Start (Windows)
|
||||
If you're having any trouble after reading through this `README`, feel free ask for help in the Support text channels. Please keep in mind that we do not condone piracy.
|
||||
|
||||
1) Download The Ship of Harkinian from [Discord](https://discord.com/invite/BtBmd55HVH).
|
||||
2) Requires a supported copy of the game (See supported games below).
|
||||
3) Use `OTRGui.exe` to generate an `oot.otr` archive file.
|
||||
4) Launch `soh.exe`
|
||||
# Quick Start
|
||||
|
||||
### Supported Games
|
||||
#### Ocarina of Time Debug PAL GC (not Master Quest)
|
||||
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 | `079b855b943d6ad8bd1eb026c0ed169ecbdac7da` |
|
||||
| PAL MQ | `50bebedad9e0f10746a52b07239e47fa6c284d03` |
|
||||
|
||||
### 2. Download The Ship of Harkinian from [Discord](https://discord.com/invite/shipofharkinian)
|
||||
The latest release is available in the most recent post in the `#downloads` channel.
|
||||
|
||||
### 3. Launch the Game!
|
||||
#### Windows
|
||||
* Extract the zip
|
||||
* Launch `soh.exe`
|
||||
|
||||
#### Linux
|
||||
* Place your supported copy of the game in the same folder as the appimage.
|
||||
* Execute `soh.appimage`. You may have to `chmod +x` the appimage via terminal.
|
||||
|
||||
#### macOS
|
||||
* Run `soh.app`. When prompted, select your supported copy of the game.
|
||||
* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start.
|
||||
|
||||
#### Nintendo Switch
|
||||
* Run one of the PC releases to generate an `oot.otr` and/or `oot-mq.otr` file. After launching the game on PC, you will be able to find these files in the same directory as `soh.exe` or `soh.appimage`. On macOS, these files can be found in `/Users/<username>/Library/Application Support/com.shipofharkinian.soh/`
|
||||
* Copy the files to your sd card
|
||||
```
|
||||
Build team: `zelda@srd022j`
|
||||
Build date: `03-02-21 00:49:18` (year-month-day)
|
||||
sha1: cee6bc3c2a634b41728f2af8da54d9bf8cc14099
|
||||
```
|
||||
#### Ocarina of Time PAL GameCube
|
||||
```
|
||||
sha1: 0227d7c0074f2d0ac935631990da8ec5914597b4
|
||||
```
|
||||
#### Ocarina of Time Debug PAL GC MQ (Dungeons will be Master Quest)
|
||||
```
|
||||
Build team: `zelda@srd022j`
|
||||
Build date: `03-02-21 00:16:31` (year-month-day)
|
||||
sha1: 079b855b943d6ad8bd1eb026c0ed169ecbdac7da (Produced by decomp)
|
||||
sha1: 50bebedad9e0f10746a52b07239e47fa6c284d03 (Alternate)
|
||||
sdcard
|
||||
└── switch
|
||||
└── soh
|
||||
├── oot-mq.otr
|
||||
├── oot.otr
|
||||
├── soh.nro
|
||||
└── soh.otr
|
||||
```
|
||||
* Launch via Atmosphere's `Game+R` launcher method.
|
||||
|
||||
### 4. Play!
|
||||
|
||||
Congratulations, you are now sailing with the Ship of Harkinian! Have fun!
|
||||
|
||||
## About Versions
|
||||
# Configuration
|
||||
|
||||
The Ship of Harkinian's versioning system is a unique system, comprising of a three-numbered version (`x.y.z`) and a version codename. The main version number `x` signifies major feature updates that require a new `oot.otr` file. The version number `y` signifies major feature updates and bugfixes that do not require a new `oot.otr` file. The version number `z` signifies minor updates such as a collection of bugfixes.
|
||||
|
||||
The version codename consists 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 major `x` or `y` version bumps. The code word represents a minor release version which increments with the minor `z` version bump.
|
||||
|
||||
## Additional Setup Information
|
||||
|
||||
### Windows Rom Extraction
|
||||
|
||||
* Open `OTRGui.exe` and click on "Open OOT ROM", then select your supported copy of the game (see section "Supported Games").
|
||||
* 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, you should have an `oot.otr` or `oot-mq.otr` file in your main directory, depending on the version of the game used to build it.
|
||||
(*NOTE:* You can have both `.otr` files, if you want to! This even allows you to shuffle MQ and vanilla dungeons in the randomizer)
|
||||
|
||||
This process can take up to several minutes, depending on your system hardware.
|
||||
|
||||
Close `OTRGui.exe` when the `Done!` message appears.
|
||||
If you get another message, then you might have selected the wrong rom. See section "Supported Games".
|
||||
|
||||
### Linux Rom Extraction
|
||||
|
||||
* Place one of the supported roms in the same folder as the appimage (See section "Supported Games").
|
||||
* Execute `soh.appimage`. You may have to `chmod +x` the appimage via terminal.
|
||||
* When the process completes, you should have an `oot.otr` or `oot-mq.otr` file in the same directory as the appimage, and the game should start automatically.
|
||||
(*NOTE:* You can provide both a vanilla and MQ ROM, if you want to! This even allows you to shuffle MQ and vanilla dungeons in the randomizer)
|
||||
|
||||
This process can take up to several minutes, depending on your system hardware.
|
||||
|
||||
If you get any errors, then you might have selected the wrong rom. See section "Supported Games".
|
||||
|
||||
### 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.
|
||||
|
||||
This process can take up to several minutes, depending on your system hardware.
|
||||
|
||||
If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom. See section "Supported Games".
|
||||
|
||||
### 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're having any trouble, feel free to join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the Support text channels. Please keep in mind that we do not condone piracy.
|
||||
|
||||
### Running The Ship of Harkinian
|
||||
|
||||
For Windows, launch `soh.exe`. For Linux, execute the appimage. For MacOS, launch the app. For Switch, launch the app via Atmosphere's `Game+R` launcher method. For Wii U, launch the `.rpx` file through the homebrew Mii Maker exploit.
|
||||
|
||||
Default keyboard configuration:
|
||||
### Default keyboard configuration
|
||||
| N64 | A | B | Z | Start | Analog stick | C buttons | D-Pad |
|
||||
| - | - | - | - | - | - | - | - |
|
||||
| Keyboard | X | C | Z | Space | WASD | Arrow keys | TFGH |
|
||||
|
||||
Other shortcuts:
|
||||
### Other shortcuts
|
||||
| Keys | Action |
|
||||
| - | - |
|
||||
| F1 | Toggle menubar |
|
||||
@ -110,89 +77,32 @@ Other shortcuts:
|
||||
| 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.
|
||||
|
||||
### Custom Music
|
||||
# Custom Assets
|
||||
|
||||
We support importing custom [Seq64](https://github.com/sauraen/seq64) files to replace the in game music and fanfares (Sound effect and instrument replacement is currently not supported).
|
||||
Custom assets are packed in `.otr` files. To use custom assets, place them in the `mods` folder.
|
||||
|
||||
First you will need to prepare a folder with the desired sequences. Every sequence requires 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, - Retro will recursively search each subfolder it finds.
|
||||
If you're interested in creating and/or packing your own custom asset `.otr` files, check out [**retro**](https://github.com/HarbourMasters64/retro)!
|
||||
|
||||
The `.meta` file requires two lines - the first line is the name that will be displayed in the SFX editor, and the second line is the instrument set number in `base16` format. For example, if there is a sequence file `Foo.seq` then you need a meta file `Foo.meta` that could contain:
|
||||
```
|
||||
Awesome Name
|
||||
C
|
||||
```
|
||||
# Development
|
||||
### Building
|
||||
|
||||
Once you have prepared your sequences folder:
|
||||
1. Download and open [Retro](https://github.com/HarbourMasters/retro/releases).
|
||||
1. Choose the "Create OTR" option.
|
||||
1. Choose the "Custom Sequences" option.
|
||||
1. Using the file selection screen, choose the sequences folder you prepared in the previous instructions.
|
||||
1. Click the "Stage Files" button.
|
||||
(*NOTE:* SoH can handle 1024 custom sequence in total. This includes the original music. Keep that in mind!)
|
||||
1. Click the "Finalize OTR" text in the green footer.
|
||||
1. Click "Generate OTR" and, using the file selection screen, save the file to the `mods` folder of your SoH installation.
|
||||
- This `mods` folder should be in the same folder as your `oot.otr` file.
|
||||
If you want to manually compile SoH, please consult the [building instructions](docs/BUILDING.md).
|
||||
|
||||
Assuming you have done everything correctly, boot up SoH and select the SFX Editor from the enhancements dropdown menu. You should now be able to swap out any of the in game sequences/fanfares for the sequences added in your newly generated OTR file. If you have any trouble with this process, please reach out in the support section of the Discord.
|
||||
### Playtesting
|
||||
If you want to playtest a continuous integration build, you can find them at the links below. Keep in mind that these are for playtesting only, and you will likely encounter bugs and possibly crashes.
|
||||
|
||||
## Building The Ship of Harkinian
|
||||
* [Windows](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-windows.zip)
|
||||
* [macOS](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-mac.zip)
|
||||
* [Linux (performance)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-performance.zip) _(requires `glibc 2.35` or newer, but will be more performant than the compatibility build.)_
|
||||
* [Linux (compatibility)](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-linux-compatiblity.zip) _(compatible with most Linux distributions, but may not be as performant as the performance build.)_
|
||||
* [Switch](https://nightly.link/HarbourMasters/Shipwright/workflows/generate-builds/develop/soh-switch.zip)
|
||||
|
||||
If you want to manually compile SoH, please consult the [building instructions](BUILDING.md).
|
||||
|
||||
## Nightly Builds
|
||||
If you want to playtest a nightly build, you can find them at the links below. However, keep in mind that these are for playtesting only, and you will likely encounter bugs. Rarely, these builds will crash.
|
||||
|
||||
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 OTRGui?
|
||||
Take [this survey](https://retroarchopenhardware.com/survey.php) to increase chances of this becoming reality.
|
||||
|
||||
## The Harbour Masters Are...
|
||||
|
||||
Kenix | Lead Developer/Public Relations - Resource Management Programmer, Audio System Programmer, and General Programmer
|
||||
Jack Walker | Lead Developer - OTR Format Programmer, Resource Load Programmer, and General Programmer
|
||||
Louist103 | Developer - Save System Programmer and General Programmer
|
||||
Emil | Developer - Fast3D Programmer
|
||||
m4xw | Developer - Shipwright, Throwing Baguettes, and General Programmer
|
||||
MelonSpeedruns | Developer - General Programmer
|
||||
Rozlette | Developer - General Programmer
|
||||
JoshDuMan | Developer - General Programmer
|
||||
KiritoDev/Lywx | Developer - General Programmer
|
||||
Theo3 | Developer - General Programmer
|
||||
Random06457 | Developer - Linux Build
|
||||
|
||||
## Special Thanks
|
||||
|
||||
Decomp & ZAPD | Made this project even possible in the first place!
|
||||
MNGoldenEagle | Patiently explained audio data formats, encouragement, and founding ZSO which was the first source of the game's code and resource format documentation.
|
||||
Rrrrry123 | Speedbunner, encouragement, and community moderation
|
||||
Fierce deity | Encouragement and community moderation
|
||||
mzxrules | For his contributions to decomp
|
||||
zel. | For his contributions to decomp
|
||||
Aloxado | Developer - General Programmer
|
||||
MegaMech | Developer - General Programmer
|
||||
Revo | Tester - GCC support and General Testing
|
||||
zfg | Tester - General Testing
|
||||
Horseless Headman | Tester - General Testing
|
||||
Steven Pritchett | Tester - General Testing
|
||||
Trenton May | Tester - General Testing
|
||||
Zeldaboy14 | Tester - General Testing, encouragement, and community moderation
|
||||
Koby Howell | Tester - General Testing
|
||||
Logg | Tester - General Testing
|
||||
Taylor Daley | Graphic Design
|
||||
Can't Sleep | Graphic Design
|
||||
|
||||
## Video Credits
|
||||
Kenix | Producer / Writer
|
||||
briaguya | Writer
|
||||
rainbow_fash | Executive Producer
|
||||
ReveriePass | Editor
|
||||
MicTheMicrophone | Gwonam / The King
|
||||
Amphibibro | Link
|
||||
AceHeart | Zelda
|
||||
<a href="https://github.com/Kenix3/libultraship/">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="./docs/poweredbylus.darkmode.png">
|
||||
<img alt="Powered by libultraship" src="./docs/poweredbylus.lightmode.png">
|
||||
</picture>
|
||||
</a>
|
||||
|
@ -22,6 +22,7 @@ typedef bool (*ExporterSetFuncBool)(ZFileMode fileMode);
|
||||
typedef void (*ExporterSetFuncVoid)(int argc, char* argv[], int& i);
|
||||
typedef void (*ExporterSetFuncVoid2)(const std::string& buildMode, ZFileMode& fileMode);
|
||||
typedef void (*ExporterSetFuncVoid3)();
|
||||
typedef void (*ExporterSetFuncVoid4)(tinyxml2::XMLElement* reader);
|
||||
typedef void (*ExporterSetResSave)(ZResource* res, BinaryWriter& writer);
|
||||
|
||||
class ExporterSet
|
||||
@ -39,6 +40,8 @@ public:
|
||||
ExporterSetFuncVoid3 endXMLFunc = nullptr;
|
||||
ExporterSetResSave resSaveFunc = nullptr;
|
||||
ExporterSetFuncVoid3 endProgramFunc = nullptr;
|
||||
|
||||
ExporterSetFuncVoid4 processCompilableFunc = nullptr;
|
||||
};
|
||||
|
||||
class Globals
|
||||
|
@ -128,6 +128,9 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename)
|
||||
if (reader->Attribute("RangeEnd") != nullptr)
|
||||
rangeEnd = StringHelper::StrToL(reader->Attribute("RangeEnd"), 16);
|
||||
|
||||
if (reader->Attribute("Compilable") != nullptr)
|
||||
isCompilable = true;
|
||||
|
||||
if (rangeStart > rangeEnd)
|
||||
HANDLE_ERROR_PROCESS(
|
||||
WarningType::Always,
|
||||
@ -268,9 +271,12 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename)
|
||||
{
|
||||
ZResource* nRes = nodeMap[nodeName](this);
|
||||
|
||||
if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile || mode == ZFileMode::ExtractDirectory)
|
||||
if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile ||
|
||||
mode == ZFileMode::ExtractDirectory)
|
||||
{
|
||||
if (!isCompilable)
|
||||
nRes->ExtractFromXML(child, rawDataIndex);
|
||||
|
||||
}
|
||||
switch (nRes->GetResourceType())
|
||||
{
|
||||
case ZResourceType::Texture:
|
||||
|
@ -36,6 +36,7 @@ public:
|
||||
std::vector<ZResource*> resources;
|
||||
|
||||
int workerID;
|
||||
bool isCompilable = false;
|
||||
|
||||
// Default to using virtual addresses
|
||||
uint32_t segment = 0x80;
|
||||
|
45
docs/CREDITS.md
Normal file
45
docs/CREDITS.md
Normal file
@ -0,0 +1,45 @@
|
||||
# Credits
|
||||
|
||||
## 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
|
24
docs/CUSTOM_MUSIC.md
Normal file
24
docs/CUSTOM_MUSIC.md
Normal file
@ -0,0 +1,24 @@
|
||||
### Custom Music
|
||||
|
||||
We support importing custom [Seq64](https://github.com/sauraen/seq64) files to replace the in game music and fanfares (Sound effect and instrument replacement is currently not supported).
|
||||
|
||||
First you will need to prepare a folder with the desired sequences. Every sequence requires 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, - Retro will recursively search each subfolder it finds.
|
||||
|
||||
The `.meta` file requires two lines - the first line is the name that will be displayed in the SFX editor, and the second line is the instrument set number in `base16` format. For example, if there is a sequence file `Foo.seq` then you need a meta file `Foo.meta` that could contain:
|
||||
```
|
||||
Awesome Name
|
||||
C
|
||||
```
|
||||
|
||||
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 selection screen, choose the sequences folder you prepared in the previous instructions.
|
||||
1. Click the "Stage Files" button.
|
||||
(*NOTE:* SoH can handle 1024 custom sequence in total. This includes the original music. Keep that in mind!)
|
||||
1. Click the "Finalize OTR" text in the green footer.
|
||||
1. Click "Generate OTR" and, using the file selection screen, save the file to the `mods` folder of your SoH installation.
|
||||
- This `mods` folder should be in the same folder as your `oot.otr` file.
|
||||
|
||||
Assuming you have done everything correctly, boot up SoH and select the SFX Editor from the enhancements dropdown menu. 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.
|
5
docs/VERSIONING.md
Normal file
5
docs/VERSIONING.md
Normal file
@ -0,0 +1,5 @@
|
||||
## About Versions
|
||||
|
||||
The Ship of Harkinian's versioning system is a unique system, comprising of a three-numbered version (`x.y.z`) and a version codename. The main version number `x` signifies major feature updates that require a new `oot.otr` file. The version number `y` signifies major feature updates and bugfixes that do not require a new `oot.otr` file. The version number `z` signifies minor updates such as a collection of bugfixes.
|
||||
|
||||
The version codename consists 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 major `x` or `y` version bumps. The code word represents a minor release version which increments with the minor `z` version bump.
|
BIN
docs/poweredbylus.darkmode.png
Normal file
BIN
docs/poweredbylus.darkmode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 208 KiB |
BIN
docs/poweredbylus.lightmode.png
Normal file
BIN
docs/poweredbylus.lightmode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 206 KiB |
BIN
docs/shiptitle.darkmode.png
Normal file
BIN
docs/shiptitle.darkmode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
BIN
docs/shiptitle.lightmode.png
Normal file
BIN
docs/shiptitle.lightmode.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
@ -1 +1 @@
|
||||
Subproject commit 61125df584a2ed31ae33250ac3cde8e1c7f1254b
|
||||
Subproject commit 2ddffdb5b60377a09a4a198a8fd67726951bbb27
|
0
soh/assets/textures/boss_title_cards/.gitempty
Normal file
0
soh/assets/textures/boss_title_cards/.gitempty
Normal file
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgBarinadeTitleCardENGTex "__OTR__textures/object_bv/gBarinadeTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gBarinadeTitleCardENGTex[] = dgBarinadeTitleCardENGTex;
|
||||
#else
|
||||
static const char gBarinadeTitleCardENGTex[] __attribute__((aligned (2))) = dgBarinadeTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gBarinadeTitleCardENGTex[] = dgBarinadeTitleCardENGTex;
|
||||
|
||||
#define dgBarinadeTitleCardGERTex "__OTR__textures/object_bv/gBarinadeTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gBarinadeTitleCardGERTex[] = dgBarinadeTitleCardGERTex;
|
||||
#else
|
||||
static const char gBarinadeTitleCardGERTex[] __attribute__((aligned (2))) = dgBarinadeTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gBarinadeTitleCardGERTex[] = dgBarinadeTitleCardGERTex;
|
||||
|
||||
#define dgBarinadeTitleCardFRATex "__OTR__textures/object_bv/gBarinadeTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gBarinadeTitleCardFRATex[] = dgBarinadeTitleCardFRATex;
|
||||
#else
|
||||
static const char gBarinadeTitleCardFRATex[] __attribute__((aligned (2))) = dgBarinadeTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gBarinadeTitleCardFRATex[] = dgBarinadeTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgVolvagiaBossTitleCardENGTex "__OTR__textures/object_fd/gVolvagiaBossTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gVolvagiaBossTitleCardENGTex[] = dgVolvagiaBossTitleCardENGTex;
|
||||
#else
|
||||
static const char gVolvagiaBossTitleCardENGTex[] __attribute__((aligned (2))) = dgVolvagiaBossTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardENGTex[] = dgVolvagiaBossTitleCardENGTex;
|
||||
|
||||
#define dgVolvagiaBossTitleCardGERTex "__OTR__textures/object_fd/gVolvagiaBossTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gVolvagiaBossTitleCardGERTex[] = dgVolvagiaBossTitleCardGERTex;
|
||||
#else
|
||||
static const char gVolvagiaBossTitleCardGERTex[] __attribute__((aligned (2))) = dgVolvagiaBossTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardGERTex[] = dgVolvagiaBossTitleCardGERTex;
|
||||
|
||||
#define dgVolvagiaBossTitleCardFRATex "__OTR__textures/object_fd/gVolvagiaBossTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gVolvagiaBossTitleCardFRATex[] = dgVolvagiaBossTitleCardFRATex;
|
||||
#else
|
||||
static const char gVolvagiaBossTitleCardFRATex[] __attribute__((aligned (2))) = dgVolvagiaBossTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gVolvagiaBossTitleCardFRATex[] = dgVolvagiaBossTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgPhantomGanonTitleCardENGTex "__OTR__textures/object_fhg/gPhantomGanonTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gPhantomGanonTitleCardENGTex[] = dgPhantomGanonTitleCardENGTex;
|
||||
#else
|
||||
static const char gPhantomGanonTitleCardENGTex[] __attribute__((aligned (2))) = dgPhantomGanonTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gPhantomGanonTitleCardENGTex[] = dgPhantomGanonTitleCardENGTex;
|
||||
|
||||
#define dgPhantomGanonTitleCardGERTex "__OTR__textures/object_fhg/gPhantomGanonTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gPhantomGanonTitleCardGERTex[] = dgPhantomGanonTitleCardGERTex;
|
||||
#else
|
||||
static const char gPhantomGanonTitleCardGERTex[] __attribute__((aligned (2))) = dgPhantomGanonTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gPhantomGanonTitleCardGERTex[] = dgPhantomGanonTitleCardGERTex;
|
||||
|
||||
#define dgPhantomGanonTitleCardFRATex "__OTR__textures/object_fhg/gPhantomGanonTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gPhantomGanonTitleCardFRATex[] = dgPhantomGanonTitleCardFRATex;
|
||||
#else
|
||||
static const char gPhantomGanonTitleCardFRATex[] __attribute__((aligned (2))) = dgPhantomGanonTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gPhantomGanonTitleCardFRATex[] = dgPhantomGanonTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgGanondorfTitleCardENGTex "__OTR__textures/object_ganon/gGanondorfTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGanondorfTitleCardENGTex[] = dgGanondorfTitleCardENGTex;
|
||||
#else
|
||||
static const char gGanondorfTitleCardENGTex[] __attribute__((aligned (2))) = dgGanondorfTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gGanondorfTitleCardENGTex[] = dgGanondorfTitleCardENGTex;
|
||||
|
||||
#define dgGanondorfTitleCardGERTex "__OTR__textures/object_ganon/gGanondorfTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGanondorfTitleCardGERTex[] = dgGanondorfTitleCardGERTex;
|
||||
#else
|
||||
static const char gGanondorfTitleCardGERTex[] __attribute__((aligned (2))) = dgGanondorfTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gGanondorfTitleCardGERTex[] = dgGanondorfTitleCardGERTex;
|
||||
|
||||
#define dgGanondorfTitleCardFRATex "__OTR__textures/object_ganon/gGanondorfTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGanondorfTitleCardFRATex[] = dgGanondorfTitleCardFRATex;
|
||||
#else
|
||||
static const char gGanondorfTitleCardFRATex[] __attribute__((aligned (2))) = dgGanondorfTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gGanondorfTitleCardFRATex[] = dgGanondorfTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgGanonTitleCardENGTex "__OTR__textures/object_ganon2/gGanonTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGanonTitleCardENGTex[] = dgGanonTitleCardENGTex;
|
||||
#else
|
||||
static const char gGanonTitleCardENGTex[] __attribute__((aligned (2))) = dgGanonTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gGanonTitleCardENGTex[] = dgGanonTitleCardENGTex;
|
||||
|
||||
#define dgGanonTitleCardGERTex "__OTR__textures/object_ganon2/gGanonTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGanonTitleCardGERTex[] = dgGanonTitleCardGERTex;
|
||||
#else
|
||||
static const char gGanonTitleCardGERTex[] __attribute__((aligned (2))) = dgGanonTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gGanonTitleCardGERTex[] = dgGanonTitleCardGERTex;
|
||||
|
||||
#define dgGanonTitleCardFRATex "__OTR__textures/object_ganon2/gGanonTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGanonTitleCardFRATex[] = dgGanonTitleCardFRATex;
|
||||
#else
|
||||
static const char gGanonTitleCardFRATex[] __attribute__((aligned (2))) = dgGanonTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gGanonTitleCardFRATex[] = dgGanonTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgGohmaTitleCardENGTex "__OTR__textures/object_goma/gGohmaTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGohmaTitleCardENGTex[] = dgGohmaTitleCardENGTex;
|
||||
#else
|
||||
static const char gGohmaTitleCardENGTex[] __attribute__((aligned (2))) = dgGohmaTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gGohmaTitleCardENGTex[] = dgGohmaTitleCardENGTex;
|
||||
|
||||
#define dgGohmaTitleCardGERTex "__OTR__textures/object_goma/gGohmaTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGohmaTitleCardGERTex[] = dgGohmaTitleCardGERTex;
|
||||
#else
|
||||
static const char gGohmaTitleCardGERTex[] __attribute__((aligned (2))) = dgGohmaTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gGohmaTitleCardGERTex[] = dgGohmaTitleCardGERTex;
|
||||
|
||||
#define dgGohmaTitleCardFRATex "__OTR__textures/object_goma/gGohmaTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gGohmaTitleCardFRATex[] = dgGohmaTitleCardFRATex;
|
||||
#else
|
||||
static const char gGohmaTitleCardFRATex[] __attribute__((aligned (2))) = dgGohmaTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gGohmaTitleCardFRATex[] = dgGohmaTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgKingDodongoTitleCardENGTex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gKingDodongoTitleCardENGTex[] = dgKingDodongoTitleCardENGTex;
|
||||
#else
|
||||
static const char gKingDodongoTitleCardENGTex[] __attribute__((aligned (2))) = dgKingDodongoTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gKingDodongoTitleCardENGTex[] = dgKingDodongoTitleCardENGTex;
|
||||
|
||||
#define dgKingDodongoTitleCardGERTex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gKingDodongoTitleCardGERTex[] = dgKingDodongoTitleCardGERTex;
|
||||
#else
|
||||
static const char gKingDodongoTitleCardGERTex[] __attribute__((aligned (2))) = dgKingDodongoTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gKingDodongoTitleCardGERTex[] = dgKingDodongoTitleCardGERTex;
|
||||
|
||||
#define dgKingDodongoTitleCardFRATex "__OTR__textures/object_kingdodongo/gKingDodongoTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gKingDodongoTitleCardFRATex[] = dgKingDodongoTitleCardFRATex;
|
||||
#else
|
||||
static const char gKingDodongoTitleCardFRATex[] __attribute__((aligned (2))) = dgKingDodongoTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gKingDodongoTitleCardFRATex[] = dgKingDodongoTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgMorphaTitleCardENGTex "__OTR__textures/object_mo/gMorphaTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gMorphaTitleCardENGTex[] = dgMorphaTitleCardENGTex;
|
||||
#else
|
||||
static const char gMorphaTitleCardENGTex[] __attribute__((aligned (2))) = dgMorphaTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gMorphaTitleCardENGTex[] = dgMorphaTitleCardENGTex;
|
||||
|
||||
#define dgMorphaTitleCardGERTex "__OTR__textures/object_mo/gMorphaTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gMorphaTitleCardGERTex[] = dgMorphaTitleCardGERTex;
|
||||
#else
|
||||
static const char gMorphaTitleCardGERTex[] __attribute__((aligned (2))) = dgMorphaTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gMorphaTitleCardGERTex[] = dgMorphaTitleCardGERTex;
|
||||
|
||||
#define dgMorphaTitleCardFRATex "__OTR__textures/object_mo/gMorphaTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gMorphaTitleCardFRATex[] = dgMorphaTitleCardFRATex;
|
||||
#else
|
||||
static const char gMorphaTitleCardFRATex[] __attribute__((aligned (2))) = dgMorphaTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gMorphaTitleCardFRATex[] = dgMorphaTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgBongoTitleCardENGTex "__OTR__textures/object_sst/gBongoTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gBongoTitleCardENGTex[] = dgBongoTitleCardENGTex;
|
||||
#else
|
||||
static const char gBongoTitleCardENGTex[] __attribute__((aligned (2))) = dgBongoTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gBongoTitleCardENGTex[] = dgBongoTitleCardENGTex;
|
||||
|
||||
#define dgBongoTitleCardGERTex "__OTR__textures/object_sst/gBongoTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gBongoTitleCardGERTex[] = dgBongoTitleCardGERTex;
|
||||
#else
|
||||
static const char gBongoTitleCardGERTex[] __attribute__((aligned (2))) = dgBongoTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gBongoTitleCardGERTex[] = dgBongoTitleCardGERTex;
|
||||
|
||||
#define dgBongoTitleCardFRATex "__OTR__textures/object_sst/gBongoTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gBongoTitleCardFRATex[] = dgBongoTitleCardFRATex;
|
||||
#else
|
||||
static const char gBongoTitleCardFRATex[] __attribute__((aligned (2))) = dgBongoTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gBongoTitleCardFRATex[] = dgBongoTitleCardFRATex;
|
@ -1,23 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "align_asset_macro.h"
|
||||
|
||||
#define dgTwinrovaTitleCardENGTex "__OTR__textures/object_tw/gTwinrovaTitleCardENGTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gTwinrovaTitleCardENGTex[] = dgTwinrovaTitleCardENGTex;
|
||||
#else
|
||||
static const char gTwinrovaTitleCardENGTex[] __attribute__((aligned (2))) = dgTwinrovaTitleCardENGTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gTwinrovaTitleCardENGTex[] = dgTwinrovaTitleCardENGTex;
|
||||
|
||||
#define dgTwinrovaTitleCardGERTex "__OTR__textures/object_tw/gTwinrovaTitleCardGERTex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gTwinrovaTitleCardGERTex[] = dgTwinrovaTitleCardGERTex;
|
||||
#else
|
||||
static const char gTwinrovaTitleCardGERTex[] __attribute__((aligned (2))) = dgTwinrovaTitleCardGERTex;
|
||||
#endif
|
||||
static const ALIGN_ASSET(2) char gTwinrovaTitleCardGERTex[] = dgTwinrovaTitleCardGERTex;
|
||||
|
||||
#define dgTwinrovaTitleCardFRATex "__OTR__textures/object_tw/gTwinrovaTitleCardFRATex"
|
||||
#ifdef _WIN32
|
||||
static const __declspec(align(2)) char gTwinrovaTitleCardFRATex[] = dgTwinrovaTitleCardFRATex;
|
||||
#else
|
||||
static const char gTwinrovaTitleCardFRATex[] __attribute__((aligned (2))) = dgTwinrovaTitleCardFRATex;
|
||||
#endif
|
||||
|
||||
|
||||
static const ALIGN_ASSET(2) char gTwinrovaTitleCardFRATex[] = dgTwinrovaTitleCardFRATex;
|
52
soh/assets/xml/GC_MQ_D/textures/boss_title_cards.xml
Normal file
52
soh/assets/xml/GC_MQ_D/textures/boss_title_cards.xml
Normal file
@ -0,0 +1,52 @@
|
||||
<Root>
|
||||
<File Name="object_bv" Segment="6">
|
||||
<Texture Name="gBarinadeTitleCardENGTex" OutName="barinade_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x1230" />
|
||||
<Texture Name="gBarinadeTitleCardGERTex" OutName="barinade_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2630" />
|
||||
<Texture Name="gBarinadeTitleCardFRATex" OutName="barinade_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x3a30" />
|
||||
</File>
|
||||
<File Name="object_fd" Segment="6">
|
||||
<Texture Name="gVolvagiaBossTitleCardENGTex" OutName="volvagia_boss_eng_title_card" Format="i8" Width="128" Height="40" Offset="0xd700" />
|
||||
<Texture Name="gVolvagiaBossTitleCardGERTex" OutName="volvagia_boss_ger_title_card" Format="i8" Width="128" Height="40" Offset="0xeb00" />
|
||||
<Texture Name="gVolvagiaBossTitleCardFRATex" OutName="volvagia_boss_fra_title_card" Format="i8" Width="128" Height="40" Offset="0xff00" />
|
||||
</File>
|
||||
<File Name="object_fhg" Segment="6">
|
||||
<Texture Name="gPhantomGanonTitleCardENGTex" OutName="phantom_ganon_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x59a0" />
|
||||
<Texture Name="gPhantomGanonTitleCardGERTex" OutName="phantom_ganon_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x6da0" />
|
||||
<Texture Name="gPhantomGanonTitleCardFRATex" OutName="phantom_ganon_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x81a0" />
|
||||
</File>
|
||||
<File Name="object_ganon" Segment="6">
|
||||
<Texture Name="gGanondorfTitleCardENGTex" OutName="ganondorf_eng_title_card" Format="i8" Width="128" Height="40" Offset="0xcf00" />
|
||||
<Texture Name="gGanondorfTitleCardGERTex" OutName="ganondorf_ger_title_card" Format="i8" Width="128" Height="40" Offset="0xe300" />
|
||||
<Texture Name="gGanondorfTitleCardFRATex" OutName="ganondorf_fra_title_card" Format="i8" Width="128" Height="40" Offset="0xf700" />
|
||||
</File>
|
||||
<File Name="object_ganon2" Segment="6">
|
||||
<Texture Name="gGanonTitleCardENGTex" OutName="ganon_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x21a90" />
|
||||
<Texture Name="gGanonTitleCardGERTex" OutName="ganon_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x22e90" />
|
||||
<Texture Name="gGanonTitleCardFRATex" OutName="ganon_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x24290" />
|
||||
</File>
|
||||
<File Name="object_goma" Segment="6">
|
||||
<Texture Name="gGohmaTitleCardENGTex" OutName="gohma_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x19ba8" />
|
||||
<Texture Name="gGohmaTitleCardGERTex" OutName="gohma_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x1afa8" />
|
||||
<Texture Name="gGohmaTitleCardFRATex" OutName="gohma_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x1c3a8" />
|
||||
</File>
|
||||
<File Name="object_kingdodongo" Segment="6">
|
||||
<Texture Name="gKingDodongoTitleCardENGTex" OutName="king_dodongo_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x17410" />
|
||||
<Texture Name="gKingDodongoTitleCardGERTex" OutName="king_dodongo_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x18810" />
|
||||
<Texture Name="gKingDodongoTitleCardFRATex" OutName="king_dodongo_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x19c10" />
|
||||
</File>
|
||||
<File Name="object_mo" Segment="6">
|
||||
<Texture Name="gMorphaTitleCardENGTex" OutName="morpha_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x1010" />
|
||||
<Texture Name="gMorphaTitleCardGERTex" OutName="morpha_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2410" />
|
||||
<Texture Name="gMorphaTitleCardFRATex" OutName="morpha_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x3810" />
|
||||
</File>
|
||||
<File Name="object_sst" Segment="6">
|
||||
<Texture Name="gBongoTitleCardENGTex" OutName="bongo_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x13d80" />
|
||||
<Texture Name="gBongoTitleCardGERTex" OutName="bongo_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x15180" />
|
||||
<Texture Name="gBongoTitleCardFRATex" OutName="bongo_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x16580" />
|
||||
</File>
|
||||
<File Name="object_tw" Segment="6">
|
||||
<Texture Name="gTwinrovaTitleCardENGTex" OutName="twinrova_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x2e170" />
|
||||
<Texture Name="gTwinrovaTitleCardGERTex" OutName="twinrova_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2f570" />
|
||||
<Texture Name="gTwinrovaTitleCardFRATex" OutName="twinrova_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x30970" />
|
||||
</File>
|
||||
</Root>
|
52
soh/assets/xml/GC_NMQ_D/textures/boss_title_cards.xml
Normal file
52
soh/assets/xml/GC_NMQ_D/textures/boss_title_cards.xml
Normal file
@ -0,0 +1,52 @@
|
||||
<Root>
|
||||
<File Name="object_bv" Segment="6">
|
||||
<Texture Name="gBarinadeTitleCardENGTex" OutName="barinade_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x1230" />
|
||||
<Texture Name="gBarinadeTitleCardGERTex" OutName="barinade_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2630" />
|
||||
<Texture Name="gBarinadeTitleCardFRATex" OutName="barinade_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x3a30" />
|
||||
</File>
|
||||
<File Name="object_fd" Segment="6">
|
||||
<Texture Name="gVolvagiaBossTitleCardENGTex" OutName="volvagia_boss_eng_title_card" Format="i8" Width="128" Height="40" Offset="0xd700" />
|
||||
<Texture Name="gVolvagiaBossTitleCardGERTex" OutName="volvagia_boss_ger_title_card" Format="i8" Width="128" Height="40" Offset="0xeb00" />
|
||||
<Texture Name="gVolvagiaBossTitleCardFRATex" OutName="volvagia_boss_fra_title_card" Format="i8" Width="128" Height="40" Offset="0xff00" />
|
||||
</File>
|
||||
<File Name="object_fhg" Segment="6">
|
||||
<Texture Name="gPhantomGanonTitleCardENGTex" OutName="phantom_ganon_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x59a0" />
|
||||
<Texture Name="gPhantomGanonTitleCardGERTex" OutName="phantom_ganon_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x6da0" />
|
||||
<Texture Name="gPhantomGanonTitleCardFRATex" OutName="phantom_ganon_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x81a0" />
|
||||
</File>
|
||||
<File Name="object_ganon" Segment="6">
|
||||
<Texture Name="gGanondorfTitleCardENGTex" OutName="ganondorf_eng_title_card" Format="i8" Width="128" Height="40" Offset="0xcf00" />
|
||||
<Texture Name="gGanondorfTitleCardGERTex" OutName="ganondorf_ger_title_card" Format="i8" Width="128" Height="40" Offset="0xe300" />
|
||||
<Texture Name="gGanondorfTitleCardFRATex" OutName="ganondorf_fra_title_card" Format="i8" Width="128" Height="40" Offset="0xf700" />
|
||||
</File>
|
||||
<File Name="object_ganon2" Segment="6">
|
||||
<Texture Name="gGanonTitleCardENGTex" OutName="ganon_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x21a90" />
|
||||
<Texture Name="gGanonTitleCardGERTex" OutName="ganon_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x22e90" />
|
||||
<Texture Name="gGanonTitleCardFRATex" OutName="ganon_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x24290" />
|
||||
</File>
|
||||
<File Name="object_goma" Segment="6">
|
||||
<Texture Name="gGohmaTitleCardENGTex" OutName="gohma_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x19ba8" />
|
||||
<Texture Name="gGohmaTitleCardGERTex" OutName="gohma_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x1afa8" />
|
||||
<Texture Name="gGohmaTitleCardFRATex" OutName="gohma_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x1c3a8" />
|
||||
</File>
|
||||
<File Name="object_kingdodongo" Segment="6">
|
||||
<Texture Name="gKingDodongoTitleCardENGTex" OutName="king_dodongo_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x17410" />
|
||||
<Texture Name="gKingDodongoTitleCardGERTex" OutName="king_dodongo_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x18810" />
|
||||
<Texture Name="gKingDodongoTitleCardFRATex" OutName="king_dodongo_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x19c10" />
|
||||
</File>
|
||||
<File Name="object_mo" Segment="6">
|
||||
<Texture Name="gMorphaTitleCardENGTex" OutName="morpha_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x1010" />
|
||||
<Texture Name="gMorphaTitleCardGERTex" OutName="morpha_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2410" />
|
||||
<Texture Name="gMorphaTitleCardFRATex" OutName="morpha_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x3810" />
|
||||
</File>
|
||||
<File Name="object_sst" Segment="6">
|
||||
<Texture Name="gBongoTitleCardENGTex" OutName="bongo_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x13d80" />
|
||||
<Texture Name="gBongoTitleCardGERTex" OutName="bongo_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x15180" />
|
||||
<Texture Name="gBongoTitleCardFRATex" OutName="bongo_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x16580" />
|
||||
</File>
|
||||
<File Name="object_tw" Segment="6">
|
||||
<Texture Name="gTwinrovaTitleCardENGTex" OutName="twinrova_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x2e170" />
|
||||
<Texture Name="gTwinrovaTitleCardGERTex" OutName="twinrova_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2f570" />
|
||||
<Texture Name="gTwinrovaTitleCardFRATex" OutName="twinrova_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x30970" />
|
||||
</File>
|
||||
</Root>
|
52
soh/assets/xml/GC_NMQ_PAL_F/textures/boss_title_cards.xml
Normal file
52
soh/assets/xml/GC_NMQ_PAL_F/textures/boss_title_cards.xml
Normal file
@ -0,0 +1,52 @@
|
||||
<Root>
|
||||
<File Name="object_bv" Segment="6">
|
||||
<Texture Name="gBarinadeTitleCardENGTex" OutName="barinade_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x1230" />
|
||||
<Texture Name="gBarinadeTitleCardGERTex" OutName="barinade_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2630" />
|
||||
<Texture Name="gBarinadeTitleCardFRATex" OutName="barinade_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x3a30" />
|
||||
</File>
|
||||
<File Name="object_fd" Segment="6">
|
||||
<Texture Name="gVolvagiaBossTitleCardENGTex" OutName="volvagia_boss_eng_title_card" Format="i8" Width="128" Height="40" Offset="0xd700" />
|
||||
<Texture Name="gVolvagiaBossTitleCardGERTex" OutName="volvagia_boss_ger_title_card" Format="i8" Width="128" Height="40" Offset="0xeb00" />
|
||||
<Texture Name="gVolvagiaBossTitleCardFRATex" OutName="volvagia_boss_fra_title_card" Format="i8" Width="128" Height="40" Offset="0xff00" />
|
||||
</File>
|
||||
<File Name="object_fhg" Segment="6">
|
||||
<Texture Name="gPhantomGanonTitleCardENGTex" OutName="phantom_ganon_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x59a0" />
|
||||
<Texture Name="gPhantomGanonTitleCardGERTex" OutName="phantom_ganon_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x6da0" />
|
||||
<Texture Name="gPhantomGanonTitleCardFRATex" OutName="phantom_ganon_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x81a0" />
|
||||
</File>
|
||||
<File Name="object_ganon" Segment="6">
|
||||
<Texture Name="gGanondorfTitleCardENGTex" OutName="ganondorf_eng_title_card" Format="i8" Width="128" Height="40" Offset="0xcf00" />
|
||||
<Texture Name="gGanondorfTitleCardGERTex" OutName="ganondorf_ger_title_card" Format="i8" Width="128" Height="40" Offset="0xe300" />
|
||||
<Texture Name="gGanondorfTitleCardFRATex" OutName="ganondorf_fra_title_card" Format="i8" Width="128" Height="40" Offset="0xf700" />
|
||||
</File>
|
||||
<File Name="object_ganon2" Segment="6">
|
||||
<Texture Name="gGanonTitleCardENGTex" OutName="ganon_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x21a90" />
|
||||
<Texture Name="gGanonTitleCardGERTex" OutName="ganon_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x22e90" />
|
||||
<Texture Name="gGanonTitleCardFRATex" OutName="ganon_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x24290" />
|
||||
</File>
|
||||
<File Name="object_goma" Segment="6">
|
||||
<Texture Name="gGohmaTitleCardENGTex" OutName="gohma_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x19ba8" />
|
||||
<Texture Name="gGohmaTitleCardGERTex" OutName="gohma_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x1afa8" />
|
||||
<Texture Name="gGohmaTitleCardFRATex" OutName="gohma_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x1c3a8" />
|
||||
</File>
|
||||
<File Name="object_kingdodongo" Segment="6">
|
||||
<Texture Name="gKingDodongoTitleCardENGTex" OutName="king_dodongo_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x17410" />
|
||||
<Texture Name="gKingDodongoTitleCardGERTex" OutName="king_dodongo_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x18810" />
|
||||
<Texture Name="gKingDodongoTitleCardFRATex" OutName="king_dodongo_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x19c10" />
|
||||
</File>
|
||||
<File Name="object_mo" Segment="6">
|
||||
<Texture Name="gMorphaTitleCardENGTex" OutName="morpha_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x1010" />
|
||||
<Texture Name="gMorphaTitleCardGERTex" OutName="morpha_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2410" />
|
||||
<Texture Name="gMorphaTitleCardFRATex" OutName="morpha_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x3810" />
|
||||
</File>
|
||||
<File Name="object_sst" Segment="6">
|
||||
<Texture Name="gBongoTitleCardENGTex" OutName="bongo_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x13d80" />
|
||||
<Texture Name="gBongoTitleCardGERTex" OutName="bongo_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x15180" />
|
||||
<Texture Name="gBongoTitleCardFRATex" OutName="bongo_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x16580" />
|
||||
</File>
|
||||
<File Name="object_tw" Segment="6">
|
||||
<Texture Name="gTwinrovaTitleCardENGTex" OutName="twinrova_eng_title_card" Format="i8" Width="128" Height="40" Offset="0x2e170" />
|
||||
<Texture Name="gTwinrovaTitleCardGERTex" OutName="twinrova_ger_title_card" Format="i8" Width="128" Height="40" Offset="0x2f570" />
|
||||
<Texture Name="gTwinrovaTitleCardFRATex" OutName="twinrova_fra_title_card" Format="i8" Width="128" Height="40" Offset="0x30970" />
|
||||
</File>
|
||||
</Root>
|
@ -28,6 +28,7 @@ f64 sqrt(f64 d);
|
||||
//#pragma intrinsic(sqrt)
|
||||
|
||||
void gSPSegment(void* value, int segNum, uintptr_t target);
|
||||
void gSPSegmentLoadRes(void* value, int segNum, uintptr_t target);
|
||||
void gDPSetTextureImage(Gfx* pkt, u32 f, u32 s, u32 w, uintptr_t i);
|
||||
void gSPDisplayList(Gfx* pkt, Gfx* dl);
|
||||
void gSPDisplayListOffset(Gfx* pkt, Gfx* dl, int offset);
|
||||
@ -840,7 +841,7 @@ void CollisionCheck_SpawnShieldParticlesMetal2(PlayState* play, Vec3f* v);
|
||||
void CollisionCheck_SpawnShieldParticlesWood(PlayState* play, Vec3f* b, Vec3f* actorPos);
|
||||
s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* actorPos, Vec3f* itemPos,
|
||||
Vec3f* itemProjPos, Vec3f* out1, Vec3f* out2);
|
||||
u8 CollisionCheck_GetSwordDamage(s32 dmgFlags);
|
||||
u8 CollisionCheck_GetSwordDamage(s32 dmgFlags, PlayState* play);
|
||||
void SaveContext_Init(void);
|
||||
s32 func_800635D0(s32);
|
||||
void func_800636C0(void);
|
||||
|
@ -481,3 +481,4 @@
|
||||
/* 0x01D4 */ DEFINE_ACTOR(En_Mm2, ACTOR_EN_MM2, ALLOCTYPE_NORMAL)
|
||||
/* 0x01D5 */ DEFINE_ACTOR(Bg_Jya_Block, ACTOR_BG_JYA_BLOCK, ALLOCTYPE_NORMAL)
|
||||
/* 0x01D6 */ DEFINE_ACTOR(Obj_Warp2block, ACTOR_OBJ_WARP2BLOCK, ALLOCTYPE_NORMAL)
|
||||
/* 0x01D7 */ DEFINE_ACTOR(En_Partner, ACTOR_EN_PARTNER, ALLOCTYPE_NORMAL)
|
@ -624,12 +624,15 @@ typedef enum {
|
||||
/* 10 */ TEXT_STATE_AWAITING_NEXT
|
||||
} TextState;
|
||||
|
||||
// Increased char buffer because texture paths could be bigger than (16 * 16 / 2)
|
||||
#define FONT_CHAR_MULTIPLIER 256
|
||||
|
||||
typedef struct {
|
||||
/* 0x0000 */ uintptr_t msgOffset;
|
||||
/* 0x0004 */ u32 msgLength;
|
||||
/* 0x0008 */ u8 charTexBuf[FONT_CHAR_TEX_SIZE * 120];
|
||||
/* 0x3C08 */ u8 iconBuf[FONT_CHAR_TEX_SIZE];
|
||||
/* 0x3C88 */ u8 fontBuf[FONT_CHAR_TEX_SIZE * 320];
|
||||
/* 0x0008 */ u8 charTexBuf[FONT_CHAR_TEX_SIZE * FONT_CHAR_MULTIPLIER];
|
||||
/* 0x3C08 */ u8 iconBuf[FONT_CHAR_TEX_SIZE * FONT_CHAR_MULTIPLIER];
|
||||
/* 0x3C88 */ u8 fontBuf[FONT_CHAR_TEX_SIZE * FONT_CHAR_MULTIPLIER];
|
||||
union {
|
||||
/* 0xDC88 */ char msgBuf[1280];
|
||||
/* 0xDC88 */ u16 msgBufWide[640];
|
||||
@ -737,9 +740,10 @@ typedef struct {
|
||||
/* 0x0128 */ Vtx* actionVtx;
|
||||
/* 0x012C */ Vtx* beatingHeartVtx;
|
||||
/* 0x0130 */ u8* parameterSegment;
|
||||
/* 0x0134 */ u8* doActionSegment;
|
||||
/* 0x0134 */ char** doActionSegment;
|
||||
/* 0x0138 */ u8* iconItemSegment;
|
||||
/* 0x013C */ u8* mapSegment;
|
||||
/* 0x013C */ char** mapSegment;
|
||||
char** mapSegmentName;
|
||||
/* 0x0140 */ u8 mapPalette[32];
|
||||
/* 0x0160 */ DmaRequest dmaRequest_160;
|
||||
/* 0x0180 */ DmaRequest dmaRequest_180;
|
||||
|
@ -678,6 +678,8 @@ typedef struct Player {
|
||||
// Upstream TODO: Rename this to make it more obvious it is apart of an enhancement
|
||||
/* */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still?
|
||||
// #endregion
|
||||
u8 ivanFloating;
|
||||
u8 ivanDamageMultiplier;
|
||||
} Player; // size = 0xA94
|
||||
|
||||
#endif
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <libultraship/libultra/types.h>
|
||||
#include <libultraship/libultra/pi.h>
|
||||
#include <libultraship/libultra/sptask.h>
|
||||
#include <Fast3D/gfx_pc.h>
|
||||
|
||||
#ifdef __SWITCH__
|
||||
#include <port/switch/SwitchImpl.h>
|
||||
@ -28,6 +29,7 @@
|
||||
#include "soh/SaveManager.h"
|
||||
#include "OTRGlobals.h"
|
||||
#include "soh/Enhancements/presets.h"
|
||||
#include "soh/resource/type/Skeleton.h"
|
||||
|
||||
#ifdef ENABLE_CROWD_CONTROL
|
||||
#include "Enhancements/crowd-control/CrowdControl.h"
|
||||
@ -36,6 +38,7 @@
|
||||
#include "Enhancements/game-interactor/GameInteractor.h"
|
||||
#include "Enhancements/cosmetics/authenticGfxPatches.h"
|
||||
|
||||
bool ShouldClearTextureCacheAtEndOfFrame = false;
|
||||
bool isBetaQuestEnabled = false;
|
||||
|
||||
extern "C" {
|
||||
@ -791,6 +794,34 @@ namespace GameMenuBar {
|
||||
|
||||
if (ImGui::BeginMenu("Graphics"))
|
||||
{
|
||||
if (UIWidgets::PaddedEnhancementCheckbox("Use Alternate Assets", "gAltAssets", true, false)) {
|
||||
ShouldClearTextureCacheAtEndOfFrame = true;
|
||||
}
|
||||
UIWidgets::PaddedEnhancementCheckbox("Disable LOD", "gDisableLOD", true, false);
|
||||
UIWidgets::Tooltip("Turns off the Level of Detail setting, making models use their higher-poly variants at any distance");
|
||||
if (UIWidgets::PaddedEnhancementCheckbox("Disable Draw Distance", "gDisableDrawDistance", true, false)) {
|
||||
if (CVarGetInteger("gDisableDrawDistance", 0) == 0) {
|
||||
CVarSetInteger("gDisableKokiriDrawDistance", 0);
|
||||
}
|
||||
}
|
||||
UIWidgets::Tooltip("Turns off the objects draw distance, making objects being visible from a longer range");
|
||||
if (CVarGetInteger("gDisableDrawDistance", 0) == 1) {
|
||||
UIWidgets::PaddedEnhancementCheckbox("Kokiri Draw Distance", "gDisableKokiriDrawDistance", true, false);
|
||||
UIWidgets::Tooltip("The Kokiri are mystical beings that fade into view when approached\nEnabling this will remove their draw distance");
|
||||
}
|
||||
UIWidgets::PaddedEnhancementCheckbox("N64 Mode", "gLowResMode", true, false);
|
||||
UIWidgets::Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Glitch line-up tick", "gDrawLineupTick", true, false);
|
||||
UIWidgets::Tooltip("Displays a tick in the top center of the screen to help with glitch line-ups in SoH, as traditional UI based line-ups do not work outside of 4:3");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Enable 3D Dropped items/projectiles", "gNewDrops", true, false);
|
||||
UIWidgets::Tooltip("Change most 2D items and projectiles on the overworld to their 3D versions");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Disable Black Bar Letterboxes", "gDisableBlackBars", true, false);
|
||||
UIWidgets::Tooltip("Disables Black Bar Letterboxes during cutscenes and Z-targeting\nNote: there may be minor visual glitches that were covered up by the black bars\nPlease disable this setting before reporting a bug");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Dynamic Wallet Icon", "gDynamicWalletIcon", true, false);
|
||||
UIWidgets::Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Always show dungeon entrances", "gAlwaysShowDungeonMinimapIcon", true, false);
|
||||
UIWidgets::Tooltip("Always shows dungeon entrance icons on the minimap");
|
||||
UIWidgets::Spacer(0);
|
||||
if (ImGui::BeginMenu("Animated Link in Pause Menu")) {
|
||||
ImGui::Text("Rotation");
|
||||
UIWidgets::EnhancementRadioButton("Disabled", "gPauseLiveLinkRotation", 0);
|
||||
@ -834,37 +865,14 @@ namespace GameMenuBar {
|
||||
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
UIWidgets::PaddedEnhancementCheckbox("Disable LOD", "gDisableLOD", true, false);
|
||||
UIWidgets::Tooltip("Turns off the Level of Detail setting, making models use their higher-poly variants at any distance");
|
||||
if (UIWidgets::PaddedEnhancementCheckbox("Disable Draw Distance", "gDisableDrawDistance", true, false)) {
|
||||
if (CVarGetInteger("gDisableDrawDistance", 0) == 0) {
|
||||
CVarSetInteger("gDisableKokiriDrawDistance", 0);
|
||||
}
|
||||
}
|
||||
UIWidgets::Tooltip("Turns off the objects draw distance, making objects being visible from a longer range");
|
||||
if (CVarGetInteger("gDisableDrawDistance", 0) == 1) {
|
||||
UIWidgets::PaddedEnhancementCheckbox("Kokiri Draw Distance", "gDisableKokiriDrawDistance", true, false);
|
||||
UIWidgets::Tooltip("The Kokiri are mystical beings that fade into view when approached\nEnabling this will remove their draw distance");
|
||||
}
|
||||
UIWidgets::PaddedEnhancementCheckbox("N64 Mode", "gLowResMode", true, false);
|
||||
UIWidgets::Tooltip("Sets aspect ratio to 4:3 and lowers resolution to 240p, the N64's native resolution");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Glitch line-up tick", "gDrawLineupTick", true, false);
|
||||
UIWidgets::Tooltip("Displays a tick in the top center of the screen to help with glitch line-ups in SoH, as traditional UI based line-ups do not work outside of 4:3");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Enable 3D Dropped items/projectiles", "gNewDrops", true, false);
|
||||
UIWidgets::Tooltip("Change most 2D items and projectiles on the overworld to their 3D versions");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Disable Black Bar Letterboxes", "gDisableBlackBars", true, false);
|
||||
UIWidgets::Tooltip("Disables Black Bar Letterboxes during cutscenes and Z-targeting\nNote: there may be minor visual glitches that were covered up by the black bars\nPlease disable this setting before reporting a bug");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Dynamic Wallet Icon", "gDynamicWalletIcon", true, false);
|
||||
UIWidgets::Tooltip("Changes the rupee in the wallet icon to match the wallet size you currently have");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Always show dungeon entrances", "gAlwaysShowDungeonMinimapIcon", true, false);
|
||||
UIWidgets::Tooltip("Always shows dungeon entrance icons on the minimap");
|
||||
UIWidgets::PaddedText("Fix Vanishing Paths", true, false);
|
||||
UIWidgets::EnhancementCombobox("gDirtPathFix", zFightingOptions, 0);
|
||||
UIWidgets::Tooltip("Disabled: Paths vanish more the higher the resolution (Z-fighting is based on resolution)\n"
|
||||
"Consistent: Certain paths vanish the same way in all resolutions\n"
|
||||
"No Vanish: Paths do not vanish, Link seems to sink in to some paths\n"
|
||||
"This might affect other decal effects\n");
|
||||
|
||||
UIWidgets::PaddedEnhancementSliderInt("Text Spacing: %d", "##TEXTSPACING", "gTextSpacing", 4, 6, "", 6, true, true, true);
|
||||
UIWidgets::Tooltip("Space between text characters (useful for HD font textures)");
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
@ -922,9 +930,9 @@ namespace GameMenuBar {
|
||||
|
||||
if (ImGui::BeginMenu("Restoration"))
|
||||
{
|
||||
UIWidgets::PaddedEnhancementCheckbox("Hide Build Info", "gHideBuildInfo", true, false);
|
||||
UIWidgets::Tooltip("Hides the game version and build details in the boot logo start screen");
|
||||
UIWidgets::EnhancementCheckbox("Red Ganon blood", "gRedGanonBlood");
|
||||
UIWidgets::EnhancementCheckbox("Authentic Logo Screen", "gAuthenticLogo");
|
||||
UIWidgets::Tooltip("Hide the game version and build details and display the authentic model and texture on the boot logo start screen");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Red Ganon blood", "gRedGanonBlood", true, false);
|
||||
UIWidgets::Tooltip("Restore the original red blood from NTSC 1.0/1.1. Disable for green blood");
|
||||
UIWidgets::PaddedEnhancementCheckbox("Fish while hovering", "gHoverFishing", true, false);
|
||||
UIWidgets::Tooltip("Restore a bug from NTSC 1.0 that allows casting the Fishing Rod while using the Hover Boots");
|
||||
@ -941,7 +949,30 @@ namespace GameMenuBar {
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
UIWidgets::PaddedSeparator();
|
||||
UIWidgets::Spacer(0);
|
||||
|
||||
if (ImGui::BeginMenu("Extra Modes")) {
|
||||
UIWidgets::PaddedEnhancementCheckbox("Ivan the Fairy (Coop Mode)", "gIvanCoopModeEnabled", true, false);
|
||||
UIWidgets::Tooltip("Enables Ivan the Fairy upon the next map change. Player 2 can control Ivan and "
|
||||
"press the C-Buttons to use items and mess with Player 1!");
|
||||
|
||||
UIWidgets::Spacer(0);
|
||||
|
||||
UIWidgets::PaddedEnhancementCheckbox("Rupee Dash Mode", "gRupeeDash", true, false);
|
||||
|
||||
if (CVarGetInteger("gRupeeDash", 0)) {
|
||||
UIWidgets::Tooltip("Rupees reduced over time, Link suffers damage when the count hits 0.");
|
||||
UIWidgets::PaddedEnhancementSliderInt(
|
||||
"Rupee Dash Interval: %d", "##DashInterval", "gDashInterval", 3, 5, "", 5, true, true, false,
|
||||
!CVarGetInteger("gRupeeDash", 0),
|
||||
"This option is disabled because \"Rupee Dash Mode\" is turned off");
|
||||
UIWidgets::Tooltip("Interval between Rupee reduction in Rupee Dash Mode");
|
||||
}
|
||||
|
||||
ImGui::EndMenu();
|
||||
}
|
||||
|
||||
UIWidgets::PaddedSeparator(false, true);
|
||||
|
||||
// Autosave enum value of 1 is the default in presets and the old checkbox "on" state for backwards compatibility
|
||||
UIWidgets::PaddedText("Autosave", false, true);
|
||||
|
@ -21,6 +21,7 @@ uint16_t ResourceMgr_LoadTexWidthByName(char* texPath);
|
||||
uint16_t ResourceMgr_LoadTexHeightByName(char* texPath);
|
||||
size_t GetResourceTexSizeByName(const char* name);
|
||||
char* ResourceMgr_LoadTexOrDListByName(char* filePath);
|
||||
char* ResourceMgr_LoadIfDListByName(char* filePath);
|
||||
char* ResourceMgr_LoadPlayerAnimByName(char* animPath);
|
||||
char* ResourceMgr_GetNameByCRC(uint64_t crc, char* alloc);
|
||||
Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc);
|
||||
@ -30,6 +31,7 @@ Vtx* ResourceMgr_LoadVtxByName(char* path);
|
||||
CollisionHeader* ResourceMgr_LoadColByName(char* path);
|
||||
uint64_t GetPerfCounter();
|
||||
int ResourceMgr_OTRSigCheck(char* imgData);
|
||||
void ResourceMgr_PushCurrentDirectory(char* path);
|
||||
|
||||
}
|
||||
|
||||
@ -39,8 +41,30 @@ extern "C" void gSPSegment(void* value, int segNum, uintptr_t target) {
|
||||
|
||||
int res = ResourceMgr_OTRSigCheck(imgData);
|
||||
|
||||
if (res)
|
||||
// OTRTODO: Disabled for now to fix an issue with HD Textures.
|
||||
// With HD textures, we need to pass the path to F3D, not the raw texture data.
|
||||
// Otherwise the needed metadata is not available for proper rendering...
|
||||
// This should *not* cause any crashes, but some testing may be needed...
|
||||
// UPDATE: To maintain compatability it will still do the old behavior if the resource is a display list.
|
||||
// That should not affect HD textures.
|
||||
if (res) {
|
||||
uintptr_t desiredTarget = (uintptr_t)ResourceMgr_LoadIfDListByName(imgData);
|
||||
|
||||
if (desiredTarget != NULL)
|
||||
target = desiredTarget;
|
||||
}
|
||||
|
||||
__gSPSegment(value, segNum, target);
|
||||
}
|
||||
|
||||
extern "C" void gSPSegmentLoadRes(void* value, int segNum, uintptr_t target) {
|
||||
char* imgData = (char*)target;
|
||||
|
||||
int res = ResourceMgr_OTRSigCheck(imgData);
|
||||
|
||||
if (res) {
|
||||
target = (uintptr_t)ResourceMgr_LoadTexOrDListByName(imgData);
|
||||
}
|
||||
|
||||
__gSPSegment(value, segNum, target);
|
||||
}
|
||||
@ -57,8 +81,12 @@ extern "C" void gDPSetTextureImageFB(Gfx* pkt, u32 format, u32 size, u32 width,
|
||||
extern "C" void gSPDisplayList(Gfx* pkt, Gfx* dl) {
|
||||
char* imgData = (char*)dl;
|
||||
|
||||
if (ResourceMgr_OTRSigCheck(imgData) == 1)
|
||||
if (ResourceMgr_OTRSigCheck(imgData) == 1) {
|
||||
|
||||
//ResourceMgr_PushCurrentDirectory(imgData);
|
||||
//gsSPPushCD(pkt++, imgData);
|
||||
dl = ResourceMgr_LoadGfxByName(imgData);
|
||||
}
|
||||
|
||||
__gSPDisplayList(pkt, dl);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "OTRGlobals.h"
|
||||
#include "OTRGlobals.h"
|
||||
#include "OTRAudio.h"
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
@ -694,7 +694,7 @@ extern "C" uint32_t GetGIID(uint32_t itemID) {
|
||||
}
|
||||
|
||||
extern "C" void OTRExtScanner() {
|
||||
auto lst = *OTRGlobals::Instance->context->GetResourceManager()->GetArchive()->ListFiles("*.*").get();
|
||||
auto lst = *OTRGlobals::Instance->context->GetResourceManager()->GetArchive()->ListFiles("*").get();
|
||||
|
||||
for (auto& rPath : lst) {
|
||||
std::vector<std::string> raw = StringHelper::Split(rPath, ".");
|
||||
@ -834,14 +834,16 @@ extern "C" void Graph_ProcessFrame(void (*run_one_game_iter)(void)) {
|
||||
OTRGlobals::Instance->context->MainLoop(run_one_game_iter);
|
||||
}
|
||||
|
||||
extern bool ShouldClearTextureCacheAtEndOfFrame;
|
||||
|
||||
extern "C" void Graph_StartFrame() {
|
||||
#ifndef __WIIU__
|
||||
// Why -1?
|
||||
using Ship::KbScancode;
|
||||
int32_t dwScancode = OTRGlobals::Instance->context->GetLastScancode();
|
||||
OTRGlobals::Instance->context->SetLastScancode(-1);
|
||||
|
||||
switch (dwScancode - 1) {
|
||||
case SDL_SCANCODE_F5: {
|
||||
switch (dwScancode) {
|
||||
case KbScancode::LUS_KB_F5: {
|
||||
const unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot();
|
||||
const SaveStateReturn stateReturn =
|
||||
OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE });
|
||||
@ -858,7 +860,7 @@ extern "C" void Graph_StartFrame() {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SDL_SCANCODE_F6: {
|
||||
case KbScancode::LUS_KB_F6: {
|
||||
unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot();
|
||||
slot++;
|
||||
if (slot > 5) {
|
||||
@ -868,7 +870,7 @@ extern "C" void Graph_StartFrame() {
|
||||
SPDLOG_INFO("Set SaveState slot to {}.", slot);
|
||||
break;
|
||||
}
|
||||
case SDL_SCANCODE_F7: {
|
||||
case KbScancode::LUS_KB_F7: {
|
||||
const unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot();
|
||||
const SaveStateReturn stateReturn =
|
||||
OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::LOAD });
|
||||
@ -892,9 +894,16 @@ extern "C" void Graph_StartFrame() {
|
||||
|
||||
break;
|
||||
}
|
||||
case SDL_SCANCODE_F9: {
|
||||
case KbScancode::LUS_KB_F9: {
|
||||
// Toggle TTS
|
||||
CVarSetInteger("gA11yTTS", !CVarGetInteger("gA11yTTS", 0));
|
||||
break;
|
||||
}
|
||||
case KbScancode::LUS_KB_TAB: {
|
||||
// Toggle HD Assets
|
||||
CVarSetInteger("gAltAssets", !CVarGetInteger("gAltAssets", 0));
|
||||
ShouldClearTextureCacheAtEndOfFrame = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -963,6 +972,12 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) {
|
||||
}
|
||||
}
|
||||
|
||||
if (ShouldClearTextureCacheAtEndOfFrame) {
|
||||
gfx_texture_cache_clear();
|
||||
Ship::SkeletonPatcher::UpdateSkeletons();
|
||||
ShouldClearTextureCacheAtEndOfFrame = false;
|
||||
}
|
||||
|
||||
// OTRTODO: FIGURE OUT END FRAME POINT
|
||||
/* if (OTRGlobals::Instance->context->lastScancode != -1)
|
||||
OTRGlobals::Instance->context->lastScancode = -1;*/
|
||||
@ -1036,6 +1051,7 @@ extern "C" void ResourceMgr_DirtyDirectory(const char* resName) {
|
||||
}
|
||||
|
||||
// OTRTODO: There is probably a more elegant way to go about this...
|
||||
// Kenix: This is definitely leaking memory when it's called.
|
||||
extern "C" char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize) {
|
||||
auto lst = OTRGlobals::Instance->context->GetResourceManager()->GetArchive()->ListFiles(searchMask);
|
||||
char** result = (char**)malloc(lst->size() * sizeof(char*));
|
||||
@ -1051,6 +1067,15 @@ extern "C" char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize)
|
||||
return result;
|
||||
}
|
||||
|
||||
extern "C" uint8_t ResourceMgr_FileExists(const char* filePath) {
|
||||
std::string path = filePath;
|
||||
if(path.substr(0, 7) == "__OTR__"){
|
||||
path = path.substr(7);
|
||||
}
|
||||
|
||||
return ExtensionCache.contains(path);
|
||||
}
|
||||
|
||||
extern "C" void ResourceMgr_LoadFile(const char* resName) {
|
||||
OTRGlobals::Instance->context->GetResourceManager()->LoadResource(resName);
|
||||
}
|
||||
@ -1095,7 +1120,7 @@ extern "C" uint8_t ResourceMgr_ResourceIsBackground(char* texPath) {
|
||||
return res->InitData->Type == Ship::ResourceType::SOH_Background;
|
||||
}
|
||||
|
||||
extern "C" char* ResourceMgr_LoadJPEG(char* data, int dataSize)
|
||||
extern "C" char* ResourceMgr_LoadJPEG(char* data, size_t dataSize)
|
||||
{
|
||||
static char* finalBuffer = 0;
|
||||
|
||||
@ -1149,6 +1174,15 @@ extern "C" char* ResourceMgr_LoadTexOrDListByName(const char* filePath) {
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" char* ResourceMgr_LoadIfDListByName(const char* filePath) {
|
||||
auto res = GetResourceByNameHandlingMQ(filePath);
|
||||
|
||||
if (res->InitData->Type == Ship::ResourceType::DisplayList)
|
||||
return (char*)&((std::static_pointer_cast<Ship::DisplayList>(res))->Instructions[0]);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
extern "C" Sprite* GetSeedTexture(uint8_t index) {
|
||||
return OTRGlobals::Instance->gRandomizer->GetSeedTexture(index);
|
||||
}
|
||||
@ -1159,6 +1193,11 @@ extern "C" char* ResourceMgr_LoadPlayerAnimByName(const char* animPath) {
|
||||
return (char*)&anim->limbRotData[0];
|
||||
}
|
||||
|
||||
extern "C" void ResourceMgr_PushCurrentDirectory(char* path)
|
||||
{
|
||||
gfx_push_current_dir(path);
|
||||
}
|
||||
|
||||
extern "C" Gfx* ResourceMgr_LoadGfxByName(const char* path)
|
||||
{
|
||||
auto res = std::static_pointer_cast<Ship::DisplayList>(GetResourceByNameHandlingMQ(path));
|
||||
@ -1351,8 +1390,29 @@ extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path) {
|
||||
return (AnimationHeaderCommon*)GetResourceDataByName(path, false);
|
||||
}
|
||||
|
||||
extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path) {
|
||||
return (SkeletonHeader*)GetResourceDataByName(path, false);
|
||||
extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path, SkelAnime* skelAnime)
|
||||
{
|
||||
SkeletonHeader* skelHeader = (SkeletonHeader*)GetResourceDataByName(path, false);
|
||||
|
||||
// This function is only called when a skeleton is initialized.
|
||||
// Therefore we can take this oppurtunity to take note of the Skeleton that is created...
|
||||
if (skelAnime != nullptr) {
|
||||
auto stringPath = std::string(path);
|
||||
Ship::SkeletonPatcher::RegisterSkeleton(stringPath, skelAnime);
|
||||
}
|
||||
|
||||
|
||||
return skelHeader;
|
||||
}
|
||||
|
||||
extern "C" void ResourceMgr_UnregisterSkeleton(SkelAnime* skelAnime) {
|
||||
if (skelAnime != nullptr)
|
||||
Ship::SkeletonPatcher::UnregisterSkeleton(skelAnime);
|
||||
}
|
||||
|
||||
extern "C" void ResourceMgr_ClearSkeletons(SkelAnime* skelAnime) {
|
||||
if (skelAnime != nullptr)
|
||||
Ship::SkeletonPatcher::ClearSkeletons();
|
||||
}
|
||||
|
||||
extern "C" s32* ResourceMgr_LoadCSByName(const char* path) {
|
||||
@ -1916,3 +1976,7 @@ extern "C" void EntranceTracker_SetCurrentGrottoID(s16 entranceIndex) {
|
||||
extern "C" void EntranceTracker_SetLastEntranceOverride(s16 entranceIndex) {
|
||||
SetLastEntranceOverrideForTracker(entranceIndex);
|
||||
}
|
||||
|
||||
extern "C" void Gfx_RegisterBlendedTexture(const char* name, u8* mask, u8* replacement) {
|
||||
gfx_register_blended_texture(name, mask, replacement);
|
||||
}
|
||||
|
@ -60,11 +60,12 @@ uint32_t ResourceMgr_GetNumGameVersions();
|
||||
uint32_t ResourceMgr_GetGameVersion(int index);
|
||||
void ResourceMgr_LoadDirectory(const char* resName);
|
||||
char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize);
|
||||
uint8_t ResourceMgr_FileExists(const char* resName);
|
||||
char* GetResourceDataByNameHandlingMQ(const char* path);
|
||||
void ResourceMgr_LoadFile(const char* resName);
|
||||
char* ResourceMgr_LoadFileFromDisk(const char* filePath);
|
||||
uint8_t ResourceMgr_ResourceIsBackground(char* texPath);
|
||||
char* ResourceMgr_LoadJPEG(char* data, int dataSize);
|
||||
char* ResourceMgr_LoadJPEG(char* data, size_t dataSize);
|
||||
uint16_t ResourceMgr_LoadTexWidthByName(char* texPath);
|
||||
uint16_t ResourceMgr_LoadTexHeightByName(char* texPath);
|
||||
char* ResourceMgr_LoadTexOrDListByName(const char* filePath);
|
||||
@ -87,7 +88,9 @@ void Ctx_ReadSaveFile(uintptr_t addr, void* dramAddr, size_t size);
|
||||
void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size);
|
||||
|
||||
uint64_t GetPerfCounter();
|
||||
struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path);
|
||||
struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path, SkelAnime* skelAnime);
|
||||
void ResourceMgr_UnregisterSkeleton(SkelAnime* skelAnime);
|
||||
void ResourceMgr_ClearSkeletons();
|
||||
s32* ResourceMgr_LoadCSByName(const char* path);
|
||||
int ResourceMgr_OTRSigCheck(char* imgData);
|
||||
uint64_t osGetTime(void);
|
||||
@ -139,6 +142,7 @@ void Entrance_ClearEntranceTrackingData(void);
|
||||
void Entrance_InitEntranceTrackingData(void);
|
||||
void EntranceTracker_SetCurrentGrottoID(s16 entranceIndex);
|
||||
void EntranceTracker_SetLastEntranceOverride(s16 entranceIndex);
|
||||
void Gfx_RegisterBlendedTexture(const char* name, u8* mask, u8* replacement);
|
||||
|
||||
uint32_t GetGIID(uint32_t itemID);
|
||||
#endif
|
||||
|
@ -26,6 +26,28 @@ std::shared_ptr<Resource> SkeletonFactory::ReadResource(std::shared_ptr<Resource
|
||||
return resource;
|
||||
}
|
||||
|
||||
std::shared_ptr<Resource> SkeletonFactory::ReadResourceXML(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
tinyxml2::XMLElement* reader) {
|
||||
auto resource = std::make_shared<Skeleton>(resourceMgr, initData);
|
||||
std::shared_ptr<ResourceVersionFactory> factory = nullptr;
|
||||
|
||||
switch ((Version)resource->InitData->ResourceVersion) {
|
||||
case Version::Deckard:
|
||||
factory = std::make_shared<SkeletonFactoryV0>();
|
||||
break;
|
||||
}
|
||||
|
||||
if (factory == nullptr) {
|
||||
SPDLOG_ERROR("Failed to load Skeleton with version {}", resource->InitData->ResourceVersion);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
factory->ParseFileXML(reader, resource);
|
||||
|
||||
return resource;
|
||||
}
|
||||
|
||||
void SkeletonFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader,
|
||||
std::shared_ptr<Resource> resource)
|
||||
{
|
||||
@ -77,4 +99,59 @@ void SkeletonFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader,
|
||||
SPDLOG_ERROR("unknown skeleton type {}", (uint32_t)skeleton->type);
|
||||
}
|
||||
}
|
||||
void SkeletonFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<Resource> resource)
|
||||
{
|
||||
std::shared_ptr<Skeleton> skel = std::static_pointer_cast<Skeleton>(resource);
|
||||
|
||||
std::string skeletonType = reader->Attribute("Type");
|
||||
// std::string skeletonLimbType = reader->Attribute("LimbType");
|
||||
int numLimbs = reader->IntAttribute("LimbCount");
|
||||
int numDLs = reader->IntAttribute("DisplayListCount");
|
||||
|
||||
if (skeletonType == "Flex") {
|
||||
skel->type = SkeletonType::Flex;
|
||||
} else if (skeletonType == "Curve") {
|
||||
skel->type = SkeletonType::Curve;
|
||||
} else if (skeletonType == "Normal") {
|
||||
skel->type = SkeletonType::Normal;
|
||||
}
|
||||
|
||||
skel->type = SkeletonType::Flex;
|
||||
skel->limbType = LimbType::LOD;
|
||||
|
||||
// if (skeletonLimbType == "Standard")
|
||||
// skel->limbType = LimbType::Standard;
|
||||
// else if (skeletonLimbType == "LOD")
|
||||
// skel->limbType = LimbType::LOD;
|
||||
// else if (skeletonLimbType == "Curve")
|
||||
// skel->limbType = LimbType::Curve;
|
||||
// else if (skeletonLimbType == "Skin")
|
||||
// skel->limbType = LimbType::Skin;
|
||||
// else if (skeletonLimbType == "Legacy")
|
||||
// Sskel->limbType = LimbType::Legacy;
|
||||
|
||||
auto child = reader->FirstChildElement();
|
||||
|
||||
skel->limbCount = numLimbs;
|
||||
skel->dListCount = numDLs;
|
||||
|
||||
while (child != nullptr) {
|
||||
std::string childName = child->Name();
|
||||
|
||||
if (childName == "SkeletonLimb") {
|
||||
std::string limbName = child->Attribute("Path");
|
||||
skel->limbTable.push_back(limbName);
|
||||
|
||||
auto limb = GetResourceDataByName(limbName.c_str(), true);
|
||||
skel->skeletonHeaderSegments.push_back(limb);
|
||||
}
|
||||
|
||||
child = child->NextSiblingElement();
|
||||
}
|
||||
|
||||
skel->skeletonData.flexSkeletonHeader.sh.limbCount = skel->limbCount;
|
||||
skel->skeletonData.flexSkeletonHeader.sh.segment = (void**)skel->skeletonHeaderSegments.data();
|
||||
skel->skeletonData.flexSkeletonHeader.dListCount = skel->dListCount;
|
||||
}
|
||||
|
||||
} // namespace Ship
|
||||
|
@ -10,11 +10,16 @@ class SkeletonFactory : public ResourceFactory
|
||||
std::shared_ptr<Resource> ReadResource(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
std::shared_ptr<BinaryReader> reader) override;
|
||||
std::shared_ptr<Resource> ReadResourceXML(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
tinyxml2::XMLElement* reader) override;
|
||||
};
|
||||
|
||||
class SkeletonFactoryV0 : public ResourceVersionFactory
|
||||
{
|
||||
public:
|
||||
void ParseFileBinary(std::shared_ptr<BinaryReader> reader, std::shared_ptr<Resource> resource) override;
|
||||
void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<Resource> resource) override;
|
||||
};
|
||||
}; // namespace Ship
|
||||
|
||||
|
@ -26,6 +26,28 @@ std::shared_ptr<Resource> SkeletonLimbFactory::ReadResource(std::shared_ptr<Reso
|
||||
return resource;
|
||||
}
|
||||
|
||||
std::shared_ptr<Resource> SkeletonLimbFactory::ReadResourceXML(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
tinyxml2::XMLElement* reader) {
|
||||
auto resource = std::make_shared<SkeletonLimb>(resourceMgr, initData);
|
||||
std::shared_ptr<ResourceVersionFactory> factory = nullptr;
|
||||
|
||||
switch ((Version)resource->InitData->ResourceVersion) {
|
||||
case Version::Deckard:
|
||||
factory = std::make_shared<SkeletonLimbFactoryV0>();
|
||||
break;
|
||||
}
|
||||
|
||||
if (factory == nullptr) {
|
||||
SPDLOG_ERROR("Failed to load Skeleton Limb with version {}", resource->InitData->ResourceVersion);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
factory->ParseFileXML(reader, resource);
|
||||
|
||||
return resource;
|
||||
}
|
||||
|
||||
void Ship::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader,
|
||||
std::shared_ptr<Resource> resource)
|
||||
{
|
||||
@ -190,4 +212,59 @@ void Ship::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader>
|
||||
}
|
||||
}
|
||||
}
|
||||
void SkeletonLimbFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<Resource> resource)
|
||||
{
|
||||
std::shared_ptr<SkeletonLimb> skelLimb = std::static_pointer_cast<SkeletonLimb>(resource);
|
||||
|
||||
std::string limbType = reader->Attribute("Type");
|
||||
|
||||
// OTRTODO
|
||||
skelLimb->limbType = LimbType::LOD;
|
||||
|
||||
// skelLimb->legTransX = reader->FloatAttribute("LegTransX");
|
||||
// skelLimb->legTransY = reader->FloatAttribute("LegTransY");
|
||||
// skelLimb->legTransZ = reader->FloatAttribute("LegTransZ");
|
||||
skelLimb->rotX = reader->IntAttribute("RotX");
|
||||
skelLimb->rotY = reader->IntAttribute("RotY");
|
||||
skelLimb->rotZ = reader->IntAttribute("RotZ");
|
||||
|
||||
// skelLimb->transX = reader->IntAttribute("TransX");
|
||||
// skelLimb->transY = reader->IntAttribute("TransY");
|
||||
// skelLimb->transZ = reader->IntAttribute("TransZ");
|
||||
|
||||
skelLimb->transX = (int)reader->FloatAttribute("LegTransX");
|
||||
skelLimb->transY = (int)reader->FloatAttribute("LegTransY");
|
||||
skelLimb->transZ = (int)reader->FloatAttribute("LegTransZ");
|
||||
|
||||
skelLimb->childIndex = reader->IntAttribute("ChildIndex");
|
||||
skelLimb->siblingIndex = reader->IntAttribute("SiblingIndex");
|
||||
|
||||
// skelLimb->childPtr = reader->Attribute("ChildLimb");
|
||||
// skelLimb->siblingPtr = reader->Attribute("SiblingLimb");
|
||||
skelLimb->dListPtr = reader->Attribute("DisplayList1");
|
||||
|
||||
if (std::string(reader->Attribute("DisplayList1")) == "gEmptyDL") {
|
||||
skelLimb->dListPtr = "";
|
||||
}
|
||||
|
||||
auto& limbData = skelLimb->limbData;
|
||||
|
||||
limbData.lodLimb.jointPos.x = skelLimb->transX;
|
||||
limbData.lodLimb.jointPos.y = skelLimb->transY;
|
||||
limbData.lodLimb.jointPos.z = skelLimb->transZ;
|
||||
|
||||
if (skelLimb->dListPtr != "") {
|
||||
limbData.lodLimb.dLists[0] = (Gfx*)GetResourceDataByName((const char*)skelLimb->dListPtr.c_str(), true);
|
||||
} else {
|
||||
limbData.lodLimb.dLists[0] = nullptr;
|
||||
}
|
||||
|
||||
limbData.lodLimb.dLists[1] = nullptr;
|
||||
|
||||
limbData.lodLimb.child = skelLimb->childIndex;
|
||||
limbData.lodLimb.sibling = skelLimb->siblingIndex;
|
||||
|
||||
// skelLimb->dList2Ptr = reader->Attribute("DisplayList2");
|
||||
}
|
||||
|
||||
} // namespace Ship
|
||||
|
@ -10,11 +10,16 @@ class SkeletonLimbFactory : public ResourceFactory
|
||||
std::shared_ptr<Resource> ReadResource(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
std::shared_ptr<BinaryReader> reader) override;
|
||||
std::shared_ptr<Resource> ReadResourceXML(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
tinyxml2::XMLElement* reader) override;
|
||||
};
|
||||
|
||||
class SkeletonLimbFactoryV0 : public ResourceVersionFactory
|
||||
{
|
||||
public:
|
||||
void ParseFileBinary(std::shared_ptr<BinaryReader> reader, std::shared_ptr<Resource> resource) override;
|
||||
void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<Resource> resource) override;
|
||||
};
|
||||
}; // namespace Ship
|
||||
|
||||
|
@ -28,6 +28,28 @@ std::shared_ptr<Resource> TextFactory::ReadResource(std::shared_ptr<ResourceMgr>
|
||||
return resource;
|
||||
}
|
||||
|
||||
std::shared_ptr<Resource> TextFactory::ReadResourceXML(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
tinyxml2::XMLElement* reader) {
|
||||
auto resource = std::make_shared<Text>(resourceMgr, initData);
|
||||
std::shared_ptr<ResourceVersionFactory> factory = nullptr;
|
||||
|
||||
switch ((Version)resource->InitData->ResourceVersion) {
|
||||
case Version::Deckard:
|
||||
factory = std::make_shared<TextFactoryV0>();
|
||||
break;
|
||||
}
|
||||
|
||||
if (factory == nullptr) {
|
||||
SPDLOG_ERROR("Failed to load Text with version {}", resource->InitData->ResourceVersion);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
factory->ParseFileXML(reader, resource);
|
||||
|
||||
return resource;
|
||||
}
|
||||
|
||||
void Ship::TextFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader,
|
||||
std::shared_ptr<Resource> resource) {
|
||||
std::shared_ptr<Text> text = std::static_pointer_cast<Text>(resource);
|
||||
@ -46,4 +68,28 @@ void Ship::TextFactoryV0::ParseFileBinary(std::shared_ptr<BinaryReader> reader,
|
||||
text->messages.push_back(entry);
|
||||
}
|
||||
}
|
||||
void TextFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<Resource> resource) {
|
||||
std::shared_ptr<Text> txt = std::static_pointer_cast<Text>(resource);
|
||||
|
||||
auto child = reader->FirstChildElement();
|
||||
|
||||
while (child != nullptr) {
|
||||
std::string childName = child->Name();
|
||||
|
||||
if (childName == "TextEntry") {
|
||||
MessageEntry entry;
|
||||
entry.id = child->IntAttribute("ID");
|
||||
entry.textboxType = child->IntAttribute("TextboxType");
|
||||
entry.textboxYPos = child->IntAttribute("TextboxYPos");
|
||||
entry.msg = child->Attribute("Message");
|
||||
entry.msg += "\x2";
|
||||
|
||||
txt->messages.push_back(entry);
|
||||
int bp = 0;
|
||||
}
|
||||
|
||||
child = child->NextSiblingElement();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Ship
|
||||
|
@ -10,11 +10,16 @@ class TextFactory : public ResourceFactory
|
||||
std::shared_ptr<Resource> ReadResource(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
std::shared_ptr<BinaryReader> reader) override;
|
||||
std::shared_ptr<Resource> ReadResourceXML(std::shared_ptr<ResourceMgr> resourceMgr,
|
||||
std::shared_ptr<ResourceInitData> initData,
|
||||
tinyxml2::XMLElement* reader) override;
|
||||
};
|
||||
|
||||
class TextFactoryV0 : public ResourceVersionFactory
|
||||
{
|
||||
public:
|
||||
void ParseFileBinary(std::shared_ptr<BinaryReader> reader, std::shared_ptr<Resource> resource) override;
|
||||
void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr<Resource> resource) override;
|
||||
};
|
||||
}; // namespace Ship
|
||||
|
||||
|
@ -1,4 +1,7 @@
|
||||
#include "resource/ResourceMgr.h"
|
||||
#include "Skeleton.h"
|
||||
#include "soh/OTRGlobals.h"
|
||||
#include "libultraship/libultraship.h"
|
||||
|
||||
namespace Ship {
|
||||
void* Skeleton::GetPointer() {
|
||||
@ -17,4 +20,61 @@ size_t Skeleton::GetPointerSize() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<SkeletonPatchInfo> SkeletonPatcher::skeletons;
|
||||
|
||||
|
||||
void SkeletonPatcher::RegisterSkeleton(std::string& path, SkelAnime* skelAnime) {
|
||||
SkeletonPatchInfo info;
|
||||
|
||||
info.skelAnime = skelAnime;
|
||||
|
||||
static const std::string sOtr = "__OTR__";
|
||||
|
||||
if (path.starts_with(sOtr)) {
|
||||
path = path.substr(sOtr.length());
|
||||
}
|
||||
|
||||
// Determine if we're using an alternate skeleton
|
||||
if (path.starts_with(Ship::Resource::gAltAssetPrefix)) {
|
||||
info.vanillaSkeletonPath = path.substr(Ship::Resource::gAltAssetPrefix.length(),
|
||||
path.size() - Ship::Resource::gAltAssetPrefix.length());
|
||||
} else {
|
||||
info.vanillaSkeletonPath = path;
|
||||
}
|
||||
|
||||
skeletons.push_back(info);
|
||||
}
|
||||
|
||||
void SkeletonPatcher::UnregisterSkeleton(SkelAnime* skelAnime) {
|
||||
|
||||
// TODO: Should probably just use a dictionary here...
|
||||
for (int i = 0; i < skeletons.size(); i++)
|
||||
{
|
||||
auto skel = skeletons[i];
|
||||
|
||||
if (skel.skelAnime == skelAnime) {
|
||||
skeletons.erase(skeletons.begin() + i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
void SkeletonPatcher::ClearSkeletons()
|
||||
{
|
||||
skeletons.clear();
|
||||
}
|
||||
|
||||
void SkeletonPatcher::UpdateSkeletons() {
|
||||
bool isHD = CVarGetInteger("gAltAssets", 0);
|
||||
for (auto skel : skeletons)
|
||||
{
|
||||
Skeleton* newSkel =
|
||||
(Skeleton*)OTRGlobals::Instance->context->GetResourceManager()
|
||||
->LoadResource((isHD ? Ship::Resource::gAltAssetPrefix : "") + skel.vanillaSkeletonPath, true)
|
||||
.get();
|
||||
|
||||
if (newSkel != nullptr)
|
||||
skel.skelAnime->skeleton = newSkel->skeletonData.skeletonHeader.segment;
|
||||
}
|
||||
}
|
||||
} // namespace Ship
|
||||
|
@ -3,6 +3,7 @@
|
||||
#include <cstdint>
|
||||
#include "Resource.h"
|
||||
#include "SkeletonLimb.h"
|
||||
#include <z64animation.h>
|
||||
|
||||
namespace Ship {
|
||||
|
||||
@ -68,4 +69,23 @@ class Skeleton : public Resource {
|
||||
std::vector<std::string> limbTable;
|
||||
std::vector<void*> skeletonHeaderSegments;
|
||||
};
|
||||
|
||||
// TODO: CLEAN THIS UP LATER
|
||||
struct SkeletonPatchInfo
|
||||
{
|
||||
SkelAnime* skelAnime;
|
||||
std::string vanillaSkeletonPath;
|
||||
};
|
||||
|
||||
class SkeletonPatcher {
|
||||
public:
|
||||
static void RegisterSkeleton(std::string& path, SkelAnime* skelAnime);
|
||||
static void UnregisterSkeleton(SkelAnime* skelAnime);
|
||||
static void ClearSkeletons();
|
||||
static void UpdateSkeletons();
|
||||
|
||||
static std::vector<SkeletonPatchInfo> skeletons;
|
||||
};
|
||||
|
||||
|
||||
} // namespace Ship
|
@ -22,6 +22,8 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
|
||||
return nullptr;
|
||||
|
||||
// Allocate room for an additional message
|
||||
// OTRTODO: Should not be malloc'ing here. It's fine for now since we check elsewhere that the message table is
|
||||
// already null.
|
||||
MessageTableEntry* table = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * (file->messages.size() + 1));
|
||||
|
||||
for (size_t i = 0; i < file->messages.size(); i++) {
|
||||
@ -29,6 +31,8 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
|
||||
if (file->messages[i].id == 0x2066) {
|
||||
// Create a new message based on the Owl Text
|
||||
uint32_t kaeporaMsgSize = file->messages[i].msg.size();
|
||||
// OTRTODO: Should not be malloc'ing here. It's fine for now since we check elsewhere that the message table
|
||||
// is already null.
|
||||
char* kaeporaOg = (char*)malloc(sizeof(char) * kaeporaMsgSize);
|
||||
char* kaeporaPatch = (char*)malloc(sizeof(char) * kaeporaMsgSize);
|
||||
file->messages[i].msg.copy(kaeporaOg, kaeporaMsgSize, 0);
|
||||
@ -73,21 +77,34 @@ MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) {
|
||||
|
||||
extern "C" void OTRMessage_Init()
|
||||
{
|
||||
// OTRTODO: Added a lot of null checks here so that we don't malloc the table multiple times causing a memory leak.
|
||||
// We really ought to fix the implementation such that we aren't malloc'ing new tables.
|
||||
// Once we fix the implementation, remove these NULL checks.
|
||||
if (sNesMessageEntryTablePtr == NULL) {
|
||||
sNesMessageEntryTablePtr = OTRMessage_LoadTable("text/nes_message_data_static/nes_message_data_static", true);
|
||||
}
|
||||
if (sGerMessageEntryTablePtr == NULL) {
|
||||
sGerMessageEntryTablePtr = OTRMessage_LoadTable("text/ger_message_data_static/ger_message_data_static", false);
|
||||
}
|
||||
if (sFraMessageEntryTablePtr == NULL) {
|
||||
sFraMessageEntryTablePtr = OTRMessage_LoadTable("text/fra_message_data_static/fra_message_data_static", false);
|
||||
}
|
||||
|
||||
auto file2 = std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource("text/staff_message_data_static/staff_message_data_static"));
|
||||
|
||||
if (sStaffMessageEntryTablePtr == NULL) {
|
||||
auto file2 =
|
||||
std::static_pointer_cast<Ship::Text>(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(
|
||||
"text/staff_message_data_static/staff_message_data_static"));
|
||||
// OTRTODO: Should not be malloc'ing here. It's fine for now since we check that the message table is already null.
|
||||
sStaffMessageEntryTablePtr = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file2->messages.size());
|
||||
|
||||
for (size_t i = 0; i < file2->messages.size(); i++)
|
||||
{
|
||||
for (size_t i = 0; i < file2->messages.size(); i++) {
|
||||
sStaffMessageEntryTablePtr[i].textId = file2->messages[i].id;
|
||||
sStaffMessageEntryTablePtr[i].typePos = (file2->messages[i].textboxType << 4) | file2->messages[i].textboxYPos;
|
||||
sStaffMessageEntryTablePtr[i].typePos =
|
||||
(file2->messages[i].textboxType << 4) | file2->messages[i].textboxYPos;
|
||||
sStaffMessageEntryTablePtr[i].segment = file2->messages[i].msg.c_str();
|
||||
sStaffMessageEntryTablePtr[i].msgSize = file2->messages[i].msg.size();
|
||||
}
|
||||
}
|
||||
|
||||
CustomMessageManager::Instance->AddCustomMessageTable(customMessageTableID);
|
||||
CustomMessageManager::Instance->CreateGetItemMessage(
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <string.h>
|
||||
#include "global.h"
|
||||
#include "vt.h"
|
||||
#include "libultraship/bridge.h"
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
|
||||
SpeedMeter D_801664D0;
|
||||
@ -13,6 +14,7 @@ u16 sLastButtonPressed;
|
||||
|
||||
// Forward declared, because this in a C++ header.
|
||||
int gfx_create_framebuffer(uint32_t width, uint32_t height);
|
||||
void gfx_texture_cache_clear();
|
||||
|
||||
void GameState_FaultPrint(void) {
|
||||
static char sBtnChars[] = "ABZSuldr*+LRudlr";
|
||||
@ -459,6 +461,14 @@ void GameState_Destroy(GameState* gameState) {
|
||||
Fault_RemoveClient(&sGameFaultClient);
|
||||
|
||||
osSyncPrintf("game デストラクタ終了\n"); // "game destructor end"
|
||||
|
||||
// Performing clear skeletons before unload resources fixes an actor heap corruption crash due to the skeleton patching system.
|
||||
ResourceMgr_ClearSkeletons();
|
||||
|
||||
if (CVarGetInteger("gAltAssets", 0)) {
|
||||
UnloadResourceDirectory("alt/*");
|
||||
gfx_texture_cache_clear();
|
||||
}
|
||||
}
|
||||
|
||||
GameStateFunc GameState_GetInit(GameState* gameState) {
|
||||
|
@ -128,6 +128,7 @@ u8 sGfxPrintFontData[(16 * 256) / 2] = {
|
||||
|
||||
// Can be used to set GFXP_FLAG_ENLARGE by default
|
||||
static u8 sDefaultSpecialFlags;
|
||||
static const char rGfxPrintFontData[] = "__OTR__alt/textures/font/sGfxPrintFontData";
|
||||
|
||||
void GfxPrint_Setup(GfxPrint* this) {
|
||||
s32 width = 16;
|
||||
@ -140,13 +141,26 @@ void GfxPrint_Setup(GfxPrint* this) {
|
||||
G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
|
||||
G_AC_NONE | G_ZS_PRIM | G_RM_XLU_SURF | G_RM_XLU_SURF2);
|
||||
gDPSetCombineMode(this->dList++, G_CC_DECALRGBA, G_CC_DECALRGBA);
|
||||
|
||||
bool useAltTexture = ResourceMgr_FileExists(rGfxPrintFontData) && CVarGetInteger("gAltAssets", 0);
|
||||
if (!useAltTexture) {
|
||||
gDPLoadTextureBlock_4b(this->dList++, sGfxPrintFontData, G_IM_FMT_CI, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
} else {
|
||||
gDPLoadTextureBlock_4b(this->dList++, rGfxPrintFontData, G_IM_FMT_CI, width * 4, height, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
}
|
||||
|
||||
gDPLoadTLUT(this->dList++, 64, 256, sGfxPrintFontTLUT);
|
||||
|
||||
for (i = 1; i < 4; i++) {
|
||||
if (useAltTexture) {
|
||||
gDPSetTile(this->dList++, G_IM_FMT_RGBA, G_IM_SIZ_4b, 1, 0, i * 2, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
|
||||
G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
||||
} else {
|
||||
gDPSetTile(this->dList++, G_IM_FMT_CI, G_IM_SIZ_4b, 1, 0, i * 2, i, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
|
||||
G_TX_NOLOD, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD);
|
||||
}
|
||||
gDPSetTileSize(this->dList++, i * 2, 0, 0, 60, 1020);
|
||||
}
|
||||
|
||||
@ -174,7 +188,7 @@ void GfxPrint_SetColor(GfxPrint* this, u32 r, u32 g, u32 b, u32 a) {
|
||||
}
|
||||
|
||||
void GfxPrint_SetPosPx(GfxPrint* this, s32 x, s32 y) {
|
||||
this->posX = this->baseX + (x * 4);
|
||||
this->posX = this->baseX + (x * 4) + CVarGetInteger("gGfxPrintCharStartOffset", 0);
|
||||
this->posY = this->baseY + (y * 4);
|
||||
}
|
||||
|
||||
@ -189,6 +203,8 @@ void GfxPrint_SetBasePosPx(GfxPrint* this, s32 x, s32 y) {
|
||||
|
||||
void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) {
|
||||
u32 tile = (c & 0xFF) * 2;
|
||||
u8 offset = ((c * 2) & 0x7) / 2;
|
||||
u8 useAltTexture = ResourceMgr_FileExists(rGfxPrintFontData) && CVarGetInteger("gAltAssets", 0);
|
||||
|
||||
if (this->flags & GFXP_FLAG_UPDATE) {
|
||||
this->flags &= ~GFXP_FLAG_UPDATE;
|
||||
@ -226,11 +242,12 @@ void GfxPrint_PrintCharImpl(GfxPrint* this, u8 c) {
|
||||
gSPTextureRectangle(this->dList++, (this->posX) << 1, (this->posY) << 1, (this->posX + 32) << 1,
|
||||
(this->posY + 32) << 1, tile, (u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1 << 9, 1 << 9);
|
||||
} else {
|
||||
gSPTextureRectangle(this->dList++, this->posX, this->posY, this->posX + 32, this->posY + 32, tile,
|
||||
(u16)(c & 4) * 64, (u16)(c >> 3) * 256, 1 << 10, 1 << 10);
|
||||
gSPTextureRectangle(this->dList++, this->posX, this->posY, this->posX + 32, this->posY + 32,
|
||||
useAltTexture ? 0 : tile, (useAltTexture ? ((128 * 4) * offset) : 0) + (u16)((c & 4) * 64),
|
||||
(u16)(c >> 3) * 256, 1 << 10, 1 << 10);
|
||||
}
|
||||
|
||||
this->posX += 32;
|
||||
this->posX += CVarGetInteger("gGfxPrintCharSpacing", 32);
|
||||
}
|
||||
|
||||
void GfxPrint_PrintStringWithSize(GfxPrint* this, const void* buffer, u32 charSize, u32 charCount) {
|
||||
|
@ -799,9 +799,22 @@ void func_8002CDE4(PlayState* play, TitleCardContext* titleCtx) {
|
||||
|
||||
void TitleCard_InitBossName(PlayState* play, TitleCardContext* titleCtx, void* texture, s16 x, s16 y, u8 width,
|
||||
u8 height, s16 hasTranslation) {
|
||||
static char newName[512];
|
||||
|
||||
if (ResourceMgr_OTRSigCheck(texture))
|
||||
texture = GetResourceDataByName(texture, false);
|
||||
if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
size_t length = strlen(texture);
|
||||
strcpy(newName, texture);
|
||||
if (gSaveContext.language == LANGUAGE_FRA) {
|
||||
newName[length - 6] = 'F';
|
||||
newName[length - 5] = 'R';
|
||||
newName[length - 4] = 'A';
|
||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
||||
newName[length - 6] = 'G';
|
||||
newName[length - 5] = 'E';
|
||||
newName[length - 4] = 'R';
|
||||
}
|
||||
texture = newName;
|
||||
}
|
||||
|
||||
titleCtx->texture = texture;
|
||||
titleCtx->isBossCard = true;
|
||||
@ -1005,7 +1018,7 @@ void TitleCard_InitPlaceName(PlayState* play, TitleCardContext* titleCtx, void*
|
||||
|
||||
}
|
||||
|
||||
char newName[512];
|
||||
static char newName[512];
|
||||
|
||||
if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
size_t length = strlen(texture);
|
||||
@ -1023,7 +1036,7 @@ void TitleCard_InitPlaceName(PlayState* play, TitleCardContext* titleCtx, void*
|
||||
texture = newName;
|
||||
}
|
||||
|
||||
titleCtx->texture = GetResourceDataByName(texture, false);
|
||||
titleCtx->texture = texture;
|
||||
titleCtx->isBossCard = false;
|
||||
titleCtx->hasTranslation = false;
|
||||
titleCtx->x = x;
|
||||
@ -1067,14 +1080,9 @@ void TitleCard_Update(PlayState* play, TitleCardContext* titleCtx) {
|
||||
void TitleCard_Draw(PlayState* play, TitleCardContext* titleCtx) {
|
||||
s32 width;
|
||||
s32 height;
|
||||
s32 unused;
|
||||
s32 titleX;
|
||||
s32 doubleWidth;
|
||||
s32 titleY;
|
||||
s32 titleSecondY;
|
||||
s32 textureLanguageOffset;
|
||||
s32 shiftTopY;
|
||||
s32 shiftBottomY;
|
||||
|
||||
if (titleCtx->alpha != 0) {
|
||||
width = titleCtx->width;
|
||||
@ -1107,52 +1115,21 @@ void TitleCard_Draw(PlayState* play, TitleCardContext* titleCtx) {
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
height = (width * height > 0x1000) ? 0x1000 / width : height;
|
||||
titleSecondY = titleY + (height * 4);
|
||||
|
||||
textureLanguageOffset = 0x0;
|
||||
shiftTopY = 0x0;
|
||||
shiftBottomY = 0x1000;
|
||||
|
||||
//if this card is bosses cards, has translation and that is not using English language.
|
||||
if (titleCtx->isBossCard && titleCtx->hasTranslation && gSaveContext.language != LANGUAGE_ENG) {
|
||||
textureLanguageOffset = (width * height * gSaveContext.language);
|
||||
if (gSaveContext.language == LANGUAGE_GER) {
|
||||
shiftTopY = 0x400;
|
||||
shiftBottomY = 0x1400;
|
||||
} else if (gSaveContext.language == LANGUAGE_FRA) {
|
||||
shiftTopY = 0x800;
|
||||
shiftBottomY = 0x1800;
|
||||
}
|
||||
}
|
||||
|
||||
// WORLD_OVERLAY_DISP Goes over POLY_XLU_DISP but under POLY_KAL_DISP
|
||||
WORLD_OVERLAY_DISP = Gfx_SetupDL_52NoCD(WORLD_OVERLAY_DISP);
|
||||
|
||||
gDPSetPrimColor(WORLD_OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensityR, (u8)titleCtx->intensityG, (u8)titleCtx->intensityB,
|
||||
(u8)titleCtx->alpha);
|
||||
|
||||
gDPLoadTextureBlock(WORLD_OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + shiftTopY, G_IM_FMT_IA,
|
||||
gDPLoadTextureBlock(WORLD_OVERLAY_DISP++, (uintptr_t)titleCtx->texture, G_IM_FMT_IA,
|
||||
G_IM_SIZ_8b,
|
||||
width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
|
||||
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
//Removing the -1 there remove the gap between top and bottom textures.
|
||||
gSPWideTextureRectangle(WORLD_OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4),
|
||||
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
|
||||
|
||||
height = titleCtx->height - height;
|
||||
|
||||
// If texture is bigger than 0x1000, display the rest
|
||||
if (height > 0) {
|
||||
gDPLoadTextureBlock(WORLD_OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + shiftBottomY,
|
||||
G_IM_FMT_IA,
|
||||
G_IM_SIZ_8b, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
//Removing the -1 there remove the gap between top and bottom textures.
|
||||
gSPWideTextureRectangle(WORLD_OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
|
||||
titleSecondY + (height * 4), G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
|
||||
}
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
}
|
||||
}
|
||||
|
@ -6,6 +6,10 @@ void Gfx_DrawDListOpa(PlayState* play, Gfx* dlist) {
|
||||
Gfx_SetupDL_25Opa(play->state.gfxCtx);
|
||||
gSPMatrix(POLY_OPA_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
|
||||
G_MTX_MODELVIEW | G_MTX_LOAD);
|
||||
|
||||
if (ResourceMgr_OTRSigCheck(dlist) == 1)
|
||||
gsSPPushCD(POLY_OPA_DISP++, dlist);
|
||||
|
||||
gSPDisplayList(POLY_OPA_DISP++, dlist);
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
@ -17,6 +21,10 @@ void Gfx_DrawDListXlu(PlayState* play, Gfx* dlist) {
|
||||
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
|
||||
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
|
||||
G_MTX_MODELVIEW | G_MTX_LOAD);
|
||||
|
||||
if (ResourceMgr_OTRSigCheck(dlist) == 1)
|
||||
gsSPPushCD(POLY_XLU_DISP++, dlist);
|
||||
|
||||
gSPDisplayList(POLY_XLU_DISP++, dlist);
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
|
@ -3045,6 +3045,10 @@ void CollisionCheck_ApplyDamage(PlayState* play, CollisionCheckContext* colChkCt
|
||||
if (!(collider->acFlags & AC_HARD)) {
|
||||
collider->actor->colChkInfo.damage += damage;
|
||||
}
|
||||
|
||||
if (CVarGetInteger("gIvanCoopModeEnabled", 0)) {
|
||||
collider->actor->colChkInfo.damage *= GET_PLAYER(play)->ivanDamageMultiplier;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3649,7 +3653,7 @@ s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* a
|
||||
* Gets damage from a sword strike using generic values, and returns 0 if the attack is
|
||||
* not sword-type. Used by bosses to require that a sword attack deal the killing blow.
|
||||
*/
|
||||
u8 CollisionCheck_GetSwordDamage(s32 dmgFlags) {
|
||||
u8 CollisionCheck_GetSwordDamage(s32 dmgFlags, PlayState* play) {
|
||||
u8 damage = 0;
|
||||
|
||||
if (dmgFlags & 0x00400100) {
|
||||
@ -3662,6 +3666,10 @@ u8 CollisionCheck_GetSwordDamage(s32 dmgFlags) {
|
||||
damage = 8;
|
||||
}
|
||||
|
||||
if (CVarGetInteger("gIvanCoopModeEnabled", 0)) {
|
||||
damage *= GET_PLAYER(play)->ivanDamageMultiplier;
|
||||
}
|
||||
|
||||
KREG(7) = damage;
|
||||
return damage;
|
||||
}
|
||||
|
@ -41,18 +41,16 @@ void func_801109B0(PlayState* play) {
|
||||
DmaMgr_SendRequest1(interfaceCtx->parameterSegment, (uintptr_t)_parameter_staticSegmentRomStart, parameterSize,
|
||||
__FILE__, 162);
|
||||
|
||||
interfaceCtx->doActionSegment = GAMESTATE_ALLOC_MC(&play->state, 0x480);
|
||||
interfaceCtx->doActionSegment = GAMESTATE_ALLOC_MC(&play->state, 3 * sizeof(char*));
|
||||
|
||||
osSyncPrintf("DOアクション テクスチャ初期=%x\n", 0x480); // "DO Action Texture Initialization"
|
||||
osSyncPrintf("parameter->do_actionSegment=%x\n", interfaceCtx->doActionSegment);
|
||||
|
||||
ASSERT(interfaceCtx->doActionSegment != NULL);
|
||||
|
||||
uint32_t attackDoActionTexSize = GetResourceTexSizeByName(gAttackDoActionENGTex, false);
|
||||
memcpy(interfaceCtx->doActionSegment, GetResourceDataByName(gAttackDoActionENGTex, false), attackDoActionTexSize);
|
||||
memcpy(interfaceCtx->doActionSegment + (attackDoActionTexSize / 2), GetResourceDataByName(gCheckDoActionENGTex, false), attackDoActionTexSize);
|
||||
|
||||
memcpy(interfaceCtx->doActionSegment + attackDoActionTexSize, GetResourceDataByName(gReturnDoActionENGTex, false), GetResourceTexSizeByName(gReturnDoActionENGTex, false));
|
||||
interfaceCtx->doActionSegment[0] = gAttackDoActionENGTex;
|
||||
interfaceCtx->doActionSegment[1] = gCheckDoActionENGTex;
|
||||
interfaceCtx->doActionSegment[2] = gReturnDoActionENGTex;
|
||||
|
||||
interfaceCtx->iconItemSegment = GAMESTATE_ALLOC_MC(
|
||||
&play->state, 0x1000 * ARRAY_COUNT(gSaveContext.equips.buttonItems));
|
||||
|
@ -15,7 +15,7 @@ s32 SkelCurve_Init(PlayState* play, SkelAnimeCurve* skelCurve, SkelCurveLimbList
|
||||
TransformUpdateIndex* transUpdIdx) {
|
||||
|
||||
if (ResourceMgr_OTRSigCheck(limbListSeg))
|
||||
limbListSeg = ResourceMgr_LoadSkeletonByName(limbListSeg);
|
||||
limbListSeg = ResourceMgr_LoadSkeletonByName(limbListSeg, NULL);
|
||||
|
||||
SkelCurveLimb** limbs;
|
||||
SkelCurveLimbList* limbList = SEGMENTED_TO_VIRTUAL(limbListSeg);
|
||||
|
@ -174,7 +174,7 @@ void Font_LoadChar(Font* font, u8 character, u16 codePointIndex) {
|
||||
//__FILE__, __LINE__);
|
||||
|
||||
if (character < 0x8B)
|
||||
memcpy(&font->charTexBuf[codePointIndex], GetResourceDataByName(fntTbl[character], false), FONT_CHAR_TEX_SIZE);
|
||||
memcpy(&font->charTexBuf[codePointIndex], fntTbl[character], strlen(fntTbl[character]) + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -183,7 +183,7 @@ void Font_LoadChar(Font* font, u8 character, u16 codePointIndex) {
|
||||
* The different icons are given in the MessageBoxIcon enum.
|
||||
*/
|
||||
void Font_LoadMessageBoxIcon(Font* font, u16 icon) {
|
||||
memcpy(font->iconBuf, GetResourceDataByName(msgStaticTbl[4 + icon], false), FONT_CHAR_TEX_SIZE);
|
||||
memcpy(font->iconBuf, msgStaticTbl[4 + icon], strlen(msgStaticTbl[4 + icon]) + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -218,7 +218,7 @@ void Font_LoadOrderedFont(Font* font) {
|
||||
osSyncPrintf("nes_mes_buf[%d]=%d\n", codePointIndex, font->msgBuf[codePointIndex]);
|
||||
|
||||
offset = (font->msgBuf[codePointIndex] - '\x20') * FONT_CHAR_TEX_SIZE;
|
||||
memcpy(fontBuf, GetResourceDataByName(fntTbl[offset / FONT_CHAR_TEX_SIZE], false), FONT_CHAR_TEX_SIZE);
|
||||
memcpy(fontBuf, fntTbl[offset / FONT_CHAR_TEX_SIZE], strlen(fntTbl[offset / FONT_CHAR_TEX_SIZE]) + 1);
|
||||
//DmaMgr_SendRequest1(fontBuf, fontStatic + offset, FONT_CHAR_TEX_SIZE, __FILE__, __LINE__);
|
||||
fontBufIndex += FONT_CHAR_TEX_SIZE / 8;
|
||||
}
|
||||
|
@ -413,8 +413,8 @@ void Map_InitData(PlayState* play, s16 room) {
|
||||
//gMapData->owMinimapTexSize[mapIndex], __FILE__, __LINE__);
|
||||
|
||||
if (sEntranceIconMapIndex < 24) {
|
||||
const char* textureName = minimapTableOW[sEntranceIconMapIndex];
|
||||
memcpy(play->interfaceCtx.mapSegment, GetResourceDataByName(textureName, false), GetResourceTexSizeByName(textureName, false));
|
||||
play->interfaceCtx.mapSegment[0] = GetResourceDataByName(minimapTableOW[sEntranceIconMapIndex], true);
|
||||
play->interfaceCtx.mapSegmentName[0] = minimapTableOW[sEntranceIconMapIndex];
|
||||
}
|
||||
|
||||
interfaceCtx->unk_258 = mapIndex;
|
||||
@ -447,9 +447,8 @@ void Map_InitData(PlayState* play, s16 room) {
|
||||
//((gMapData->dgnMinimapTexIndexOffset[mapIndex] + room) * 0xFF0),
|
||||
//0xFF0, __FILE__, __LINE__);
|
||||
|
||||
const char* textureName = minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room];
|
||||
memcpy(play->interfaceCtx.mapSegment, GetResourceDataByName(textureName, false), GetResourceTexSizeByName(textureName, false));
|
||||
|
||||
play->interfaceCtx.mapSegment[0] = GetResourceDataByName(minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room], true);
|
||||
play->interfaceCtx.mapSegmentName[0] = minimapTableDangeon[gMapData->dgnMinimapTexIndexOffset[mapIndex] + room];
|
||||
R_COMPASS_OFFSET_X = gMapData->roomCompassOffsetX[mapIndex][room];
|
||||
R_COMPASS_OFFSET_Y = gMapData->roomCompassOffsetY[mapIndex][room];
|
||||
Map_SetFloorPalettesData(play, VREG(30));
|
||||
@ -519,7 +518,8 @@ void Map_Init(PlayState* play) {
|
||||
interfaceCtx->unk_258 = -1;
|
||||
interfaceCtx->unk_25A = -1;
|
||||
|
||||
interfaceCtx->mapSegment = GAMESTATE_ALLOC_MC(&play->state, 0x1000);
|
||||
interfaceCtx->mapSegment = GAMESTATE_ALLOC_MC(&play->state, 2 * sizeof(char*));
|
||||
interfaceCtx->mapSegmentName = GAMESTATE_ALLOC_MC(&play->state, 2 * sizeof(char*));
|
||||
// "MAP texture initialization scene_data_ID=%d mapSegment=%x"
|
||||
osSyncPrintf("\n\n\nMAP テクスチャ初期化 scene_data_ID=%d\nmapSegment=%x\n\n", play->sceneNum,
|
||||
interfaceCtx->mapSegment, play);
|
||||
@ -756,8 +756,7 @@ void Minimap_Draw(PlayState* play) {
|
||||
if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) {
|
||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, minimapColor.r, minimapColor.g, minimapColor.b, interfaceCtx->minimapAlpha);
|
||||
|
||||
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment);
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_I, 96, 85, 0,
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegmentName[0], G_IM_FMT_I, 96, 85, 0,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
|
||||
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
|
||||
@ -827,7 +826,7 @@ void Minimap_Draw(PlayState* play) {
|
||||
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
|
||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, minimapColor.r, minimapColor.g, minimapColor.b, interfaceCtx->minimapAlpha);
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_IA,
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegmentName[0], G_IM_FMT_IA,
|
||||
gMapData->owMinimapWidth[mapIndex], gMapData->owMinimapHeight[mapIndex], 0,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
|
||||
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
|
@ -32,10 +32,10 @@ s16 sMessageHasSetSfx = false;
|
||||
|
||||
u16 sOcarinaSongBitFlags = 0; // ocarina bit flags
|
||||
|
||||
MessageTableEntry* sNesMessageEntryTablePtr;
|
||||
MessageTableEntry* sGerMessageEntryTablePtr;
|
||||
MessageTableEntry* sFraMessageEntryTablePtr;
|
||||
MessageTableEntry* sStaffMessageEntryTablePtr;
|
||||
MessageTableEntry* sNesMessageEntryTablePtr = NULL;
|
||||
MessageTableEntry* sGerMessageEntryTablePtr = NULL;
|
||||
MessageTableEntry* sFraMessageEntryTablePtr = NULL;
|
||||
MessageTableEntry* sStaffMessageEntryTablePtr = NULL;
|
||||
|
||||
char* _message_0xFFFC_nes;
|
||||
|
||||
@ -562,7 +562,6 @@ void Message_DrawTextboxIcon(PlayState* play, Gfx** p, s16 x, s16 y) {
|
||||
*p = gfx;
|
||||
}
|
||||
|
||||
#define MESSAGE_SPACE_WIDTH 6
|
||||
f32 sFontWidths[144] = {
|
||||
8.0f, // ' '
|
||||
8.0f, // '!'
|
||||
@ -865,7 +864,7 @@ void Message_DrawText(PlayState* play, Gfx** gfxP) {
|
||||
Message_SetTextColor(msgCtx, msgCtx->msgBufDecoded[++i] & 0xF);
|
||||
break;
|
||||
case ' ':
|
||||
msgCtx->textPosX += MESSAGE_SPACE_WIDTH;
|
||||
msgCtx->textPosX += CVarGetInteger("gTextSpacing", 6);
|
||||
break;
|
||||
case MESSAGE_BOX_BREAK:
|
||||
if (msgCtx->msgMode == MSGMODE_TEXT_DISPLAYING) {
|
||||
@ -1131,7 +1130,7 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) {
|
||||
R_TEXTBOX_ICON_YPOS = y + 6;
|
||||
R_TEXTBOX_ICON_SIZE = 32;
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE,
|
||||
GetResourceDataByName(gItemIcons[itemId], false), GetResourceTexSizeByName(gItemIcons[itemId], false));
|
||||
gItemIcons[itemId], strlen(gItemIcons[itemId]) + 1);
|
||||
// "Item 32-0"
|
||||
osSyncPrintf("アイテム32-0\n");
|
||||
} else {
|
||||
@ -1139,7 +1138,7 @@ void Message_LoadItemIcon(PlayState* play, u16 itemId, s16 y) {
|
||||
R_TEXTBOX_ICON_YPOS = y + 10;
|
||||
R_TEXTBOX_ICON_SIZE = 24;
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE,
|
||||
GetResourceDataByName(gItemIcons[itemId], false), GetResourceTexSizeByName(gItemIcons[itemId], false));
|
||||
gItemIcons[itemId], strlen(gItemIcons[itemId]) + 1);
|
||||
// "Item 24"
|
||||
osSyncPrintf("アイテム24=%d (%d) {%d}\n", itemId, itemId - ITEM_KOKIRI_EMERALD, 84);
|
||||
}
|
||||
@ -1525,10 +1524,8 @@ void Message_Decode(PlayState* play) {
|
||||
msgCtx->textboxBackgroundYOffsetIdx = (font->msgBuf[msgCtx->msgBufPos + 3] & 0xF0) >> 4;
|
||||
msgCtx->textboxBackgroundUnkArg = font->msgBuf[msgCtx->msgBufPos + 3] & 0xF;
|
||||
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE,
|
||||
GetResourceDataByName(gRedMessageXLeftTex, false), GetResourceTexSizeByName(gRedMessageXLeftTex, false));
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900,
|
||||
GetResourceDataByName(gRedMessageXRightTex, false), GetResourceTexSizeByName(gRedMessageXRightTex, false));
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE, gRedMessageXLeftTex, strlen(gRedMessageXLeftTex) + 1);
|
||||
memcpy((uintptr_t)msgCtx->textboxSegment + MESSAGE_STATIC_TEX_SIZE + 0x900, gRedMessageXRightTex, strlen(gRedMessageXRightTex) + 1);
|
||||
|
||||
msgCtx->msgBufPos += 3;
|
||||
R_TEXTBOX_BG_YPOS = R_TEXTBOX_Y + 8;
|
||||
@ -1674,7 +1671,7 @@ void Message_OpenText(PlayState* play, u16 textId) {
|
||||
osSyncPrintf("吹き出し種類=%d\n", msgCtx->textBoxType);
|
||||
if (textBoxType < TEXTBOX_TYPE_NONE_BOTTOM) {
|
||||
const char* textureName = msgStaticTbl[messageStaticIndices[textBoxType]];
|
||||
memcpy(msgCtx->textboxSegment, GetResourceDataByName(textureName, false), MESSAGE_STATIC_TEX_SIZE);
|
||||
memcpy(msgCtx->textboxSegment, textureName, strlen(textureName) + 1);
|
||||
if (textBoxType == TEXTBOX_TYPE_BLACK) {
|
||||
msgCtx->textboxColorRed = 0;
|
||||
msgCtx->textboxColorGreen = 0;
|
||||
|
@ -16,30 +16,9 @@
|
||||
#include "soh/Enhancements/game-interactor/GameInteractor.h"
|
||||
|
||||
|
||||
static uint16_t _doActionTexWidth, _doActionTexHeight = -1;
|
||||
static uint16_t DO_ACTION_TEX_WIDTH() {
|
||||
return 48;
|
||||
|
||||
// TODO: Figure out why Ship::Texture is not returning a valid width
|
||||
if (_doActionTexWidth == -1)
|
||||
_doActionTexWidth = GetResourceTexWidthByName(gCheckDoActionENGTex, false);
|
||||
return _doActionTexWidth;
|
||||
}
|
||||
static uint16_t DO_ACTION_TEX_HEIGHT() {
|
||||
return 16;
|
||||
|
||||
// TODO: Figure out why Ship::Texture is not returning a valid height
|
||||
if (_doActionTexHeight == -1)
|
||||
_doActionTexHeight = GetResourceTexHeightByName(gCheckDoActionENGTex, false);
|
||||
return _doActionTexHeight;
|
||||
}
|
||||
|
||||
static uint32_t _doActionTexSize = -1;
|
||||
static uint32_t DO_ACTION_TEX_SIZE() {
|
||||
if (_doActionTexSize == -1)
|
||||
_doActionTexSize = GetResourceTexSizeByName(gCheckDoActionENGTex, false);
|
||||
return _doActionTexSize;
|
||||
}
|
||||
#define DO_ACTION_TEX_WIDTH() 48
|
||||
#define DO_ACTION_TEX_HEIGHT() 16
|
||||
#define DO_ACTION_TEX_SIZE() ((DO_ACTION_TEX_WIDTH() * DO_ACTION_TEX_HEIGHT()) / 2)
|
||||
|
||||
// The button statuses include the A button when most things are only the equip item buttons
|
||||
// So, when indexing into it with a item button index, we need to adjust
|
||||
@ -225,6 +204,8 @@ static const char* actionsTbl[] =
|
||||
gNum8DoActionENGTex,
|
||||
};
|
||||
|
||||
static const char gDoEmptyTexture[] = "__OTR__textures/virtual/gEmptyTexture";
|
||||
|
||||
// original name: "alpha_change"
|
||||
void Interface_ChangeAlpha(u16 alphaType) {
|
||||
if (alphaType != gSaveContext.unk_13EA) {
|
||||
@ -2848,11 +2829,7 @@ bool Inventory_HatchPocketCucco(PlayState* play) {
|
||||
}
|
||||
|
||||
void func_80086D5C(s32* buf, u16 size) {
|
||||
u16 i;
|
||||
|
||||
//buf = GetResourceDataByName(buf, false);
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
for (u16 i = 0; i < size; i++) {
|
||||
buf[i] = 0;
|
||||
}
|
||||
}
|
||||
@ -2865,46 +2842,25 @@ void Interface_LoadActionLabel(InterfaceContext* interfaceCtx, u16 action, s16 l
|
||||
|
||||
char* doAction = actionsTbl[action];
|
||||
|
||||
char newName[512];
|
||||
static char newName[4][512];
|
||||
if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
size_t length = strlen(doAction);
|
||||
strcpy(newName, doAction);
|
||||
strcpy(newName[loadOffset], doAction);
|
||||
if (gSaveContext.language == LANGUAGE_FRA) {
|
||||
newName[length - 6] = 'F';
|
||||
newName[length - 5] = 'R';
|
||||
newName[length - 4] = 'A';
|
||||
newName[loadOffset][length - 6] = 'F';
|
||||
newName[loadOffset][length - 5] = 'R';
|
||||
newName[loadOffset][length - 4] = 'A';
|
||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
||||
newName[length - 6] = 'G';
|
||||
newName[length - 5] = 'E';
|
||||
newName[length - 4] = 'R';
|
||||
newName[loadOffset][length - 6] = 'G';
|
||||
newName[loadOffset][length - 5] = 'E';
|
||||
newName[loadOffset][length - 4] = 'R';
|
||||
}
|
||||
doAction = newName;
|
||||
doAction = newName[loadOffset];
|
||||
}
|
||||
|
||||
/*
|
||||
if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
action += DO_ACTION_MAX;
|
||||
}
|
||||
|
||||
if (gSaveContext.language == LANGUAGE_FRA) {
|
||||
action += DO_ACTION_MAX;
|
||||
}*/
|
||||
|
||||
|
||||
if (action != DO_ACTION_NONE) {
|
||||
//osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK);
|
||||
memcpy(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE()), GetResourceDataByName(doAction, false),
|
||||
DO_ACTION_TEX_SIZE());
|
||||
//DmaMgr_SendRequest2(&interfaceCtx->dmaRequest_160,
|
||||
//interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE),
|
||||
//(uintptr_t)_do_action_staticSegmentRomStart + (action * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE,
|
||||
//0, &interfaceCtx->loadQueue, NULL, __FILE__, __LINE__);
|
||||
//osRecvMesg(&interfaceCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
||||
} else {
|
||||
gSegments[7] = VIRTUAL_TO_PHYSICAL(interfaceCtx->doActionSegment);
|
||||
//func_80086D5C(SEGMENTED_TO_VIRTUAL(sDoActionTextures[loadOffset]), DO_ACTION_TEX_SIZE / 4);
|
||||
func_80086D5C(interfaceCtx->doActionSegment + (loadOffset * DO_ACTION_TEX_SIZE()), DO_ACTION_TEX_SIZE() / 4);
|
||||
}
|
||||
char* segment = interfaceCtx->doActionSegment[loadOffset];
|
||||
interfaceCtx->doActionSegment[loadOffset] = action != DO_ACTION_NONE ? doAction : gDoEmptyTexture;
|
||||
gSegments[7] = interfaceCtx->doActionSegment[loadOffset];
|
||||
}
|
||||
|
||||
void Interface_SetDoAction(PlayState* play, u16 action) {
|
||||
@ -2950,7 +2906,7 @@ void Interface_LoadActionLabelB(PlayState* play, u16 action) {
|
||||
InterfaceContext* interfaceCtx = &play->interfaceCtx;
|
||||
|
||||
char* doAction = actionsTbl[action];
|
||||
char newName[512];
|
||||
static char newName[512];
|
||||
|
||||
if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
size_t length = strlen(doAction);
|
||||
@ -2967,24 +2923,10 @@ void Interface_LoadActionLabelB(PlayState* play, u16 action) {
|
||||
doAction = newName;
|
||||
}
|
||||
|
||||
/*if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
action += DO_ACTION_MAX;
|
||||
}
|
||||
|
||||
if (gSaveContext.language == LANGUAGE_FRA) {
|
||||
action += DO_ACTION_MAX;
|
||||
}*/
|
||||
|
||||
interfaceCtx->unk_1FC = action;
|
||||
|
||||
|
||||
|
||||
// OTRTODO
|
||||
osCreateMesgQueue(&interfaceCtx->loadQueue, &interfaceCtx->loadMsg, OS_MESG_BLOCK);
|
||||
memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE(), GetResourceDataByName(doAction, false), DO_ACTION_TEX_SIZE());
|
||||
//DmaMgr_SendRequest2(&interfaceCtx->dmaRequest_160, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE,
|
||||
//(uintptr_t)_do_action_staticSegmentRomStart + (action * DO_ACTION_TEX_SIZE), DO_ACTION_TEX_SIZE, 0,
|
||||
//&interfaceCtx->loadQueue, NULL, __FILE__, __LINE__);
|
||||
char* segment = interfaceCtx->doActionSegment[1];
|
||||
interfaceCtx->doActionSegment[1] = action != DO_ACTION_NONE ? doAction : gDoEmptyTexture;
|
||||
osRecvMesg(&interfaceCtx->loadQueue, NULL, OS_MESG_BLOCK);
|
||||
|
||||
interfaceCtx->unk_1FA = 1;
|
||||
@ -4040,28 +3982,8 @@ void Interface_DrawItemButtons(PlayState* play) {
|
||||
gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0);
|
||||
gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
|
||||
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
|
||||
|
||||
//There is probably a more elegant way to do it.
|
||||
char* doAction = actionsTbl[3];
|
||||
char newName[512];
|
||||
if (gSaveContext.language != LANGUAGE_ENG) {
|
||||
size_t length = strlen(doAction);
|
||||
strcpy(newName, doAction);
|
||||
if (gSaveContext.language == LANGUAGE_FRA) {
|
||||
newName[length - 6] = 'F';
|
||||
newName[length - 5] = 'R';
|
||||
newName[length - 4] = 'A';
|
||||
} else if (gSaveContext.language == LANGUAGE_GER) {
|
||||
newName[length - 6] = 'G';
|
||||
newName[length - 5] = 'E';
|
||||
newName[length - 4] = 'R';
|
||||
}
|
||||
doAction = newName;
|
||||
}
|
||||
|
||||
memcpy(interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2, GetResourceDataByName(doAction, false), DO_ACTION_TEX_SIZE());
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2, G_IM_FMT_IA,
|
||||
Interface_LoadActionLabel(interfaceCtx, 3, 2);
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment[2], G_IM_FMT_IA,
|
||||
DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_HEIGHT(), 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
|
||||
@ -4076,7 +3998,7 @@ void Interface_DrawItemButtons(PlayState* play) {
|
||||
gSPMatrix(OVERLAY_DISP++, MATRIX_NEWMTX(play->state.gfxCtx),
|
||||
G_MTX_MODELVIEW | G_MTX_LOAD);
|
||||
gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[4], 4, 0);
|
||||
Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE() * 2);
|
||||
Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment[2]);
|
||||
gDPPipeSync(OVERLAY_DISP++);
|
||||
}
|
||||
}
|
||||
@ -4900,10 +4822,6 @@ void Interface_Draw(PlayState* play) {
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
// Invalidate Do Action textures as they may have changed
|
||||
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment);
|
||||
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE());
|
||||
|
||||
gSPSegment(OVERLAY_DISP++, 0x02, interfaceCtx->parameterSegment);
|
||||
gSPSegment(OVERLAY_DISP++, 0x07, interfaceCtx->doActionSegment);
|
||||
gSPSegment(OVERLAY_DISP++, 0x08, interfaceCtx->iconItemSegment);
|
||||
@ -5211,7 +5129,7 @@ void Interface_Draw(PlayState* play) {
|
||||
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
|
||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha);
|
||||
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE(), G_IM_FMT_IA,
|
||||
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->doActionSegment[1], G_IM_FMT_IA,
|
||||
DO_ACTION_TEX_WIDTH(), DO_ACTION_TEX_HEIGHT(), 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
|
||||
@ -5301,7 +5219,7 @@ void Interface_Draw(PlayState* play) {
|
||||
|
||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, dPadColor.r, dPadColor.g, dPadColor.b, dpadAlpha);
|
||||
if (fullUi) {
|
||||
gDPLoadTextureBlock(OVERLAY_DISP++, GetResourceDataByName("__OTR__textures/parameter_static/gDPad", false),
|
||||
gDPLoadTextureBlock(OVERLAY_DISP++, "__OTR__textures/parameter_static/gDPad",
|
||||
G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
|
||||
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2,
|
||||
@ -5417,9 +5335,9 @@ void Interface_Draw(PlayState* play) {
|
||||
gSPVertex(OVERLAY_DISP++, &interfaceCtx->actionVtx[4], 4, 0);
|
||||
|
||||
if ((interfaceCtx->unk_1EC < 2) || (interfaceCtx->unk_1EC == 3)) {
|
||||
Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment);
|
||||
Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment[0]);
|
||||
} else {
|
||||
Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment + DO_ACTION_TEX_SIZE());
|
||||
Interface_DrawActionLabel(play->state.gfxCtx, interfaceCtx->doActionSegment[1]);
|
||||
}
|
||||
|
||||
gDPPipeSync(OVERLAY_DISP++);
|
||||
|
@ -682,6 +682,12 @@ void Play_Init(GameState* thisx) {
|
||||
DmaMgr_DmaRomToRam(0x03FEB000, D_8012D1F0, sizeof(D_801614D0));
|
||||
}
|
||||
#endif
|
||||
|
||||
if (CVarGetInteger("gIvanCoopModeEnabled", 0)) {
|
||||
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_PARTNER, GET_PLAYER(play)->actor.world.pos.x,
|
||||
GET_PLAYER(play)->actor.world.pos.y + Player_GetHeight(GET_PLAYER(play)) + 5.0f,
|
||||
GET_PLAYER(play)->actor.world.pos.z, 0, 0, 0, 1, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Play_Update(PlayState* play) {
|
||||
|
@ -330,6 +330,12 @@ void Player_SetBootData(PlayState* play, Player* this) {
|
||||
}
|
||||
}
|
||||
|
||||
// Custom method used to determine if we're using a custom model for link
|
||||
uint8_t Player_IsCustomLinkModel() {
|
||||
return (LINK_IS_ADULT && GetResourceIsCustomByName(gLinkAdultSkel, true)) ||
|
||||
(LINK_IS_CHILD && GetResourceIsCustomByName(gLinkChildSkel, true));
|
||||
}
|
||||
|
||||
s32 Player_InBlockingCsMode(PlayState* play, Player* this) {
|
||||
return (this->stateFlags1 & 0x20000080) || (this->csMode != 0) || (play->sceneLoadFlag == 0x14) ||
|
||||
(this->stateFlags1 & 1) || (this->stateFlags3 & 0x80) ||
|
||||
@ -788,6 +794,11 @@ void func_8008F470(PlayState* play, void** skeleton, Vec3s* jointTable, s32 dLis
|
||||
|
||||
gDPSetEnvColor(POLY_OPA_DISP++, color->r, color->g, color->b, 0);
|
||||
|
||||
// If we have a custom link model, always use the most detailed LOD
|
||||
if (Player_IsCustomLinkModel()) {
|
||||
lod = 0;
|
||||
}
|
||||
|
||||
sDListsLodOffset = lod * 2;
|
||||
|
||||
SkelAnime_DrawFlexLod(play, skeleton, jointTable, dListCount, overrideLimbDraw, postLimbDraw, data, lod);
|
||||
@ -1024,7 +1035,8 @@ s32 func_8008FCC8(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
|
||||
s32 func_80090014(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) {
|
||||
Player* this = (Player*)thisx;
|
||||
|
||||
if (!func_8008FCC8(play, limbIndex, dList, pos, rot, thisx)) {
|
||||
if (!func_8008FCC8(play, limbIndex, dList, pos, rot, thisx))
|
||||
{
|
||||
if (limbIndex == PLAYER_LIMB_L_HAND) {
|
||||
Gfx** dLists = this->leftHandDLists;
|
||||
|
||||
@ -1072,7 +1084,12 @@ s32 func_80090014(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
|
||||
|
||||
|
||||
} else if (limbIndex == PLAYER_LIMB_WAIST) {
|
||||
*dList = ResourceMgr_LoadGfxByName(this->waistDLists[sDListsLodOffset]);
|
||||
|
||||
if (!Player_IsCustomLinkModel()) {
|
||||
*dList = ResourceMgr_LoadGfxByName(
|
||||
this->waistDLists[sDListsLodOffset]); // NOTE: This needs to be disabled when using custom
|
||||
// characters - they're not going to have LODs anyways...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1678,6 +1695,10 @@ s32 func_80091880(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s
|
||||
}
|
||||
} else if (limbIndex == PLAYER_LIMB_WAIST) {
|
||||
type = gPlayerModelTypes[modelGroup][4];
|
||||
|
||||
if (Player_IsCustomLinkModel()) {
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,3 +1,7 @@
|
||||
#ifdef WIN32
|
||||
#include <vcruntime_string.h>
|
||||
#endif
|
||||
|
||||
#include "global.h"
|
||||
#include "vt.h"
|
||||
#include "soh/Enhancements/randomizer/randomizer_entrance.h"
|
||||
@ -222,42 +226,29 @@ void func_80095D04(PlayState* play, Room* room, u32 flags) {
|
||||
|
||||
s32 swapAndConvertJPEG(void* data) {
|
||||
OSTime time;
|
||||
if (BE32SWAP(*(u32*)data) == JPEG_MARKER) {
|
||||
size_t size = 320 * 240 * 2;
|
||||
|
||||
if (BE32SWAP(*(u32*)data) == JPEG_MARKER)
|
||||
{
|
||||
char* decodedJpeg = ResourceMgr_LoadJPEG(data, 320 * 240 * 2);
|
||||
//char* decodedJpeg = ResourceMgr_LoadJPEG(data, 480 * 240 * 2);
|
||||
char *decodedJpeg = ResourceMgr_LoadJPEG(data, size);
|
||||
|
||||
osSyncPrintf("JPEGデータを展開します\n"); // "Expanding jpeg data"
|
||||
osSyncPrintf("JPEGデータアドレス %08x\n", data); // "Jpeg data address %08x"
|
||||
// "Work buffer address (Z buffer) %08x"
|
||||
osSyncPrintf("ワークバッファアドレス(Zバッファ)%08x\n", gZBuffer);
|
||||
osSyncPrintf("Expanding jpeg data\n");
|
||||
osSyncPrintf("Work buffer address (Z buffer) %08x\n", gZBuffer);
|
||||
|
||||
time = osGetTime();
|
||||
|
||||
//if (!Jpeg_Decode(data, gZBuffer, gGfxSPTaskOutputBuffer, sizeof(gGfxSPTaskOutputBuffer)))
|
||||
if (1)
|
||||
{
|
||||
memcpy(data, decodedJpeg, 320 * 240 * 2);
|
||||
//memcpy(data, decodedJpeg, 480 * 240 * 2);
|
||||
memcpy(data, decodedJpeg, size);
|
||||
time = osGetTime() - time;
|
||||
|
||||
// "Success... I think. time = %6.3f ms"
|
||||
osSyncPrintf("成功…だと思う。 time = %6.3f ms \n", OS_CYCLES_TO_USEC(time) / 1000.0f);
|
||||
// "Writing back to original address from work buffer."
|
||||
osSyncPrintf("ワークバッファから元のアドレスに書き戻します。\n");
|
||||
// "If the original buffer size isn't at least 150kb, it will be out of control."
|
||||
osSyncPrintf("元のバッファのサイズが150キロバイト無いと暴走するでしょう。\n");
|
||||
|
||||
//bcopy(gZBuffer, data, sizeof(gZBuffer));
|
||||
} else {
|
||||
osSyncPrintf("失敗!なんで〜\n"); // "Failure! Why is it 〜"
|
||||
}
|
||||
osSyncPrintf("Success... I think. time = %6.3f ms", OS_CYCLES_TO_USEC(time) / 1000.0f);
|
||||
osSyncPrintf("Writing back to original address from work buffer.");
|
||||
osSyncPrintf("If the original buffer size isn't at least 150kb, it will be out of control.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0,
|
||||
u16 tlutCount, f32 frameX, f32 frameY) {
|
||||
Gfx* displayListHead;
|
||||
@ -265,7 +256,6 @@ void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 h
|
||||
s32 temp;
|
||||
|
||||
displayListHead = *displayList;
|
||||
swapAndConvertJPEG(SEGMENTED_TO_VIRTUAL(source));
|
||||
|
||||
bg = (uObjBg*)(displayListHead + 1);
|
||||
gSPBranchList(displayListHead, (u8*)bg + sizeof(uObjBg));
|
||||
|
@ -1077,7 +1077,7 @@ void SkelAnime_InitLink(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeade
|
||||
LinkAnimationHeader* animation, s32 flags, Vec3s* jointTable, Vec3s* morphTable,
|
||||
s32 limbBufCount) {
|
||||
if (ResourceMgr_OTRSigCheck(skeletonHeaderSeg) != 0)
|
||||
skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg);
|
||||
skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg, skelAnime);
|
||||
|
||||
FlexSkeletonHeader* skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
|
||||
s32 headerJointCount = skeletonHeader->sh.limbCount;
|
||||
@ -1429,7 +1429,7 @@ s32 LinkAnimation_OnFrame(SkelAnime* skelAnime, f32 frame) {
|
||||
s32 SkelAnime_Init(PlayState* play, SkelAnime* skelAnime, SkeletonHeader* skeletonHeaderSeg,
|
||||
AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount) {
|
||||
if (ResourceMgr_OTRSigCheck(skeletonHeaderSeg))
|
||||
skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg);
|
||||
skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg, skelAnime);
|
||||
|
||||
SkeletonHeader* skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
|
||||
|
||||
@ -1462,7 +1462,7 @@ s32 SkelAnime_Init(PlayState* play, SkelAnime* skelAnime, SkeletonHeader* skelet
|
||||
s32 SkelAnime_InitFlex(PlayState* play, SkelAnime* skelAnime, FlexSkeletonHeader* skeletonHeaderSeg,
|
||||
AnimationHeader* animation, Vec3s* jointTable, Vec3s* morphTable, s32 limbCount) {
|
||||
if (ResourceMgr_OTRSigCheck(skeletonHeaderSeg) != 0)
|
||||
skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg);
|
||||
skeletonHeaderSeg = ResourceMgr_LoadSkeletonByName(skeletonHeaderSeg, skelAnime);
|
||||
|
||||
FlexSkeletonHeader* skeletonHeader = SEGMENTED_TO_VIRTUAL(skeletonHeaderSeg);
|
||||
|
||||
@ -1921,6 +1921,8 @@ void SkelAnime_Free(SkelAnime* skelAnime, PlayState* play) {
|
||||
} else {
|
||||
osSyncPrintf("morf_joint あきまへん!!\n"); // "morf_joint is freed !!"
|
||||
}
|
||||
|
||||
ResourceMgr_UnregisterSkeleton(skelAnime);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -38,7 +38,7 @@ void Skin_InitAnimatedLimb(PlayState* play, Skin* skin, s32 limbIndex) {
|
||||
*/
|
||||
void Skin_Init(PlayState* play, Skin* skin, SkeletonHeader* skeletonHeader, AnimationHeader* animationHeader) {
|
||||
if (ResourceMgr_OTRSigCheck(skeletonHeader))
|
||||
skeletonHeader = ResourceMgr_LoadSkeletonByName(skeletonHeader);
|
||||
skeletonHeader = ResourceMgr_LoadSkeletonByName(skeletonHeader, NULL);
|
||||
|
||||
s32 limbCount;
|
||||
s32 i;
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "z_boss_dodongo.h"
|
||||
#include "textures/boss_title_cards/object_kingdodongo.h"
|
||||
#include "objects/object_kingdodongo/object_kingdodongo.h"
|
||||
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
|
||||
#include "scenes/dungeons/ddan_boss/ddan_boss_room_1.h"
|
||||
@ -49,6 +50,14 @@ const ActorInit Boss_Dodongo_InitVars = {
|
||||
|
||||
#include "z_boss_dodongo_data.c"
|
||||
|
||||
static u8 sMaskTex16x16[16 * 16] = { { 0 } };
|
||||
static u8 sMaskTex8x16[8 * 16] = { { 0 } };
|
||||
static u8 sMaskTex16x32[16 * 32] = { { 0 } };
|
||||
static u8 sMaskTex32x16[32 * 16] = { { 0 } };
|
||||
static u8 sMaskTex8x8[8 * 8] = { { 0 } };
|
||||
static u8 sMaskTex8x32[8 * 32] = { { 0 } };
|
||||
static u8 sMaskTexLava[32 * 64] = { { 0 } };
|
||||
|
||||
static InitChainEntry sInitChain[] = {
|
||||
ICHAIN_U8(targetMode, 5, ICHAIN_CONTINUE),
|
||||
ICHAIN_S8(naviEnemyId, 0x0C, ICHAIN_CONTINUE),
|
||||
@ -56,65 +65,24 @@ static InitChainEntry sInitChain[] = {
|
||||
ICHAIN_F32(targetArrowOffset, 8200.0f, ICHAIN_STOP),
|
||||
};
|
||||
|
||||
void func_808C1190(s16* arg0, u8* arg1, s16 arg2) {
|
||||
arg0 = GetResourceDataByName(arg0, false);
|
||||
|
||||
if (arg2[arg1] != 0) {
|
||||
arg0[arg2 / 2] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808C11D0(s16* arg0, u8* arg1, s16 arg2) {
|
||||
arg0 = GetResourceDataByName(arg0, false);
|
||||
|
||||
if (arg1[arg2] != 0) {
|
||||
arg0[arg2] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808C1200(s16* arg0, u8* arg1, s16 arg2) {
|
||||
arg0 = GetResourceDataByName(arg0, false);
|
||||
|
||||
if (arg1[arg2] != 0) {
|
||||
arg0[arg2] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808C1230(s16* arg0, u8* arg1, s16 arg2) {
|
||||
s16 index;
|
||||
|
||||
arg0 = GetResourceDataByName(arg0, false);
|
||||
|
||||
if (arg1[arg2] != 0) {
|
||||
index = ((arg2 & 0xF) + ((arg2 & 0xF0) * 2));
|
||||
arg0[index + 16] = 0;
|
||||
arg0[index] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808C1278(s16* arg0, u8* arg1, s16 arg2) {
|
||||
s16 index;
|
||||
|
||||
arg0 = GetResourceDataByName(arg0, false);
|
||||
|
||||
if (arg1[arg2] != 0) {
|
||||
index = ((arg2 & 0xF) * 2) + ((arg2 & 0xF0) * 2);
|
||||
arg0[index + 1] = 0;
|
||||
arg0[index] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808C12C4(u8* arg1, s16 arg2) {
|
||||
func_808C1190(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_015890), arg1, arg2);
|
||||
func_808C1200(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_017210), arg1, arg2);
|
||||
func_808C11D0(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_015D90), arg1, arg2);
|
||||
func_808C11D0(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_016390), arg1, arg2);
|
||||
func_808C11D0(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_016590), arg1, arg2);
|
||||
func_808C11D0(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_016790), arg1, arg2);
|
||||
func_808C1230(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_015990), arg1, arg2);
|
||||
func_808C1230(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_015F90), arg1, arg2);
|
||||
func_808C1278(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_016990), arg1, arg2);
|
||||
func_808C1278(SEGMENTED_TO_VIRTUAL(object_kingdodongo_Tex_016E10), arg1, arg2);
|
||||
if (arg2[arg1] != 0) {
|
||||
sMaskTex8x16[arg2 / 2] = 1;
|
||||
|
||||
sMaskTex8x32[arg2] = 1;
|
||||
|
||||
sMaskTex16x16[arg2] = 1;
|
||||
|
||||
sMaskTex16x16[arg2] = 1;
|
||||
|
||||
s16 index = ((arg2 & 0xF) + ((arg2 & 0xF0) * 2));
|
||||
sMaskTex16x32[index + 16] = 1;
|
||||
sMaskTex16x32[index] = 1;
|
||||
|
||||
index = ((arg2 & 0xF) * 2) + ((arg2 & 0xF0) * 2);
|
||||
sMaskTex32x16[index + 1] = 1;
|
||||
sMaskTex32x16[index] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void func_808C1554(void* arg0, void* floorTex, s32 arg2, f32 arg3) {
|
||||
@ -228,13 +196,47 @@ void BossDodongo_Init(Actor* thisx, PlayState* play) {
|
||||
Actor_Spawn(&play->actorCtx, play, ACTOR_BG_BREAKWALL, -890.0f, -1523.76f, -3304.0f, 0, 0, 0, 0x6000, true);
|
||||
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, -690.0f, -1523.76f, -3304.0f, 0, 0, 0, 0, true);
|
||||
|
||||
for (i = 0; i < 2048; i++) {
|
||||
temp_v0 = i;
|
||||
temp_s1_3[temp_v0] = temp_s2[temp_v0];
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTexLava); i++) {
|
||||
sMaskTexLava[i] = 1;
|
||||
}
|
||||
} else {
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTexLava); i++) {
|
||||
sMaskTexLava[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
this->actor.flags &= ~ACTOR_FLAG_0;
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTex8x16); i++) {
|
||||
sMaskTex8x16[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTex8x32); i++) {
|
||||
sMaskTex8x32[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTex16x16); i++) {
|
||||
sMaskTex16x16[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTex16x32); i++) {
|
||||
sMaskTex16x32[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTex32x16); i++) {
|
||||
sMaskTex32x16[i] = 0;
|
||||
}
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_015890, sMaskTex8x16, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_017210, sMaskTex8x32, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_015D90, sMaskTex16x16, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_016390, sMaskTex16x16, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_016590, sMaskTex16x16, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_016790, sMaskTex16x16, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_015990, sMaskTex16x32, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_015F90, sMaskTex16x32, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_016990, sMaskTex32x16, NULL);
|
||||
Gfx_RegisterBlendedTexture(object_kingdodongo_Tex_016E10, sMaskTex32x16, NULL);
|
||||
|
||||
// OTRTODO: This is causing OOB memory reads with HD assets
|
||||
// commenting this out means the lava will stay lava even after beating king d
|
||||
//
|
||||
// Gfx_RegisterBlendedTexture(gDodongosCavernBossLavaFloorTex, sMaskTexLava, sLavaFloorRockTex);
|
||||
}
|
||||
|
||||
void BossDodongo_Destroy(Actor* thisx, PlayState* play) {
|
||||
@ -421,7 +423,7 @@ void BossDodongo_IntroCutscene(BossDodongo* this, PlayState* play) {
|
||||
if (this->unk_198 == 0x5A) {
|
||||
if (!(gSaveContext.eventChkInf[7] & 2)) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gKingDodongoTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gKingDodongoTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
}
|
||||
Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_FIRE_BOSS);
|
||||
}
|
||||
@ -1011,7 +1013,8 @@ void BossDodongo_Update(Actor* thisx, PlayState* play2) {
|
||||
}
|
||||
}
|
||||
|
||||
func_808C1554(gDodongosCavernBossLavaFloorTex, sLavaFloorLavaTex, this->unk_19E, this->unk_224);
|
||||
// TODO The lave floor bubbles with an effect that modifies the texture. This needs to be recreated shader-side.
|
||||
//func_808C1554(gDodongosCavernBossLavaFloorTex, sLavaFloorLavaTex, this->unk_19E, this->unk_224);
|
||||
}
|
||||
|
||||
if (this->unk_1C6 != 0) {
|
||||
@ -1022,7 +1025,7 @@ void BossDodongo_Update(Actor* thisx, PlayState* play2) {
|
||||
for (i2 = 0; i2 < 20; i2++) {
|
||||
s16 new_var = this->unk_1C2 & 0x7FF;
|
||||
|
||||
ptr1[new_var] = ptr2[new_var];
|
||||
sMaskTexLava[new_var] = 1;
|
||||
this->unk_1C2 += 37;
|
||||
}
|
||||
Math_SmoothStepToF(&this->unk_224, 0.0f, 1.0f, 0.01f, 0.0f);
|
||||
@ -1139,6 +1142,18 @@ void BossDodongo_Draw(Actor* thisx, PlayState* play) {
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
Gfx_SetupDL_25Opa(play->state.gfxCtx);
|
||||
|
||||
if ((this->csState == 9) && (this->unk_1DA < 854)) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTex8x16);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTex8x32);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTex16x16);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTex16x32);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTex32x16);
|
||||
}
|
||||
|
||||
if (this->unk_1C6 != 0) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTexLava);
|
||||
}
|
||||
|
||||
if ((this->unk_1C0 >= 2) && (this->unk_1C0 & 1)) {
|
||||
POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 255, 255, 0, 900, 1099);
|
||||
} else {
|
||||
@ -1274,7 +1289,7 @@ void BossDodongo_UpdateDamage(BossDodongo* this, PlayState* play) {
|
||||
this->collider.elements->info.bumperFlags &= ~2;
|
||||
item1 = this->collider.elements[0].info.acHitInfo;
|
||||
if ((this->actionFunc == BossDodongo_Vulnerable) || (this->actionFunc == BossDodongo_LayDown)) {
|
||||
swordDamage = damage = CollisionCheck_GetSwordDamage(item1->toucher.dmgFlags);
|
||||
swordDamage = damage = CollisionCheck_GetSwordDamage(item1->toucher.dmgFlags, play);
|
||||
|
||||
if (damage != 0) {
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DODO_K_DAMAGE);
|
||||
@ -1700,8 +1715,6 @@ void BossDodongo_DrawEffects(PlayState* play) {
|
||||
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
|
||||
unkMtx = &play->billboardMtxF;
|
||||
|
||||
gSPInvalidateTexCache(POLY_XLU_DISP++, gDodongosCavernBossLavaFloorTex);
|
||||
|
||||
for (i = 0; i < 80; i++, eff++) {
|
||||
FrameInterpolation_RecordOpenChild(eff, eff->epoch);
|
||||
if (eff->unk_24 == 1) {
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include "z_boss_fd.h"
|
||||
#include "textures/boss_title_cards/object_fd.h"
|
||||
#include "objects/object_fd/object_fd.h"
|
||||
#include "overlays/actors/ovl_En_Vb_Ball/z_en_vb_ball.h"
|
||||
#include "overlays/actors/ovl_Bg_Vb_Sima/z_bg_vb_sima.h"
|
||||
@ -499,7 +500,7 @@ void BossFd_Fly(BossFd* this, PlayState* play) {
|
||||
}
|
||||
if ((this->timers[3] == 130) && !(gSaveContext.eventChkInf[7] & 8)) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gVolvagiaBossTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gVolvagiaBossTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
}
|
||||
if (this->timers[3] <= 100) {
|
||||
this->camData.eyeVel.x = this->camData.eyeVel.y = this->camData.eyeVel.z = 2.0f;
|
||||
|
@ -869,7 +869,7 @@ void BossFd2_CollisionCheck(BossFd2* this, PlayState* play) {
|
||||
u8 canKill = false;
|
||||
u8 damage;
|
||||
|
||||
if ((damage = CollisionCheck_GetSwordDamage(hurtbox->toucher.dmgFlags)) == 0) {
|
||||
if ((damage = CollisionCheck_GetSwordDamage(hurtbox->toucher.dmgFlags, play)) == 0) {
|
||||
damage = (hurtbox->toucher.dmgFlags & 0x00001000) ? 4 : 2;
|
||||
} else {
|
||||
canKill = true;
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "overlays/actors/ovl_En_Zl3/z_en_zl3.h"
|
||||
#include "overlays/actors/ovl_Bg_Ganon_Otyuka/z_bg_ganon_otyuka.h"
|
||||
#include "overlays/actors/ovl_En_Bom/z_en_bom.h"
|
||||
#include "textures/boss_title_cards/object_ganon.h"
|
||||
#include "assets/objects/object_ganon/object_ganon.h"
|
||||
#include "assets/objects/object_ganon_anime1/object_ganon_anime1.h"
|
||||
#include "assets/objects/object_ganon_anime2/object_ganon_anime2.h"
|
||||
@ -119,6 +120,8 @@ EnZl3* sBossGanonZelda;
|
||||
|
||||
GanondorfEffect sBossGanonEffectBuf[200];
|
||||
|
||||
static u8 sWindowShatterTex[2048] = { {0} };
|
||||
|
||||
void BossGanonEff_SpawnWindowShard(PlayState* play, Vec3f* pos, Vec3f* velocity, f32 scale) {
|
||||
static Color_RGB8 shardColors[] = { { 255, 175, 85 }, { 155, 205, 155 }, { 155, 125, 55 } };
|
||||
s16 i;
|
||||
@ -453,6 +456,13 @@ void BossGanon_Init(Actor* thisx, PlayState* play2) {
|
||||
Collider_SetCylinder(play, &this->collider, thisx, &sLightBallCylinderInit);
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sWindowShatterTex); i++) {
|
||||
sWindowShatterTex[i] = 0;
|
||||
}
|
||||
|
||||
Gfx_RegisterBlendedTexture(ganon_boss_sceneTex_006C18, sWindowShatterTex, NULL);
|
||||
Gfx_RegisterBlendedTexture(ganon_boss_sceneTex_007418, sWindowShatterTex, NULL);
|
||||
}
|
||||
|
||||
void BossGanon_Destroy(Actor* thisx, PlayState* play) {
|
||||
@ -1095,7 +1105,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) {
|
||||
|
||||
if (!(gSaveContext.eventChkInf[7] & 0x100)) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gGanondorfTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gGanondorfTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
}
|
||||
|
||||
gSaveContext.eventChkInf[7] |= 0x100;
|
||||
@ -1210,14 +1220,12 @@ void BossGanon_SetupTowerCutscene(BossGanon* this, PlayState* play) {
|
||||
|
||||
void BossGanon_ShatterWindows(u8 windowShatterState) {
|
||||
s16 i;
|
||||
u8* tex1 = GetResourceDataByNameHandlingMQ(SEGMENTED_TO_VIRTUAL(ganon_boss_sceneTex_006C18));
|
||||
u8* tex2 = GetResourceDataByNameHandlingMQ(SEGMENTED_TO_VIRTUAL(ganon_boss_sceneTex_007418));
|
||||
u8* templateTex = GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGanondorfWindowShatterTemplateTex), false);
|
||||
|
||||
for (i = 0; i < 2048; i++) {
|
||||
if ((tex1[i] != 0) && (Rand_ZeroOne() < 0.03f)) {
|
||||
for (i = 0; i < ARRAY_COUNT(sWindowShatterTex); i++) {
|
||||
if ((sWindowShatterTex[i] != 1) && (Rand_ZeroOne() < 0.03f)) {
|
||||
if ((templateTex[i] == 0) || (windowShatterState == GDF_WINDOW_SHATTER_FULL)) {
|
||||
tex1[i] = tex2[i] = 1;
|
||||
sWindowShatterTex[i] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2776,7 +2784,7 @@ void BossGanon_UpdateDamage(BossGanon* this, PlayState* play) {
|
||||
Rand_ZeroFloat(200.0f) + 500.0f, 0x1E);
|
||||
}
|
||||
|
||||
damage = flags = CollisionCheck_GetSwordDamage(acHitInfo->toucher.dmgFlags);
|
||||
damage = flags = CollisionCheck_GetSwordDamage(acHitInfo->toucher.dmgFlags, play);
|
||||
|
||||
if (flags == 0) {
|
||||
damage = 2;
|
||||
@ -3866,10 +3874,9 @@ void BossGanon_Draw(Actor* thisx, PlayState* play) {
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
// Invalidate textures if they have changed
|
||||
// Invalidate texture mask if it has changed
|
||||
if (this->windowShatterState != GDF_WINDOW_SHATTER_OFF) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, ganon_boss_sceneTex_006C18);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, ganon_boss_sceneTex_007418);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sWindowShatterTex);
|
||||
}
|
||||
|
||||
Gfx_SetupDL_25Opa(play->state.gfxCtx);
|
||||
|
@ -2,6 +2,7 @@
|
||||
#include "overlays/actors/ovl_Demo_Gj/z_demo_gj.h"
|
||||
#include "overlays/actors/ovl_En_Zl3/z_en_zl3.h"
|
||||
#include "objects/object_ganon/object_ganon.h"
|
||||
#include "textures/boss_title_cards/object_ganon2.h"
|
||||
#include "objects/object_ganon2/object_ganon2.h"
|
||||
#include "objects/object_ganon_anime3/object_ganon_anime3.h"
|
||||
#include "objects/object_geff/object_geff.h"
|
||||
@ -708,7 +709,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) {
|
||||
if (this->csTimer == 80) {
|
||||
BossGanon2_SetObjectSegment(this, play, OBJECT_GANON2, false);
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gGanonTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gGanonTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
//It has translation but they are all the same. they all say "GANON" only
|
||||
}
|
||||
this->unk_3A4.x = ((this->actor.world.pos.x + 500.0f) - 350.0f) + 100.0f;
|
||||
|
@ -181,6 +181,8 @@ static u8 sDecayMaskTotal[16 * 16] = {
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
static u8 sDecayTex[16 * 16] = { { 0 } };
|
||||
|
||||
// These are Phantom Ganon's body textures, but I don't know which is which.
|
||||
static void* sLimbTex_rgba16_8x8[] = {
|
||||
gPhantomGanonLimbTex_00A800, gPhantomGanonLimbTex_00AE80, gPhantomGanonLimbTex_00AF00,
|
||||
@ -208,66 +210,9 @@ static InitChainEntry sInitChain[] = {
|
||||
|
||||
static Vec3f sAudioVec = { 0.0f, 0.0f, 50.0f };
|
||||
|
||||
void BossGanondrof_ClearPixels8x8(s16* texture, u8* mask, s16 index)
|
||||
{
|
||||
if (mask[index]) {
|
||||
WriteTextureDataInt16ByName(texture, index / 4, 0, true);
|
||||
}
|
||||
}
|
||||
|
||||
void BossGanondrof_ClearPixels16x8(s16* texture, u8* mask, s16 index) {
|
||||
if (mask[index]) {
|
||||
WriteTextureDataInt16ByName(texture, index / 2, 0, false);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void BossGanondrof_ClearPixels16x16(s16* texture, u8* mask, s16 index, s16 bpp) {
|
||||
if (mask[index]) {
|
||||
WriteTextureDataInt16ByName(texture, index, 0, false);
|
||||
}
|
||||
}
|
||||
|
||||
void BossGanondrof_ClearPixels32x16(s16* texture, u8* mask, s16 index) {
|
||||
if (mask[index]) {
|
||||
s16 i = (index & 0xF) + ((index & 0xF0) << 1);
|
||||
|
||||
WriteTextureDataInt16ByName(texture, i + 0x10, 0, false);
|
||||
WriteTextureDataInt16ByName(texture, i, 0, false);
|
||||
}
|
||||
}
|
||||
|
||||
void BossGanondrof_ClearPixels16x32(s16* texture, u8* mask, s16 index) {
|
||||
if (mask[index]) {
|
||||
s16 i = ((index & 0xF) * 2) + ((index & 0xF0) * 2);
|
||||
|
||||
WriteTextureDataInt16ByName(texture, i + 1, 0, false);
|
||||
WriteTextureDataInt16ByName(texture, i, 0, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void BossGanondrof_ClearPixels(u8* mask, s16 index) {
|
||||
s16 i;
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
// ARRAY_COUNT can't be used here because the arrays aren't guaranteed to be the same size.
|
||||
BossGanondrof_ClearPixels8x8(SEGMENTED_TO_VIRTUAL(sLimbTex_rgba16_8x8[i]), mask, index);
|
||||
BossGanondrof_ClearPixels16x8(SEGMENTED_TO_VIRTUAL(sLimbTex_rgba16_16x8[i]), mask, index);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(sLimbTex_rgba16_16x16); i++) {
|
||||
BossGanondrof_ClearPixels16x16(SEGMENTED_TO_VIRTUAL(sLimbTex_rgba16_16x16[i]), mask, index, 2);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_COUNT(sLimbTex_rgba16_16x32); i++) {
|
||||
BossGanondrof_ClearPixels16x32(SEGMENTED_TO_VIRTUAL(sLimbTex_rgba16_16x32[i]), mask, index);
|
||||
}
|
||||
|
||||
BossGanondrof_ClearPixels32x16(SEGMENTED_TO_VIRTUAL(gPhantomGanonLimbTex_00B380), mask, index);
|
||||
BossGanondrof_ClearPixels16x32(SEGMENTED_TO_VIRTUAL(gPhantomGanonEyeTex), mask, index);
|
||||
for (i = 0; i < ARRAY_COUNT(sMouthTex_ci8_16x16); i++) {
|
||||
BossGanondrof_ClearPixels16x16(SEGMENTED_TO_VIRTUAL(sMouthTex_ci8_16x16[i]), mask, index, 1);
|
||||
if (mask[index]) {
|
||||
sDecayTex[index] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -311,6 +256,26 @@ void BossGanondrof_Init(Actor* thisx, PlayState* play) {
|
||||
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_FHG, this->actor.world.pos.x,
|
||||
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 0, this->actor.params);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sDecayTex); i++) {
|
||||
sDecayTex[i] = 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
Gfx_RegisterBlendedTexture(sLimbTex_rgba16_8x8[i], sDecayTex, NULL);
|
||||
Gfx_RegisterBlendedTexture(sLimbTex_rgba16_16x8[i], sDecayTex, NULL);
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sLimbTex_rgba16_16x16); i++) {
|
||||
Gfx_RegisterBlendedTexture(sLimbTex_rgba16_16x16[i], sDecayTex, NULL);
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sLimbTex_rgba16_16x32); i++) {
|
||||
Gfx_RegisterBlendedTexture(sLimbTex_rgba16_16x32[i], sDecayTex, NULL);
|
||||
}
|
||||
Gfx_RegisterBlendedTexture(gPhantomGanonLimbTex_00B380, sDecayTex, NULL);
|
||||
Gfx_RegisterBlendedTexture(gPhantomGanonEyeTex, sDecayTex, NULL);
|
||||
for (int i = 0; i < ARRAY_COUNT(sMouthTex_ci8_16x16); i++) {
|
||||
Gfx_RegisterBlendedTexture(sMouthTex_ci8_16x16[i], sDecayTex, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void BossGanondrof_Destroy(Actor* thisx, PlayState* play) {
|
||||
@ -1271,7 +1236,7 @@ void BossGanondrof_CollisionCheck(BossGanondrof* this, PlayState* play) {
|
||||
if (dmgFlags & 0x80) {
|
||||
return;
|
||||
}
|
||||
dmg = CollisionCheck_GetSwordDamage(dmgFlags);
|
||||
dmg = CollisionCheck_GetSwordDamage(dmgFlags, play);
|
||||
(dmg == 0) ? (dmg = 2) : (canKill = true);
|
||||
if (((s8)this->actor.colChkInfo.health > 2) || canKill) {
|
||||
this->actor.colChkInfo.health -= dmg;
|
||||
@ -1512,21 +1477,7 @@ void BossGanondrof_Draw(Actor* thisx, PlayState* play) {
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
if (this->work[GND_BODY_DECAY_FLAG]) {
|
||||
for (int i = 0; i < 5; i++) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sLimbTex_rgba16_8x8[i]);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sLimbTex_rgba16_16x8[i]);
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sLimbTex_rgba16_16x16); i++) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sLimbTex_rgba16_16x16[i]);
|
||||
}
|
||||
for (int i = 0; i < ARRAY_COUNT(sLimbTex_rgba16_16x32); i++) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sLimbTex_rgba16_16x32[i]);
|
||||
}
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gPhantomGanonLimbTex_00B380);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gPhantomGanonEyeTex);
|
||||
for (int i = 0; i < ARRAY_COUNT(sMouthTex_ci8_16x16); i++) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMouthTex_ci8_16x16[i]);
|
||||
}
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sDecayTex);
|
||||
}
|
||||
|
||||
osSyncPrintf("MOVE P = %x\n", this->actor.update);
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "z_boss_goma.h"
|
||||
#include "textures/boss_title_cards/object_goma.h"
|
||||
#include "objects/object_goma/object_goma.h"
|
||||
#include "overlays/actors/ovl_En_Goma/z_en_goma.h"
|
||||
#include "overlays/actors/ovl_Door_Shutter/z_door_shutter.h"
|
||||
@ -255,6 +256,9 @@ static u8 sClearPixelTableSecondPass[16 * 16] = {
|
||||
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
|
||||
};
|
||||
|
||||
static u8 sClearPixelTex16[16 * 16] = { { 0 } };
|
||||
static u8 sClearPixelTex32[32 * 32] = { { 0 } };
|
||||
|
||||
// indexed by limb (where the root limb is 1)
|
||||
static u8 sDeadLimbLifetime[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
@ -289,47 +293,20 @@ static u8 sDeadLimbLifetime[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* Sets the `i`th pixel of a 16x16 RGBA16 image to 0 (transparent black)
|
||||
* according to the `clearPixelTable`
|
||||
*/
|
||||
void BossGoma_ClearPixels16x16Rgba16(s16* rgba16image, u8* clearPixelTable, s16 i)
|
||||
{
|
||||
if (clearPixelTable[i]) {
|
||||
rgba16image[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the `i`th 2x2 pixels block of a 32x32 RGBA16 image to 0 (transparent black)
|
||||
* according to the `clearPixelTable`
|
||||
*/
|
||||
void BossGoma_ClearPixels32x32Rgba16(s16* rgba16image, u8* clearPixelTable, s16 i) {
|
||||
s16* targetPixel;
|
||||
|
||||
if (clearPixelTable[i]) {
|
||||
// address of the top left pixel in a 2x2 pixels block located at
|
||||
// (i & 0xF, i >> 4) in a 16x16 grid of 2x2 pixels
|
||||
targetPixel = rgba16image + ((i & 0xF) * 2 + (i & 0xF0) * 4);
|
||||
// set the 2x2 block of pixels to 0
|
||||
targetPixel[0] = 0;
|
||||
targetPixel[1] = 0;
|
||||
targetPixel[32 + 0] = 0;
|
||||
targetPixel[32 + 1] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear pixels from Gohma's textures
|
||||
*/
|
||||
void BossGoma_ClearPixels(u8* clearPixelTable, s16 i) {
|
||||
BossGoma_ClearPixels16x16Rgba16(GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGohmaBodyTex), false), clearPixelTable, i);
|
||||
BossGoma_ClearPixels16x16Rgba16(GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGohmaShellUndersideTex), false), clearPixelTable, i);
|
||||
BossGoma_ClearPixels16x16Rgba16(GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGohmaDarkShellTex), false), clearPixelTable, i);
|
||||
BossGoma_ClearPixels16x16Rgba16(GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGohmaEyeTex), false), clearPixelTable, i);
|
||||
if (clearPixelTable[i]) {
|
||||
sClearPixelTex16[i] = 1;
|
||||
|
||||
BossGoma_ClearPixels32x32Rgba16(GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGohmaShellTex), false), clearPixelTable, i);
|
||||
BossGoma_ClearPixels32x32Rgba16(GetResourceDataByName(SEGMENTED_TO_VIRTUAL(gGohmaIrisTex), false), clearPixelTable, i);
|
||||
u8* targetPixel = sClearPixelTex32 + ((i & 0xF) * 2 + (i & 0xF0) * 4);
|
||||
// set the 2x2 block of pixels to 0
|
||||
targetPixel[0] = 1;
|
||||
targetPixel[1] = 1;
|
||||
targetPixel[32 + 0] = 1;
|
||||
targetPixel[32 + 1] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static InitChainEntry sInitChain[] = {
|
||||
@ -365,6 +342,21 @@ void BossGoma_Init(Actor* thisx, PlayState* play) {
|
||||
0, WARP_DUNGEON_CHILD);
|
||||
Actor_Spawn(&play->actorCtx, play, ACTOR_ITEM_B_HEART, 141.0f, -640.0f, -84.0f, 0, 0, 0, 0, true);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sClearPixelTex16); i++) {
|
||||
sClearPixelTex16[i] = 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sClearPixelTex32); i++) {
|
||||
sClearPixelTex32[i] = 0;
|
||||
}
|
||||
|
||||
Gfx_RegisterBlendedTexture(gGohmaBodyTex, sClearPixelTex16, NULL);
|
||||
Gfx_RegisterBlendedTexture(gGohmaShellUndersideTex, sClearPixelTex16, NULL);
|
||||
Gfx_RegisterBlendedTexture(gGohmaDarkShellTex, sClearPixelTex16, NULL);
|
||||
Gfx_RegisterBlendedTexture(gGohmaEyeTex, sClearPixelTex16, NULL);
|
||||
Gfx_RegisterBlendedTexture(gGohmaShellTex, sClearPixelTex32, NULL);
|
||||
Gfx_RegisterBlendedTexture(gGohmaIrisTex, sClearPixelTex32, NULL);
|
||||
}
|
||||
|
||||
void BossGoma_PlayEffectsAndSfx(BossGoma* this, PlayState* play, s16 arg2, s16 amountMinus1) {
|
||||
@ -928,7 +920,7 @@ void BossGoma_Encounter(BossGoma* this, PlayState* play) {
|
||||
|
||||
if (!(gSaveContext.eventChkInf[7] & 1)) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gGohmaTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gGohmaTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
}
|
||||
|
||||
Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_BOSS);
|
||||
@ -1831,7 +1823,7 @@ void BossGoma_UpdateHit(BossGoma* this, PlayState* play) {
|
||||
BossGoma_SetupFallStruckDown(this);
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EN_GOMA_DAM2);
|
||||
} else if (this->actionFunc == BossGoma_FloorStunned &&
|
||||
(damage = CollisionCheck_GetSwordDamage(acHitInfo->toucher.dmgFlags)) != 0) {
|
||||
(damage = CollisionCheck_GetSwordDamage(acHitInfo->toucher.dmgFlags, play)) != 0) {
|
||||
this->actor.colChkInfo.health -= damage;
|
||||
|
||||
if ((s8)this->actor.colChkInfo.health > 0) {
|
||||
@ -2137,12 +2129,8 @@ void BossGoma_Draw(Actor* thisx, PlayState* play) {
|
||||
|
||||
// Invalidate Texture Cache since Goma modifies her own texture
|
||||
if (this->visualState == VISUALSTATE_DEFEATED) {
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gGohmaBodyTex);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gGohmaShellUndersideTex);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gGohmaDarkShellTex);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gGohmaEyeTex);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gGohmaShellTex);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gGohmaIrisTex);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sClearPixelTex16);
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sClearPixelTex32);
|
||||
}
|
||||
|
||||
if (this->noBackfaceCulling) {
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include "z_boss_mo.h"
|
||||
#include "textures/boss_title_cards/object_mo.h"
|
||||
#include "objects/object_mo/object_mo.h"
|
||||
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
|
||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
@ -1437,7 +1438,7 @@ void BossMo_IntroCs(BossMo* this, PlayState* play) {
|
||||
}
|
||||
if (this->timers[2] == 130) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gMorphaTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gMorphaTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
gSaveContext.eventChkInf[7] |= 0x10;
|
||||
}
|
||||
break;
|
||||
@ -1767,7 +1768,7 @@ void BossMo_CoreCollisionCheck(BossMo* this, PlayState* play) {
|
||||
// "hit 2 !!"
|
||||
osSyncPrintf("Core_Damage_check 当り 2 !!\n");
|
||||
if ((this->work[MO_TENT_ACTION_STATE] != MO_CORE_UNDERWATER) && (this->work[MO_TENT_INVINC_TIMER] == 0)) {
|
||||
u8 damage = CollisionCheck_GetSwordDamage(hurtbox->toucher.dmgFlags);
|
||||
u8 damage = CollisionCheck_GetSwordDamage(hurtbox->toucher.dmgFlags, play);
|
||||
|
||||
if ((damage != 0) && (this->work[MO_TENT_ACTION_STATE] < MO_CORE_ATTACK)) {
|
||||
// "sword hit !!"
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include "z_boss_sst.h"
|
||||
#include "textures/boss_title_cards/object_sst.h"
|
||||
#include "objects/object_sst/object_sst.h"
|
||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
#include "overlays/actors/ovl_Bg_Sst_Floor/z_bg_sst_floor.h"
|
||||
@ -608,7 +609,7 @@ void BossSst_HeadIntro(BossSst* this, PlayState* play) {
|
||||
} else if (revealStateTimer == 85) {
|
||||
if (!(gSaveContext.eventChkInf[7] & 0x80)) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gBongoTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gBongoTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
}
|
||||
Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_BOSS);
|
||||
Animation_MorphToPlayOnce(&this->skelAnime, &gBongoHeadEyeCloseAnim, -5.0f);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "z_boss_tw.h"
|
||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
#include "textures/boss_title_cards/object_tw.h"
|
||||
#include "objects/object_tw/object_tw.h"
|
||||
#include "overlays/actors/ovl_Door_Warp1/z_door_warp1.h"
|
||||
#include "soh/frame_interpolation.h"
|
||||
@ -2181,7 +2182,7 @@ void BossTw_TwinrovaIntroCS(BossTw* this, PlayState* play) {
|
||||
play->envCtx.unk_BE = 1;
|
||||
play->envCtx.unk_BD = 1;
|
||||
play->envCtx.unk_D8 = 0.0f;
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gTwinrovaTitleCardTex), 160, 180, 128, 40, true);
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gTwinrovaTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
gSaveContext.eventChkInf[7] |= 0x20;
|
||||
Audio_QueueSeqCmd(SEQ_PLAYER_BGM_MAIN << 24 | NA_BGM_BOSS);
|
||||
}
|
||||
@ -3080,7 +3081,7 @@ void BossTw_TwinrovaUpdate(Actor* thisx, PlayState* play2) {
|
||||
|
||||
this->collider.base.acFlags &= ~AC_HIT;
|
||||
swordDamage = false;
|
||||
damage = CollisionCheck_GetSwordDamage(info->toucher.dmgFlags);
|
||||
damage = CollisionCheck_GetSwordDamage(info->toucher.dmgFlags, play);
|
||||
|
||||
if (damage == 0) {
|
||||
damage = 2;
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "textures/boss_title_cards/object_bv.h"
|
||||
#include "objects/object_bv/object_bv.h"
|
||||
#include "overlays/actors/ovl_En_Boom/z_en_boom.h"
|
||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
@ -985,7 +986,7 @@ void BossVa_BodyIntro(BossVa* this, PlayState* play) {
|
||||
|
||||
if (!(gSaveContext.eventChkInf[7] & 0x40)) {
|
||||
TitleCard_InitBossName(play, &play->actorCtx.titleCtx,
|
||||
SEGMENTED_TO_VIRTUAL(gBarinadeTitleCardTex), 160, 180, 128, 40, true);
|
||||
SEGMENTED_TO_VIRTUAL(gBarinadeTitleCardENGTex), 160, 180, 128, 40, true);
|
||||
}
|
||||
|
||||
if (Rand_ZeroOne() < 0.1f) {
|
||||
|
@ -756,16 +756,16 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
|
||||
void EnBox_CreateExtraChestTextures() {
|
||||
if (hasCreatedRandoChestTextures) return;
|
||||
Gfx gTreasureChestChestTextures[] = {
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gSkullTreasureChestFrontTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gGoldTreasureChestFrontTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gGoldTreasureChestSideAndTopTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gKeyTreasureChestFrontTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gKeyTreasureChestSideAndTopTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasRedTreasureChestFrontTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasRedTreasureChestSideAndTopTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasGreenTreasureChestFrontTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasGreenTreasureChestSideAndTopTex", false)),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gSkullTreasureChestFrontTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gGoldTreasureChestFrontTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gGoldTreasureChestSideAndTopTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gKeyTreasureChestFrontTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gKeyTreasureChestSideAndTopTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gChristmasRedTreasureChestFrontTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gChristmasRedTreasureChestSideAndTopTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gChristmasGreenTreasureChestFrontTex"),
|
||||
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, "__OTR__objects/object_box/gChristmasGreenTreasureChestSideAndTopTex"),
|
||||
};
|
||||
|
||||
Gfx* frontCmd = ResourceMgr_LoadGfxByName(gTreasureChestChestFrontDL);
|
||||
@ -839,7 +839,7 @@ void EnBox_CreateExtraChestTextures() {
|
||||
gChristmasGreenTreasureChestChestSideAndLidDL[29] = gTreasureChestChestTextures[9];
|
||||
gChristmasGreenTreasureChestChestSideAndLidDL[45] = gTreasureChestChestTextures[8];
|
||||
|
||||
ResourceMgr_ListFiles("assets/objects/object_box/gChristmas*", &hasChristmasChestTexturesAvailable);
|
||||
ResourceMgr_ListFiles("objects/object_box/gChristmas*", &hasChristmasChestTexturesAvailable);
|
||||
hasCreatedRandoChestTextures = 1;
|
||||
}
|
||||
|
||||
|
@ -96,7 +96,7 @@ static u16 sVerticesMap[GANON_MANT_NUM_STRANDS * GANON_MANT_NUM_JOINTS] = {
|
||||
#define MANT_TEX_WIDTH 32
|
||||
#define MANT_TEX_HEIGHT 64
|
||||
|
||||
//static u64 sForceAlignment = 0;
|
||||
static u8 sMaskTex[MANT_TEX_WIDTH * MANT_TEX_HEIGHT] = { {0} };
|
||||
|
||||
#include "overlays/ovl_En_Ganon_Mant/ovl_En_Ganon_Mant.h"
|
||||
|
||||
@ -104,6 +104,12 @@ void EnGanonMant_Init(Actor* thisx, PlayState* play) {
|
||||
EnGanonMant* this = (EnGanonMant*)thisx;
|
||||
|
||||
this->actor.flags &= ~ACTOR_FLAG_0;
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sMaskTex); i++) {
|
||||
sMaskTex[i] = 0;
|
||||
}
|
||||
|
||||
Gfx_RegisterBlendedTexture(gMantTex, sMaskTex, NULL);
|
||||
}
|
||||
|
||||
void EnGanonMant_Destroy(Actor* thisx, PlayState* play) {
|
||||
@ -127,8 +133,6 @@ void EnGanonMant_Tear(EnGanonMant* this) {
|
||||
s16 count = shape->count;
|
||||
s16* tearAreaSizes = shape->tearAreaSizes;
|
||||
|
||||
u8* gMantTexProper = GetResourceDataByName(gMantTex, false);
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if ((0 <= tx && tx < MANT_TEX_WIDTH) && (0 <= ty && ty < MANT_TEX_HEIGHT)) {
|
||||
for (areaX = 0; areaX <= tearAreaSizes[i]; areaX++) {
|
||||
@ -136,7 +140,7 @@ void EnGanonMant_Tear(EnGanonMant* this) {
|
||||
for (areaY = 0; areaY <= tearAreaSizes[i]; areaY++) {
|
||||
texIdx = (s16)((s16)tx + ((s16)ty * MANT_TEX_WIDTH)) + ((s16)areaX + ((s16)areaY * MANT_TEX_WIDTH));
|
||||
if (texIdx < MANT_TEX_WIDTH * MANT_TEX_HEIGHT) {
|
||||
((u16*)gMantTexProper)[texIdx] = 0;
|
||||
sMaskTex[texIdx] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -365,8 +369,8 @@ void EnGanonMant_DrawCloak(PlayState* play, EnGanonMant* this) {
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
// Invalidate cape texture as it may have been torn
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, gMantTex);
|
||||
// Invalidate cape texture mask as it may have been torn
|
||||
gSPInvalidateTexCache(POLY_OPA_DISP++, sMaskTex);
|
||||
|
||||
Matrix_Translate(0.0f, 0.0f, 0.0f, MTXMODE_NEW);
|
||||
|
||||
@ -379,9 +383,9 @@ void EnGanonMant_DrawCloak(PlayState* play, EnGanonMant* this) {
|
||||
// set vertices, vertices are double buffered to prevent
|
||||
// modification of vertices as they are being drawn
|
||||
if (this->frameTimer % 2 != 0) {
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, gMant1Vtx);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, gMant1Vtx);
|
||||
} else {
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, gMant2Vtx);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, gMant2Vtx);
|
||||
}
|
||||
|
||||
// draw cloak
|
||||
|
@ -644,7 +644,7 @@ void EnGoma_UpdateHit(EnGoma* this, PlayState* play) {
|
||||
this->hurtTimer = 8;
|
||||
}
|
||||
} else {
|
||||
swordDamage = CollisionCheck_GetSwordDamage(dmgFlags);
|
||||
swordDamage = CollisionCheck_GetSwordDamage(dmgFlags, play);
|
||||
|
||||
if (swordDamage) {
|
||||
EffectSsSibuki_SpawnBurst(play, &this->actor.focus.pos);
|
||||
|
@ -418,15 +418,15 @@ void EnJsjutan_Draw(Actor* thisx, PlayState* play2) {
|
||||
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
|
||||
// Draws the carpet's shadow texture.
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, sShadowTex);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, sShadowTex);
|
||||
gSPDisplayList(POLY_OPA_DISP++, sShadowMaterialDL);
|
||||
gDPPipeSync(POLY_OPA_DISP++);
|
||||
|
||||
// Draws the carpet's shadow vertices. Swaps them between frames to get a smoother result.
|
||||
if (play->gameplayFrames % 2 != 0) {
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, gShadowOddVtx);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, gShadowOddVtx);
|
||||
} else {
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, sShadowEvenVtx);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, sShadowEvenVtx);
|
||||
}
|
||||
gSPDisplayList(POLY_OPA_DISP++, sModelDL);
|
||||
|
||||
@ -443,9 +443,9 @@ void EnJsjutan_Draw(Actor* thisx, PlayState* play2) {
|
||||
|
||||
// Draws the carpet vertices.
|
||||
if (play->gameplayFrames % 2 != 0) {
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, sCarpetOddVtx);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, sCarpetOddVtx);
|
||||
} else {
|
||||
gSPSegment(POLY_OPA_DISP++, 0x0C, sCarpetEvenVtx);
|
||||
gSPSegmentLoadRes(POLY_OPA_DISP++, 0x0C, sCarpetEvenVtx);
|
||||
}
|
||||
gSPDisplayList(POLY_OPA_DISP++, sModelDL);
|
||||
|
||||
|
@ -572,51 +572,21 @@ void EnMag_DrawImageRGBA32(Gfx** gfxp, s16 centerX, s16 centerY, const char* sou
|
||||
s32 pad;
|
||||
s32 i;
|
||||
|
||||
source = GetResourceDataByName(source, false);
|
||||
|
||||
Gfx_SetupDL_56Ptr(&gfx);
|
||||
|
||||
curTexture = source;
|
||||
rectLeft = centerX - (width / 2);
|
||||
rectTop = centerY - (height / 2);
|
||||
textureHeight = 4096 / (width << 2);
|
||||
remainingSize = (width * height) << 2;
|
||||
textureSize = (width * textureHeight) << 2;
|
||||
textureCount = remainingSize / textureSize;
|
||||
if ((remainingSize % textureSize) != 0) {
|
||||
textureCount += 1;
|
||||
}
|
||||
|
||||
gDPSetTileCustom(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, textureHeight, 0, G_TX_NOMIRROR | G_TX_CLAMP,
|
||||
gDPSetTileCustom(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, height, 0, G_TX_NOMIRROR | G_TX_CLAMP,
|
||||
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||
|
||||
remainingSize -= textureSize;
|
||||
|
||||
for (i = 0; i < textureCount; i++) {
|
||||
gDPSetTextureImage(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, curTexture);
|
||||
gDPSetTextureImage(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, source);
|
||||
|
||||
gDPLoadSync(gfx++);
|
||||
gDPLoadTile(gfx++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2);
|
||||
gDPLoadTile(gfx++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (height - 1) << 2);
|
||||
|
||||
gSPTextureRectangle(gfx++, rectLeft << 2, rectTop << 2, (rectLeft + (s32)width) << 2,
|
||||
(rectTop + textureHeight) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
|
||||
|
||||
curTexture += textureSize;
|
||||
rectTop += textureHeight;
|
||||
|
||||
if ((remainingSize - textureSize) < 0) {
|
||||
if (remainingSize > 0) {
|
||||
textureHeight = remainingSize / (s32)(width << 2);
|
||||
remainingSize -= textureSize;
|
||||
|
||||
gDPSetTileCustom(gfx++, G_IM_FMT_RGBA, G_IM_SIZ_32b, width, textureHeight, 0,
|
||||
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK,
|
||||
G_TX_NOLOD, G_TX_NOLOD);
|
||||
}
|
||||
} else {
|
||||
remainingSize -= textureSize;
|
||||
}
|
||||
}
|
||||
(rectTop + height) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
|
||||
|
||||
*gfxp = gfx;
|
||||
}
|
||||
|
878
soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c
Normal file
878
soh/src/overlays/actors/ovl_En_Partner/z_en_partner.c
Normal file
@ -0,0 +1,878 @@
|
||||
/*
|
||||
* File: z_en_partner.c
|
||||
* Overlay: ovl_En_Partner
|
||||
* Description: Navi Coop Partner
|
||||
*/
|
||||
|
||||
#include "z_en_partner.h"
|
||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||
#include <overlays/actors/ovl_En_Arrow/z_en_arrow.h>
|
||||
#include "overlays/actors/ovl_En_Si/z_en_si.h"
|
||||
#include <objects/object_link_child/object_link_child.h>
|
||||
#include <overlays/actors/ovl_En_Bom/z_en_bom.h>
|
||||
#include <overlays/actors/ovl_Obj_Switch/z_obj_switch.h>
|
||||
|
||||
#define FLAGS (ACTOR_FLAG_4 | ACTOR_FLAG_5 | ACTOR_FLAG_10 | ACTOR_FLAG_26)
|
||||
|
||||
void EnPartner_Init(Actor* thisx, PlayState* play);
|
||||
void EnPartner_Destroy(Actor* thisx, PlayState* play);
|
||||
void EnPartner_Update(Actor* thisx, PlayState* play);
|
||||
void EnPartner_Draw(Actor* thisx, PlayState* play);
|
||||
void EnPartner_SpawnSparkles(EnPartner* this, PlayState* play, s32 sparkleLife);
|
||||
|
||||
const ActorInit En_Partner_InitVars = {
|
||||
ACTOR_EN_PARTNER,
|
||||
ACTORCAT_ITEMACTION,
|
||||
FLAGS,
|
||||
OBJECT_GAMEPLAY_KEEP,
|
||||
sizeof(EnPartner),
|
||||
(ActorFunc)EnPartner_Init,
|
||||
(ActorFunc)EnPartner_Destroy,
|
||||
(ActorFunc)EnPartner_Update,
|
||||
(ActorFunc)EnPartner_Draw,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static InitChainEntry sInitChain[] = {
|
||||
ICHAIN_VEC3F_DIV1000(scale, 8, ICHAIN_STOP),
|
||||
};
|
||||
|
||||
static Color_RGBAf sInnerColors[] = {
|
||||
{ 255.0f, 255.0f, 255.0f, 255.0f },
|
||||
};
|
||||
|
||||
static Color_RGBAf sOuterColors[] = {
|
||||
{ 0.0f, 255.0f, 0.0f, 255.0f },
|
||||
};
|
||||
|
||||
static ColliderCylinderInit sCylinderInit = {
|
||||
{
|
||||
COLTYPE_NONE,
|
||||
AT_ON | AT_TYPE_PLAYER,
|
||||
AC_ON | AC_TYPE_PLAYER,
|
||||
OC1_ON | OC1_TYPE_ALL,
|
||||
OC2_TYPE_2,
|
||||
COLSHAPE_CYLINDER,
|
||||
},
|
||||
{
|
||||
ELEMTYPE_UNK0,
|
||||
{ 0x00020002, 0x00, 0x01 },
|
||||
{ 0x4FC00748, 0x00, 0x00 },
|
||||
TOUCH_ON | TOUCH_SFX_NORMAL,
|
||||
BUMP_ON,
|
||||
OCELEM_ON,
|
||||
},
|
||||
{ 12, 27, 0, { 0, 0, 0 } },
|
||||
};
|
||||
|
||||
static CollisionCheckInfoInit sCCInfoInit = { 0, 12, 60, MASS_HEAVY };
|
||||
|
||||
void EnPartner_Init(Actor* thisx, PlayState* play) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
s32 pad;
|
||||
Player* player = GET_PLAYER(play);
|
||||
s32 i;
|
||||
|
||||
this->usedItem = 0xFF;
|
||||
this->canMove = 1;
|
||||
this->shouldDraw = 1;
|
||||
this->hookshotTarget = NULL;
|
||||
GET_PLAYER(play)->ivanFloating = 0;
|
||||
|
||||
this->innerColor.r = 255.0f;
|
||||
this->innerColor.g = 255.0f;
|
||||
this->innerColor.b = 255.0f;
|
||||
this->innerColor.a = 255.0f;
|
||||
|
||||
this->outerColor.r = 0.0f;
|
||||
this->outerColor.g = 255.0f;
|
||||
this->outerColor.b = 0.0f;
|
||||
this->outerColor.a = 255.0f;
|
||||
|
||||
this->usedItemButton = 0xFF;
|
||||
|
||||
Collider_InitCylinder(play, &this->collider);
|
||||
Collider_SetCylinder(play, &this->collider, &this->actor, &sCylinderInit);
|
||||
Collider_UpdateCylinder(&this->actor, &this->collider);
|
||||
CollisionCheck_SetInfo(&this->actor.colChkInfo, NULL, &sCCInfoInit);
|
||||
this->actor.colChkInfo.mass = MASS_HEAVY;
|
||||
this->collider.base.ocFlags1 |= OC1_TYPE_PLAYER;
|
||||
this->collider.info.toucher.damage = 1;
|
||||
GET_PLAYER(play)->ivanDamageMultiplier = 1;
|
||||
|
||||
Actor_ProcessInitChain(thisx, sInitChain);
|
||||
SkelAnime_Init(play, &this->skelAnime, &gFairySkel, &gFairyAnim, this->jointTable, this->morphTable, 15);
|
||||
ActorShape_Init(&thisx->shape, 1000.0f, ActorShadow_DrawCircle, 15.0f);
|
||||
thisx->shape.shadowAlpha = 0xFF;
|
||||
|
||||
Lights_PointGlowSetInfo(&this->lightInfoGlow, thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, 200, 255,
|
||||
200, 0);
|
||||
this->lightNodeGlow = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfoGlow);
|
||||
|
||||
Lights_PointNoGlowSetInfo(&this->lightInfoNoGlow, thisx->world.pos.x, thisx->world.pos.y, thisx->world.pos.z, 200,
|
||||
255, 200, 0);
|
||||
this->lightNodeNoGlow = LightContext_InsertLight(play, &play->lightCtx, &this->lightInfoNoGlow);
|
||||
|
||||
thisx->room = -1;
|
||||
}
|
||||
|
||||
void EnPartner_Destroy(Actor* thisx, PlayState* play) {
|
||||
s32 pad;
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
LightContext_RemoveLight(play, &play->lightCtx, this->lightNodeGlow);
|
||||
LightContext_RemoveLight(play, &play->lightCtx, this->lightNodeNoGlow);
|
||||
|
||||
Collider_DestroyCylinder(play, &this->collider);
|
||||
}
|
||||
|
||||
void EnPartner_UpdateLights(EnPartner* this, PlayState* play) {
|
||||
s16 glowLightRadius = 100;
|
||||
s16 lightRadius = 200;
|
||||
|
||||
if (this->shouldDraw == 0) {
|
||||
glowLightRadius = 0;
|
||||
lightRadius = 0;
|
||||
}
|
||||
|
||||
Player* player;
|
||||
|
||||
player = GET_PLAYER(play);
|
||||
Lights_PointNoGlowSetInfo(&this->lightInfoNoGlow, player->actor.world.pos.x, (s16)(player->actor.world.pos.y) + 69,
|
||||
player->actor.world.pos.z, 200, 255, 200, lightRadius);
|
||||
|
||||
Lights_PointGlowSetInfo(&this->lightInfoGlow, this->actor.world.pos.x, this->actor.world.pos.y + 9,
|
||||
this->actor.world.pos.z, 200, 255, 200, glowLightRadius);
|
||||
|
||||
Actor_SetScale(&this->actor, this->actor.scale.x);
|
||||
}
|
||||
|
||||
void EnPartner_SpawnSparkles(EnPartner* this, PlayState* play, s32 sparkleLife) {
|
||||
static Vec3f sparkleVelocity = { 0.0f, -0.05f, 0.0f };
|
||||
static Vec3f sparkleAccel = { 0.0f, -0.025f, 0.0f };
|
||||
s32 pad;
|
||||
Vec3f sparklePos;
|
||||
Color_RGBA8 primColor;
|
||||
Color_RGBA8 envColor;
|
||||
|
||||
sparklePos.x = Rand_CenteredFloat(6.0f) + this->actor.world.pos.x;
|
||||
sparklePos.y = (Rand_ZeroOne() * 6.0f) + this->actor.world.pos.y + 5;
|
||||
sparklePos.z = Rand_CenteredFloat(6.0f) + this->actor.world.pos.z;
|
||||
|
||||
primColor.r = this->innerColor.r;
|
||||
primColor.g = this->innerColor.g;
|
||||
primColor.b = this->innerColor.b;
|
||||
|
||||
envColor.r = this->outerColor.r;
|
||||
envColor.g = this->outerColor.g;
|
||||
envColor.b = this->outerColor.b;
|
||||
|
||||
EffectSsKiraKira_SpawnDispersed(play, &sparklePos, &sparkleVelocity, &sparkleAccel, &primColor, &envColor,
|
||||
1500, sparkleLife);
|
||||
}
|
||||
|
||||
Vec3f Vec3fNormalize(Vec3f vec) {
|
||||
f32 norm = sqrt((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));
|
||||
|
||||
if (norm != 0.0f) {
|
||||
vec.x /= norm;
|
||||
vec.y /= norm;
|
||||
vec.z /= norm;
|
||||
} else {
|
||||
vec.x = vec.y = vec.z = 0.0f;
|
||||
}
|
||||
|
||||
return vec;
|
||||
}
|
||||
|
||||
void CenterIvanOnLink(Actor* thisx, PlayState* play) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
this->actor.world.pos = GET_PLAYER(play)->actor.world.pos;
|
||||
this->actor.world.pos.y += Player_GetHeight(GET_PLAYER(play)) + 5.0f;
|
||||
}
|
||||
|
||||
static u8 magicArrowCosts[] = { 0, 4, 4, 8 };
|
||||
|
||||
void UseBow(Actor* thisx, PlayState* play, u8 started, u8 arrowType) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (started == 1) {
|
||||
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
|
||||
this->canMove = 0;
|
||||
} else if (started == 0) {
|
||||
if (this->itemTimer <= 0) {
|
||||
if (AMMO(ITEM_BOW) > 0) {
|
||||
if (arrowType >= 1 && !func_80087708(play, magicArrowCosts[arrowType], 0)) {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
this->canMove = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
this->itemTimer = 10;
|
||||
|
||||
Actor* newarrow = Actor_SpawnAsChild(
|
||||
&play->actorCtx, &this->actor, play, ACTOR_EN_ARROW, this->actor.world.pos.x,
|
||||
this->actor.world.pos.y + 7, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, ARROW_NORMAL);
|
||||
|
||||
switch (arrowType) {
|
||||
case 1:
|
||||
newarrow->params = ARROW_FIRE;
|
||||
break;
|
||||
case 2:
|
||||
newarrow->params = ARROW_ICE;
|
||||
break;
|
||||
case 3:
|
||||
newarrow->params = ARROW_LIGHT;
|
||||
break;
|
||||
}
|
||||
|
||||
GET_PLAYER(play)->unk_A73 = 4;
|
||||
newarrow->parent = NULL;
|
||||
Inventory_ChangeAmmo(ITEM_BOW, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseSlingshot(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (started == 1) {
|
||||
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
|
||||
this->canMove = 0;
|
||||
} else if (started == 0) {
|
||||
if (this->itemTimer <= 0) {
|
||||
if (AMMO(ITEM_SLINGSHOT) > 0) {
|
||||
this->itemTimer = 10;
|
||||
Actor* newarrow = Actor_SpawnAsChild(
|
||||
&play->actorCtx, &this->actor, play, ACTOR_EN_ARROW, this->actor.world.pos.x,
|
||||
this->actor.world.pos.y + 7, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, ARROW_SEED);
|
||||
GET_PLAYER(play)->unk_A73 = 4;
|
||||
newarrow->parent = NULL;
|
||||
Inventory_ChangeAmmo(ITEM_SLINGSHOT, -1);
|
||||
} else {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseBombs(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
if (AMMO(ITEM_BOMB) > 0 && play->actorCtx.actorLists[ACTORCAT_EXPLOSIVE].length < 3) {
|
||||
this->itemTimer = 10;
|
||||
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y + 7,
|
||||
this->actor.world.pos.z, 0, 0, 0, 0, false);
|
||||
Inventory_ChangeAmmo(ITEM_BOMB, -1);
|
||||
} else {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Vec3f D_80854A40 = { 0.0f, 40.0f, 45.0f };
|
||||
|
||||
void UseHammer(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
this->itemTimer = 10;
|
||||
static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
|
||||
Vec3f shockwavePos = this->actor.world.pos;
|
||||
|
||||
func_808429B4(play, 27767, 7, 20);
|
||||
func_8002F7DC(&this->actor, NA_SE_IT_HAMMER_HIT);
|
||||
|
||||
EffectSsBlast_SpawnWhiteShockwave(play, &shockwavePos, &zeroVec, &zeroVec);
|
||||
|
||||
if (this->actor.xzDistToPlayer < 100.0f && this->actor.yDistToPlayer < 35.0f) {
|
||||
func_8002F71C(play, &this->actor, 8.0f, this->actor.yawTowardsPlayer, 8.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseBombchus(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
if (AMMO(ITEM_BOMBCHU) > 0) {
|
||||
this->itemTimer = 10;
|
||||
EnBom* bomb = Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x, this->actor.world.pos.y + 7,
|
||||
this->actor.world.pos.z, 0, 0, 0, 0, false);
|
||||
bomb->timer = 0;
|
||||
Inventory_ChangeAmmo(ITEM_BOMBCHU, -1);
|
||||
} else {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static Vec3f D_808547A4 = { 0.0f, 0.5f, 0.0f };
|
||||
static Vec3f D_808547B0 = { 0.0f, 0.5f, 0.0f };
|
||||
|
||||
static Color_RGBA8 D_808547BC = { 255, 255, 100, 255 };
|
||||
static Color_RGBA8 D_808547C0 = { 255, 50, 0, 0 };
|
||||
|
||||
void UseDekuStick(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
if (AMMO(ITEM_STICK) > 0) {
|
||||
func_808328EC(this, NA_SE_EV_FLAME_IGNITION);
|
||||
} else {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
if (started == 2) {
|
||||
if (AMMO(ITEM_STICK) > 0) {
|
||||
this->stickWeaponInfo.tip = this->actor.world.pos;
|
||||
this->stickWeaponInfo.tip.y += 7.0f;
|
||||
|
||||
func_8002836C(play, &this->stickWeaponInfo.tip, &D_808547A4, &D_808547B0, &D_808547BC, &D_808547C0,
|
||||
200.0f, 0, 8);
|
||||
|
||||
CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base);
|
||||
|
||||
if (this->damageTimer <= 0) {
|
||||
Inventory_ChangeAmmo(ITEM_STICK, -1);
|
||||
this->damageTimer = 20;
|
||||
} else {
|
||||
this->damageTimer--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseNuts(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
if (AMMO(ITEM_NUT) > 0) {
|
||||
this->itemTimer = 10;
|
||||
Actor_Spawn(&play->actorCtx, play, ACTOR_EN_ARROW, this->actor.world.pos.x, this->actor.world.pos.y + 7,
|
||||
this->actor.world.pos.z, 0x1000, this->actor.world.rot.y, 0, ARROW_NUT, false);
|
||||
Inventory_ChangeAmmo(ITEM_NUT, -1);
|
||||
} else {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseHookshot(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
|
||||
this->canMove = 0;
|
||||
this->hookshotTarget =
|
||||
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_OBJ_HSBLOCK, this->actor.world.pos.x,
|
||||
this->actor.world.pos.y + 7.5f, this->actor.world.pos.z, this->actor.world.rot.x,
|
||||
this->actor.world.rot.y, this->actor.world.rot.z, 2);
|
||||
this->hookshotTarget->scale.x = 0.05f;
|
||||
this->hookshotTarget->scale.y = 0.05f;
|
||||
this->hookshotTarget->scale.z = 0.05f;
|
||||
} else if (started == 0) {
|
||||
Actor_Kill(this->hookshotTarget);
|
||||
this->hookshotTarget = NULL;
|
||||
func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
|
||||
this->canMove = 1;
|
||||
} else if (started == 2) {
|
||||
this->hookshotTarget->shape.rot.y = this->actor.world.rot.y;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseOcarina(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
Audio_PlaySoundTransposed(&this->actor.projectedPos, NA_SE_VO_NA_HELLO_2, -6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseBoomerang(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
this->itemTimer = 20;
|
||||
spawn_boomerang_ivan(&this->actor, play);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseLens(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
func_80078884(NA_SE_SY_GLASSMODE_ON);
|
||||
this->shouldDraw = 0;
|
||||
}
|
||||
|
||||
if (started == 0) {
|
||||
func_80078884(NA_SE_SY_GLASSMODE_OFF);
|
||||
this->shouldDraw = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseBeans(Actor* thisx, PlayState* play, u8 started) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->itemTimer <= 0) {
|
||||
if (started == 1) {
|
||||
this->entry = ItemTable_Retrieve(GI_BEAN);
|
||||
if (play->actorCtx.titleCtx.alpha <= 0) {
|
||||
if (gSaveContext.rupees >= 100 && GiveItemEntryWithoutActor(play, this->entry)) {
|
||||
Rupees_ChangeBy(-100);
|
||||
} else {
|
||||
func_80078884(NA_SE_SY_ERROR);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseSpell(Actor* thisx, PlayState* play, u8 started, u8 spellType) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (gSaveContext.magic > 0) {
|
||||
if (this->itemTimer <= 0 && this->usedSpell == 0) {
|
||||
if (started == 1) {
|
||||
this->usedSpell = spellType;
|
||||
}
|
||||
}
|
||||
|
||||
if (started == 0 && this->usedSpell != 0) {
|
||||
this->itemTimer = 10;
|
||||
gSaveContext.magicState = 5;
|
||||
|
||||
switch (this->usedSpell) {
|
||||
case 1:
|
||||
GET_PLAYER(play)->ivanDamageMultiplier = 1;
|
||||
break;
|
||||
case 3:
|
||||
GET_PLAYER(play)->ivanFloating = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
this->usedSpell = 0;
|
||||
}
|
||||
|
||||
if (started == 2) {
|
||||
if (this->usedSpell != 0) {
|
||||
Vec3f spE4[3];
|
||||
Vec3f newBasePos[3];
|
||||
|
||||
switch (this->usedSpell) {
|
||||
case 1: //Din's
|
||||
GET_PLAYER(play)->ivanDamageMultiplier = 2;
|
||||
break;
|
||||
case 2: //Nayru's
|
||||
GET_PLAYER(play)->invincibilityTimer = -10;
|
||||
break;
|
||||
case 3: //Farore's
|
||||
GET_PLAYER(play)->hoverBootsTimer = 10;
|
||||
GET_PLAYER(play)->ivanFloating = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
gSaveContext.magicState = 3;
|
||||
this->magicTimer--;
|
||||
if (this->magicTimer <= 0) {
|
||||
gSaveContext.magic--;
|
||||
this->magicTimer = 20;
|
||||
if (gSaveContext.magic <= 0) {
|
||||
gSaveContext.magic = 0;
|
||||
|
||||
this->itemTimer = 10;
|
||||
this->usedSpell = 0;
|
||||
gSaveContext.magicState = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UseItem(uint8_t usedItem, u8 started, Actor* thisx, PlayState* play) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (this->usedItem != 0xFF && this->itemTimer <= 0) {
|
||||
switch (usedItem) {
|
||||
case SLOT_STICK:
|
||||
UseDekuStick(this, play, started);
|
||||
break;
|
||||
case SLOT_BOMB:
|
||||
UseBombs(this, play, started);
|
||||
break;
|
||||
case SLOT_BOMBCHU:
|
||||
UseBombchus(this, play, started);
|
||||
break;
|
||||
case SLOT_NUT:
|
||||
UseNuts(this, play, started);
|
||||
break;
|
||||
case SLOT_BOW:
|
||||
UseBow(this, play, started, 0);
|
||||
break;
|
||||
case SLOT_ARROW_FIRE:
|
||||
UseBow(this, play, started, 1);
|
||||
break;
|
||||
case SLOT_ARROW_ICE:
|
||||
UseBow(this, play, started, 2);
|
||||
break;
|
||||
case SLOT_ARROW_LIGHT:
|
||||
UseBow(this, play, started, 3);
|
||||
break;
|
||||
case SLOT_SLINGSHOT:
|
||||
UseSlingshot(this, play, started);
|
||||
break;
|
||||
case SLOT_OCARINA:
|
||||
UseOcarina(this, play, started);
|
||||
break;
|
||||
case SLOT_HOOKSHOT:
|
||||
UseHookshot(this, play, started);
|
||||
break;
|
||||
case SLOT_DINS_FIRE:
|
||||
UseSpell(this, play, started, 1);
|
||||
break;
|
||||
case SLOT_NAYRUS_LOVE:
|
||||
UseSpell(this, play, started, 2);
|
||||
break;
|
||||
case SLOT_FARORES_WIND:
|
||||
UseSpell(this, play, started, 3);
|
||||
break;
|
||||
case SLOT_HAMMER:
|
||||
UseHammer(this, play, started);
|
||||
break;
|
||||
case SLOT_BOOMERANG:
|
||||
UseBoomerang(this, play, started);
|
||||
break;
|
||||
case SLOT_LENS:
|
||||
UseLens(this, play, started);
|
||||
break;
|
||||
case SLOT_BEAN:
|
||||
UseBeans(this, play, started);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (started == 0) {
|
||||
this->usedItem = 0xFF;
|
||||
}
|
||||
}
|
||||
|
||||
void EnPartner_Update(Actor* thisx, PlayState* play) {
|
||||
s32 pad;
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
Input sControlInput = play->state.input[this->actor.params];
|
||||
|
||||
f32 relX = sControlInput.cur.stick_x / 10.0f;
|
||||
f32 relY = sControlInput.cur.stick_y / 10.0f;
|
||||
|
||||
Vec3f camForward = { GET_ACTIVE_CAM(play)->at.x - GET_ACTIVE_CAM(play)->eye.x, 0.0f,
|
||||
GET_ACTIVE_CAM(play)->at.z - GET_ACTIVE_CAM(play)->eye.z };
|
||||
camForward = Vec3fNormalize(camForward);
|
||||
|
||||
Vec3f camRight = { -camForward.z, 0.0f, camForward.x };
|
||||
|
||||
this->actor.velocity.x = 0;
|
||||
this->actor.velocity.y = 0;
|
||||
this->actor.velocity.z = 0;
|
||||
|
||||
this->actor.velocity.x += camRight.x * relX;
|
||||
this->actor.velocity.z += camRight.z * relX;
|
||||
this->actor.velocity.x += camForward.x * relY;
|
||||
this->actor.velocity.z += camForward.z * relY;
|
||||
|
||||
if (this->actor.velocity.x != 0 || this->actor.velocity.z != 0) {
|
||||
int16_t finalDir = Math_Atan2S(-this->actor.velocity.x, this->actor.velocity.z) - 0x4000;
|
||||
Math_SmoothStepToS(&this->actor.world.rot.y, finalDir, 2, 10000, 0);
|
||||
Math_SmoothStepToS(&this->actor.shape.rot.y, finalDir, 2, 10000, 0);
|
||||
}
|
||||
|
||||
if (!this->canMove) {
|
||||
relX = 0;
|
||||
relY = 0;
|
||||
}
|
||||
|
||||
Math_SmoothStepToF(&this->actor.speedXZ, sqrtf(SQ(relX) + SQ(relY)), 1.0f, 1.3f, 0.0f);
|
||||
|
||||
if (this->shouldDraw == 1) {
|
||||
thisx->shape.shadowAlpha = 0xFF;
|
||||
EnPartner_SpawnSparkles(this, play, 12);
|
||||
} else {
|
||||
thisx->shape.shadowAlpha = 0;
|
||||
}
|
||||
|
||||
if (CHECK_BTN_ALL(sControlInput.cur.button, BTN_A) && this->canMove) {
|
||||
Math_SmoothStepToF(&this->yVelocity, 6.0f, 1.0f, 1.5f, 0.0f);
|
||||
} else if (CHECK_BTN_ALL(sControlInput.cur.button, BTN_B) && this->canMove) {
|
||||
Math_SmoothStepToF(&this->yVelocity, -6.0f, 1.0f, 1.5f, 0.0f);
|
||||
} else {
|
||||
Math_SmoothStepToF(&this->yVelocity, 0.0f, 1.0f, 1.5f, 0.0f);
|
||||
}
|
||||
|
||||
this->actor.gravity = this->yVelocity;
|
||||
|
||||
if (this->canMove == 1) {
|
||||
Actor_MoveForward(&this->actor);
|
||||
Actor_UpdateBgCheckInfo(play, &this->actor, 19.0f, 20.0f, 0.0f, 5);
|
||||
}
|
||||
|
||||
if (this->usedSpell != 0) {
|
||||
func_8002F974(thisx, NA_SE_PL_MAGIC_SOUL_NORMAL - SFX_FLAG);
|
||||
}
|
||||
|
||||
if (!Player_InCsMode(play)) {
|
||||
// Collect drops & rupees
|
||||
Actor* itemActor = play->actorCtx.actorLists[ACTORCAT_MISC].head;
|
||||
while (itemActor != NULL) {
|
||||
if (itemActor->id == ACTOR_EN_ITEM00) {
|
||||
if (itemActor->params == ITEM00_RUPEE_GREEN || itemActor->params == ITEM00_RUPEE_BLUE ||
|
||||
itemActor->params == ITEM00_RUPEE_RED || itemActor->params == ITEM00_RUPEE_PURPLE ||
|
||||
itemActor->params == ITEM00_RUPEE_ORANGE || itemActor->params == ITEM00_HEART ||
|
||||
itemActor->params == ITEM00_BOMBS_A || itemActor->params == ITEM00_BOMBS_B ||
|
||||
itemActor->params == ITEM00_ARROWS_SINGLE || itemActor->params == ITEM00_ARROWS_SMALL ||
|
||||
itemActor->params == ITEM00_ARROWS_MEDIUM || itemActor->params == ITEM00_ARROWS_LARGE ||
|
||||
itemActor->params == ITEM00_BOMBCHU || itemActor->params == ITEM00_MAGIC_SMALL ||
|
||||
itemActor->params == ITEM00_MAGIC_LARGE || itemActor->params == ITEM00_NUTS ||
|
||||
itemActor->params == ITEM00_STICK) {
|
||||
f32 distanceToObject = Actor_WorldDistXYZToActor(&this->actor, itemActor);
|
||||
if (distanceToObject <= 20.0f) {
|
||||
itemActor->world.pos = GET_PLAYER(play)->actor.world.pos;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
itemActor = itemActor->next;
|
||||
}
|
||||
|
||||
itemActor = play->actorCtx.actorLists[ACTORCAT_ITEMACTION].head;
|
||||
while (itemActor != NULL) {
|
||||
if (itemActor->id == ACTOR_EN_SI) {
|
||||
f32 distanceToObject = Actor_WorldDistXYZToActor(&this->actor, itemActor);
|
||||
if (distanceToObject <= 20.0f) {
|
||||
EnSi* ensi = (EnSi*)itemActor;
|
||||
ensi->collider.base.ocFlags2 = OC2_HIT_PLAYER;
|
||||
break;
|
||||
}
|
||||
}
|
||||
itemActor = itemActor->next;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->itemTimer > 0) {
|
||||
this->itemTimer--;
|
||||
if (this->itemTimer <= 0) {
|
||||
this->canMove = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Player_InCsMode(play)) {
|
||||
uint8_t pressed = 0;
|
||||
uint8_t released = 0;
|
||||
uint8_t current = 0;
|
||||
|
||||
if (this->usedItem == 0xFF && this->itemTimer <= 0) {
|
||||
if (CHECK_BTN_ALL(sControlInput.press.button, BTN_CLEFT)) {
|
||||
this->usedItem = gSaveContext.equips.cButtonSlots[0];
|
||||
this->usedItemButton = 0;
|
||||
pressed = 1;
|
||||
} else if (CHECK_BTN_ALL(sControlInput.press.button, BTN_CDOWN)) {
|
||||
this->usedItem = gSaveContext.equips.cButtonSlots[1];
|
||||
this->usedItemButton = 1;
|
||||
pressed = 1;
|
||||
} else if (CHECK_BTN_ALL(sControlInput.press.button, BTN_CRIGHT)) {
|
||||
this->usedItem = gSaveContext.equips.cButtonSlots[2];
|
||||
this->usedItemButton = 2;
|
||||
pressed = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->usedItem != 0xFF) {
|
||||
if (CHECK_BTN_ALL(sControlInput.cur.button, BTN_CLEFT) && this->usedItemButton == 0) {
|
||||
current = 1;
|
||||
} else if (CHECK_BTN_ALL(sControlInput.cur.button, BTN_CDOWN) && this->usedItemButton == 1) {
|
||||
current = 1;
|
||||
} else if (CHECK_BTN_ALL(sControlInput.cur.button, BTN_CRIGHT) && this->usedItemButton == 2) {
|
||||
current = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->usedItem != 0xFF) {
|
||||
if (CHECK_BTN_ALL(sControlInput.rel.button, BTN_CLEFT) && this->usedItemButton == 0) {
|
||||
released = 1;
|
||||
} else if (CHECK_BTN_ALL(sControlInput.rel.button, BTN_CDOWN) && this->usedItemButton == 1) {
|
||||
released = 1;
|
||||
} else if (CHECK_BTN_ALL(sControlInput.rel.button, BTN_CRIGHT) && this->usedItemButton == 2) {
|
||||
released = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (pressed == 1) {
|
||||
UseItem(this->usedItem, 1, this, play);
|
||||
} else if (released == 1) {
|
||||
UseItem(this->usedItem, 0, this, play);
|
||||
this->usedItemButton = 0xFF;
|
||||
} else if (current == 1) {
|
||||
UseItem(this->usedItem, 2, this, play);
|
||||
}
|
||||
} else {
|
||||
UseItem(this->usedItem, 0, this, play);
|
||||
this->usedItem = 0xFF;
|
||||
this->itemTimer = 10;
|
||||
}
|
||||
|
||||
if (CHECK_BTN_ALL(sControlInput.press.button, BTN_Z) && this->canMove) {
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EV_FAIRY_DASH);
|
||||
}
|
||||
|
||||
if (CHECK_BTN_ALL(sControlInput.cur.button, BTN_Z) && this->canMove) {
|
||||
CenterIvanOnLink(this, play);
|
||||
} else if (this->canMove == 1 && this->hookshotTarget == NULL) {
|
||||
Collider_UpdateCylinder(&this->actor, &this->collider);
|
||||
CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base);
|
||||
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
|
||||
}
|
||||
|
||||
SkelAnime_Update(&this->skelAnime);
|
||||
|
||||
EnPartner_UpdateLights(this, play);
|
||||
}
|
||||
|
||||
s32 EnPartner_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx,
|
||||
Gfx** gfx) {
|
||||
static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f };
|
||||
s32 pad;
|
||||
f32 scale;
|
||||
Vec3f mtxMult;
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
|
||||
if (limbIndex == 8) {
|
||||
scale = ((Math_SinS(4096) * 0.1f) + 1.0f) * 0.012f;
|
||||
scale *= (this->actor.scale.x * 124.99999f);
|
||||
Matrix_MultVec3f(&zeroVec, &mtxMult);
|
||||
Matrix_Translate(mtxMult.x, mtxMult.y, mtxMult.z, MTXMODE_NEW);
|
||||
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void DrawOrb(Actor* thisx, PlayState* play, u8 color) {
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
Vec3f pos;
|
||||
Player* player = GET_PLAYER(play);
|
||||
s32 pad;
|
||||
f32 sp6C = play->state.frames & 0x1F;
|
||||
|
||||
pos = this->actor.world.pos;
|
||||
pos.y += 5.0f;
|
||||
|
||||
pos.x -= (this->actor.scale.x * 300.0f * Math_SinS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))) *
|
||||
Math_CosS(Camera_GetCamDirPitch(GET_ACTIVE_CAM(play))));
|
||||
pos.y -= (this->actor.scale.x * 300.0f * Math_SinS(Camera_GetCamDirPitch(GET_ACTIVE_CAM(play))));
|
||||
pos.z -= (this->actor.scale.x * 300.0f * Math_CosS(Camera_GetCamDirYaw(GET_ACTIVE_CAM(play))) *
|
||||
Math_CosS(Camera_GetCamDirPitch(GET_ACTIVE_CAM(play))));
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
|
||||
|
||||
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, 255);
|
||||
|
||||
switch (color) {
|
||||
case 1:
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 255);
|
||||
break;
|
||||
case 2:
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 255);
|
||||
break;
|
||||
case 3:
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, 0, 255, 0, 255);
|
||||
break;
|
||||
}
|
||||
|
||||
Matrix_Translate(pos.x, pos.y, pos.z, MTXMODE_NEW);
|
||||
Matrix_Scale(this->actor.scale.x * 3.0f, this->actor.scale.y * 3.0f, this->actor.scale.z * 3.0f, MTXMODE_APPLY);
|
||||
Matrix_Mult(&play->billboardMtxF, MTXMODE_APPLY);
|
||||
Matrix_Push();
|
||||
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
Matrix_RotateZ(sp6C * (M_PI / 32), MTXMODE_APPLY);
|
||||
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
|
||||
Matrix_Pop();
|
||||
Matrix_RotateZ(-sp6C * (M_PI / 32), MTXMODE_APPLY);
|
||||
gSPMatrix(POLY_XLU_DISP++, MATRIX_NEWMTX(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
|
||||
gSPDisplayList(POLY_XLU_DISP++, gEffFlash1DL);
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
}
|
||||
|
||||
|
||||
void EnPartner_Draw(Actor* thisx, PlayState* play) {
|
||||
s32 pad;
|
||||
f32 alphaScale;
|
||||
s32 envAlpha;
|
||||
EnPartner* this = (EnPartner*)thisx;
|
||||
s32 pad1;
|
||||
Gfx* dListHead;
|
||||
Player* player = GET_PLAYER(play);
|
||||
|
||||
if (play->pauseCtx.state != 0 && this->usedItem != 0xFF) {
|
||||
UseItem(this->usedItem, 0, this, play);
|
||||
this->usedItem = 0xFF;
|
||||
}
|
||||
|
||||
if (this->shouldDraw == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
dListHead = Graph_Alloc(play->state.gfxCtx, sizeof(Gfx) * 4);
|
||||
|
||||
OPEN_DISPS(play->state.gfxCtx);
|
||||
|
||||
Gfx_SetupDL_27Xlu(play->state.gfxCtx);
|
||||
|
||||
envAlpha = (50) & 0x1FF;
|
||||
envAlpha = (envAlpha > 255) ? 511 - envAlpha : envAlpha;
|
||||
|
||||
alphaScale = 1.0f;
|
||||
|
||||
gSPSegment(POLY_XLU_DISP++, 0x08, dListHead);
|
||||
gDPPipeSync(dListHead++);
|
||||
gDPSetPrimColor(dListHead++, 0, 0x01, (u8)this->innerColor.r, (u8)this->innerColor.g, (u8)this->innerColor.b,
|
||||
(u8)(this->innerColor.a * alphaScale));
|
||||
|
||||
gDPSetRenderMode(dListHead++, G_RM_PASS, G_RM_ZB_CLD_SURF2);
|
||||
|
||||
gSPEndDisplayList(dListHead++);
|
||||
gDPSetEnvColor(POLY_XLU_DISP++, (u8)this->outerColor.r, (u8)this->outerColor.g, (u8)this->outerColor.b,
|
||||
(u8)(envAlpha * alphaScale));
|
||||
POLY_XLU_DISP = SkelAnime_Draw(play, this->skelAnime.skeleton, this->skelAnime.jointTable,
|
||||
EnPartner_OverrideLimbDraw, NULL, this, POLY_XLU_DISP);
|
||||
|
||||
CLOSE_DISPS(play->state.gfxCtx);
|
||||
|
||||
if (this->usedSpell > 0) {
|
||||
DrawOrb(this, play, this->usedSpell);
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user