diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..03468a05c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,403 @@
+# Cache files
+__pycache__/
+.pyc
+.DS_Store
+
+# Text editor remnants
+.vscode/
+.vs/
+.idea/
+CMakeLists.txt
+cmake-build-debug
+venv/
+
+# Project-specific ignores
+build/
+expected/
+notes/
+baserom/
+docs/doxygen/
+*.elf
+*.sra
+*.z64
+*.n64
+*.v64
+*.map
+*.dump
+out.txt
+
+# Tool artifacts
+tools/mipspro7.2_compiler/
+tools/overlayhelpers/batchdisasm/output/*
+tools/overlayhelpers/batchdisasm/output2/*
+tools/overlayhelpers/batchdisasm/mipsdisasm/*
+tools/disasm/output/*
+tools/asmsplitter/asm/*
+tools/asmsplitter/c/*
+ctx.c
+tools/*dSYM/
+graphs/
+
+# Assets
+*.png
+*.jpg
+*.mdli
+*.anmi
+*.obj
+*.mtl
+*.fbx
+!*_custom*
+.extracted-assets.json
+
+# Docs
+!docs/tutorial/
+
+# Per-user configuration
+.python-version
+
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+**/Properties/launchSettings.json
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# JetBrains Rider
+.idea/
+*.sln.iml
+
+# CodeRush
+.cr/
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+*.out
+*.o
+*.d
+lib/libgfxd/libgfxd.a
+ExporterTest/ExporterTest.a
+ZAPDUtils/ZAPDUtils.a
+.vscode/
+build/
+external/
+ZAPDUtils/build/
+ZAPD/BuildInfo.h
+
+DebugObj/*
+ReleaseObj/*
\ No newline at end of file
diff --git a/BUILDING.md b/BUILDING.md
new file mode 100644
index 000000000..fe9b2c99b
--- /dev/null
+++ b/BUILDING.md
@@ -0,0 +1,53 @@
+# Building Ship of Harkinian
+
+## Windows
+
+ 1. Install [Python](https://www.python.org/ftp/python/3.10.2/python-3.10.2-amd64.exe)
+ 2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/)
+ 2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`.
+ 4. Clone the Ship of Harkinian repository.
+ 5. Place one or more [compatible](#compatible-roms) roms in the `OTRExporter` directory with namings of your choice.
+ 6. Run `OTRExporter/OTRExporter.sln`.
+ 7. Switch the solution to `Release x64`.
+ 8. Build the solution.
+ 9. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`.
+ 10. Run `soh/soh.sln`
+ 11. Switch the solution to `Release x86`.
+ 12. Build the solution.
+ 13. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`.
+ 14. Launch `soh.exe`.
+
+## Linux
+
+```bash
+# Clone the repo
+git clone git@github.com:HarbourMasters/ShipWright.git
+cd ShipWright
+# Copy the baserom to the soh folder
+cp .../baserom_non_mq.z64 soh
+# Build the docker image
+sudo docker build . -t soh
+# Run the docker image with the working directory mounted to /soh
+sudo docker run --rm -it -v $(pwd):/soh soh /bin/bash
+```
+Inside the Docker container:
+```bash
+# Clone and build StormLib
+git clone https://github.com/ladislav-zezula/StormLib external/StormLib
+cmake -B external/StormLib/build -S external/StormLib
+cmake --build external/StormLib/build
+cp external/StormLib/build/libstorm.a external
+cp /usr/local/lib/libGLEW.a external
+
+cd soh
+# Extract the assets/Compile the exporter/Run the exporter
+make setup -j$(nproc)
+# Compile the code
+make -j $(nproc)
+```
+
+# Compatible Roms
+```
+OOT_PAL_GC checksum 0x09465AC3
+OOT_PAL_GC_DBG1 checksum 0x871E1C92 (debug non-master quest)
+```
diff --git a/Dockerfile b/Dockerfile
index e5a5ba7d2..2f0a39c50 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,7 @@ RUN dpkg --add-architecture i386 && \
binutils:i386 \
gcc-10:i386 \
g++-10:i386 \
- python3 \
+ python3.10 \
python \
make \
cmake \
@@ -23,6 +23,7 @@ RUN dpkg --add-architecture i386 && \
libbz2-dev:i386 \
libpng-dev:i386 \
libgles2-mesa-dev && \
+ ln -s /usr/bin/python3.10 /usr/bin/python3.10 \
ln -s /usr/bin/gcc-10 /usr/bin/gcc && \
ln -s /usr/bin/gcc-10 /usr/bin/cc && \
ln -s /usr/bin/g++-10 /usr/bin/g++ && \
diff --git a/OTRExporter/.gitignore b/OTRExporter/.gitignore
index 2372a0cba..005fe6b8c 100644
--- a/OTRExporter/.gitignore
+++ b/OTRExporter/.gitignore
@@ -345,6 +345,8 @@ baserom/
*.otr
*.swp
*.a
+*.z64
+*.n64
Extract/
tmp.txt
diff --git a/OTRExporter/CFG/Config.xml b/OTRExporter/CFG/Config.xml
index d9c3782e1..adec174ca 100644
--- a/OTRExporter/CFG/Config.xml
+++ b/OTRExporter/CFG/Config.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/OTRExporter/CFG/filelists/dbg.txt b/OTRExporter/CFG/filelists/dbg.txt
new file mode 100644
index 000000000..68af5e557
--- /dev/null
+++ b/OTRExporter/CFG/filelists/dbg.txt
@@ -0,0 +1,1532 @@
+makerom
+boot
+dmadata
+Audiobank
+Audioseq
+Audiotable
+link_animetion
+icon_item_static
+icon_item_24_static
+icon_item_field_static
+icon_item_dungeon_static
+icon_item_gameover_static
+icon_item_nes_static
+icon_item_ger_static
+icon_item_fra_static
+item_name_static
+map_name_static
+do_action_static
+message_static
+message_texture_static
+nes_font_static
+nes_message_data_static
+ger_message_data_static
+fra_message_data_static
+staff_message_data_static
+map_grand_static
+map_i_static
+map_48x85_static
+code
+ovl_title
+ovl_select
+ovl_opening
+ovl_file_choose
+ovl_kaleido_scope
+ovl_player_actor
+ovl_map_mark_data
+ovl_En_Test
+ovl_Arms_Hook
+ovl_Arrow_Fire
+ovl_Arrow_Ice
+ovl_Arrow_Light
+ovl_Bg_Bdan_Objects
+ovl_Bg_Bdan_Switch
+ovl_Bg_Bom_Guard
+ovl_Bg_Bombwall
+ovl_Bg_Bowl_Wall
+ovl_Bg_Breakwall
+ovl_Bg_Ddan_Jd
+ovl_Bg_Ddan_Kd
+ovl_Bg_Dodoago
+ovl_Bg_Dy_Yoseizo
+ovl_Bg_Ganon_Otyuka
+ovl_Bg_Gate_Shutter
+ovl_Bg_Gjyo_Bridge
+ovl_Bg_Gnd_Darkmeiro
+ovl_Bg_Gnd_Firemeiro
+ovl_Bg_Gnd_Iceblock
+ovl_Bg_Gnd_Nisekabe
+ovl_Bg_Gnd_Soulmeiro
+ovl_Bg_Haka
+ovl_Bg_Haka_Gate
+ovl_Bg_Haka_Huta
+ovl_Bg_Haka_Megane
+ovl_Bg_Haka_MeganeBG
+ovl_Bg_Haka_Sgami
+ovl_Bg_Haka_Ship
+ovl_Bg_Haka_Trap
+ovl_Bg_Haka_Tubo
+ovl_Bg_Haka_Water
+ovl_Bg_Haka_Zou
+ovl_Bg_Heavy_Block
+ovl_Bg_Hidan_Curtain
+ovl_Bg_Hidan_Dalm
+ovl_Bg_Hidan_Firewall
+ovl_Bg_Hidan_Fslift
+ovl_Bg_Hidan_Fwbig
+ovl_Bg_Hidan_Hamstep
+ovl_Bg_Hidan_Hrock
+ovl_Bg_Hidan_Kousi
+ovl_Bg_Hidan_Kowarerukabe
+ovl_Bg_Hidan_Rock
+ovl_Bg_Hidan_Rsekizou
+ovl_Bg_Hidan_Sekizou
+ovl_Bg_Hidan_Sima
+ovl_Bg_Hidan_Syoku
+ovl_Bg_Ice_Objects
+ovl_Bg_Ice_Shelter
+ovl_Bg_Ice_Shutter
+ovl_Bg_Ice_Turara
+ovl_Bg_Ingate
+ovl_Bg_Jya_1flift
+ovl_Bg_Jya_Amishutter
+ovl_Bg_Jya_Bigmirror
+ovl_Bg_Jya_Block
+ovl_Bg_Jya_Bombchuiwa
+ovl_Bg_Jya_Bombiwa
+ovl_Bg_Jya_Cobra
+ovl_Bg_Jya_Goroiwa
+ovl_Bg_Jya_Haheniron
+ovl_Bg_Jya_Ironobj
+ovl_Bg_Jya_Kanaami
+ovl_Bg_Jya_Lift
+ovl_Bg_Jya_Megami
+ovl_Bg_Jya_Zurerukabe
+ovl_Bg_Menkuri_Eye
+ovl_Bg_Menkuri_Kaiten
+ovl_Bg_Menkuri_Nisekabe
+ovl_Bg_Mizu_Bwall
+ovl_Bg_Mizu_Movebg
+ovl_Bg_Mizu_Shutter
+ovl_Bg_Mizu_Uzu
+ovl_Bg_Mizu_Water
+ovl_Bg_Mjin
+ovl_Bg_Mori_Bigst
+ovl_Bg_Mori_Elevator
+ovl_Bg_Mori_Hashigo
+ovl_Bg_Mori_Hashira4
+ovl_Bg_Mori_Hineri
+ovl_Bg_Mori_Idomizu
+ovl_Bg_Mori_Kaitenkabe
+ovl_Bg_Mori_Rakkatenjo
+ovl_Bg_Po_Event
+ovl_Bg_Po_Syokudai
+ovl_Bg_Pushbox
+ovl_Bg_Relay_Objects
+ovl_Bg_Spot00_Break
+ovl_Bg_Spot00_Hanebasi
+ovl_Bg_Spot01_Fusya
+ovl_Bg_Spot01_Idohashira
+ovl_Bg_Spot01_Idomizu
+ovl_Bg_Spot01_Idosoko
+ovl_Bg_Spot01_Objects2
+ovl_Bg_Spot02_Objects
+ovl_Bg_Spot03_Taki
+ovl_Bg_Spot05_Soko
+ovl_Bg_Spot06_Objects
+ovl_Bg_Spot07_Taki
+ovl_Bg_Spot08_Bakudankabe
+ovl_Bg_Spot08_Iceblock
+ovl_Bg_Spot09_Obj
+ovl_Bg_Spot11_Bakudankabe
+ovl_Bg_Spot11_Oasis
+ovl_Bg_Spot12_Gate
+ovl_Bg_Spot12_Saku
+ovl_Bg_Spot15_Rrbox
+ovl_Bg_Spot15_Saku
+ovl_Bg_Spot16_Bombstone
+ovl_Bg_Spot16_Doughnut
+ovl_Bg_Spot17_Bakudankabe
+ovl_Bg_Spot17_Funen
+ovl_Bg_Spot18_Basket
+ovl_Bg_Spot18_Futa
+ovl_Bg_Spot18_Obj
+ovl_Bg_Spot18_Shutter
+ovl_Bg_Sst_Floor
+ovl_Bg_Toki_Hikari
+ovl_Bg_Toki_Swd
+ovl_Bg_Treemouth
+ovl_Bg_Umajump
+ovl_Bg_Vb_Sima
+ovl_Bg_Ydan_Hasi
+ovl_Bg_Ydan_Maruta
+ovl_Bg_Ydan_Sp
+ovl_Bg_Zg
+ovl_Boss_Dodongo
+ovl_Boss_Fd
+ovl_Boss_Fd2
+ovl_Boss_Ganon
+ovl_Boss_Ganon2
+ovl_Boss_Ganondrof
+ovl_Boss_Goma
+ovl_Boss_Mo
+ovl_Boss_Sst
+ovl_Boss_Tw
+ovl_Boss_Va
+ovl_Demo_6K
+ovl_Demo_Du
+ovl_Demo_Ec
+ovl_Demo_Effect
+ovl_Demo_Ext
+ovl_Demo_Geff
+ovl_Demo_Gj
+ovl_Demo_Go
+ovl_Demo_Gt
+ovl_Demo_Ik
+ovl_Demo_Im
+ovl_Demo_Kankyo
+ovl_Demo_Kekkai
+ovl_Demo_Sa
+ovl_Demo_Shd
+ovl_Demo_Tre_Lgt
+ovl_Door_Ana
+ovl_Door_Gerudo
+ovl_Door_Killer
+ovl_Door_Shutter
+ovl_Door_Toki
+ovl_Door_Warp1
+ovl_Efc_Erupc
+ovl_Eff_Dust
+ovl_Effect_Ss_Blast
+ovl_Effect_Ss_Bomb
+ovl_Effect_Ss_Bomb2
+ovl_Effect_Ss_Bubble
+ovl_Effect_Ss_D_Fire
+ovl_Effect_Ss_Dead_Db
+ovl_Effect_Ss_Dead_Dd
+ovl_Effect_Ss_Dead_Ds
+ovl_Effect_Ss_Dead_Sound
+ovl_Effect_Ss_Dt_Bubble
+ovl_Effect_Ss_Dust
+ovl_Effect_Ss_En_Fire
+ovl_Effect_Ss_En_Ice
+ovl_Effect_Ss_Extra
+ovl_Effect_Ss_Fcircle
+ovl_Effect_Ss_Fhg_Flash
+ovl_Effect_Ss_Fire_Tail
+ovl_Effect_Ss_G_Fire
+ovl_Effect_Ss_G_Magma
+ovl_Effect_Ss_G_Magma2
+ovl_Effect_Ss_G_Ripple
+ovl_Effect_Ss_G_Spk
+ovl_Effect_Ss_G_Splash
+ovl_Effect_Ss_Hahen
+ovl_Effect_Ss_HitMark
+ovl_Effect_Ss_Ice_Piece
+ovl_Effect_Ss_Ice_Smoke
+ovl_Effect_Ss_K_Fire
+ovl_Effect_Ss_Kakera
+ovl_Effect_Ss_KiraKira
+ovl_Effect_Ss_Lightning
+ovl_Effect_Ss_Sibuki
+ovl_Effect_Ss_Sibuki2
+ovl_Effect_Ss_Solder_Srch_Ball
+ovl_Effect_Ss_Stick
+ovl_Effect_Ss_Stone1
+ovl_Elf_Msg
+ovl_Elf_Msg2
+ovl_En_Am
+ovl_En_Ani
+ovl_En_Anubice
+ovl_En_Anubice_Fire
+ovl_En_Anubice_Tag
+ovl_En_Arow_Trap
+ovl_En_Arrow
+ovl_En_Attack_Niw
+ovl_En_Ba
+ovl_En_Bb
+ovl_En_Bdfire
+ovl_En_Bigokuta
+ovl_En_Bili
+ovl_En_Bird
+ovl_En_Blkobj
+ovl_En_Bom
+ovl_En_Bom_Bowl_Man
+ovl_En_Bom_Bowl_Pit
+ovl_En_Bom_Chu
+ovl_En_Bombf
+ovl_En_Boom
+ovl_En_Box
+ovl_En_Brob
+ovl_En_Bubble
+ovl_En_Butte
+ovl_En_Bw
+ovl_En_Bx
+ovl_En_Changer
+ovl_En_Clear_Tag
+ovl_En_Cow
+ovl_En_Crow
+ovl_En_Cs
+ovl_En_Daiku
+ovl_En_Daiku_Kakariko
+ovl_En_Dekubaba
+ovl_En_Dekunuts
+ovl_En_Dh
+ovl_En_Dha
+ovl_En_Diving_Game
+ovl_En_Dns
+ovl_En_Dnt_Demo
+ovl_En_Dnt_Jiji
+ovl_En_Dnt_Nomal
+ovl_En_Dodojr
+ovl_En_Dodongo
+ovl_En_Dog
+ovl_En_Door
+ovl_En_Ds
+ovl_En_Du
+ovl_En_Dy_Extra
+ovl_En_Eg
+ovl_En_Eiyer
+ovl_En_Elf
+ovl_En_Encount1
+ovl_En_Encount2
+ovl_En_Ex_Item
+ovl_En_Ex_Ruppy
+ovl_En_Fd
+ovl_En_Fd_Fire
+ovl_En_Fhg_Fire
+ovl_En_Fire_Rock
+ovl_En_Firefly
+ovl_En_Fish
+ovl_En_Floormas
+ovl_En_Fr
+ovl_En_Fu
+ovl_En_Fw
+ovl_En_Fz
+ovl_En_G_Switch
+ovl_En_Ganon_Mant
+ovl_En_Ganon_Organ
+ovl_En_Gb
+ovl_En_Ge1
+ovl_En_Ge2
+ovl_En_Ge3
+ovl_En_GeldB
+ovl_En_GirlA
+ovl_En_Gm
+ovl_En_Go
+ovl_En_Go2
+ovl_En_Goma
+ovl_En_Goroiwa
+ovl_En_Gs
+ovl_En_Guest
+ovl_En_Hata
+ovl_En_Heishi1
+ovl_En_Heishi2
+ovl_En_Heishi3
+ovl_En_Heishi4
+ovl_En_Hintnuts
+ovl_En_Holl
+ovl_En_Honotrap
+ovl_En_Horse
+ovl_En_Horse_Game_Check
+ovl_En_Horse_Ganon
+ovl_En_Horse_Link_Child
+ovl_En_Horse_Normal
+ovl_En_Horse_Zelda
+ovl_En_Hs
+ovl_En_Hs2
+ovl_En_Hy
+ovl_En_Ice_Hono
+ovl_En_Ik
+ovl_En_In
+ovl_En_Insect
+ovl_En_Ishi
+ovl_En_It
+ovl_En_Jj
+ovl_En_Js
+ovl_En_Jsjutan
+ovl_En_Kakasi
+ovl_En_Kakasi2
+ovl_En_Kakasi3
+ovl_En_Kanban
+ovl_En_Karebaba
+ovl_En_Ko
+ovl_En_Kusa
+ovl_En_Kz
+ovl_En_Light
+ovl_En_Lightbox
+ovl_En_M_Fire1
+ovl_En_M_Thunder
+ovl_En_Ma1
+ovl_En_Ma2
+ovl_En_Ma3
+ovl_En_Mag
+ovl_En_Mb
+ovl_En_Md
+ovl_En_Mk
+ovl_En_Mm
+ovl_En_Mm2
+ovl_En_Ms
+ovl_En_Mu
+ovl_En_Nb
+ovl_En_Niw
+ovl_En_Niw_Girl
+ovl_En_Niw_Lady
+ovl_En_Nutsball
+ovl_En_Nwc
+ovl_En_Ny
+ovl_En_OE2
+ovl_En_Okarina_Effect
+ovl_En_Okarina_Tag
+ovl_En_Okuta
+ovl_En_Ossan
+ovl_En_Owl
+ovl_En_Part
+ovl_En_Peehat
+ovl_En_Po_Desert
+ovl_En_Po_Field
+ovl_En_Po_Relay
+ovl_En_Po_Sisters
+ovl_En_Poh
+ovl_En_Pu_box
+ovl_En_Rd
+ovl_En_Reeba
+ovl_En_River_Sound
+ovl_En_Rl
+ovl_En_Rr
+ovl_En_Ru1
+ovl_En_Ru2
+ovl_En_Sa
+ovl_En_Sb
+ovl_En_Scene_Change
+ovl_En_Sda
+ovl_En_Shopnuts
+ovl_En_Si
+ovl_En_Siofuki
+ovl_En_Skb
+ovl_En_Skj
+ovl_En_Skjneedle
+ovl_En_Ssh
+ovl_En_St
+ovl_En_Sth
+ovl_En_Stream
+ovl_En_Sw
+ovl_En_Syateki_Itm
+ovl_En_Syateki_Man
+ovl_En_Syateki_Niw
+ovl_En_Ta
+ovl_En_Takara_Man
+ovl_En_Tana
+ovl_En_Tg
+ovl_En_Tite
+ovl_En_Tk
+ovl_En_Torch
+ovl_En_Torch2
+ovl_En_Toryo
+ovl_En_Tp
+ovl_En_Tr
+ovl_En_Trap
+ovl_En_Tubo_Trap
+ovl_En_Vali
+ovl_En_Vase
+ovl_En_Vb_Ball
+ovl_En_Viewer
+ovl_En_Vm
+ovl_En_Wall_Tubo
+ovl_En_Wallmas
+ovl_En_Weather_Tag
+ovl_En_Weiyer
+ovl_En_Wf
+ovl_En_Wonder_Item
+ovl_En_Wonder_Talk
+ovl_En_Wonder_Talk2
+ovl_En_Wood02
+ovl_En_Xc
+ovl_En_Yabusame_Mark
+ovl_En_Yukabyun
+ovl_En_Zf
+ovl_En_Zl1
+ovl_En_Zl2
+ovl_En_Zl3
+ovl_En_Zl4
+ovl_En_Zo
+ovl_En_fHG
+ovl_End_Title
+ovl_Fishing
+ovl_Item_B_Heart
+ovl_Item_Etcetera
+ovl_Item_Inbox
+ovl_Item_Ocarina
+ovl_Item_Shield
+ovl_Magic_Dark
+ovl_Magic_Fire
+ovl_Magic_Wind
+ovl_Mir_Ray
+ovl_Obj_Bean
+ovl_Obj_Blockstop
+ovl_Obj_Bombiwa
+ovl_Obj_Comb
+ovl_Obj_Dekujr
+ovl_Obj_Elevator
+ovl_Obj_Hamishi
+ovl_Obj_Hana
+ovl_Obj_Hsblock
+ovl_Obj_Ice_Poly
+ovl_Obj_Kibako
+ovl_Obj_Kibako2
+ovl_Obj_Lift
+ovl_Obj_Lightswitch
+ovl_Obj_Makekinsuta
+ovl_Obj_Makeoshihiki
+ovl_Obj_Mure
+ovl_Obj_Mure2
+ovl_Obj_Mure3
+ovl_Obj_Oshihiki
+ovl_Obj_Roomtimer
+ovl_Obj_Switch
+ovl_Obj_Syokudai
+ovl_Obj_Timeblock
+ovl_Obj_Tsubo
+ovl_Obj_Warp2block
+ovl_Object_Kankyo
+ovl_Oceff_Spot
+ovl_Oceff_Storm
+ovl_Oceff_Wipe
+ovl_Oceff_Wipe2
+ovl_Oceff_Wipe3
+ovl_Oceff_Wipe4
+ovl_Shot_Sun
+gameplay_keep
+gameplay_field_keep
+gameplay_dangeon_keep
+gameplay_object_exchange_static
+object_link_boy
+object_link_child
+object_box
+object_human
+object_okuta
+object_poh
+object_wallmaster
+object_dy_obj
+object_firefly
+object_dodongo
+object_fire
+object_niw
+object_tite
+object_reeba
+object_peehat
+object_kingdodongo
+object_horse
+object_zf
+object_goma
+object_zl1
+object_gol
+object_bubble
+object_dodojr
+object_torch2
+object_bl
+object_tp
+object_oA1
+object_st
+object_bw
+object_ei
+object_horse_normal
+object_oB1
+object_o_anime
+object_spot04_objects
+object_ddan_objects
+object_hidan_objects
+object_horse_ganon
+object_oA2
+object_spot00_objects
+object_mb
+object_bombf
+object_sk2
+object_oE1
+object_oE_anime
+object_oE2
+object_ydan_objects
+object_gnd
+object_am
+object_dekubaba
+object_oA3
+object_oA4
+object_oA5
+object_oA6
+object_oA7
+object_jj
+object_oA8
+object_oA9
+object_oB2
+object_oB3
+object_oB4
+object_horse_zelda
+object_opening_demo1
+object_warp1
+object_b_heart
+object_dekunuts
+object_oE3
+object_oE4
+object_menkuri_objects
+object_oE5
+object_oE6
+object_oE7
+object_oE8
+object_oE9
+object_oE10
+object_oE11
+object_oE12
+object_vali
+object_oA10
+object_oA11
+object_mizu_objects
+object_fhg
+object_ossan
+object_mori_hineri1
+object_Bb
+object_toki_objects
+object_yukabyun
+object_zl2
+object_mjin
+object_mjin_flash
+object_mjin_dark
+object_mjin_flame
+object_mjin_ice
+object_mjin_soul
+object_mjin_wind
+object_mjin_oka
+object_haka_objects
+object_spot06_objects
+object_ice_objects
+object_relay_objects
+object_mori_hineri1a
+object_mori_hineri2
+object_mori_hineri2a
+object_mori_objects
+object_mori_tex
+object_spot08_obj
+object_warp2
+object_hata
+object_bird
+object_wood02
+object_lightbox
+object_pu_box
+object_trap
+object_vase
+object_im
+object_ta
+object_tk
+object_xc
+object_vm
+object_bv
+object_hakach_objects
+object_efc_crystal_light
+object_efc_fire_ball
+object_efc_flash
+object_efc_lgt_shower
+object_efc_star_field
+object_god_lgt
+object_light_ring
+object_triforce_spot
+object_medal
+object_bdan_objects
+object_sd
+object_rd
+object_po_sisters
+object_heavy_object
+object_gndd
+object_fd
+object_du
+object_fw
+object_horse_link_child
+object_spot02_objects
+object_haka
+object_ru1
+object_syokudai
+object_fd2
+object_dh
+object_rl
+object_efc_tw
+object_demo_tre_lgt
+object_gi_key
+object_mir_ray
+object_brob
+object_gi_jewel
+object_spot09_obj
+object_spot18_obj
+object_bdoor
+object_spot17_obj
+object_shop_dungen
+object_nb
+object_mo
+object_sb
+object_gi_melody
+object_gi_heart
+object_gi_compass
+object_gi_bosskey
+object_gi_medal
+object_gi_nuts
+object_sa
+object_gi_hearts
+object_gi_arrowcase
+object_gi_bombpouch
+object_in
+object_tr
+object_spot16_obj
+object_oE1s
+object_oE4s
+object_os_anime
+object_gi_bottle
+object_gi_stick
+object_gi_map
+object_oF1d_map
+object_ru2
+object_gi_shield_1
+object_dekujr
+object_gi_magicpot
+object_gi_bomb_1
+object_oF1s
+object_ma2
+object_gi_purse
+object_hni
+object_tw
+object_rr
+object_bxa
+object_anubice
+object_gi_gerudo
+object_gi_arrow
+object_gi_bomb_2
+object_gi_egg
+object_gi_scale
+object_gi_shield_2
+object_gi_hookshot
+object_gi_ocarina
+object_gi_milk
+object_ma1
+object_ganon
+object_sst
+object_ny
+object_fr
+object_gi_pachinko
+object_gi_boomerang
+object_gi_bow
+object_gi_glasses
+object_gi_liquid
+object_ani
+object_demo_6k
+object_gi_shield_3
+object_gi_letter
+object_spot15_obj
+object_jya_obj
+object_gi_clothes
+object_gi_bean
+object_gi_fish
+object_gi_saw
+object_gi_hammer
+object_gi_grass
+object_gi_longsword
+object_spot01_objects
+object_md
+object_km1
+object_kw1
+object_zo
+object_kz
+object_umajump
+object_masterkokiri
+object_masterkokirihead
+object_mastergolon
+object_masterzoora
+object_aob
+object_ik
+object_ahg
+object_cne
+object_gi_niwatori
+object_skj
+object_gi_bottle_letter
+object_bji
+object_bba
+object_gi_ocarina_0
+object_ds
+object_ane
+object_boj
+object_spot03_object
+object_spot07_object
+object_fz
+object_bob
+object_ge1
+object_yabusame_point
+object_gi_boots_2
+object_gi_seed
+object_gnd_magic
+object_d_elevator
+object_d_hsblock
+object_d_lift
+object_mamenoki
+object_goroiwa
+object_toryo
+object_daiku
+object_nwc
+object_blkobj
+object_gm
+object_ms
+object_hs
+object_ingate
+object_lightswitch
+object_kusa
+object_tsubo
+object_gi_gloves
+object_gi_coin
+object_kanban
+object_gjyo_objects
+object_owl
+object_mk
+object_fu
+object_gi_ki_tan_mask
+object_gi_redead_mask
+object_gi_skj_mask
+object_gi_rabit_mask
+object_gi_truth_mask
+object_ganon_objects
+object_siofuki
+object_stream
+object_mm
+object_fa
+object_os
+object_gi_eye_lotion
+object_gi_powder
+object_gi_mushroom
+object_gi_ticketstone
+object_gi_brokensword
+object_js
+object_cs
+object_gi_prescription
+object_gi_bracelet
+object_gi_soldout
+object_gi_frog
+object_mag
+object_door_gerudo
+object_gt
+object_efc_erupc
+object_zl2_anime1
+object_zl2_anime2
+object_gi_golonmask
+object_gi_zoramask
+object_gi_gerudomask
+object_ganon2
+object_ka
+object_ts
+object_zg
+object_gi_hoverboots
+object_gi_m_arrow
+object_ds2
+object_ec
+object_fish
+object_gi_sutaru
+object_gi_goddess
+object_ssh
+object_bigokuta
+object_bg
+object_spot05_objects
+object_spot12_obj
+object_bombiwa
+object_hintnuts
+object_rs
+object_spot00_break
+object_gla
+object_shopnuts
+object_geldb
+object_gr
+object_dog
+object_jya_iron
+object_jya_door
+object_spot01_objects2
+object_spot11_obj
+object_kibako2
+object_dns
+object_dnk
+object_gi_fire
+object_gi_insect
+object_gi_butterfly
+object_gi_ghost
+object_gi_soul
+object_bowl
+object_po_field
+object_demo_kekkai
+object_efc_doughnut
+object_gi_dekupouch
+object_ganon_anime1
+object_ganon_anime2
+object_ganon_anime3
+object_gi_rupy
+object_spot01_matoya
+object_spot01_matoyab
+object_po_composer
+object_mu
+object_wf
+object_skb
+object_gj
+object_geff
+object_haka_door
+object_gs
+object_ps
+object_bwall
+object_crow
+object_cow
+object_cob
+object_gi_sword_1
+object_door_killer
+object_ouke_haka
+object_timeblock
+object_zl4
+g_pn_01
+g_pn_02
+g_pn_03
+g_pn_04
+g_pn_05
+g_pn_06
+g_pn_07
+g_pn_08
+g_pn_09
+g_pn_10
+g_pn_11
+g_pn_12
+g_pn_13
+g_pn_14
+g_pn_15
+g_pn_16
+g_pn_17
+g_pn_18
+g_pn_19
+g_pn_20
+g_pn_21
+g_pn_22
+g_pn_23
+g_pn_24
+g_pn_25
+g_pn_26
+g_pn_27
+g_pn_28
+g_pn_29
+g_pn_30
+g_pn_31
+g_pn_32
+g_pn_33
+g_pn_34
+g_pn_35
+g_pn_36
+g_pn_37
+g_pn_38
+g_pn_39
+g_pn_40
+g_pn_41
+g_pn_42
+g_pn_43
+g_pn_44
+g_pn_45
+g_pn_46
+g_pn_47
+g_pn_48
+g_pn_49
+g_pn_50
+g_pn_51
+g_pn_52
+g_pn_53
+g_pn_54
+g_pn_55
+g_pn_56
+g_pn_57
+z_select_static
+nintendo_rogo_static
+title_static
+parameter_static
+vr_fine0_static
+vr_fine0_pal_static
+vr_fine1_static
+vr_fine1_pal_static
+vr_fine2_static
+vr_fine2_pal_static
+vr_fine3_static
+vr_fine3_pal_static
+vr_cloud0_static
+vr_cloud0_pal_static
+vr_cloud1_static
+vr_cloud1_pal_static
+vr_cloud2_static
+vr_cloud2_pal_static
+vr_cloud3_static
+vr_cloud3_pal_static
+vr_holy0_static
+vr_holy0_pal_static
+vr_holy1_static
+vr_holy1_pal_static
+vr_MDVR_static
+vr_MDVR_pal_static
+vr_MNVR_static
+vr_MNVR_pal_static
+vr_RUVR_static
+vr_RUVR_pal_static
+vr_LHVR_static
+vr_LHVR_pal_static
+vr_KHVR_static
+vr_KHVR_pal_static
+vr_K3VR_static
+vr_K3VR_pal_static
+vr_K4VR_static
+vr_K4VR_pal_static
+vr_K5VR_static
+vr_K5VR_pal_static
+vr_SP1a_static
+vr_SP1a_pal_static
+vr_MLVR_static
+vr_MLVR_pal_static
+vr_KKRVR_static
+vr_KKRVR_pal_static
+vr_KR3VR_static
+vr_KR3VR_pal_static
+vr_IPVR_static
+vr_IPVR_pal_static
+vr_KSVR_static
+vr_KSVR_pal_static
+vr_GLVR_static
+vr_GLVR_pal_static
+vr_ZRVR_static
+vr_ZRVR_pal_static
+vr_DGVR_static
+vr_DGVR_pal_static
+vr_ALVR_static
+vr_ALVR_pal_static
+vr_NSVR_static
+vr_NSVR_pal_static
+vr_LBVR_static
+vr_LBVR_pal_static
+vr_TTVR_static
+vr_TTVR_pal_static
+vr_FCVR_static
+vr_FCVR_pal_static
+elf_message_field
+elf_message_ydan
+syotes_scene
+syotes_room_0
+syotes2_scene
+syotes2_room_0
+depth_test_scene
+depth_test_room_0
+spot00_scene
+spot00_room_0
+spot01_scene
+spot01_room_0
+spot02_scene
+spot02_room_0
+spot02_room_1
+spot03_scene
+spot03_room_0
+spot03_room_1
+spot04_scene
+spot04_room_0
+spot04_room_1
+spot04_room_2
+spot05_scene
+spot05_room_0
+spot06_scene
+spot06_room_0
+spot07_scene
+spot07_room_0
+spot07_room_1
+spot08_scene
+spot08_room_0
+spot09_scene
+spot09_room_0
+spot10_scene
+spot10_room_0
+spot10_room_1
+spot10_room_2
+spot10_room_3
+spot10_room_4
+spot10_room_5
+spot10_room_6
+spot10_room_7
+spot10_room_8
+spot10_room_9
+spot11_scene
+spot11_room_0
+spot12_scene
+spot12_room_0
+spot12_room_1
+spot13_scene
+spot13_room_0
+spot13_room_1
+spot15_scene
+spot15_room_0
+spot16_scene
+spot16_room_0
+spot17_scene
+spot17_room_0
+spot17_room_1
+spot18_scene
+spot18_room_0
+spot18_room_1
+spot18_room_2
+spot18_room_3
+ydan_scene
+ydan_room_0
+ydan_room_1
+ydan_room_2
+ydan_room_3
+ydan_room_4
+ydan_room_5
+ydan_room_6
+ydan_room_7
+ydan_room_8
+ydan_room_9
+ydan_room_10
+ydan_room_11
+ddan_scene
+ddan_room_0
+ddan_room_1
+ddan_room_2
+ddan_room_3
+ddan_room_4
+ddan_room_5
+ddan_room_6
+ddan_room_7
+ddan_room_8
+ddan_room_9
+ddan_room_10
+ddan_room_11
+ddan_room_12
+ddan_room_13
+ddan_room_14
+ddan_room_15
+ddan_room_16
+bdan_scene
+bdan_room_0
+bdan_room_1
+bdan_room_2
+bdan_room_3
+bdan_room_4
+bdan_room_5
+bdan_room_6
+bdan_room_7
+bdan_room_8
+bdan_room_9
+bdan_room_10
+bdan_room_11
+bdan_room_12
+bdan_room_13
+bdan_room_14
+bdan_room_15
+Bmori1_scene
+Bmori1_room_0
+Bmori1_room_1
+Bmori1_room_2
+Bmori1_room_3
+Bmori1_room_4
+Bmori1_room_5
+Bmori1_room_6
+Bmori1_room_7
+Bmori1_room_8
+Bmori1_room_9
+Bmori1_room_10
+Bmori1_room_11
+Bmori1_room_12
+Bmori1_room_13
+Bmori1_room_14
+Bmori1_room_15
+Bmori1_room_16
+Bmori1_room_17
+Bmori1_room_18
+Bmori1_room_19
+Bmori1_room_20
+Bmori1_room_21
+Bmori1_room_22
+HIDAN_scene
+HIDAN_room_0
+HIDAN_room_1
+HIDAN_room_2
+HIDAN_room_3
+HIDAN_room_4
+HIDAN_room_5
+HIDAN_room_6
+HIDAN_room_7
+HIDAN_room_8
+HIDAN_room_9
+HIDAN_room_10
+HIDAN_room_11
+HIDAN_room_12
+HIDAN_room_13
+HIDAN_room_14
+HIDAN_room_15
+HIDAN_room_16
+HIDAN_room_17
+HIDAN_room_18
+HIDAN_room_19
+HIDAN_room_20
+HIDAN_room_21
+HIDAN_room_22
+HIDAN_room_23
+HIDAN_room_24
+HIDAN_room_25
+HIDAN_room_26
+MIZUsin_scene
+MIZUsin_room_0
+MIZUsin_room_1
+MIZUsin_room_2
+MIZUsin_room_3
+MIZUsin_room_4
+MIZUsin_room_5
+MIZUsin_room_6
+MIZUsin_room_7
+MIZUsin_room_8
+MIZUsin_room_9
+MIZUsin_room_10
+MIZUsin_room_11
+MIZUsin_room_12
+MIZUsin_room_13
+MIZUsin_room_14
+MIZUsin_room_15
+MIZUsin_room_16
+MIZUsin_room_17
+MIZUsin_room_18
+MIZUsin_room_19
+MIZUsin_room_20
+MIZUsin_room_21
+MIZUsin_room_22
+jyasinzou_scene
+jyasinzou_room_0
+jyasinzou_room_1
+jyasinzou_room_2
+jyasinzou_room_3
+jyasinzou_room_4
+jyasinzou_room_5
+jyasinzou_room_6
+jyasinzou_room_7
+jyasinzou_room_8
+jyasinzou_room_9
+jyasinzou_room_10
+jyasinzou_room_11
+jyasinzou_room_12
+jyasinzou_room_13
+jyasinzou_room_14
+jyasinzou_room_15
+jyasinzou_room_16
+jyasinzou_room_17
+jyasinzou_room_18
+jyasinzou_room_19
+jyasinzou_room_20
+jyasinzou_room_21
+jyasinzou_room_22
+jyasinzou_room_23
+jyasinzou_room_24
+jyasinzou_room_25
+jyasinzou_room_26
+jyasinzou_room_27
+jyasinzou_room_28
+HAKAdan_scene
+HAKAdan_room_0
+HAKAdan_room_1
+HAKAdan_room_2
+HAKAdan_room_3
+HAKAdan_room_4
+HAKAdan_room_5
+HAKAdan_room_6
+HAKAdan_room_7
+HAKAdan_room_8
+HAKAdan_room_9
+HAKAdan_room_10
+HAKAdan_room_11
+HAKAdan_room_12
+HAKAdan_room_13
+HAKAdan_room_14
+HAKAdan_room_15
+HAKAdan_room_16
+HAKAdan_room_17
+HAKAdan_room_18
+HAKAdan_room_19
+HAKAdan_room_20
+HAKAdan_room_21
+HAKAdan_room_22
+HAKAdanCH_scene
+HAKAdanCH_room_0
+HAKAdanCH_room_1
+HAKAdanCH_room_2
+HAKAdanCH_room_3
+HAKAdanCH_room_4
+HAKAdanCH_room_5
+HAKAdanCH_room_6
+ice_doukutu_scene
+ice_doukutu_room_0
+ice_doukutu_room_1
+ice_doukutu_room_2
+ice_doukutu_room_3
+ice_doukutu_room_4
+ice_doukutu_room_5
+ice_doukutu_room_6
+ice_doukutu_room_7
+ice_doukutu_room_8
+ice_doukutu_room_9
+ice_doukutu_room_10
+ice_doukutu_room_11
+men_scene
+men_room_0
+men_room_1
+men_room_2
+men_room_3
+men_room_4
+men_room_5
+men_room_6
+men_room_7
+men_room_8
+men_room_9
+men_room_10
+ganontika_scene
+ganontika_room_0
+ganontika_room_1
+ganontika_room_2
+ganontika_room_3
+ganontika_room_4
+ganontika_room_5
+ganontika_room_6
+ganontika_room_7
+ganontika_room_8
+ganontika_room_9
+ganontika_room_10
+ganontika_room_11
+ganontika_room_12
+ganontika_room_13
+ganontika_room_14
+ganontika_room_15
+ganontika_room_16
+ganontika_room_17
+ganontika_room_18
+ganontika_room_19
+market_day_scene
+market_day_room_0
+market_night_scene
+market_night_room_0
+testroom_scene
+testroom_room_0
+testroom_room_1
+testroom_room_2
+testroom_room_3
+testroom_room_4
+kenjyanoma_scene
+kenjyanoma_room_0
+tokinoma_scene
+tokinoma_room_0
+tokinoma_room_1
+sutaru_scene
+sutaru_room_0
+link_home_scene
+link_home_room_0
+kokiri_shop_scene
+kokiri_shop_room_0
+kokiri_home_scene
+kokiri_home_room_0
+kakusiana_scene
+kakusiana_room_0
+kakusiana_room_1
+kakusiana_room_2
+kakusiana_room_3
+kakusiana_room_4
+kakusiana_room_5
+kakusiana_room_6
+kakusiana_room_7
+kakusiana_room_8
+kakusiana_room_9
+kakusiana_room_10
+kakusiana_room_11
+kakusiana_room_12
+kakusiana_room_13
+entra_scene
+entra_room_0
+moribossroom_scene
+moribossroom_room_0
+moribossroom_room_1
+syatekijyou_scene
+syatekijyou_room_0
+shop1_scene
+shop1_room_0
+hairal_niwa_scene
+hairal_niwa_room_0
+ganon_tou_scene
+ganon_tou_room_0
+sasatest_scene
+sasatest_room_0
+market_alley_scene
+market_alley_room_0
+spot20_scene
+spot20_room_0
+market_ruins_scene
+market_ruins_room_0
+entra_n_scene
+entra_n_room_0
+enrui_scene
+enrui_room_0
+market_alley_n_scene
+market_alley_n_room_0
+hiral_demo_scene
+hiral_demo_room_0
+kokiri_home3_scene
+kokiri_home3_room_0
+malon_stable_scene
+malon_stable_room_0
+kakariko_scene
+kakariko_room_0
+bdan_boss_scene
+bdan_boss_room_0
+bdan_boss_room_1
+FIRE_bs_scene
+FIRE_bs_room_0
+FIRE_bs_room_1
+hut_scene
+hut_room_0
+daiyousei_izumi_scene
+daiyousei_izumi_room_0
+hakaana_scene
+hakaana_room_0
+yousei_izumi_tate_scene
+yousei_izumi_tate_room_0
+yousei_izumi_yoko_scene
+yousei_izumi_yoko_room_0
+golon_scene
+golon_room_0
+zoora_scene
+zoora_room_0
+drag_scene
+drag_room_0
+alley_shop_scene
+alley_shop_room_0
+night_shop_scene
+night_shop_room_0
+impa_scene
+impa_room_0
+labo_scene
+labo_room_0
+tent_scene
+tent_room_0
+nakaniwa_scene
+nakaniwa_room_0
+ddan_boss_scene
+ddan_boss_room_0
+ddan_boss_room_1
+ydan_boss_scene
+ydan_boss_room_0
+ydan_boss_room_1
+HAKAdan_bs_scene
+HAKAdan_bs_room_0
+HAKAdan_bs_room_1
+MIZUsin_bs_scene
+MIZUsin_bs_room_0
+MIZUsin_bs_room_1
+ganon_scene
+ganon_room_0
+ganon_room_1
+ganon_room_2
+ganon_room_3
+ganon_room_4
+ganon_room_5
+ganon_room_6
+ganon_room_7
+ganon_room_8
+ganon_room_9
+ganon_boss_scene
+ganon_boss_room_0
+jyasinboss_scene
+jyasinboss_room_0
+jyasinboss_room_1
+jyasinboss_room_2
+jyasinboss_room_3
+kokiri_home4_scene
+kokiri_home4_room_0
+kokiri_home5_scene
+kokiri_home5_room_0
+ganon_final_scene
+ganon_final_room_0
+kakariko3_scene
+kakariko3_room_0
+hairal_niwa2_scene
+hairal_niwa2_room_0
+hakasitarelay_scene
+hakasitarelay_room_0
+hakasitarelay_room_1
+hakasitarelay_room_2
+hakasitarelay_room_3
+hakasitarelay_room_4
+hakasitarelay_room_5
+hakasitarelay_room_6
+shrine_scene
+shrine_room_0
+turibori_scene
+turibori_room_0
+shrine_n_scene
+shrine_n_room_0
+shrine_r_scene
+shrine_r_room_0
+hakaana2_scene
+hakaana2_room_0
+gerudoway_scene
+gerudoway_room_0
+gerudoway_room_1
+gerudoway_room_2
+gerudoway_room_3
+gerudoway_room_4
+gerudoway_room_5
+hairal_niwa_n_scene
+hairal_niwa_n_room_0
+bowling_scene
+bowling_room_0
+hakaana_ouke_scene
+hakaana_ouke_room_0
+hakaana_ouke_room_1
+hakaana_ouke_room_2
+hylia_labo_scene
+hylia_labo_room_0
+souko_scene
+souko_room_0
+souko_room_1
+souko_room_2
+miharigoya_scene
+miharigoya_room_0
+mahouya_scene
+mahouya_room_0
+takaraya_scene
+takaraya_room_0
+takaraya_room_1
+takaraya_room_2
+takaraya_room_3
+takaraya_room_4
+takaraya_room_5
+takaraya_room_6
+ganon_sonogo_scene
+ganon_sonogo_room_0
+ganon_sonogo_room_1
+ganon_sonogo_room_2
+ganon_sonogo_room_3
+ganon_sonogo_room_4
+ganon_demo_scene
+ganon_demo_room_0
+besitu_scene
+besitu_room_0
+face_shop_scene
+face_shop_room_0
+kinsuta_scene
+kinsuta_room_0
+ganontikasonogo_scene
+ganontikasonogo_room_0
+ganontikasonogo_room_1
+test01_scene
+test01_room_0
+bump_texture_static
+anime_model_1_static
+anime_model_2_static
+anime_model_3_static
+anime_model_4_static
+anime_model_5_static
+anime_model_6_static
+anime_texture_1_static
+anime_texture_2_static
+anime_texture_3_static
+anime_texture_4_static
+anime_texture_5_static
+anime_texture_6_static
+softsprite_matrix_static
\ No newline at end of file
diff --git a/OTRExporter/CFG/filelists/gamecube.txt b/OTRExporter/CFG/filelists/gamecube.txt
new file mode 100644
index 000000000..23794e1f6
--- /dev/null
+++ b/OTRExporter/CFG/filelists/gamecube.txt
@@ -0,0 +1,1509 @@
+makerom
+boot
+dmadata
+Audiobank
+Audioseq
+Audiotable
+kanji
+link_animetion
+icon_item_static
+icon_item_24_static
+icon_item_field_static
+icon_item_dungeon_static
+icon_item_gameover_static
+icon_item_jpn_static
+icon_item_nes_static
+item_name_static
+map_name_static
+do_action_static
+message_static
+message_texture_static
+nes_font_static
+jpn_message_data_static
+nes_message_data_static
+staff_message_data_static
+map_grand_static
+map_48x85_static
+map_i_static
+code
+ovl_title
+ovl_select
+ovl_opening
+ovl_file_choose
+ovl_kaleido_scope
+ovl_player_actor
+ovl_map_mark_data
+ovl_En_Test
+ovl_Arms_Hook
+ovl_Arrow_Fire
+ovl_Arrow_Ice
+ovl_Arrow_Light
+ovl_Bg_Bdan_Objects
+ovl_Bg_Bdan_Switch
+ovl_Bg_Bom_Guard
+ovl_Bg_Bombwall
+ovl_Bg_Bowl_Wall
+ovl_Bg_Breakwall
+ovl_Bg_Ddan_Jd
+ovl_Bg_Ddan_Kd
+ovl_Bg_Dodoago
+ovl_Bg_Dy_Yoseizo
+ovl_Bg_Ganon_Otyuka
+ovl_Bg_Gate_Shutter
+ovl_Bg_Gjyo_Bridge
+ovl_Bg_Gnd_Darkmeiro
+ovl_Bg_Gnd_Firemeiro
+ovl_Bg_Gnd_Iceblock
+ovl_Bg_Gnd_Nisekabe
+ovl_Bg_Gnd_Soulmeiro
+ovl_Bg_Haka
+ovl_Bg_Haka_Gate
+ovl_Bg_Haka_Huta
+ovl_Bg_Haka_Megane
+ovl_Bg_Haka_MeganeBG
+ovl_Bg_Haka_Sgami
+ovl_Bg_Haka_Ship
+ovl_Bg_Haka_Trap
+ovl_Bg_Haka_Tubo
+ovl_Bg_Haka_Water
+ovl_Bg_Haka_Zou
+ovl_Bg_Heavy_Block
+ovl_Bg_Hidan_Curtain
+ovl_Bg_Hidan_Dalm
+ovl_Bg_Hidan_Firewall
+ovl_Bg_Hidan_Fslift
+ovl_Bg_Hidan_Fwbig
+ovl_Bg_Hidan_Hamstep
+ovl_Bg_Hidan_Hrock
+ovl_Bg_Hidan_Kousi
+ovl_Bg_Hidan_Kowarerukabe
+ovl_Bg_Hidan_Rock
+ovl_Bg_Hidan_Rsekizou
+ovl_Bg_Hidan_Sekizou
+ovl_Bg_Hidan_Sima
+ovl_Bg_Hidan_Syoku
+ovl_Bg_Ice_Objects
+ovl_Bg_Ice_Shelter
+ovl_Bg_Ice_Shutter
+ovl_Bg_Ice_Turara
+ovl_Bg_Ingate
+ovl_Bg_Jya_1flift
+ovl_Bg_Jya_Amishutter
+ovl_Bg_Jya_Bigmirror
+ovl_Bg_Jya_Block
+ovl_Bg_Jya_Bombchuiwa
+ovl_Bg_Jya_Bombiwa
+ovl_Bg_Jya_Cobra
+ovl_Bg_Jya_Goroiwa
+ovl_Bg_Jya_Haheniron
+ovl_Bg_Jya_Ironobj
+ovl_Bg_Jya_Kanaami
+ovl_Bg_Jya_Lift
+ovl_Bg_Jya_Megami
+ovl_Bg_Jya_Zurerukabe
+ovl_Bg_Menkuri_Eye
+ovl_Bg_Menkuri_Kaiten
+ovl_Bg_Menkuri_Nisekabe
+ovl_Bg_Mizu_Bwall
+ovl_Bg_Mizu_Movebg
+ovl_Bg_Mizu_Shutter
+ovl_Bg_Mizu_Uzu
+ovl_Bg_Mizu_Water
+ovl_Bg_Mjin
+ovl_Bg_Mori_Bigst
+ovl_Bg_Mori_Elevator
+ovl_Bg_Mori_Hashigo
+ovl_Bg_Mori_Hashira4
+ovl_Bg_Mori_Hineri
+ovl_Bg_Mori_Idomizu
+ovl_Bg_Mori_Kaitenkabe
+ovl_Bg_Mori_Rakkatenjo
+ovl_Bg_Po_Event
+ovl_Bg_Po_Syokudai
+ovl_Bg_Pushbox
+ovl_Bg_Relay_Objects
+ovl_Bg_Spot00_Break
+ovl_Bg_Spot00_Hanebasi
+ovl_Bg_Spot01_Fusya
+ovl_Bg_Spot01_Idohashira
+ovl_Bg_Spot01_Idomizu
+ovl_Bg_Spot01_Idosoko
+ovl_Bg_Spot01_Objects2
+ovl_Bg_Spot02_Objects
+ovl_Bg_Spot03_Taki
+ovl_Bg_Spot05_Soko
+ovl_Bg_Spot06_Objects
+ovl_Bg_Spot07_Taki
+ovl_Bg_Spot08_Bakudankabe
+ovl_Bg_Spot08_Iceblock
+ovl_Bg_Spot09_Obj
+ovl_Bg_Spot11_Bakudankabe
+ovl_Bg_Spot11_Oasis
+ovl_Bg_Spot12_Gate
+ovl_Bg_Spot12_Saku
+ovl_Bg_Spot15_Rrbox
+ovl_Bg_Spot15_Saku
+ovl_Bg_Spot16_Bombstone
+ovl_Bg_Spot16_Doughnut
+ovl_Bg_Spot17_Bakudankabe
+ovl_Bg_Spot17_Funen
+ovl_Bg_Spot18_Basket
+ovl_Bg_Spot18_Futa
+ovl_Bg_Spot18_Obj
+ovl_Bg_Spot18_Shutter
+ovl_Bg_Sst_Floor
+ovl_Bg_Toki_Hikari
+ovl_Bg_Toki_Swd
+ovl_Bg_Treemouth
+ovl_Bg_Umajump
+ovl_Bg_Vb_Sima
+ovl_Bg_Ydan_Hasi
+ovl_Bg_Ydan_Maruta
+ovl_Bg_Ydan_Sp
+ovl_Bg_Zg
+ovl_Boss_Dodongo
+ovl_Boss_Fd
+ovl_Boss_Fd2
+ovl_Boss_Ganon
+ovl_Boss_Ganon2
+ovl_Boss_Ganondrof
+ovl_Boss_Goma
+ovl_Boss_Mo
+ovl_Boss_Sst
+ovl_Boss_Tw
+ovl_Boss_Va
+ovl_Demo_6K
+ovl_Demo_Du
+ovl_Demo_Ec
+ovl_Demo_Effect
+ovl_Demo_Ext
+ovl_Demo_Geff
+ovl_Demo_Gj
+ovl_Demo_Go
+ovl_Demo_Gt
+ovl_Demo_Ik
+ovl_Demo_Im
+ovl_Demo_Kankyo
+ovl_Demo_Kekkai
+ovl_Demo_Sa
+ovl_Demo_Shd
+ovl_Demo_Tre_Lgt
+ovl_Door_Ana
+ovl_Door_Gerudo
+ovl_Door_Killer
+ovl_Door_Shutter
+ovl_Door_Toki
+ovl_Door_Warp1
+ovl_Efc_Erupc
+ovl_Eff_Dust
+ovl_Effect_Ss_Blast
+ovl_Effect_Ss_Bomb
+ovl_Effect_Ss_Bomb2
+ovl_Effect_Ss_Bubble
+ovl_Effect_Ss_D_Fire
+ovl_Effect_Ss_Dead_Db
+ovl_Effect_Ss_Dead_Dd
+ovl_Effect_Ss_Dead_Ds
+ovl_Effect_Ss_Dead_Sound
+ovl_Effect_Ss_Dt_Bubble
+ovl_Effect_Ss_Dust
+ovl_Effect_Ss_En_Fire
+ovl_Effect_Ss_En_Ice
+ovl_Effect_Ss_Extra
+ovl_Effect_Ss_Fcircle
+ovl_Effect_Ss_Fhg_Flash
+ovl_Effect_Ss_Fire_Tail
+ovl_Effect_Ss_G_Fire
+ovl_Effect_Ss_G_Magma
+ovl_Effect_Ss_G_Magma2
+ovl_Effect_Ss_G_Ripple
+ovl_Effect_Ss_G_Spk
+ovl_Effect_Ss_G_Splash
+ovl_Effect_Ss_Hahen
+ovl_Effect_Ss_HitMark
+ovl_Effect_Ss_Ice_Piece
+ovl_Effect_Ss_Ice_Smoke
+ovl_Effect_Ss_K_Fire
+ovl_Effect_Ss_Kakera
+ovl_Effect_Ss_KiraKira
+ovl_Effect_Ss_Lightning
+ovl_Effect_Ss_Sibuki
+ovl_Effect_Ss_Sibuki2
+ovl_Effect_Ss_Solder_Srch_Ball
+ovl_Effect_Ss_Stick
+ovl_Effect_Ss_Stone1
+ovl_Elf_Msg
+ovl_Elf_Msg2
+ovl_En_Am
+ovl_En_Ani
+ovl_En_Anubice
+ovl_En_Anubice_Fire
+ovl_En_Anubice_Tag
+ovl_En_Arow_Trap
+ovl_En_Arrow
+ovl_En_Attack_Niw
+ovl_En_Ba
+ovl_En_Bb
+ovl_En_Bdfire
+ovl_En_Bigokuta
+ovl_En_Bili
+ovl_En_Bird
+ovl_En_Blkobj
+ovl_En_Bom
+ovl_En_Bom_Bowl_Man
+ovl_En_Bom_Bowl_Pit
+ovl_En_Bom_Chu
+ovl_En_Bombf
+ovl_En_Boom
+ovl_En_Box
+ovl_En_Brob
+ovl_En_Bubble
+ovl_En_Butte
+ovl_En_Bw
+ovl_En_Bx
+ovl_En_Changer
+ovl_En_Clear_Tag
+ovl_En_Cow
+ovl_En_Crow
+ovl_En_Cs
+ovl_En_Daiku
+ovl_En_Daiku_Kakariko
+ovl_En_Dekubaba
+ovl_En_Dekunuts
+ovl_En_Dh
+ovl_En_Dha
+ovl_En_Diving_Game
+ovl_En_Dns
+ovl_En_Dnt_Demo
+ovl_En_Dnt_Jiji
+ovl_En_Dnt_Nomal
+ovl_En_Dodojr
+ovl_En_Dodongo
+ovl_En_Dog
+ovl_En_Door
+ovl_En_Ds
+ovl_En_Du
+ovl_En_Dy_Extra
+ovl_En_Eg
+ovl_En_Eiyer
+ovl_En_Elf
+ovl_En_Encount1
+ovl_En_Encount2
+ovl_En_Ex_Item
+ovl_En_Ex_Ruppy
+ovl_En_Fd
+ovl_En_Fd_Fire
+ovl_En_Fhg_Fire
+ovl_En_Fire_Rock
+ovl_En_Firefly
+ovl_En_Fish
+ovl_En_Floormas
+ovl_En_Fr
+ovl_En_Fu
+ovl_En_Fw
+ovl_En_Fz
+ovl_En_G_Switch
+ovl_En_Ganon_Mant
+ovl_En_Ganon_Organ
+ovl_En_Gb
+ovl_En_Ge1
+ovl_En_Ge2
+ovl_En_Ge3
+ovl_En_GeldB
+ovl_En_GirlA
+ovl_En_Gm
+ovl_En_Go
+ovl_En_Go2
+ovl_En_Goma
+ovl_En_Goroiwa
+ovl_En_Gs
+ovl_En_Guest
+ovl_En_Hata
+ovl_En_Heishi1
+ovl_En_Heishi2
+ovl_En_Heishi3
+ovl_En_Heishi4
+ovl_En_Hintnuts
+ovl_En_Holl
+ovl_En_Honotrap
+ovl_En_Horse
+ovl_En_Horse_Game_Check
+ovl_En_Horse_Ganon
+ovl_En_Horse_Link_Child
+ovl_En_Horse_Normal
+ovl_En_Horse_Zelda
+ovl_En_Hs
+ovl_En_Hs2
+ovl_En_Hy
+ovl_En_Ice_Hono
+ovl_En_Ik
+ovl_En_In
+ovl_En_Insect
+ovl_En_Ishi
+ovl_En_It
+ovl_En_Jj
+ovl_En_Js
+ovl_En_Jsjutan
+ovl_En_Kakasi
+ovl_En_Kakasi2
+ovl_En_Kakasi3
+ovl_En_Kanban
+ovl_En_Karebaba
+ovl_En_Ko
+ovl_En_Kusa
+ovl_En_Kz
+ovl_En_Light
+ovl_En_Lightbox
+ovl_En_M_Fire1
+ovl_En_M_Thunder
+ovl_En_Ma1
+ovl_En_Ma2
+ovl_En_Ma3
+ovl_En_Mag
+ovl_En_Mb
+ovl_En_Md
+ovl_En_Mk
+ovl_En_Mm
+ovl_En_Mm2
+ovl_En_Ms
+ovl_En_Mu
+ovl_En_Nb
+ovl_En_Niw
+ovl_En_Niw_Girl
+ovl_En_Niw_Lady
+ovl_En_Nutsball
+ovl_En_Nwc
+ovl_En_Ny
+ovl_En_OE2
+ovl_En_Okarina_Effect
+ovl_En_Okarina_Tag
+ovl_En_Okuta
+ovl_En_Ossan
+ovl_En_Owl
+ovl_En_Part
+ovl_En_Peehat
+ovl_En_Po_Desert
+ovl_En_Po_Field
+ovl_En_Po_Relay
+ovl_En_Po_Sisters
+ovl_En_Poh
+ovl_En_Pu_box
+ovl_En_Rd
+ovl_En_Reeba
+ovl_En_River_Sound
+ovl_En_Rl
+ovl_En_Rr
+ovl_En_Ru1
+ovl_En_Ru2
+ovl_En_Sa
+ovl_En_Sb
+ovl_En_Scene_Change
+ovl_En_Sda
+ovl_En_Shopnuts
+ovl_En_Si
+ovl_En_Siofuki
+ovl_En_Skb
+ovl_En_Skj
+ovl_En_Skjneedle
+ovl_En_Ssh
+ovl_En_St
+ovl_En_Sth
+ovl_En_Stream
+ovl_En_Sw
+ovl_En_Syateki_Itm
+ovl_En_Syateki_Man
+ovl_En_Syateki_Niw
+ovl_En_Ta
+ovl_En_Takara_Man
+ovl_En_Tana
+ovl_En_Tg
+ovl_En_Tite
+ovl_En_Tk
+ovl_En_Torch
+ovl_En_Torch2
+ovl_En_Toryo
+ovl_En_Tp
+ovl_En_Tr
+ovl_En_Trap
+ovl_En_Tubo_Trap
+ovl_En_Vali
+ovl_En_Vase
+ovl_En_Vb_Ball
+ovl_En_Viewer
+ovl_En_Vm
+ovl_En_Wall_Tubo
+ovl_En_Wallmas
+ovl_En_Weather_Tag
+ovl_En_Weiyer
+ovl_En_Wf
+ovl_En_Wonder_Item
+ovl_En_Wonder_Talk
+ovl_En_Wonder_Talk2
+ovl_En_Wood02
+ovl_En_Xc
+ovl_En_Yabusame_Mark
+ovl_En_Yukabyun
+ovl_En_Zf
+ovl_En_Zl1
+ovl_En_Zl2
+ovl_En_Zl3
+ovl_En_Zl4
+ovl_En_Zo
+ovl_En_fHG
+ovl_End_Title
+ovl_Fishing
+ovl_Item_B_Heart
+ovl_Item_Etcetera
+ovl_Item_Inbox
+ovl_Item_Ocarina
+ovl_Item_Shield
+ovl_Magic_Dark
+ovl_Magic_Fire
+ovl_Magic_Wind
+ovl_Mir_Ray
+ovl_Obj_Bean
+ovl_Obj_Blockstop
+ovl_Obj_Bombiwa
+ovl_Obj_Comb
+ovl_Obj_Dekujr
+ovl_Obj_Elevator
+ovl_Obj_Hamishi
+ovl_Obj_Hana
+ovl_Obj_Hsblock
+ovl_Obj_Ice_Poly
+ovl_Obj_Kibako
+ovl_Obj_Kibako2
+ovl_Obj_Lift
+ovl_Obj_Lightswitch
+ovl_Obj_Makekinsuta
+ovl_Obj_Makeoshihiki
+ovl_Obj_Mure
+ovl_Obj_Mure2
+ovl_Obj_Mure3
+ovl_Obj_Oshihiki
+ovl_Obj_Roomtimer
+ovl_Obj_Switch
+ovl_Obj_Syokudai
+ovl_Obj_Timeblock
+ovl_Obj_Tsubo
+ovl_Obj_Warp2block
+ovl_Object_Kankyo
+ovl_Oceff_Spot
+ovl_Oceff_Storm
+ovl_Oceff_Wipe
+ovl_Oceff_Wipe2
+ovl_Oceff_Wipe3
+ovl_Oceff_Wipe4
+ovl_Shot_Sun
+gameplay_keep
+gameplay_field_keep
+gameplay_dangeon_keep
+gameplay_object_exchange_static
+object_link_boy
+object_link_child
+object_box
+object_human
+object_okuta
+object_poh
+object_wallmaster
+object_dy_obj
+object_firefly
+object_dodongo
+object_fire
+object_niw
+object_tite
+object_reeba
+object_peehat
+object_kingdodongo
+object_horse
+object_zf
+object_goma
+object_zl1
+object_gol
+object_bubble
+object_dodojr
+object_torch2
+object_bl
+object_tp
+object_oA1
+object_st
+object_bw
+object_ei
+object_horse_normal
+object_oB1
+object_o_anime
+object_spot04_objects
+object_ddan_objects
+object_hidan_objects
+object_horse_ganon
+object_oA2
+object_spot00_objects
+object_mb
+object_bombf
+object_sk2
+object_oE1
+object_oE_anime
+object_oE2
+object_ydan_objects
+object_gnd
+object_am
+object_dekubaba
+object_oA3
+object_oA4
+object_oA5
+object_oA6
+object_oA7
+object_jj
+object_oA8
+object_oA9
+object_oB2
+object_oB3
+object_oB4
+object_horse_zelda
+object_opening_demo1
+object_warp1
+object_b_heart
+object_dekunuts
+object_oE3
+object_oE4
+object_menkuri_objects
+object_oE5
+object_oE6
+object_oE7
+object_oE8
+object_oE9
+object_oE10
+object_oE11
+object_oE12
+object_vali
+object_oA10
+object_oA11
+object_mizu_objects
+object_fhg
+object_ossan
+object_mori_hineri1
+object_Bb
+object_toki_objects
+object_yukabyun
+object_zl2
+object_mjin
+object_mjin_flash
+object_mjin_dark
+object_mjin_flame
+object_mjin_ice
+object_mjin_soul
+object_mjin_wind
+object_mjin_oka
+object_haka_objects
+object_spot06_objects
+object_ice_objects
+object_relay_objects
+object_mori_hineri1a
+object_mori_hineri2
+object_mori_hineri2a
+object_mori_objects
+object_mori_tex
+object_spot08_obj
+object_warp2
+object_hata
+object_bird
+object_wood02
+object_lightbox
+object_pu_box
+object_trap
+object_vase
+object_im
+object_ta
+object_tk
+object_xc
+object_vm
+object_bv
+object_hakach_objects
+object_efc_crystal_light
+object_efc_fire_ball
+object_efc_flash
+object_efc_lgt_shower
+object_efc_star_field
+object_god_lgt
+object_light_ring
+object_triforce_spot
+object_medal
+object_bdan_objects
+object_sd
+object_rd
+object_po_sisters
+object_heavy_object
+object_gndd
+object_fd
+object_du
+object_fw
+object_horse_link_child
+object_spot02_objects
+object_haka
+object_ru1
+object_syokudai
+object_fd2
+object_dh
+object_rl
+object_efc_tw
+object_demo_tre_lgt
+object_gi_key
+object_mir_ray
+object_brob
+object_gi_jewel
+object_spot09_obj
+object_spot18_obj
+object_bdoor
+object_spot17_obj
+object_shop_dungen
+object_nb
+object_mo
+object_sb
+object_gi_melody
+object_gi_heart
+object_gi_compass
+object_gi_bosskey
+object_gi_medal
+object_gi_nuts
+object_sa
+object_gi_hearts
+object_gi_arrowcase
+object_gi_bombpouch
+object_in
+object_tr
+object_spot16_obj
+object_oE1s
+object_oE4s
+object_os_anime
+object_gi_bottle
+object_gi_stick
+object_gi_map
+object_oF1d_map
+object_ru2
+object_gi_shield_1
+object_dekujr
+object_gi_magicpot
+object_gi_bomb_1
+object_oF1s
+object_ma2
+object_gi_purse
+object_hni
+object_tw
+object_rr
+object_bxa
+object_anubice
+object_gi_gerudo
+object_gi_arrow
+object_gi_bomb_2
+object_gi_egg
+object_gi_scale
+object_gi_shield_2
+object_gi_hookshot
+object_gi_ocarina
+object_gi_milk
+object_ma1
+object_ganon
+object_sst
+object_ny
+object_fr
+object_gi_pachinko
+object_gi_boomerang
+object_gi_bow
+object_gi_glasses
+object_gi_liquid
+object_ani
+object_demo_6k
+object_gi_shield_3
+object_gi_letter
+object_spot15_obj
+object_jya_obj
+object_gi_clothes
+object_gi_bean
+object_gi_fish
+object_gi_saw
+object_gi_hammer
+object_gi_grass
+object_gi_longsword
+object_spot01_objects
+object_md
+object_km1
+object_kw1
+object_zo
+object_kz
+object_umajump
+object_masterkokiri
+object_masterkokirihead
+object_mastergolon
+object_masterzoora
+object_aob
+object_ik
+object_ahg
+object_cne
+object_gi_niwatori
+object_skj
+object_gi_bottle_letter
+object_bji
+object_bba
+object_gi_ocarina_0
+object_ds
+object_ane
+object_boj
+object_spot03_object
+object_spot07_object
+object_fz
+object_bob
+object_ge1
+object_yabusame_point
+object_gi_boots_2
+object_gi_seed
+object_gnd_magic
+object_d_elevator
+object_d_hsblock
+object_d_lift
+object_mamenoki
+object_goroiwa
+object_toryo
+object_daiku
+object_nwc
+object_blkobj
+object_gm
+object_ms
+object_hs
+object_ingate
+object_lightswitch
+object_kusa
+object_tsubo
+object_gi_gloves
+object_gi_coin
+object_kanban
+object_gjyo_objects
+object_owl
+object_mk
+object_fu
+object_gi_ki_tan_mask
+object_gi_redead_mask
+object_gi_skj_mask
+object_gi_rabit_mask
+object_gi_truth_mask
+object_ganon_objects
+object_siofuki
+object_stream
+object_mm
+object_fa
+object_os
+object_gi_eye_lotion
+object_gi_powder
+object_gi_mushroom
+object_gi_ticketstone
+object_gi_brokensword
+object_js
+object_cs
+object_gi_prescription
+object_gi_bracelet
+object_gi_soldout
+object_gi_frog
+object_mag
+object_door_gerudo
+object_gt
+object_efc_erupc
+object_zl2_anime1
+object_zl2_anime2
+object_gi_golonmask
+object_gi_zoramask
+object_gi_gerudomask
+object_ganon2
+object_ka
+object_ts
+object_zg
+object_gi_hoverboots
+object_gi_m_arrow
+object_ds2
+object_ec
+object_fish
+object_gi_sutaru
+object_gi_goddess
+object_ssh
+object_bigokuta
+object_bg
+object_spot05_objects
+object_spot12_obj
+object_bombiwa
+object_hintnuts
+object_rs
+object_spot00_break
+object_gla
+object_shopnuts
+object_geldb
+object_gr
+object_dog
+object_jya_iron
+object_jya_door
+object_spot01_objects2
+object_spot11_obj
+object_kibako2
+object_dns
+object_dnk
+object_gi_fire
+object_gi_insect
+object_gi_butterfly
+object_gi_ghost
+object_gi_soul
+object_bowl
+object_po_field
+object_demo_kekkai
+object_efc_doughnut
+object_gi_dekupouch
+object_ganon_anime1
+object_ganon_anime2
+object_ganon_anime3
+object_gi_rupy
+object_spot01_matoya
+object_spot01_matoyab
+object_po_composer
+object_mu
+object_wf
+object_skb
+object_gj
+object_geff
+object_haka_door
+object_gs
+object_ps
+object_bwall
+object_crow
+object_cow
+object_cob
+object_gi_sword_1
+object_door_killer
+object_ouke_haka
+object_timeblock
+object_zl4
+g_pn_01
+g_pn_02
+g_pn_03
+g_pn_04
+g_pn_05
+g_pn_06
+g_pn_07
+g_pn_08
+g_pn_09
+g_pn_10
+g_pn_11
+g_pn_12
+g_pn_13
+g_pn_14
+g_pn_15
+g_pn_16
+g_pn_17
+g_pn_18
+g_pn_19
+g_pn_20
+g_pn_21
+g_pn_22
+g_pn_23
+g_pn_24
+g_pn_25
+g_pn_26
+g_pn_27
+g_pn_28
+g_pn_29
+g_pn_30
+g_pn_31
+g_pn_32
+g_pn_33
+g_pn_34
+g_pn_35
+g_pn_36
+g_pn_37
+g_pn_38
+g_pn_39
+g_pn_40
+g_pn_41
+g_pn_42
+g_pn_43
+g_pn_44
+g_pn_45
+g_pn_46
+g_pn_47
+g_pn_48
+g_pn_49
+g_pn_50
+g_pn_51
+g_pn_52
+g_pn_53
+g_pn_54
+g_pn_55
+g_pn_56
+g_pn_57
+z_select_static
+nintendo_rogo_static
+title_static
+parameter_static
+vr_fine0_static
+vr_fine0_pal_static
+vr_fine1_static
+vr_fine1_pal_static
+vr_fine2_static
+vr_fine2_pal_static
+vr_fine3_static
+vr_fine3_pal_static
+vr_cloud0_static
+vr_cloud0_pal_static
+vr_cloud1_static
+vr_cloud1_pal_static
+vr_cloud2_static
+vr_cloud2_pal_static
+vr_cloud3_static
+vr_cloud3_pal_static
+vr_holy0_static
+vr_holy0_pal_static
+vr_holy1_static
+vr_holy1_pal_static
+vr_MDVR_static
+vr_MDVR_pal_static
+vr_MNVR_static
+vr_MNVR_pal_static
+vr_RUVR_static
+vr_RUVR_pal_static
+vr_LHVR_static
+vr_LHVR_pal_static
+vr_KHVR_static
+vr_KHVR_pal_static
+vr_K3VR_static
+vr_K3VR_pal_static
+vr_K4VR_static
+vr_K4VR_pal_static
+vr_K5VR_static
+vr_K5VR_pal_static
+vr_SP1a_static
+vr_SP1a_pal_static
+vr_MLVR_static
+vr_MLVR_pal_static
+vr_KKRVR_static
+vr_KKRVR_pal_static
+vr_KR3VR_static
+vr_KR3VR_pal_static
+vr_IPVR_static
+vr_IPVR_pal_static
+vr_KSVR_static
+vr_KSVR_pal_static
+vr_GLVR_static
+vr_GLVR_pal_static
+vr_ZRVR_static
+vr_ZRVR_pal_static
+vr_DGVR_static
+vr_DGVR_pal_static
+vr_ALVR_static
+vr_ALVR_pal_static
+vr_NSVR_static
+vr_NSVR_pal_static
+vr_LBVR_static
+vr_LBVR_pal_static
+vr_TTVR_static
+vr_TTVR_pal_static
+vr_FCVR_static
+vr_FCVR_pal_static
+elf_message_field
+elf_message_ydan
+ydan_scene
+ydan_room_0
+ydan_room_1
+ydan_room_2
+ydan_room_3
+ydan_room_4
+ydan_room_5
+ydan_room_6
+ydan_room_7
+ydan_room_8
+ydan_room_9
+ydan_room_10
+ydan_room_11
+ddan_scene
+ddan_room_0
+ddan_room_1
+ddan_room_2
+ddan_room_3
+ddan_room_4
+ddan_room_5
+ddan_room_6
+ddan_room_7
+ddan_room_8
+ddan_room_9
+ddan_room_10
+ddan_room_11
+ddan_room_12
+ddan_room_13
+ddan_room_14
+ddan_room_15
+ddan_room_16
+bdan_scene
+bdan_room_0
+bdan_room_1
+bdan_room_2
+bdan_room_3
+bdan_room_4
+bdan_room_5
+bdan_room_6
+bdan_room_7
+bdan_room_8
+bdan_room_9
+bdan_room_10
+bdan_room_11
+bdan_room_12
+bdan_room_13
+bdan_room_14
+bdan_room_15
+Bmori1_scene
+Bmori1_room_0
+Bmori1_room_1
+Bmori1_room_2
+Bmori1_room_3
+Bmori1_room_4
+Bmori1_room_5
+Bmori1_room_6
+Bmori1_room_7
+Bmori1_room_8
+Bmori1_room_9
+Bmori1_room_10
+Bmori1_room_11
+Bmori1_room_12
+Bmori1_room_13
+Bmori1_room_14
+Bmori1_room_15
+Bmori1_room_16
+Bmori1_room_17
+Bmori1_room_18
+Bmori1_room_19
+Bmori1_room_20
+Bmori1_room_21
+Bmori1_room_22
+HIDAN_scene
+HIDAN_room_0
+HIDAN_room_1
+HIDAN_room_2
+HIDAN_room_3
+HIDAN_room_4
+HIDAN_room_5
+HIDAN_room_6
+HIDAN_room_7
+HIDAN_room_8
+HIDAN_room_9
+HIDAN_room_10
+HIDAN_room_11
+HIDAN_room_12
+HIDAN_room_13
+HIDAN_room_14
+HIDAN_room_15
+HIDAN_room_16
+HIDAN_room_17
+HIDAN_room_18
+HIDAN_room_19
+HIDAN_room_20
+HIDAN_room_21
+HIDAN_room_22
+HIDAN_room_23
+HIDAN_room_24
+HIDAN_room_25
+HIDAN_room_26
+MIZUsin_scene
+MIZUsin_room_0
+MIZUsin_room_1
+MIZUsin_room_2
+MIZUsin_room_3
+MIZUsin_room_4
+MIZUsin_room_5
+MIZUsin_room_6
+MIZUsin_room_7
+MIZUsin_room_8
+MIZUsin_room_9
+MIZUsin_room_10
+MIZUsin_room_11
+MIZUsin_room_12
+MIZUsin_room_13
+MIZUsin_room_14
+MIZUsin_room_15
+MIZUsin_room_16
+MIZUsin_room_17
+MIZUsin_room_18
+MIZUsin_room_19
+MIZUsin_room_20
+MIZUsin_room_21
+MIZUsin_room_22
+jyasinzou_scene
+jyasinzou_room_0
+jyasinzou_room_1
+jyasinzou_room_2
+jyasinzou_room_3
+jyasinzou_room_4
+jyasinzou_room_5
+jyasinzou_room_6
+jyasinzou_room_7
+jyasinzou_room_8
+jyasinzou_room_9
+jyasinzou_room_10
+jyasinzou_room_11
+jyasinzou_room_12
+jyasinzou_room_13
+jyasinzou_room_14
+jyasinzou_room_15
+jyasinzou_room_16
+jyasinzou_room_17
+jyasinzou_room_18
+jyasinzou_room_19
+jyasinzou_room_20
+jyasinzou_room_21
+jyasinzou_room_22
+jyasinzou_room_23
+jyasinzou_room_24
+jyasinzou_room_25
+jyasinzou_room_26
+jyasinzou_room_27
+jyasinzou_room_28
+HAKAdan_scene
+HAKAdan_room_0
+HAKAdan_room_1
+HAKAdan_room_2
+HAKAdan_room_3
+HAKAdan_room_4
+HAKAdan_room_5
+HAKAdan_room_6
+HAKAdan_room_7
+HAKAdan_room_8
+HAKAdan_room_9
+HAKAdan_room_10
+HAKAdan_room_11
+HAKAdan_room_12
+HAKAdan_room_13
+HAKAdan_room_14
+HAKAdan_room_15
+HAKAdan_room_16
+HAKAdan_room_17
+HAKAdan_room_18
+HAKAdan_room_19
+HAKAdan_room_20
+HAKAdan_room_21
+HAKAdan_room_22
+HAKAdanCH_scene
+HAKAdanCH_room_0
+HAKAdanCH_room_1
+HAKAdanCH_room_2
+HAKAdanCH_room_3
+HAKAdanCH_room_4
+HAKAdanCH_room_5
+HAKAdanCH_room_6
+ice_doukutu_scene
+ice_doukutu_room_0
+ice_doukutu_room_1
+ice_doukutu_room_2
+ice_doukutu_room_3
+ice_doukutu_room_4
+ice_doukutu_room_5
+ice_doukutu_room_6
+ice_doukutu_room_7
+ice_doukutu_room_8
+ice_doukutu_room_9
+ice_doukutu_room_10
+ice_doukutu_room_11
+men_scene
+men_room_0
+men_room_1
+men_room_2
+men_room_3
+men_room_4
+men_room_5
+men_room_6
+men_room_7
+men_room_8
+men_room_9
+men_room_10
+ganontika_scene
+ganontika_room_0
+ganontika_room_1
+ganontika_room_2
+ganontika_room_3
+ganontika_room_4
+ganontika_room_5
+ganontika_room_6
+ganontika_room_7
+ganontika_room_8
+ganontika_room_9
+ganontika_room_10
+ganontika_room_11
+ganontika_room_12
+ganontika_room_13
+ganontika_room_14
+ganontika_room_15
+ganontika_room_16
+ganontika_room_17
+ganontika_room_18
+ganontika_room_19
+spot00_scene
+spot00_room_0
+spot01_scene
+spot01_room_0
+spot02_scene
+spot02_room_0
+spot02_room_1
+spot03_scene
+spot03_room_0
+spot03_room_1
+spot04_scene
+spot04_room_0
+spot04_room_1
+spot04_room_2
+spot05_scene
+spot05_room_0
+spot06_scene
+spot06_room_0
+spot07_scene
+spot07_room_0
+spot07_room_1
+spot08_scene
+spot08_room_0
+spot09_scene
+spot09_room_0
+spot10_scene
+spot10_room_0
+spot10_room_1
+spot10_room_2
+spot10_room_3
+spot10_room_4
+spot10_room_5
+spot10_room_6
+spot10_room_7
+spot10_room_8
+spot10_room_9
+spot11_scene
+spot11_room_0
+spot12_scene
+spot12_room_0
+spot12_room_1
+spot13_scene
+spot13_room_0
+spot13_room_1
+spot15_scene
+spot15_room_0
+spot16_scene
+spot16_room_0
+spot17_scene
+spot17_room_0
+spot17_room_1
+spot18_scene
+spot18_room_0
+spot18_room_1
+spot18_room_2
+spot18_room_3
+market_day_scene
+market_day_room_0
+market_night_scene
+market_night_room_0
+kenjyanoma_scene
+kenjyanoma_room_0
+tokinoma_scene
+tokinoma_room_0
+tokinoma_room_1
+link_home_scene
+link_home_room_0
+kokiri_shop_scene
+kokiri_shop_room_0
+kokiri_home_scene
+kokiri_home_room_0
+kakusiana_scene
+kakusiana_room_0
+kakusiana_room_1
+kakusiana_room_2
+kakusiana_room_3
+kakusiana_room_4
+kakusiana_room_5
+kakusiana_room_6
+kakusiana_room_7
+kakusiana_room_8
+kakusiana_room_9
+kakusiana_room_10
+kakusiana_room_11
+kakusiana_room_12
+kakusiana_room_13
+entra_scene
+entra_room_0
+moribossroom_scene
+moribossroom_room_0
+moribossroom_room_1
+syatekijyou_scene
+syatekijyou_room_0
+shop1_scene
+shop1_room_0
+hairal_niwa_scene
+hairal_niwa_room_0
+ganon_tou_scene
+ganon_tou_room_0
+market_alley_scene
+market_alley_room_0
+spot20_scene
+spot20_room_0
+market_ruins_scene
+market_ruins_room_0
+entra_n_scene
+entra_n_room_0
+enrui_scene
+enrui_room_0
+market_alley_n_scene
+market_alley_n_room_0
+hiral_demo_scene
+hiral_demo_room_0
+kokiri_home3_scene
+kokiri_home3_room_0
+malon_stable_scene
+malon_stable_room_0
+kakariko_scene
+kakariko_room_0
+bdan_boss_scene
+bdan_boss_room_0
+bdan_boss_room_1
+FIRE_bs_scene
+FIRE_bs_room_0
+FIRE_bs_room_1
+hut_scene
+hut_room_0
+daiyousei_izumi_scene
+daiyousei_izumi_room_0
+hakaana_scene
+hakaana_room_0
+yousei_izumi_tate_scene
+yousei_izumi_tate_room_0
+yousei_izumi_yoko_scene
+yousei_izumi_yoko_room_0
+golon_scene
+golon_room_0
+zoora_scene
+zoora_room_0
+drag_scene
+drag_room_0
+alley_shop_scene
+alley_shop_room_0
+night_shop_scene
+night_shop_room_0
+impa_scene
+impa_room_0
+labo_scene
+labo_room_0
+tent_scene
+tent_room_0
+nakaniwa_scene
+nakaniwa_room_0
+ddan_boss_scene
+ddan_boss_room_0
+ddan_boss_room_1
+ydan_boss_scene
+ydan_boss_room_0
+ydan_boss_room_1
+HAKAdan_bs_scene
+HAKAdan_bs_room_0
+HAKAdan_bs_room_1
+MIZUsin_bs_scene
+MIZUsin_bs_room_0
+MIZUsin_bs_room_1
+ganon_scene
+ganon_room_0
+ganon_room_1
+ganon_room_2
+ganon_room_3
+ganon_room_4
+ganon_room_5
+ganon_room_6
+ganon_room_7
+ganon_room_8
+ganon_room_9
+ganon_boss_scene
+ganon_boss_room_0
+jyasinboss_scene
+jyasinboss_room_0
+jyasinboss_room_1
+jyasinboss_room_2
+jyasinboss_room_3
+kokiri_home4_scene
+kokiri_home4_room_0
+kokiri_home5_scene
+kokiri_home5_room_0
+ganon_final_scene
+ganon_final_room_0
+kakariko3_scene
+kakariko3_room_0
+hakasitarelay_scene
+hakasitarelay_room_0
+hakasitarelay_room_1
+hakasitarelay_room_2
+hakasitarelay_room_3
+hakasitarelay_room_4
+hakasitarelay_room_5
+hakasitarelay_room_6
+shrine_scene
+shrine_room_0
+turibori_scene
+turibori_room_0
+shrine_n_scene
+shrine_n_room_0
+shrine_r_scene
+shrine_r_room_0
+hakaana2_scene
+hakaana2_room_0
+gerudoway_scene
+gerudoway_room_0
+gerudoway_room_1
+gerudoway_room_2
+gerudoway_room_3
+gerudoway_room_4
+gerudoway_room_5
+hairal_niwa_n_scene
+hairal_niwa_n_room_0
+bowling_scene
+bowling_room_0
+hakaana_ouke_scene
+hakaana_ouke_room_0
+hakaana_ouke_room_1
+hakaana_ouke_room_2
+hylia_labo_scene
+hylia_labo_room_0
+souko_scene
+souko_room_0
+souko_room_1
+souko_room_2
+miharigoya_scene
+miharigoya_room_0
+mahouya_scene
+mahouya_room_0
+takaraya_scene
+takaraya_room_0
+takaraya_room_1
+takaraya_room_2
+takaraya_room_3
+takaraya_room_4
+takaraya_room_5
+takaraya_room_6
+ganon_sonogo_scene
+ganon_sonogo_room_0
+ganon_sonogo_room_1
+ganon_sonogo_room_2
+ganon_sonogo_room_3
+ganon_sonogo_room_4
+ganon_demo_scene
+ganon_demo_room_0
+face_shop_scene
+face_shop_room_0
+kinsuta_scene
+kinsuta_room_0
+ganontikasonogo_scene
+ganontikasonogo_room_0
+ganontikasonogo_room_1
+bump_texture_static
+anime_model_1_static
+anime_model_2_static
+anime_model_3_static
+anime_model_4_static
+anime_model_5_static
+anime_model_6_static
+anime_texture_1_static
+anime_texture_2_static
+anime_texture_3_static
+anime_texture_4_static
+anime_texture_5_static
+anime_texture_6_static
+softsprite_matrix_static
\ No newline at end of file
diff --git a/OTRExporter/CFG/filelists/gamecube_pal.txt b/OTRExporter/CFG/filelists/gamecube_pal.txt
new file mode 100644
index 000000000..c9746c1da
--- /dev/null
+++ b/OTRExporter/CFG/filelists/gamecube_pal.txt
@@ -0,0 +1,1510 @@
+makerom
+boot
+dmadata
+Audiobank
+Audioseq
+Audiotable
+link_animetion
+icon_item_static
+icon_item_24_static
+icon_item_field_static
+icon_item_dungeon_static
+icon_item_gameover_static
+icon_item_nes_static
+icon_item_ger_static
+icon_item_fra_static
+item_name_static
+map_name_static
+do_action_static
+message_static
+message_texture_static
+nes_font_static
+nes_message_data_static
+ger_message_data_static
+fra_message_data_static
+staff_message_data_static
+map_grand_static
+map_48x85_static
+map_i_static
+code
+ovl_title
+ovl_select
+ovl_opening
+ovl_file_choose
+ovl_kaleido_scope
+ovl_player_actor
+ovl_map_mark_data
+ovl_En_Test
+ovl_Arms_Hook
+ovl_Arrow_Fire
+ovl_Arrow_Ice
+ovl_Arrow_Light
+ovl_Bg_Bdan_Objects
+ovl_Bg_Bdan_Switch
+ovl_Bg_Bom_Guard
+ovl_Bg_Bombwall
+ovl_Bg_Bowl_Wall
+ovl_Bg_Breakwall
+ovl_Bg_Ddan_Jd
+ovl_Bg_Ddan_Kd
+ovl_Bg_Dodoago
+ovl_Bg_Dy_Yoseizo
+ovl_Bg_Ganon_Otyuka
+ovl_Bg_Gate_Shutter
+ovl_Bg_Gjyo_Bridge
+ovl_Bg_Gnd_Darkmeiro
+ovl_Bg_Gnd_Firemeiro
+ovl_Bg_Gnd_Iceblock
+ovl_Bg_Gnd_Nisekabe
+ovl_Bg_Gnd_Soulmeiro
+ovl_Bg_Haka
+ovl_Bg_Haka_Gate
+ovl_Bg_Haka_Huta
+ovl_Bg_Haka_Megane
+ovl_Bg_Haka_MeganeBG
+ovl_Bg_Haka_Sgami
+ovl_Bg_Haka_Ship
+ovl_Bg_Haka_Trap
+ovl_Bg_Haka_Tubo
+ovl_Bg_Haka_Water
+ovl_Bg_Haka_Zou
+ovl_Bg_Heavy_Block
+ovl_Bg_Hidan_Curtain
+ovl_Bg_Hidan_Dalm
+ovl_Bg_Hidan_Firewall
+ovl_Bg_Hidan_Fslift
+ovl_Bg_Hidan_Fwbig
+ovl_Bg_Hidan_Hamstep
+ovl_Bg_Hidan_Hrock
+ovl_Bg_Hidan_Kousi
+ovl_Bg_Hidan_Kowarerukabe
+ovl_Bg_Hidan_Rock
+ovl_Bg_Hidan_Rsekizou
+ovl_Bg_Hidan_Sekizou
+ovl_Bg_Hidan_Sima
+ovl_Bg_Hidan_Syoku
+ovl_Bg_Ice_Objects
+ovl_Bg_Ice_Shelter
+ovl_Bg_Ice_Shutter
+ovl_Bg_Ice_Turara
+ovl_Bg_Ingate
+ovl_Bg_Jya_1flift
+ovl_Bg_Jya_Amishutter
+ovl_Bg_Jya_Bigmirror
+ovl_Bg_Jya_Block
+ovl_Bg_Jya_Bombchuiwa
+ovl_Bg_Jya_Bombiwa
+ovl_Bg_Jya_Cobra
+ovl_Bg_Jya_Goroiwa
+ovl_Bg_Jya_Haheniron
+ovl_Bg_Jya_Ironobj
+ovl_Bg_Jya_Kanaami
+ovl_Bg_Jya_Lift
+ovl_Bg_Jya_Megami
+ovl_Bg_Jya_Zurerukabe
+ovl_Bg_Menkuri_Eye
+ovl_Bg_Menkuri_Kaiten
+ovl_Bg_Menkuri_Nisekabe
+ovl_Bg_Mizu_Bwall
+ovl_Bg_Mizu_Movebg
+ovl_Bg_Mizu_Shutter
+ovl_Bg_Mizu_Uzu
+ovl_Bg_Mizu_Water
+ovl_Bg_Mjin
+ovl_Bg_Mori_Bigst
+ovl_Bg_Mori_Elevator
+ovl_Bg_Mori_Hashigo
+ovl_Bg_Mori_Hashira4
+ovl_Bg_Mori_Hineri
+ovl_Bg_Mori_Idomizu
+ovl_Bg_Mori_Kaitenkabe
+ovl_Bg_Mori_Rakkatenjo
+ovl_Bg_Po_Event
+ovl_Bg_Po_Syokudai
+ovl_Bg_Pushbox
+ovl_Bg_Relay_Objects
+ovl_Bg_Spot00_Break
+ovl_Bg_Spot00_Hanebasi
+ovl_Bg_Spot01_Fusya
+ovl_Bg_Spot01_Idohashira
+ovl_Bg_Spot01_Idomizu
+ovl_Bg_Spot01_Idosoko
+ovl_Bg_Spot01_Objects2
+ovl_Bg_Spot02_Objects
+ovl_Bg_Spot03_Taki
+ovl_Bg_Spot05_Soko
+ovl_Bg_Spot06_Objects
+ovl_Bg_Spot07_Taki
+ovl_Bg_Spot08_Bakudankabe
+ovl_Bg_Spot08_Iceblock
+ovl_Bg_Spot09_Obj
+ovl_Bg_Spot11_Bakudankabe
+ovl_Bg_Spot11_Oasis
+ovl_Bg_Spot12_Gate
+ovl_Bg_Spot12_Saku
+ovl_Bg_Spot15_Rrbox
+ovl_Bg_Spot15_Saku
+ovl_Bg_Spot16_Bombstone
+ovl_Bg_Spot16_Doughnut
+ovl_Bg_Spot17_Bakudankabe
+ovl_Bg_Spot17_Funen
+ovl_Bg_Spot18_Basket
+ovl_Bg_Spot18_Futa
+ovl_Bg_Spot18_Obj
+ovl_Bg_Spot18_Shutter
+ovl_Bg_Sst_Floor
+ovl_Bg_Toki_Hikari
+ovl_Bg_Toki_Swd
+ovl_Bg_Treemouth
+ovl_Bg_Umajump
+ovl_Bg_Vb_Sima
+ovl_Bg_Ydan_Hasi
+ovl_Bg_Ydan_Maruta
+ovl_Bg_Ydan_Sp
+ovl_Bg_Zg
+ovl_Boss_Dodongo
+ovl_Boss_Fd
+ovl_Boss_Fd2
+ovl_Boss_Ganon
+ovl_Boss_Ganon2
+ovl_Boss_Ganondrof
+ovl_Boss_Goma
+ovl_Boss_Mo
+ovl_Boss_Sst
+ovl_Boss_Tw
+ovl_Boss_Va
+ovl_Demo_6K
+ovl_Demo_Du
+ovl_Demo_Ec
+ovl_Demo_Effect
+ovl_Demo_Ext
+ovl_Demo_Geff
+ovl_Demo_Gj
+ovl_Demo_Go
+ovl_Demo_Gt
+ovl_Demo_Ik
+ovl_Demo_Im
+ovl_Demo_Kankyo
+ovl_Demo_Kekkai
+ovl_Demo_Sa
+ovl_Demo_Shd
+ovl_Demo_Tre_Lgt
+ovl_Door_Ana
+ovl_Door_Gerudo
+ovl_Door_Killer
+ovl_Door_Shutter
+ovl_Door_Toki
+ovl_Door_Warp1
+ovl_Efc_Erupc
+ovl_Eff_Dust
+ovl_Effect_Ss_Blast
+ovl_Effect_Ss_Bomb
+ovl_Effect_Ss_Bomb2
+ovl_Effect_Ss_Bubble
+ovl_Effect_Ss_D_Fire
+ovl_Effect_Ss_Dead_Db
+ovl_Effect_Ss_Dead_Dd
+ovl_Effect_Ss_Dead_Ds
+ovl_Effect_Ss_Dead_Sound
+ovl_Effect_Ss_Dt_Bubble
+ovl_Effect_Ss_Dust
+ovl_Effect_Ss_En_Fire
+ovl_Effect_Ss_En_Ice
+ovl_Effect_Ss_Extra
+ovl_Effect_Ss_Fcircle
+ovl_Effect_Ss_Fhg_Flash
+ovl_Effect_Ss_Fire_Tail
+ovl_Effect_Ss_G_Fire
+ovl_Effect_Ss_G_Magma
+ovl_Effect_Ss_G_Magma2
+ovl_Effect_Ss_G_Ripple
+ovl_Effect_Ss_G_Spk
+ovl_Effect_Ss_G_Splash
+ovl_Effect_Ss_Hahen
+ovl_Effect_Ss_HitMark
+ovl_Effect_Ss_Ice_Piece
+ovl_Effect_Ss_Ice_Smoke
+ovl_Effect_Ss_K_Fire
+ovl_Effect_Ss_Kakera
+ovl_Effect_Ss_KiraKira
+ovl_Effect_Ss_Lightning
+ovl_Effect_Ss_Sibuki
+ovl_Effect_Ss_Sibuki2
+ovl_Effect_Ss_Solder_Srch_Ball
+ovl_Effect_Ss_Stick
+ovl_Effect_Ss_Stone1
+ovl_Elf_Msg
+ovl_Elf_Msg2
+ovl_En_Am
+ovl_En_Ani
+ovl_En_Anubice
+ovl_En_Anubice_Fire
+ovl_En_Anubice_Tag
+ovl_En_Arow_Trap
+ovl_En_Arrow
+ovl_En_Attack_Niw
+ovl_En_Ba
+ovl_En_Bb
+ovl_En_Bdfire
+ovl_En_Bigokuta
+ovl_En_Bili
+ovl_En_Bird
+ovl_En_Blkobj
+ovl_En_Bom
+ovl_En_Bom_Bowl_Man
+ovl_En_Bom_Bowl_Pit
+ovl_En_Bom_Chu
+ovl_En_Bombf
+ovl_En_Boom
+ovl_En_Box
+ovl_En_Brob
+ovl_En_Bubble
+ovl_En_Butte
+ovl_En_Bw
+ovl_En_Bx
+ovl_En_Changer
+ovl_En_Clear_Tag
+ovl_En_Cow
+ovl_En_Crow
+ovl_En_Cs
+ovl_En_Daiku
+ovl_En_Daiku_Kakariko
+ovl_En_Dekubaba
+ovl_En_Dekunuts
+ovl_En_Dh
+ovl_En_Dha
+ovl_En_Diving_Game
+ovl_En_Dns
+ovl_En_Dnt_Demo
+ovl_En_Dnt_Jiji
+ovl_En_Dnt_Nomal
+ovl_En_Dodojr
+ovl_En_Dodongo
+ovl_En_Dog
+ovl_En_Door
+ovl_En_Ds
+ovl_En_Du
+ovl_En_Dy_Extra
+ovl_En_Eg
+ovl_En_Eiyer
+ovl_En_Elf
+ovl_En_Encount1
+ovl_En_Encount2
+ovl_En_Ex_Item
+ovl_En_Ex_Ruppy
+ovl_En_Fd
+ovl_En_Fd_Fire
+ovl_En_Fhg_Fire
+ovl_En_Fire_Rock
+ovl_En_Firefly
+ovl_En_Fish
+ovl_En_Floormas
+ovl_En_Fr
+ovl_En_Fu
+ovl_En_Fw
+ovl_En_Fz
+ovl_En_G_Switch
+ovl_En_Ganon_Mant
+ovl_En_Ganon_Organ
+ovl_En_Gb
+ovl_En_Ge1
+ovl_En_Ge2
+ovl_En_Ge3
+ovl_En_GeldB
+ovl_En_GirlA
+ovl_En_Gm
+ovl_En_Go
+ovl_En_Go2
+ovl_En_Goma
+ovl_En_Goroiwa
+ovl_En_Gs
+ovl_En_Guest
+ovl_En_Hata
+ovl_En_Heishi1
+ovl_En_Heishi2
+ovl_En_Heishi3
+ovl_En_Heishi4
+ovl_En_Hintnuts
+ovl_En_Holl
+ovl_En_Honotrap
+ovl_En_Horse
+ovl_En_Horse_Game_Check
+ovl_En_Horse_Ganon
+ovl_En_Horse_Link_Child
+ovl_En_Horse_Normal
+ovl_En_Horse_Zelda
+ovl_En_Hs
+ovl_En_Hs2
+ovl_En_Hy
+ovl_En_Ice_Hono
+ovl_En_Ik
+ovl_En_In
+ovl_En_Insect
+ovl_En_Ishi
+ovl_En_It
+ovl_En_Jj
+ovl_En_Js
+ovl_En_Jsjutan
+ovl_En_Kakasi
+ovl_En_Kakasi2
+ovl_En_Kakasi3
+ovl_En_Kanban
+ovl_En_Karebaba
+ovl_En_Ko
+ovl_En_Kusa
+ovl_En_Kz
+ovl_En_Light
+ovl_En_Lightbox
+ovl_En_M_Fire1
+ovl_En_M_Thunder
+ovl_En_Ma1
+ovl_En_Ma2
+ovl_En_Ma3
+ovl_En_Mag
+ovl_En_Mb
+ovl_En_Md
+ovl_En_Mk
+ovl_En_Mm
+ovl_En_Mm2
+ovl_En_Ms
+ovl_En_Mu
+ovl_En_Nb
+ovl_En_Niw
+ovl_En_Niw_Girl
+ovl_En_Niw_Lady
+ovl_En_Nutsball
+ovl_En_Nwc
+ovl_En_Ny
+ovl_En_OE2
+ovl_En_Okarina_Effect
+ovl_En_Okarina_Tag
+ovl_En_Okuta
+ovl_En_Ossan
+ovl_En_Owl
+ovl_En_Part
+ovl_En_Peehat
+ovl_En_Po_Desert
+ovl_En_Po_Field
+ovl_En_Po_Relay
+ovl_En_Po_Sisters
+ovl_En_Poh
+ovl_En_Pu_box
+ovl_En_Rd
+ovl_En_Reeba
+ovl_En_River_Sound
+ovl_En_Rl
+ovl_En_Rr
+ovl_En_Ru1
+ovl_En_Ru2
+ovl_En_Sa
+ovl_En_Sb
+ovl_En_Scene_Change
+ovl_En_Sda
+ovl_En_Shopnuts
+ovl_En_Si
+ovl_En_Siofuki
+ovl_En_Skb
+ovl_En_Skj
+ovl_En_Skjneedle
+ovl_En_Ssh
+ovl_En_St
+ovl_En_Sth
+ovl_En_Stream
+ovl_En_Sw
+ovl_En_Syateki_Itm
+ovl_En_Syateki_Man
+ovl_En_Syateki_Niw
+ovl_En_Ta
+ovl_En_Takara_Man
+ovl_En_Tana
+ovl_En_Tg
+ovl_En_Tite
+ovl_En_Tk
+ovl_En_Torch
+ovl_En_Torch2
+ovl_En_Toryo
+ovl_En_Tp
+ovl_En_Tr
+ovl_En_Trap
+ovl_En_Tubo_Trap
+ovl_En_Vali
+ovl_En_Vase
+ovl_En_Vb_Ball
+ovl_En_Viewer
+ovl_En_Vm
+ovl_En_Wall_Tubo
+ovl_En_Wallmas
+ovl_En_Weather_Tag
+ovl_En_Weiyer
+ovl_En_Wf
+ovl_En_Wonder_Item
+ovl_En_Wonder_Talk
+ovl_En_Wonder_Talk2
+ovl_En_Wood02
+ovl_En_Xc
+ovl_En_Yabusame_Mark
+ovl_En_Yukabyun
+ovl_En_Zf
+ovl_En_Zl1
+ovl_En_Zl2
+ovl_En_Zl3
+ovl_En_Zl4
+ovl_En_Zo
+ovl_En_fHG
+ovl_End_Title
+ovl_Fishing
+ovl_Item_B_Heart
+ovl_Item_Etcetera
+ovl_Item_Inbox
+ovl_Item_Ocarina
+ovl_Item_Shield
+ovl_Magic_Dark
+ovl_Magic_Fire
+ovl_Magic_Wind
+ovl_Mir_Ray
+ovl_Obj_Bean
+ovl_Obj_Blockstop
+ovl_Obj_Bombiwa
+ovl_Obj_Comb
+ovl_Obj_Dekujr
+ovl_Obj_Elevator
+ovl_Obj_Hamishi
+ovl_Obj_Hana
+ovl_Obj_Hsblock
+ovl_Obj_Ice_Poly
+ovl_Obj_Kibako
+ovl_Obj_Kibako2
+ovl_Obj_Lift
+ovl_Obj_Lightswitch
+ovl_Obj_Makekinsuta
+ovl_Obj_Makeoshihiki
+ovl_Obj_Mure
+ovl_Obj_Mure2
+ovl_Obj_Mure3
+ovl_Obj_Oshihiki
+ovl_Obj_Roomtimer
+ovl_Obj_Switch
+ovl_Obj_Syokudai
+ovl_Obj_Timeblock
+ovl_Obj_Tsubo
+ovl_Obj_Warp2block
+ovl_Object_Kankyo
+ovl_Oceff_Spot
+ovl_Oceff_Storm
+ovl_Oceff_Wipe
+ovl_Oceff_Wipe2
+ovl_Oceff_Wipe3
+ovl_Oceff_Wipe4
+ovl_Shot_Sun
+gameplay_keep
+gameplay_field_keep
+gameplay_dangeon_keep
+gameplay_object_exchange_static
+object_link_boy
+object_link_child
+object_box
+object_human
+object_okuta
+object_poh
+object_wallmaster
+object_dy_obj
+object_firefly
+object_dodongo
+object_fire
+object_niw
+object_tite
+object_reeba
+object_peehat
+object_kingdodongo
+object_horse
+object_zf
+object_goma
+object_zl1
+object_gol
+object_bubble
+object_dodojr
+object_torch2
+object_bl
+object_tp
+object_oA1
+object_st
+object_bw
+object_ei
+object_horse_normal
+object_oB1
+object_o_anime
+object_spot04_objects
+object_ddan_objects
+object_hidan_objects
+object_horse_ganon
+object_oA2
+object_spot00_objects
+object_mb
+object_bombf
+object_sk2
+object_oE1
+object_oE_anime
+object_oE2
+object_ydan_objects
+object_gnd
+object_am
+object_dekubaba
+object_oA3
+object_oA4
+object_oA5
+object_oA6
+object_oA7
+object_jj
+object_oA8
+object_oA9
+object_oB2
+object_oB3
+object_oB4
+object_horse_zelda
+object_opening_demo1
+object_warp1
+object_b_heart
+object_dekunuts
+object_oE3
+object_oE4
+object_menkuri_objects
+object_oE5
+object_oE6
+object_oE7
+object_oE8
+object_oE9
+object_oE10
+object_oE11
+object_oE12
+object_vali
+object_oA10
+object_oA11
+object_mizu_objects
+object_fhg
+object_ossan
+object_mori_hineri1
+object_Bb
+object_toki_objects
+object_yukabyun
+object_zl2
+object_mjin
+object_mjin_flash
+object_mjin_dark
+object_mjin_flame
+object_mjin_ice
+object_mjin_soul
+object_mjin_wind
+object_mjin_oka
+object_haka_objects
+object_spot06_objects
+object_ice_objects
+object_relay_objects
+object_mori_hineri1a
+object_mori_hineri2
+object_mori_hineri2a
+object_mori_objects
+object_mori_tex
+object_spot08_obj
+object_warp2
+object_hata
+object_bird
+object_wood02
+object_lightbox
+object_pu_box
+object_trap
+object_vase
+object_im
+object_ta
+object_tk
+object_xc
+object_vm
+object_bv
+object_hakach_objects
+object_efc_crystal_light
+object_efc_fire_ball
+object_efc_flash
+object_efc_lgt_shower
+object_efc_star_field
+object_god_lgt
+object_light_ring
+object_triforce_spot
+object_medal
+object_bdan_objects
+object_sd
+object_rd
+object_po_sisters
+object_heavy_object
+object_gndd
+object_fd
+object_du
+object_fw
+object_horse_link_child
+object_spot02_objects
+object_haka
+object_ru1
+object_syokudai
+object_fd2
+object_dh
+object_rl
+object_efc_tw
+object_demo_tre_lgt
+object_gi_key
+object_mir_ray
+object_brob
+object_gi_jewel
+object_spot09_obj
+object_spot18_obj
+object_bdoor
+object_spot17_obj
+object_shop_dungen
+object_nb
+object_mo
+object_sb
+object_gi_melody
+object_gi_heart
+object_gi_compass
+object_gi_bosskey
+object_gi_medal
+object_gi_nuts
+object_sa
+object_gi_hearts
+object_gi_arrowcase
+object_gi_bombpouch
+object_in
+object_tr
+object_spot16_obj
+object_oE1s
+object_oE4s
+object_os_anime
+object_gi_bottle
+object_gi_stick
+object_gi_map
+object_oF1d_map
+object_ru2
+object_gi_shield_1
+object_dekujr
+object_gi_magicpot
+object_gi_bomb_1
+object_oF1s
+object_ma2
+object_gi_purse
+object_hni
+object_tw
+object_rr
+object_bxa
+object_anubice
+object_gi_gerudo
+object_gi_arrow
+object_gi_bomb_2
+object_gi_egg
+object_gi_scale
+object_gi_shield_2
+object_gi_hookshot
+object_gi_ocarina
+object_gi_milk
+object_ma1
+object_ganon
+object_sst
+object_ny
+object_fr
+object_gi_pachinko
+object_gi_boomerang
+object_gi_bow
+object_gi_glasses
+object_gi_liquid
+object_ani
+object_demo_6k
+object_gi_shield_3
+object_gi_letter
+object_spot15_obj
+object_jya_obj
+object_gi_clothes
+object_gi_bean
+object_gi_fish
+object_gi_saw
+object_gi_hammer
+object_gi_grass
+object_gi_longsword
+object_spot01_objects
+object_md
+object_km1
+object_kw1
+object_zo
+object_kz
+object_umajump
+object_masterkokiri
+object_masterkokirihead
+object_mastergolon
+object_masterzoora
+object_aob
+object_ik
+object_ahg
+object_cne
+object_gi_niwatori
+object_skj
+object_gi_bottle_letter
+object_bji
+object_bba
+object_gi_ocarina_0
+object_ds
+object_ane
+object_boj
+object_spot03_object
+object_spot07_object
+object_fz
+object_bob
+object_ge1
+object_yabusame_point
+object_gi_boots_2
+object_gi_seed
+object_gnd_magic
+object_d_elevator
+object_d_hsblock
+object_d_lift
+object_mamenoki
+object_goroiwa
+object_toryo
+object_daiku
+object_nwc
+object_blkobj
+object_gm
+object_ms
+object_hs
+object_ingate
+object_lightswitch
+object_kusa
+object_tsubo
+object_gi_gloves
+object_gi_coin
+object_kanban
+object_gjyo_objects
+object_owl
+object_mk
+object_fu
+object_gi_ki_tan_mask
+object_gi_redead_mask
+object_gi_skj_mask
+object_gi_rabit_mask
+object_gi_truth_mask
+object_ganon_objects
+object_siofuki
+object_stream
+object_mm
+object_fa
+object_os
+object_gi_eye_lotion
+object_gi_powder
+object_gi_mushroom
+object_gi_ticketstone
+object_gi_brokensword
+object_js
+object_cs
+object_gi_prescription
+object_gi_bracelet
+object_gi_soldout
+object_gi_frog
+object_mag
+object_door_gerudo
+object_gt
+object_efc_erupc
+object_zl2_anime1
+object_zl2_anime2
+object_gi_golonmask
+object_gi_zoramask
+object_gi_gerudomask
+object_ganon2
+object_ka
+object_ts
+object_zg
+object_gi_hoverboots
+object_gi_m_arrow
+object_ds2
+object_ec
+object_fish
+object_gi_sutaru
+object_gi_goddess
+object_ssh
+object_bigokuta
+object_bg
+object_spot05_objects
+object_spot12_obj
+object_bombiwa
+object_hintnuts
+object_rs
+object_spot00_break
+object_gla
+object_shopnuts
+object_geldb
+object_gr
+object_dog
+object_jya_iron
+object_jya_door
+object_spot01_objects2
+object_spot11_obj
+object_kibako2
+object_dns
+object_dnk
+object_gi_fire
+object_gi_insect
+object_gi_butterfly
+object_gi_ghost
+object_gi_soul
+object_bowl
+object_po_field
+object_demo_kekkai
+object_efc_doughnut
+object_gi_dekupouch
+object_ganon_anime1
+object_ganon_anime2
+object_ganon_anime3
+object_gi_rupy
+object_spot01_matoya
+object_spot01_matoyab
+object_po_composer
+object_mu
+object_wf
+object_skb
+object_gj
+object_geff
+object_haka_door
+object_gs
+object_ps
+object_bwall
+object_crow
+object_cow
+object_cob
+object_gi_sword_1
+object_door_killer
+object_ouke_haka
+object_timeblock
+object_zl4
+g_pn_01
+g_pn_02
+g_pn_03
+g_pn_04
+g_pn_05
+g_pn_06
+g_pn_07
+g_pn_08
+g_pn_09
+g_pn_10
+g_pn_11
+g_pn_12
+g_pn_13
+g_pn_14
+g_pn_15
+g_pn_16
+g_pn_17
+g_pn_18
+g_pn_19
+g_pn_20
+g_pn_21
+g_pn_22
+g_pn_23
+g_pn_24
+g_pn_25
+g_pn_26
+g_pn_27
+g_pn_28
+g_pn_29
+g_pn_30
+g_pn_31
+g_pn_32
+g_pn_33
+g_pn_34
+g_pn_35
+g_pn_36
+g_pn_37
+g_pn_38
+g_pn_39
+g_pn_40
+g_pn_41
+g_pn_42
+g_pn_43
+g_pn_44
+g_pn_45
+g_pn_46
+g_pn_47
+g_pn_48
+g_pn_49
+g_pn_50
+g_pn_51
+g_pn_52
+g_pn_53
+g_pn_54
+g_pn_55
+g_pn_56
+g_pn_57
+z_select_static
+nintendo_rogo_static
+title_static
+parameter_static
+vr_fine0_static
+vr_fine0_pal_static
+vr_fine1_static
+vr_fine1_pal_static
+vr_fine2_static
+vr_fine2_pal_static
+vr_fine3_static
+vr_fine3_pal_static
+vr_cloud0_static
+vr_cloud0_pal_static
+vr_cloud1_static
+vr_cloud1_pal_static
+vr_cloud2_static
+vr_cloud2_pal_static
+vr_cloud3_static
+vr_cloud3_pal_static
+vr_holy0_static
+vr_holy0_pal_static
+vr_holy1_static
+vr_holy1_pal_static
+vr_MDVR_static
+vr_MDVR_pal_static
+vr_MNVR_static
+vr_MNVR_pal_static
+vr_RUVR_static
+vr_RUVR_pal_static
+vr_LHVR_static
+vr_LHVR_pal_static
+vr_KHVR_static
+vr_KHVR_pal_static
+vr_K3VR_static
+vr_K3VR_pal_static
+vr_K4VR_static
+vr_K4VR_pal_static
+vr_K5VR_static
+vr_K5VR_pal_static
+vr_SP1a_static
+vr_SP1a_pal_static
+vr_MLVR_static
+vr_MLVR_pal_static
+vr_KKRVR_static
+vr_KKRVR_pal_static
+vr_KR3VR_static
+vr_KR3VR_pal_static
+vr_IPVR_static
+vr_IPVR_pal_static
+vr_KSVR_static
+vr_KSVR_pal_static
+vr_GLVR_static
+vr_GLVR_pal_static
+vr_ZRVR_static
+vr_ZRVR_pal_static
+vr_DGVR_static
+vr_DGVR_pal_static
+vr_ALVR_static
+vr_ALVR_pal_static
+vr_NSVR_static
+vr_NSVR_pal_static
+vr_LBVR_static
+vr_LBVR_pal_static
+vr_TTVR_static
+vr_TTVR_pal_static
+vr_FCVR_static
+vr_FCVR_pal_static
+elf_message_field
+elf_message_ydan
+ydan_scene
+ydan_room_0
+ydan_room_1
+ydan_room_2
+ydan_room_3
+ydan_room_4
+ydan_room_5
+ydan_room_6
+ydan_room_7
+ydan_room_8
+ydan_room_9
+ydan_room_10
+ydan_room_11
+ddan_scene
+ddan_room_0
+ddan_room_1
+ddan_room_2
+ddan_room_3
+ddan_room_4
+ddan_room_5
+ddan_room_6
+ddan_room_7
+ddan_room_8
+ddan_room_9
+ddan_room_10
+ddan_room_11
+ddan_room_12
+ddan_room_13
+ddan_room_14
+ddan_room_15
+ddan_room_16
+bdan_scene
+bdan_room_0
+bdan_room_1
+bdan_room_2
+bdan_room_3
+bdan_room_4
+bdan_room_5
+bdan_room_6
+bdan_room_7
+bdan_room_8
+bdan_room_9
+bdan_room_10
+bdan_room_11
+bdan_room_12
+bdan_room_13
+bdan_room_14
+bdan_room_15
+Bmori1_scene
+Bmori1_room_0
+Bmori1_room_1
+Bmori1_room_2
+Bmori1_room_3
+Bmori1_room_4
+Bmori1_room_5
+Bmori1_room_6
+Bmori1_room_7
+Bmori1_room_8
+Bmori1_room_9
+Bmori1_room_10
+Bmori1_room_11
+Bmori1_room_12
+Bmori1_room_13
+Bmori1_room_14
+Bmori1_room_15
+Bmori1_room_16
+Bmori1_room_17
+Bmori1_room_18
+Bmori1_room_19
+Bmori1_room_20
+Bmori1_room_21
+Bmori1_room_22
+HIDAN_scene
+HIDAN_room_0
+HIDAN_room_1
+HIDAN_room_2
+HIDAN_room_3
+HIDAN_room_4
+HIDAN_room_5
+HIDAN_room_6
+HIDAN_room_7
+HIDAN_room_8
+HIDAN_room_9
+HIDAN_room_10
+HIDAN_room_11
+HIDAN_room_12
+HIDAN_room_13
+HIDAN_room_14
+HIDAN_room_15
+HIDAN_room_16
+HIDAN_room_17
+HIDAN_room_18
+HIDAN_room_19
+HIDAN_room_20
+HIDAN_room_21
+HIDAN_room_22
+HIDAN_room_23
+HIDAN_room_24
+HIDAN_room_25
+HIDAN_room_26
+MIZUsin_scene
+MIZUsin_room_0
+MIZUsin_room_1
+MIZUsin_room_2
+MIZUsin_room_3
+MIZUsin_room_4
+MIZUsin_room_5
+MIZUsin_room_6
+MIZUsin_room_7
+MIZUsin_room_8
+MIZUsin_room_9
+MIZUsin_room_10
+MIZUsin_room_11
+MIZUsin_room_12
+MIZUsin_room_13
+MIZUsin_room_14
+MIZUsin_room_15
+MIZUsin_room_16
+MIZUsin_room_17
+MIZUsin_room_18
+MIZUsin_room_19
+MIZUsin_room_20
+MIZUsin_room_21
+MIZUsin_room_22
+jyasinzou_scene
+jyasinzou_room_0
+jyasinzou_room_1
+jyasinzou_room_2
+jyasinzou_room_3
+jyasinzou_room_4
+jyasinzou_room_5
+jyasinzou_room_6
+jyasinzou_room_7
+jyasinzou_room_8
+jyasinzou_room_9
+jyasinzou_room_10
+jyasinzou_room_11
+jyasinzou_room_12
+jyasinzou_room_13
+jyasinzou_room_14
+jyasinzou_room_15
+jyasinzou_room_16
+jyasinzou_room_17
+jyasinzou_room_18
+jyasinzou_room_19
+jyasinzou_room_20
+jyasinzou_room_21
+jyasinzou_room_22
+jyasinzou_room_23
+jyasinzou_room_24
+jyasinzou_room_25
+jyasinzou_room_26
+jyasinzou_room_27
+jyasinzou_room_28
+HAKAdan_scene
+HAKAdan_room_0
+HAKAdan_room_1
+HAKAdan_room_2
+HAKAdan_room_3
+HAKAdan_room_4
+HAKAdan_room_5
+HAKAdan_room_6
+HAKAdan_room_7
+HAKAdan_room_8
+HAKAdan_room_9
+HAKAdan_room_10
+HAKAdan_room_11
+HAKAdan_room_12
+HAKAdan_room_13
+HAKAdan_room_14
+HAKAdan_room_15
+HAKAdan_room_16
+HAKAdan_room_17
+HAKAdan_room_18
+HAKAdan_room_19
+HAKAdan_room_20
+HAKAdan_room_21
+HAKAdan_room_22
+HAKAdanCH_scene
+HAKAdanCH_room_0
+HAKAdanCH_room_1
+HAKAdanCH_room_2
+HAKAdanCH_room_3
+HAKAdanCH_room_4
+HAKAdanCH_room_5
+HAKAdanCH_room_6
+ice_doukutu_scene
+ice_doukutu_room_0
+ice_doukutu_room_1
+ice_doukutu_room_2
+ice_doukutu_room_3
+ice_doukutu_room_4
+ice_doukutu_room_5
+ice_doukutu_room_6
+ice_doukutu_room_7
+ice_doukutu_room_8
+ice_doukutu_room_9
+ice_doukutu_room_10
+ice_doukutu_room_11
+men_scene
+men_room_0
+men_room_1
+men_room_2
+men_room_3
+men_room_4
+men_room_5
+men_room_6
+men_room_7
+men_room_8
+men_room_9
+men_room_10
+ganontika_scene
+ganontika_room_0
+ganontika_room_1
+ganontika_room_2
+ganontika_room_3
+ganontika_room_4
+ganontika_room_5
+ganontika_room_6
+ganontika_room_7
+ganontika_room_8
+ganontika_room_9
+ganontika_room_10
+ganontika_room_11
+ganontika_room_12
+ganontika_room_13
+ganontika_room_14
+ganontika_room_15
+ganontika_room_16
+ganontika_room_17
+ganontika_room_18
+ganontika_room_19
+spot00_scene
+spot00_room_0
+spot01_scene
+spot01_room_0
+spot02_scene
+spot02_room_0
+spot02_room_1
+spot03_scene
+spot03_room_0
+spot03_room_1
+spot04_scene
+spot04_room_0
+spot04_room_1
+spot04_room_2
+spot05_scene
+spot05_room_0
+spot06_scene
+spot06_room_0
+spot07_scene
+spot07_room_0
+spot07_room_1
+spot08_scene
+spot08_room_0
+spot09_scene
+spot09_room_0
+spot10_scene
+spot10_room_0
+spot10_room_1
+spot10_room_2
+spot10_room_3
+spot10_room_4
+spot10_room_5
+spot10_room_6
+spot10_room_7
+spot10_room_8
+spot10_room_9
+spot11_scene
+spot11_room_0
+spot12_scene
+spot12_room_0
+spot12_room_1
+spot13_scene
+spot13_room_0
+spot13_room_1
+spot15_scene
+spot15_room_0
+spot16_scene
+spot16_room_0
+spot17_scene
+spot17_room_0
+spot17_room_1
+spot18_scene
+spot18_room_0
+spot18_room_1
+spot18_room_2
+spot18_room_3
+market_day_scene
+market_day_room_0
+market_night_scene
+market_night_room_0
+kenjyanoma_scene
+kenjyanoma_room_0
+tokinoma_scene
+tokinoma_room_0
+tokinoma_room_1
+link_home_scene
+link_home_room_0
+kokiri_shop_scene
+kokiri_shop_room_0
+kokiri_home_scene
+kokiri_home_room_0
+kakusiana_scene
+kakusiana_room_0
+kakusiana_room_1
+kakusiana_room_2
+kakusiana_room_3
+kakusiana_room_4
+kakusiana_room_5
+kakusiana_room_6
+kakusiana_room_7
+kakusiana_room_8
+kakusiana_room_9
+kakusiana_room_10
+kakusiana_room_11
+kakusiana_room_12
+kakusiana_room_13
+entra_scene
+entra_room_0
+moribossroom_scene
+moribossroom_room_0
+moribossroom_room_1
+syatekijyou_scene
+syatekijyou_room_0
+shop1_scene
+shop1_room_0
+hairal_niwa_scene
+hairal_niwa_room_0
+ganon_tou_scene
+ganon_tou_room_0
+market_alley_scene
+market_alley_room_0
+spot20_scene
+spot20_room_0
+market_ruins_scene
+market_ruins_room_0
+entra_n_scene
+entra_n_room_0
+enrui_scene
+enrui_room_0
+market_alley_n_scene
+market_alley_n_room_0
+hiral_demo_scene
+hiral_demo_room_0
+kokiri_home3_scene
+kokiri_home3_room_0
+malon_stable_scene
+malon_stable_room_0
+kakariko_scene
+kakariko_room_0
+bdan_boss_scene
+bdan_boss_room_0
+bdan_boss_room_1
+FIRE_bs_scene
+FIRE_bs_room_0
+FIRE_bs_room_1
+hut_scene
+hut_room_0
+daiyousei_izumi_scene
+daiyousei_izumi_room_0
+hakaana_scene
+hakaana_room_0
+yousei_izumi_tate_scene
+yousei_izumi_tate_room_0
+yousei_izumi_yoko_scene
+yousei_izumi_yoko_room_0
+golon_scene
+golon_room_0
+zoora_scene
+zoora_room_0
+drag_scene
+drag_room_0
+alley_shop_scene
+alley_shop_room_0
+night_shop_scene
+night_shop_room_0
+impa_scene
+impa_room_0
+labo_scene
+labo_room_0
+tent_scene
+tent_room_0
+nakaniwa_scene
+nakaniwa_room_0
+ddan_boss_scene
+ddan_boss_room_0
+ddan_boss_room_1
+ydan_boss_scene
+ydan_boss_room_0
+ydan_boss_room_1
+HAKAdan_bs_scene
+HAKAdan_bs_room_0
+HAKAdan_bs_room_1
+MIZUsin_bs_scene
+MIZUsin_bs_room_0
+MIZUsin_bs_room_1
+ganon_scene
+ganon_room_0
+ganon_room_1
+ganon_room_2
+ganon_room_3
+ganon_room_4
+ganon_room_5
+ganon_room_6
+ganon_room_7
+ganon_room_8
+ganon_room_9
+ganon_boss_scene
+ganon_boss_room_0
+jyasinboss_scene
+jyasinboss_room_0
+jyasinboss_room_1
+jyasinboss_room_2
+jyasinboss_room_3
+kokiri_home4_scene
+kokiri_home4_room_0
+kokiri_home5_scene
+kokiri_home5_room_0
+ganon_final_scene
+ganon_final_room_0
+kakariko3_scene
+kakariko3_room_0
+hakasitarelay_scene
+hakasitarelay_room_0
+hakasitarelay_room_1
+hakasitarelay_room_2
+hakasitarelay_room_3
+hakasitarelay_room_4
+hakasitarelay_room_5
+hakasitarelay_room_6
+shrine_scene
+shrine_room_0
+turibori_scene
+turibori_room_0
+shrine_n_scene
+shrine_n_room_0
+shrine_r_scene
+shrine_r_room_0
+hakaana2_scene
+hakaana2_room_0
+gerudoway_scene
+gerudoway_room_0
+gerudoway_room_1
+gerudoway_room_2
+gerudoway_room_3
+gerudoway_room_4
+gerudoway_room_5
+hairal_niwa_n_scene
+hairal_niwa_n_room_0
+bowling_scene
+bowling_room_0
+hakaana_ouke_scene
+hakaana_ouke_room_0
+hakaana_ouke_room_1
+hakaana_ouke_room_2
+hylia_labo_scene
+hylia_labo_room_0
+souko_scene
+souko_room_0
+souko_room_1
+souko_room_2
+miharigoya_scene
+miharigoya_room_0
+mahouya_scene
+mahouya_room_0
+takaraya_scene
+takaraya_room_0
+takaraya_room_1
+takaraya_room_2
+takaraya_room_3
+takaraya_room_4
+takaraya_room_5
+takaraya_room_6
+ganon_sonogo_scene
+ganon_sonogo_room_0
+ganon_sonogo_room_1
+ganon_sonogo_room_2
+ganon_sonogo_room_3
+ganon_sonogo_room_4
+ganon_demo_scene
+ganon_demo_room_0
+face_shop_scene
+face_shop_room_0
+kinsuta_scene
+kinsuta_room_0
+ganontikasonogo_scene
+ganontikasonogo_room_0
+ganontikasonogo_room_1
+bump_texture_static
+anime_model_1_static
+anime_model_2_static
+anime_model_3_static
+anime_model_4_static
+anime_model_5_static
+anime_model_6_static
+anime_texture_1_static
+anime_texture_2_static
+anime_texture_3_static
+anime_texture_4_static
+anime_texture_5_static
+anime_texture_6_static
+softsprite_matrix_static
\ No newline at end of file
diff --git a/OTRExporter/OTRExporter/DisplayListExporter.cpp b/OTRExporter/OTRExporter/DisplayListExporter.cpp
index d01126fde..d03a06333 100644
--- a/OTRExporter/OTRExporter/DisplayListExporter.cpp
+++ b/OTRExporter/OTRExporter/DisplayListExporter.cpp
@@ -195,7 +195,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
break;
case G_MTX:
{
- if ((!Globals::Instance->HasSegment(GETSEGNUM(data))) || ((data & 0xFFFFFFFF) == 0x07000000)) // En_Zf and En_Ny place a DL in segment 7
+ if ((!Globals::Instance->HasSegment(GETSEGNUM(data), res->parent->workerID)) || ((data & 0xFFFFFFFF) == 0x07000000)) // En_Zf and En_Ny place a DL in segment 7
{
uint32_t pp = (data & 0x000000FF00000000) >> 32;
uint32_t mm = (data & 0x00000000FFFFFFFF);
@@ -356,7 +356,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
//std::string fName = StringHelper::Sprintf("%s\\%s", GetParentFolderName(res).c_str(), dListDecl2->varName.c_str());
std::string fName = OTRExporter_DisplayList::GetPathToRes(res, dListDecl2->varName.c_str());
- if (!File::Exists("Extract/" + fName))
+ if (files.find(fName) == files.end() && !File::Exists("Extract/" + fName))
{
MemoryStream* dlStream = new MemoryStream();
BinaryWriter dlWriter = BinaryWriter(dlStream);
@@ -368,7 +368,10 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
//otrArchive->RemoveFile(fName);
#endif
- File::WriteAllBytes("Extract/" + fName, dlStream->ToVector());
+ if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
+ File::WriteAllBytes("Extract/" + fName, dlStream->ToVector());
+ else
+ files[fName] = dlStream->ToVector();
//otrArchive->AddFile(fName, (uintptr_t)dlStream->ToVector().data(), dlWriter.GetBaseAddress());
}
@@ -387,7 +390,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
//case G_BRANCH_Z:
case G_DL:
{
- if ((!Globals::Instance->HasSegment(GETSEGNUM(data)) && (int)opF3D != G_BRANCH_Z)
+ if ((!Globals::Instance->HasSegment(GETSEGNUM(data), res->parent->workerID) && (int)opF3D != G_BRANCH_Z)
|| ((data & 0xFFFFFFFF) == 0x07000000)) // En_Zf and En_Ny place a DL in segment 7
{
int32_t pp = (data & 0x00FF000000000000) >> 56;
@@ -450,14 +453,17 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
//std::string fName = StringHelper::Sprintf("%s\\%s", GetParentFolderName(res).c_str(), dListDecl2->varName.c_str());
std::string fName = OTRExporter_DisplayList::GetPathToRes(res, dListDecl2->varName.c_str());
- if (!File::Exists("Extract/" + fName))
+ if (files.find(fName) == files.end() && !File::Exists("Extract/" + fName))
{
MemoryStream* dlStream = new MemoryStream();
BinaryWriter dlWriter = BinaryWriter(dlStream);
Save(dList->otherDLists[i], outPath, &dlWriter);
- File::WriteAllBytes("Extract/" + fName, dlStream->ToVector());
+ if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
+ File::WriteAllBytes("Extract/" + fName, dlStream->ToVector());
+ else
+ files[fName] = dlStream->ToVector();
}
}
else
@@ -647,7 +653,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
{
int sss = (data & 0x00FFF00000000000) >> 44;
int ttt = (data & 0x00000FFF00000000) >> 32;
- int i = (data & 0x000000000F000000) >> 16;
+ int i = (data & 0x000000000F000000) >> 24;
int uuu = (data & 0x0000000000FFF000) >> 12;
int vvv= (data & 0x0000000000000FFF);
@@ -661,7 +667,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
uint32_t seg = data & 0xFFFFFFFF;
int32_t texAddress = Seg2Filespace(data, dList->parent->baseAddress);
- if (!Globals::Instance->HasSegment(GETSEGNUM(seg)))
+ if (!Globals::Instance->HasSegment(GETSEGNUM(seg), res->parent->workerID))
{
int32_t __ = (data & 0x00FF000000000000) >> 48;
int32_t www = (data & 0x00000FFF00000000) >> 32;
@@ -669,7 +675,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
uint32_t fmt = (__ & 0xE0) >> 5;
uint32_t siz = (__ & 0x18) >> 3;
- Gfx value = gsDPSetTextureImage(fmt, siz, www - 1, (seg & 0x0FFFFFFF) + 1);
+ Gfx value = gsDPSetTextureImage(fmt, siz, www + 1, (seg & 0x0FFFFFFF) + 1);
word0 = value.words.w0;
word1 = value.words.w1;
@@ -679,7 +685,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
else
{
std::string texName = "";
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", texName);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", texName, res->parent->workerID);
int32_t __ = (data & 0x00FF000000000000) >> 48;
int32_t www = (data & 0x00000FFF00000000) >> 32;
@@ -687,7 +693,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
uint32_t fmt = (__ & 0xE0) >> 5;
uint32_t siz = (__ & 0x18) >> 3;
- Gfx value = gsDPSetTextureImage(fmt, siz, www - 1, __);
+ Gfx value = gsDPSetTextureImage(fmt, siz, www + 1, __);
word0 = value.words.w0 & 0x00FFFFFF;
word0 += (G_SETTIMG_OTR << 24);
//word1 = value.words.w1;
@@ -698,7 +704,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
if (foundDecl)
{
- ZFile* assocFile = Globals::Instance->GetSegment(GETSEGNUM(seg));
+ ZFile* assocFile = Globals::Instance->GetSegment(GETSEGNUM(seg), res->parent->workerID);
std::string assocFileName = assocFile->GetName();
std::string fName = "";
@@ -736,42 +742,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
word1 = value.words.w1 | 1;
}
else
- //if (dList->vertices.size() > 0)
{
- // Connect neighboring vertex arrays
- std::vector>> vertsKeys(dList->vertices.begin(),
- dList->vertices.end());
-
- if (vertsKeys.size() > 0)
- {
- auto lastItem = vertsKeys[0];
-
- for (size_t i = 1; i < vertsKeys.size(); i++)
- {
- auto curItem = vertsKeys[i];
-
- int32_t sizeDiff = curItem.first - (lastItem.first + (lastItem.second.size() * 16));
-
- // Make sure there isn't an unaccounted inbetween these two
- if (sizeDiff == 0)
- {
- for (auto v : curItem.second)
- {
- dList->vertices[lastItem.first].push_back(v);
- lastItem.second.push_back(v);
- }
-
- dList->vertices.erase(curItem.first);
- vertsKeys.erase(vertsKeys.begin() + i);
-
- i--;
- continue;
- }
-
- lastItem = curItem;
- }
- }
-
// Write CRC64 of vtx file name
uint32_t addr = data & 0xFFFFFFFF;
@@ -779,10 +750,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
addr -= dList->parent->baseAddress;
auto segOffset = GETSEGOFFSET(addr);
- //uint32_t seg = data & 0xFFFFFFFF;
Declaration* vtxDecl = dList->parent->GetDeclarationRanged(segOffset);
- //std::string vtxName = "";
- //bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, dList->parent, "", vtxName);
int32_t aa = (data & 0x000000FF00000000ULL) >> 32;
int32_t nn = (data & 0x000FF00000000000ULL) >> 44;
@@ -808,9 +776,8 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
word0 = hash >> 32;
word1 = hash & 0xFFFFFFFF;
- if (!File::Exists("Extract/" + fName))
+ if (files.find(fName) == files.end() && !File::Exists("Extract/" + fName))
{
- //printf("Exporting VTX Data %s\n", fName.c_str());
// Write vertices to file
MemoryStream* vtxStream = new MemoryStream();
BinaryWriter vtxWriter = BinaryWriter(vtxStream);
@@ -833,44 +800,40 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
vtxWriter.Write((uint32_t)ZResourceType::Vertex);
vtxWriter.Write((uint32_t)arrCnt);
- size_t sz = dList->vertices[vtxDecl->address].size();
+ auto start = std::chrono::steady_clock::now();
- //if (sz > 0)
+ // God dammit this is so dumb
+ for (size_t i = 0; i < split.size(); i++)
{
- auto start = std::chrono::steady_clock::now();
+ std::string line = split[i];
- // God dammit this is so dumb
- for (size_t i = 0; i < split.size(); i++)
+ if (StringHelper::Contains(line, "VTX("))
{
- std::string line = split[i];
+ auto split2 = StringHelper::Split(StringHelper::Split(StringHelper::Split(line, "VTX(")[1], ")")[0], ",");
- if (StringHelper::Contains(line, "VTX("))
- {
- auto split2 = StringHelper::Split(StringHelper::Split(StringHelper::Split(line, "VTX(")[1], ")")[0], ",");
+ vtxWriter.Write((int16_t)std::stoi(split2[0], nullptr, 10)); // v.x
+ vtxWriter.Write((int16_t)std::stoi(split2[1], nullptr, 10)); // v.y
+ vtxWriter.Write((int16_t)std::stoi(split2[2], nullptr, 10)); // v.z
- vtxWriter.Write((int16_t)std::stoi(split2[0], nullptr, 10)); // v.x
- vtxWriter.Write((int16_t)std::stoi(split2[1], nullptr, 10)); // v.y
- vtxWriter.Write((int16_t)std::stoi(split2[2], nullptr, 10)); // v.z
+ vtxWriter.Write((int16_t)0); // v.flag
- vtxWriter.Write((int16_t)0); // v.flag
+ vtxWriter.Write((int16_t)std::stoi(split2[3], nullptr, 10)); // v.s
+ vtxWriter.Write((int16_t)std::stoi(split2[4], nullptr, 10)); // v.t
- vtxWriter.Write((int16_t)std::stoi(split2[3], nullptr, 10)); // v.s
- vtxWriter.Write((int16_t)std::stoi(split2[4], nullptr, 10)); // v.t
-
- vtxWriter.Write((uint8_t)std::stoi(split2[5], nullptr, 10)); // v.r
- vtxWriter.Write((uint8_t)std::stoi(split2[6], nullptr, 10)); // v.g
- vtxWriter.Write((uint8_t)std::stoi(split2[7], nullptr, 10)); // v.b
- vtxWriter.Write((uint8_t)std::stoi(split2[8], nullptr, 10)); // v.a
- }
+ vtxWriter.Write((uint8_t)std::stoi(split2[5], nullptr, 10)); // v.r
+ vtxWriter.Write((uint8_t)std::stoi(split2[6], nullptr, 10)); // v.g
+ vtxWriter.Write((uint8_t)std::stoi(split2[7], nullptr, 10)); // v.b
+ vtxWriter.Write((uint8_t)std::stoi(split2[8], nullptr, 10)); // v.a
}
-
- File::WriteAllBytes("Extract/" + fName, vtxStream->ToVector());
-
- auto end = std::chrono::steady_clock::now();
- size_t diff = std::chrono::duration_cast(end - start).count();
-
- //printf("Exported VTX Array %s in %zums\n", fName.c_str(), diff);
}
+
+ if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
+ File::WriteAllBytes("Extract/" + fName, vtxStream->ToVector());
+ else
+ files[fName] = vtxStream->ToVector();
+
+ auto end = std::chrono::steady_clock::now();
+ size_t diff = std::chrono::duration_cast(end - start).count();
}
}
else
@@ -878,15 +841,6 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
spdlog::error("vtxDecl == nullptr!");
}
}
- /*else
- {
- writer->Write(word0);
- writer->Write(word1);
- word0 = 0;
- word1 = 0;
-
- spdlog::error("dList->vertices.size() <= 0!");
- }*/
}
break;
}
diff --git a/OTRExporter/OTRExporter/Main.cpp b/OTRExporter/OTRExporter/Main.cpp
index bff760c66..2ed9cb427 100644
--- a/OTRExporter/OTRExporter/Main.cpp
+++ b/OTRExporter/OTRExporter/Main.cpp
@@ -25,6 +25,7 @@ std::string otrFileName = "oot.otr";
std::shared_ptr otrArchive;
BinaryWriter* fileWriter;
std::chrono::steady_clock::time_point fileStart, resStart;
+std::map> files;
void InitVersionInfo();
@@ -39,6 +40,8 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM
{
fileMode = (ZFileMode)ExporterFileMode::BuildOTR;
+ printf("BOTR: Generating OTR Archive...\n");
+
if (File::Exists(otrFileName))
otrArchive = std::shared_ptr(new Ship::Archive(otrFileName, true));
else
@@ -54,6 +57,35 @@ static void ExporterParseFileMode(const std::string& buildMode, ZFileMode& fileM
}
}
+static void ExporterProgramEnd()
+{
+ if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory)
+ {
+ printf("Generating OTR Archive...\n");
+ otrArchive = Ship::Archive::CreateArchive(otrFileName, 65536 / 2);
+
+ for (auto item : files)
+ {
+ auto fileData = item.second;
+ otrArchive->AddFile(item.first, (uintptr_t)fileData.data(), fileData.size());
+ }
+
+ // Add any additional files that need to be manually copied...
+ auto lst = Directory::ListFiles("Extract");
+
+ for (auto item : lst)
+ {
+ auto fileData = File::ReadAllBytes(item);
+ otrArchive->AddFile(StringHelper::Split(item, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
+ }
+
+ otrArchive->AddFile("Audiobank", (uintptr_t)Globals::Instance->GetBaseromFile("Audiobank").data(), Globals::Instance->GetBaseromFile("Audiobank").size());
+ otrArchive->AddFile("Audioseq", (uintptr_t)Globals::Instance->GetBaseromFile("Audioseq").data(), Globals::Instance->GetBaseromFile("Audioseq").size());
+ otrArchive->AddFile("Audiotable", (uintptr_t)Globals::Instance->GetBaseromFile("Audiotable").data(), Globals::Instance->GetBaseromFile("Audiotable").size());
+ }
+}
+
+
static void ExporterParseArgs(int argc, char* argv[], int& i)
{
std::string arg = argv[i];
@@ -85,7 +117,7 @@ static void ExporterFileBegin(ZFile* file)
static void ExporterFileEnd(ZFile* file)
{
- delete fileWriter;
+ // delete fileWriter;
}
static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
@@ -125,7 +157,10 @@ static void ExporterResourceEnd(ZResource* res, BinaryWriter& writer)
else
fName = StringHelper::Sprintf("%s/%s", oName.c_str(), rName.c_str());
- File::WriteAllBytes("Extract/" + fName, strem->ToVector());
+ if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory)
+ files[fName] = strem->ToVector();
+ else
+ File::WriteAllBytes("Extract/" + fName, strem->ToVector());
}
auto end = std::chrono::steady_clock::now();
@@ -156,6 +191,8 @@ static void ImportExporters()
exporterSet->beginXMLFunc = ExporterXMLBegin;
exporterSet->endXMLFunc = ExporterXMLEnd;
exporterSet->resSaveFunc = ExporterResourceEnd;
+ exporterSet->endProgramFunc = ExporterProgramEnd;
+
exporterSet->exporters[ZResourceType::Background] = new OTRExporter_Background();
exporterSet->exporters[ZResourceType::Texture] = new OTRExporter_Texture();
exporterSet->exporters[ZResourceType::Room] = new OTRExporter_Room();
diff --git a/OTRExporter/OTRExporter/Main.h b/OTRExporter/OTRExporter/Main.h
index a29e21859..af4ada763 100644
--- a/OTRExporter/OTRExporter/Main.h
+++ b/OTRExporter/OTRExporter/Main.h
@@ -2,4 +2,5 @@
#include
-extern std::shared_ptr otrArchive;
\ No newline at end of file
+extern std::shared_ptr otrArchive;
+extern std::map> files;
\ No newline at end of file
diff --git a/OTRExporter/OTRExporter/OTRExporter.vcxproj b/OTRExporter/OTRExporter/OTRExporter.vcxproj
index 96531304b..4ed7d72e1 100644
--- a/OTRExporter/OTRExporter/OTRExporter.vcxproj
+++ b/OTRExporter/OTRExporter/OTRExporter.vcxproj
@@ -63,6 +63,12 @@
+
+
+ {02d10590-9542-3f55-aaf8-6055677e2a2a}
+ false
+
+
16.0
Win32Proj
@@ -118,19 +124,31 @@
true
$(SolutionDir)otrlib;$(SolutionDir)\ZAPD\ZAPD\;$(SolutionDir)\ZAPD\lib\tinyxml2;$(SolutionDir)\ZAPD\lib\libgfxd;$(SolutionDir)\ZAPD\lib\elfio;$(SolutionDir)\ZAPD\lib\assimp\include;$(SolutionDir)\ZAPD\lib\stb;$(ProjectDir);$(IncludePath)
+ MinimumRecommendedRules.ruleset
+
+
false
+ MinimumRecommendedRules.ruleset
+
+
true
$(ProjectDir)..\..\ZAPDTR\ZAPD;$(ProjectDir)..\..\ZAPDTR\lib\tinyxml2;$(ProjectDir)..\..\ZAPDTR\lib\libgfxd;$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)..\..\libultraship\libultraship;$(ProjectDir)..\..\libultraship\libultraship\lib\spdlog\include;$(ProjectDir)..\..\libultraship\libultraship\Lib\Fast3D\U64;$(IncludePath)
$(ProjectDir)..\..\libultraship\libultraship;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
false
$(ProjectDir)..\..\ZAPDTR\ZAPD;$(ProjectDir)..\..\ZAPDTR\lib\tinyxml2;$(ProjectDir)..\..\ZAPDTR\lib\libgfxd;$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)..\..\libultraship\libultraship;$(ProjectDir)..\..\libultraship\libultraship\lib\spdlog\include;$(ProjectDir)..\..\libultraship\libultraship\Lib\Fast3D\U64;$(IncludePath)
$(ProjectDir)..\..\libultraship\libultraship;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
diff --git a/OTRExporter/OTRExporter/RoomExporter.cpp b/OTRExporter/OTRExporter/RoomExporter.cpp
index 837d2ad91..9a5704bbc 100644
--- a/OTRExporter/OTRExporter/RoomExporter.cpp
+++ b/OTRExporter/OTRExporter/RoomExporter.cpp
@@ -407,7 +407,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
{
uint32_t seg = cmdHeaders->headers[i] & 0xFFFFFFFF;
std::string headerName = "";
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, room->parent, "", headerName);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(seg, room->parent, "", headerName, res->parent->workerID);
if (headerName == "NULL")
writer->Write("");
else
@@ -443,7 +443,7 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
SetCutscenes* cmdSetCutscenes = (SetCutscenes*)cmd;
std::string listName;
- Globals::Instance->GetSegmentedPtrName(cmdSetCutscenes->cmdArg2, room->parent, "CutsceneData", listName);
+ Globals::Instance->GetSegmentedPtrName(cmdSetCutscenes->cmdArg2, room->parent, "CutsceneData", listName, res->parent->workerID);
std::string fName = OTRExporter_DisplayList::GetPathToRes(room, listName);
//std::string fName = StringHelper::Sprintf("%s\\%s", OTRExporter_DisplayList::GetParentFolderName(room).c_str(), listName.c_str());
writer->Write(fName);
@@ -453,7 +453,10 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
OTRExporter_Cutscene cs;
cs.Save(cmdSetCutscenes->cutscenes[0], "", &csWriter);
- File::WriteAllBytes("Extract/" + fName, csStream->ToVector());
+ if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
+ File::WriteAllBytes("Extract/" + fName, csStream->ToVector());
+ else
+ files[fName] = csStream->ToVector();
//std::string fName = OTRExporter_DisplayList::GetPathToRes(res, vtxDecl->varName);
//otrArchive->AddFile(fName, (uintptr_t)csStream->ToVector().data(), csWriter.GetBaseAddress());
@@ -477,7 +480,10 @@ void OTRExporter_Room::Save(ZResource* res, const fs::path& outPath, BinaryWrite
OTRExporter_Path pathExp;
pathExp.Save(&cmdSetPathways->pathwayList, outPath, &pathWriter);
- File::WriteAllBytes("Extract/" + path, pathStream->ToVector());
+ if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory)
+ File::WriteAllBytes("Extract/" + path, pathStream->ToVector());
+ else
+ files[path] = pathStream->ToVector();
//otrArchive->AddFile(path, (uintptr_t)pathStream->ToVector().data(), pathWriter.GetBaseAddress());
diff --git a/OTRExporter/OTRExporter/SkeletonExporter.cpp b/OTRExporter/OTRExporter/SkeletonExporter.cpp
index cd9f7a8fd..3e0c58d06 100644
--- a/OTRExporter/OTRExporter/SkeletonExporter.cpp
+++ b/OTRExporter/OTRExporter/SkeletonExporter.cpp
@@ -23,7 +23,7 @@ void OTRExporter_Skeleton::Save(ZResource* res, const fs::path& outPath, BinaryW
Declaration* skelDecl = skel->parent->GetDeclarationRanged(GETSEGOFFSET(skel->limbsTable.limbsAddresses[i]));
std::string name;
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(skel->limbsTable.limbsAddresses[i], skel->parent, "", name);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(skel->limbsTable.limbsAddresses[i], skel->parent, "", name, res->parent->workerID);
if (foundDecl)
{
if (name.at(0) == '&')
diff --git a/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp b/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp
index d22c3d000..e29c9a425 100644
--- a/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp
+++ b/OTRExporter/OTRExporter/SkeletonLimbExporter.cpp
@@ -86,7 +86,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin
if (limb->childPtr != 0)
{
std::string name;
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->childPtr, limb->parent, "", name);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->childPtr, limb->parent, "", name, res->parent->workerID);
if (foundDecl)
{
if (name.at(0) == '&')
@@ -107,7 +107,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin
if (limb->siblingPtr != 0)
{
std::string name;
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->siblingPtr, limb->parent, "", name);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->siblingPtr, limb->parent, "", name, res->parent->workerID);
if (foundDecl)
{
if (name.at(0) == '&')
@@ -128,7 +128,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin
if (limb->dListPtr != 0)
{
std::string name;
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dListPtr, limb->parent, "", name);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dListPtr, limb->parent, "", name, res->parent->workerID);
if (foundDecl)
{
if (name.at(0) == '&')
@@ -149,7 +149,7 @@ void OTRExporter_SkeletonLimb::Save(ZResource* res, const fs::path& outPath, Bin
if (limb->dList2Ptr != 0)
{
std::string name;
- bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dList2Ptr, limb->parent, "", name);
+ bool foundDecl = Globals::Instance->GetSegmentedPtrName(limb->dList2Ptr, limb->parent, "", name, res->parent->workerID);
if (foundDecl)
{
if (name.at(0) == '&')
diff --git a/OTRExporter/extract_assets.py b/OTRExporter/extract_assets.py
index deb17aa1d..d2a96f2e5 100755
--- a/OTRExporter/extract_assets.py
+++ b/OTRExporter/extract_assets.py
@@ -1,24 +1,51 @@
#!/usr/bin/env python3
-import argparse, json, os, signal, time, sys, shutil
+# How to use:
+# Place a rom in this directory then run the script.
+# If you are using multiple roms, the script will let you choose one.
+# To choose with a commandline argument:
+# Python3 extract_assets.py
+# Invalid input results in the first rom being selected
+
+import json, os, signal, time, sys, shutil, glob
from multiprocessing import Pool, cpu_count, Event, Manager, ProcessError
+from enum import Enum
import shutil
-def SignalHandler(sig, frame):
- print(f'Signal {sig} received. Aborting...')
- mainAbort.set()
- # Don't exit immediately to update the extracted assets file.
+romVer = "..\\soh\\baserom_non_mq.z64"
+roms = [];
+checksums = ["", "", ""];
-def BuildOTR():
- shutil.copyfile("../soh/baserom/Audiobank", "Extract/Audiobank")
- shutil.copyfile("../soh/baserom/Audioseq", "Extract/Audioseq")
- shutil.copyfile("../soh/baserom/Audiotable", "Extract/Audiotable")
+class Checksums(Enum):
+ OOT_NTSC_10 = "EC7011B7"
+ OOT_NTSC_11 = "D43DA81F"
+ OOT_NTSC_12 = "693BA2AE"
+ OOT_PAL_10 = "B044B569"
+ OOT_PAL_11 = "B2055FBD"
+ OOT_NTSC_JP_GC_CE = "F7F52DB8"
+ OOT_NTSC_JP_GC = "F611F4BA"
+ OOT_NTSC_US_GC = "F3DD35BA"
+ OOT_PAL_GC = "09465AC3"
+ OOT_NTSC_JP_MQ = "F43B45BA"
+ OOT_NTSC_US_MQ = "F034001A"
+ OOT_PAL_MQ = "1D4136F3"
+ OOT_PAL_GC_DBG1 = "871E1C92"
+ OOT_PAL_GC_DBG2 = "87121EFE"
+ OOT_PAL_GC_MQ_DBG = "917D18F6"
+ OOT_IQUE_TW = "3D81FB3E"
+ OOT_IQUE_CN = "B1E1E07B"
+ OOT_UNKNOWN = "FFFFFFFF"
+CompatibleChecksums = [
+ Checksums.OOT_PAL_GC,
+ Checksums.OOT_PAL_GC_DBG1
+]
+
+def BuildOTR(xmlPath, rom):
shutil.copytree("assets", "Extract/assets")
execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPDTR/ZAPD.out"
-
- execStr += " botr -se OTR"
+ execStr += " ed -i %s -b %s -fl CFG/filelists -o placeholder -osf placeholder -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath, rom)
print(execStr)
exitValue = os.system(execStr)
@@ -28,90 +55,95 @@ def BuildOTR():
print("Aborting...", file=os.sys.stderr)
print("\n")
-def ExtractFile(xmlPath, outputPath, outputSourcePath):
- execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPDTR/ZAPD.out"
- execStr += " e -eh -i %s -b ../soh/baserom/ -o %s -osf %s -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath, outputPath, outputSourcePath)
+def checkChecksum(rom):
+ r = open(rom, "rb")
+ r.seek(16)
+ bytes = r.read(4).hex().upper()
+ r.close()
- if "overlays" in xmlPath:
- execStr += " --static"
+ for checksum in Checksums:
+ if (checksum.value == bytes):
- print(execStr)
- exitValue = os.system(execStr)
- #exitValue = 0
- if exitValue != 0:
- print("\n")
- print("Error when extracting from file " + xmlPath, file=os.sys.stderr)
- print("Aborting...", file=os.sys.stderr)
- print("\n")
-
-def ExtractFunc(fullPath):
- *pathList, xmlName = fullPath.split(os.sep)
- objectName = os.path.splitext(xmlName)[0]
-
- outPath = os.path.join("../soh/assets/", *pathList[4:], objectName)
- os.makedirs(outPath, exist_ok=True)
- outSourcePath = outPath
-
- ExtractFile(fullPath, outPath, outSourcePath)
-
-def initializeWorker(abort, test):
- global globalAbort
- globalAbort = abort
+ for compat in CompatibleChecksums:
+ if (checksum.name == compat.name):
+ print("Compatible rom found!")
+ return checksum
+ print("Valid oot rom found. However, not compatible with SoH.")
+ print("Compatible roms:")
+ for compat in CompatibleChecksums:
+ print(compat.name+" | 0x"+compat.value)
+ sys.exit(1)
+ print("Wrong rom! No valid checksum found")
+ sys.exit(1)
def main():
- parser = argparse.ArgumentParser(description="baserom asset extractor")
- parser.add_argument("-s", "--single", help="asset path relative to assets/, e.g. objects/gameplay_keep")
- parser.add_argument("-f", "--force", help="Force the extraction of every xml instead of checking the touched ones.", action="store_true")
- parser.add_argument("-u", "--unaccounted", help="Enables ZAPD unaccounted detector warning system.", action="store_true")
- args = parser.parse_args()
- global mainAbort
- mainAbort = Event()
- manager = Manager()
- signal.signal(signal.SIGINT, SignalHandler)
+ romToUse = "";
- extractedAssetsTracker = manager.dict()
+ for file in glob.glob("*.z64"):
+ roms.append(file)
- asset_path = args.single
- if asset_path is not None:
- fullPath = os.path.join("../soh/assets", "xml", asset_path + ".xml")
- if not os.path.exists(fullPath):
- print(f"Error. File {fullPath} doesn't exists.", file=os.sys.stderr)
- exit(1)
+ if not (roms):
+ print("Error: No roms located, place one in the OTRExporter directory", file=os.sys.stderr)
+ sys.exit(1)
+
+ if (len(roms) > 1):
+
+ # If commandline args exist
+ if (len(sys.argv) > 1):
+ try:
+ if ((int(sys.argv[1]) - 1) < 1):
+ romToUse = roms[0]
+
+ elif ((int(sys.argv[1]) - 1) > len(roms)):
+ romToUse = roms[len(roms) - 1]
+
+ else:
+ romToUse = roms[int(sys.argv[1]) - 1]
+ except:
+ romToUse = roms[0]
+
+ # No commandline args, select rom using user input
+ else:
+
+ print(str(len(roms))+" roms found, please select one by pressing 1-"+str(len(roms)))
+
+ count = 1
+ for list in range(len(roms)):
+ print(str(count)+". "+roms[list])
+ count += 1
+
+ while(1):
+ try:
+ selection = int(input())
+ except:
+ print("Bad input. Try again with the number keys.")
+ continue
+
+ if (selection < 1 or selection > len(roms)):
+ print("Bad input. Try again.")
+ continue
+
+ else: break
+
+ romToUse = roms[selection - 1]
- ExtractFunc(fullPath)
else:
- extract_text_path = "assets/text/message_data.h"
- if os.path.isfile(extract_text_path):
- extract_text_path = None
- extract_staff_text_path = "assets/text/message_data_staff.h"
- if os.path.isfile(extract_staff_text_path):
- extract_staff_text_path = None
+ romToUse = roms[0]
- xmlFiles = []
- for currentPath, _, files in os.walk(os.path.join("../soh/assets", "xml")):
- for file in files:
- fullPath = os.path.join(currentPath, file)
- if file.endswith(".xml"):
- xmlFiles.append(fullPath)
+ match checkChecksum(romToUse):
+ case Checksums.OOT_PAL_GC:
+ xmlVer = "GC_NMQ_PAL_F"
+ case Checksums.OOT_PAL_GC_DBG1:
+ xmlVer = "GC_NMQ_D"
+ case _: # default case
+ xmlVer = "GC_MQ_D"
- try:
- numCores = 2
- print("Extracting assets with " + str(numCores) + " CPU cores.")
- with Pool(numCores, initializer=initializeWorker, initargs=(mainAbort, 0)) as p:
- p.map(ExtractFunc, xmlFiles)
- except Exception as e:
- print("Warning: Multiprocessing exception ocurred.", file=os.sys.stderr)
- print("Disabling mutliprocessing.", file=os.sys.stderr)
-
- initializeWorker(mainAbort, 0)
- for singlePath in xmlFiles:
- ExtractFunc(singlePath)
-
-
- BuildOTR()
+ if (os.path.exists("Extract")):
shutil.rmtree("Extract")
+ BuildOTR("../soh/assets/xml/" + xmlVer + "/", romToUse)
+
if __name__ == "__main__":
- main()
\ No newline at end of file
+ main()
diff --git a/OTRExporter/extract_assets_old.py b/OTRExporter/extract_assets_old.py
new file mode 100644
index 000000000..2922bbf06
--- /dev/null
+++ b/OTRExporter/extract_assets_old.py
@@ -0,0 +1,125 @@
+#!/usr/bin/env python3
+
+import argparse, json, os, signal, time, sys, shutil
+from multiprocessing import Pool, cpu_count, Event, Manager, ProcessError
+import shutil
+
+def SignalHandler(sig, frame):
+ print(f'Signal {sig} received. Aborting...')
+ mainAbort.set()
+ # Don't exit immediately to update the extracted assets file.
+
+def BuildOTR():
+ shutil.copyfile("baserom/Audiobank", "Extract/Audiobank")
+ shutil.copyfile("baserom/Audioseq", "Extract/Audioseq")
+ shutil.copyfile("baserom/Audiotable", "Extract/Audiotable")
+
+ shutil.copytree("assets", "Extract/assets")
+
+ execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out"
+
+ execStr += " botr -se OTR"
+
+ print(execStr)
+ exitValue = os.system(execStr)
+ if exitValue != 0:
+ print("\n")
+ print("Error when building the OTR file...", file=os.sys.stderr)
+ print("Aborting...", file=os.sys.stderr)
+ print("\n")
+
+def ExtractFile(xmlPath, outputPath, outputSourcePath):
+ execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out"
+ execStr += " e -eh -i %s -b baserom/ -o %s -osf %s -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath, outputPath, outputSourcePath)
+
+ if "overlays" in xmlPath:
+ execStr += " --static"
+
+ print(execStr)
+ exitValue = os.system(execStr)
+ #exitValue = 0
+ if exitValue != 0:
+ print("\n")
+ print("Error when extracting from file " + xmlPath, file=os.sys.stderr)
+ print("Aborting...", file=os.sys.stderr)
+ print("\n")
+
+def ExtractFunc(fullPath):
+ *pathList, xmlName = fullPath.split(os.sep)
+ objectName = os.path.splitext(xmlName)[0]
+
+ outPath = os.path.join("..\\soh\\assets\\", *pathList[5:], objectName)
+ os.makedirs(outPath, exist_ok=True)
+ outSourcePath = outPath
+
+ ExtractFile(fullPath, outPath, outSourcePath)
+
+def initializeWorker(abort, test):
+ global globalAbort
+ globalAbort = abort
+
+
+def main():
+ parser = argparse.ArgumentParser(description="baserom asset extractor")
+ parser.add_argument("-s", "--single", help="asset path relative to assets/, e.g. objects/gameplay_keep")
+ parser.add_argument("-f", "--force", help="Force the extraction of every xml instead of checking the touched ones.", action="store_true")
+ parser.add_argument("-u", "--unaccounted", help="Enables ZAPD unaccounted detector warning system.", action="store_true")
+ parser.add_argument("-v", "--version", help="Sets game version.")
+ args = parser.parse_args()
+
+ global mainAbort
+ mainAbort = Event()
+ manager = Manager()
+ signal.signal(signal.SIGINT, SignalHandler)
+
+ extractedAssetsTracker = manager.dict()
+
+ xmlVer = "GC_NMQ_D"
+
+ if (args.version == "gc_pal_nmpq"):
+ xmlVer = "GC_NMQ_PAL_F"
+ elif (args.version == "dbg_mq"):
+ xmlVer = "GC_MQ_D"
+
+ asset_path = args.single
+ if asset_path is not None:
+ fullPath = os.path.join("..\\soh\\assets", "xml", asset_path + ".xml")
+ if not os.path.exists(fullPath):
+ print(f"Error. File {fullPath} doesn't exists.", file=os.sys.stderr)
+ exit(1)
+
+ ExtractFunc(fullPath)
+ else:
+ extract_text_path = "assets/text/message_data.h"
+ if os.path.isfile(extract_text_path):
+ extract_text_path = None
+ extract_staff_text_path = "assets/text/message_data_staff.h"
+ if os.path.isfile(extract_staff_text_path):
+ extract_staff_text_path = None
+
+ xmlFiles = []
+ for currentPath, _, files in os.walk(os.path.join("..\\soh\\assets\\xml\\", xmlVer)):
+ for file in files:
+ fullPath = os.path.join(currentPath, file)
+ if file.endswith(".xml"):
+ xmlFiles.append(fullPath)
+
+ try:
+ numCores = 2
+ print("Extracting assets with " + str(numCores) + " CPU cores.")
+ with Pool(numCores, initializer=initializeWorker, initargs=(mainAbort, 0)) as p:
+ p.map(ExtractFunc, xmlFiles)
+ except Exception as e:
+ print("Warning: Multiprocessing exception ocurred.", file=os.sys.stderr)
+ print("Disabling mutliprocessing.", file=os.sys.stderr)
+
+ initializeWorker(mainAbort, 0)
+ for singlePath in xmlFiles:
+ ExtractFunc(singlePath)
+
+
+ BuildOTR()
+ shutil.rmtree("Extract")
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/soh/extract_baserom.py b/OTRExporter/extract_baserom_debug.py
old mode 100755
new mode 100644
similarity index 100%
rename from soh/extract_baserom.py
rename to OTRExporter/extract_baserom_debug.py
diff --git a/OTRExporter/extract_baserom_gc.py b/OTRExporter/extract_baserom_gc.py
new file mode 100644
index 000000000..0bc324f81
--- /dev/null
+++ b/OTRExporter/extract_baserom_gc.py
@@ -0,0 +1,1586 @@
+#!/usr/bin/python3
+
+import os
+import sys
+import struct
+from multiprocessing import Pool, cpu_count
+
+
+ROM_FILE_NAME = 'zlp_f.n64'
+FILE_TABLE_OFFSET = 0x7170
+
+FILE_NAMES = [
+ 'makerom',
+ 'boot',
+ 'dmadata',
+ 'Audiobank',
+ 'Audioseq',
+ 'Audiotable',
+ 'link_animetion',
+ 'icon_item_static',
+ 'icon_item_24_static',
+ 'icon_item_field_static',
+ 'icon_item_dungeon_static',
+ 'icon_item_gameover_static',
+ 'icon_item_nes_static',
+ 'icon_item_ger_static',
+ 'icon_item_fra_static',
+ 'item_name_static',
+ 'map_name_static',
+ 'do_action_static',
+ 'message_static',
+ 'message_texture_static',
+ 'nes_font_static',
+ 'nes_message_data_static',
+ 'ger_message_data_static',
+ 'fra_message_data_static',
+ 'staff_message_data_static',
+ 'map_grand_static',
+ 'map_48x85_static',
+ 'map_i_static',
+ 'code',
+ 'ovl_title',
+ 'ovl_select',
+ 'ovl_opening',
+ 'ovl_file_choose',
+ 'ovl_kaleido_scope',
+ 'ovl_player_actor',
+ 'ovl_map_mark_data',
+ 'ovl_En_Test',
+ 'ovl_Arms_Hook',
+ 'ovl_Arrow_Fire',
+ 'ovl_Arrow_Ice',
+ 'ovl_Arrow_Light',
+ 'ovl_Bg_Bdan_Objects',
+ 'ovl_Bg_Bdan_Switch',
+ 'ovl_Bg_Bom_Guard',
+ 'ovl_Bg_Bombwall',
+ 'ovl_Bg_Bowl_Wall',
+ 'ovl_Bg_Breakwall',
+ 'ovl_Bg_Ddan_Jd',
+ 'ovl_Bg_Ddan_Kd',
+ 'ovl_Bg_Dodoago',
+ 'ovl_Bg_Dy_Yoseizo',
+ 'ovl_Bg_Ganon_Otyuka',
+ 'ovl_Bg_Gate_Shutter',
+ 'ovl_Bg_Gjyo_Bridge',
+ 'ovl_Bg_Gnd_Darkmeiro',
+ 'ovl_Bg_Gnd_Firemeiro',
+ 'ovl_Bg_Gnd_Iceblock',
+ 'ovl_Bg_Gnd_Nisekabe',
+ 'ovl_Bg_Gnd_Soulmeiro',
+ 'ovl_Bg_Haka',
+ 'ovl_Bg_Haka_Gate',
+ 'ovl_Bg_Haka_Huta',
+ 'ovl_Bg_Haka_Megane',
+ 'ovl_Bg_Haka_MeganeBG',
+ 'ovl_Bg_Haka_Sgami',
+ 'ovl_Bg_Haka_Ship',
+ 'ovl_Bg_Haka_Trap',
+ 'ovl_Bg_Haka_Tubo',
+ 'ovl_Bg_Haka_Water',
+ 'ovl_Bg_Haka_Zou',
+ 'ovl_Bg_Heavy_Block',
+ 'ovl_Bg_Hidan_Curtain',
+ 'ovl_Bg_Hidan_Dalm',
+ 'ovl_Bg_Hidan_Firewall',
+ 'ovl_Bg_Hidan_Fslift',
+ 'ovl_Bg_Hidan_Fwbig',
+ 'ovl_Bg_Hidan_Hamstep',
+ 'ovl_Bg_Hidan_Hrock',
+ 'ovl_Bg_Hidan_Kousi',
+ 'ovl_Bg_Hidan_Kowarerukabe',
+ 'ovl_Bg_Hidan_Rock',
+ 'ovl_Bg_Hidan_Rsekizou',
+ 'ovl_Bg_Hidan_Sekizou',
+ 'ovl_Bg_Hidan_Sima',
+ 'ovl_Bg_Hidan_Syoku',
+ 'ovl_Bg_Ice_Objects',
+ 'ovl_Bg_Ice_Shelter',
+ 'ovl_Bg_Ice_Shutter',
+ 'ovl_Bg_Ice_Turara',
+ 'ovl_Bg_Ingate',
+ 'ovl_Bg_Jya_1flift',
+ 'ovl_Bg_Jya_Amishutter',
+ 'ovl_Bg_Jya_Bigmirror',
+ 'ovl_Bg_Jya_Block',
+ 'ovl_Bg_Jya_Bombchuiwa',
+ 'ovl_Bg_Jya_Bombiwa',
+ 'ovl_Bg_Jya_Cobra',
+ 'ovl_Bg_Jya_Goroiwa',
+ 'ovl_Bg_Jya_Haheniron',
+ 'ovl_Bg_Jya_Ironobj',
+ 'ovl_Bg_Jya_Kanaami',
+ 'ovl_Bg_Jya_Lift',
+ 'ovl_Bg_Jya_Megami',
+ 'ovl_Bg_Jya_Zurerukabe',
+ 'ovl_Bg_Menkuri_Eye',
+ 'ovl_Bg_Menkuri_Kaiten',
+ 'ovl_Bg_Menkuri_Nisekabe',
+ 'ovl_Bg_Mizu_Bwall',
+ 'ovl_Bg_Mizu_Movebg',
+ 'ovl_Bg_Mizu_Shutter',
+ 'ovl_Bg_Mizu_Uzu',
+ 'ovl_Bg_Mizu_Water',
+ 'ovl_Bg_Mjin',
+ 'ovl_Bg_Mori_Bigst',
+ 'ovl_Bg_Mori_Elevator',
+ 'ovl_Bg_Mori_Hashigo',
+ 'ovl_Bg_Mori_Hashira4',
+ 'ovl_Bg_Mori_Hineri',
+ 'ovl_Bg_Mori_Idomizu',
+ 'ovl_Bg_Mori_Kaitenkabe',
+ 'ovl_Bg_Mori_Rakkatenjo',
+ 'ovl_Bg_Po_Event',
+ 'ovl_Bg_Po_Syokudai',
+ 'ovl_Bg_Pushbox',
+ 'ovl_Bg_Relay_Objects',
+ 'ovl_Bg_Spot00_Break',
+ 'ovl_Bg_Spot00_Hanebasi',
+ 'ovl_Bg_Spot01_Fusya',
+ 'ovl_Bg_Spot01_Idohashira',
+ 'ovl_Bg_Spot01_Idomizu',
+ 'ovl_Bg_Spot01_Idosoko',
+ 'ovl_Bg_Spot01_Objects2',
+ 'ovl_Bg_Spot02_Objects',
+ 'ovl_Bg_Spot03_Taki',
+ 'ovl_Bg_Spot05_Soko',
+ 'ovl_Bg_Spot06_Objects',
+ 'ovl_Bg_Spot07_Taki',
+ 'ovl_Bg_Spot08_Bakudankabe',
+ 'ovl_Bg_Spot08_Iceblock',
+ 'ovl_Bg_Spot09_Obj',
+ 'ovl_Bg_Spot11_Bakudankabe',
+ 'ovl_Bg_Spot11_Oasis',
+ 'ovl_Bg_Spot12_Gate',
+ 'ovl_Bg_Spot12_Saku',
+ 'ovl_Bg_Spot15_Rrbox',
+ 'ovl_Bg_Spot15_Saku',
+ 'ovl_Bg_Spot16_Bombstone',
+ 'ovl_Bg_Spot16_Doughnut',
+ 'ovl_Bg_Spot17_Bakudankabe',
+ 'ovl_Bg_Spot17_Funen',
+ 'ovl_Bg_Spot18_Basket',
+ 'ovl_Bg_Spot18_Futa',
+ 'ovl_Bg_Spot18_Obj',
+ 'ovl_Bg_Spot18_Shutter',
+ 'ovl_Bg_Sst_Floor',
+ 'ovl_Bg_Toki_Hikari',
+ 'ovl_Bg_Toki_Swd',
+ 'ovl_Bg_Treemouth',
+ 'ovl_Bg_Umajump',
+ 'ovl_Bg_Vb_Sima',
+ 'ovl_Bg_Ydan_Hasi',
+ 'ovl_Bg_Ydan_Maruta',
+ 'ovl_Bg_Ydan_Sp',
+ 'ovl_Bg_Zg',
+ 'ovl_Boss_Dodongo',
+ 'ovl_Boss_Fd',
+ 'ovl_Boss_Fd2',
+ 'ovl_Boss_Ganon',
+ 'ovl_Boss_Ganon2',
+ 'ovl_Boss_Ganondrof',
+ 'ovl_Boss_Goma',
+ 'ovl_Boss_Mo',
+ 'ovl_Boss_Sst',
+ 'ovl_Boss_Tw',
+ 'ovl_Boss_Va',
+ 'ovl_Demo_6K',
+ 'ovl_Demo_Du',
+ 'ovl_Demo_Ec',
+ 'ovl_Demo_Effect',
+ 'ovl_Demo_Ext',
+ 'ovl_Demo_Geff',
+ 'ovl_Demo_Gj',
+ 'ovl_Demo_Go',
+ 'ovl_Demo_Gt',
+ 'ovl_Demo_Ik',
+ 'ovl_Demo_Im',
+ 'ovl_Demo_Kankyo',
+ 'ovl_Demo_Kekkai',
+ 'ovl_Demo_Sa',
+ 'ovl_Demo_Shd',
+ 'ovl_Demo_Tre_Lgt',
+ 'ovl_Door_Ana',
+ 'ovl_Door_Gerudo',
+ 'ovl_Door_Killer',
+ 'ovl_Door_Shutter',
+ 'ovl_Door_Toki',
+ 'ovl_Door_Warp1',
+ 'ovl_Efc_Erupc',
+ 'ovl_Eff_Dust',
+ 'ovl_Effect_Ss_Blast',
+ 'ovl_Effect_Ss_Bomb',
+ 'ovl_Effect_Ss_Bomb2',
+ 'ovl_Effect_Ss_Bubble',
+ 'ovl_Effect_Ss_D_Fire',
+ 'ovl_Effect_Ss_Dead_Db',
+ 'ovl_Effect_Ss_Dead_Dd',
+ 'ovl_Effect_Ss_Dead_Ds',
+ 'ovl_Effect_Ss_Dead_Sound',
+ 'ovl_Effect_Ss_Dt_Bubble',
+ 'ovl_Effect_Ss_Dust',
+ 'ovl_Effect_Ss_En_Fire',
+ 'ovl_Effect_Ss_En_Ice',
+ 'ovl_Effect_Ss_Extra',
+ 'ovl_Effect_Ss_Fcircle',
+ 'ovl_Effect_Ss_Fhg_Flash',
+ 'ovl_Effect_Ss_Fire_Tail',
+ 'ovl_Effect_Ss_G_Fire',
+ 'ovl_Effect_Ss_G_Magma',
+ 'ovl_Effect_Ss_G_Magma2',
+ 'ovl_Effect_Ss_G_Ripple',
+ 'ovl_Effect_Ss_G_Spk',
+ 'ovl_Effect_Ss_G_Splash',
+ 'ovl_Effect_Ss_Hahen',
+ 'ovl_Effect_Ss_HitMark',
+ 'ovl_Effect_Ss_Ice_Piece',
+ 'ovl_Effect_Ss_Ice_Smoke',
+ 'ovl_Effect_Ss_K_Fire',
+ 'ovl_Effect_Ss_Kakera',
+ 'ovl_Effect_Ss_KiraKira',
+ 'ovl_Effect_Ss_Lightning',
+ 'ovl_Effect_Ss_Sibuki',
+ 'ovl_Effect_Ss_Sibuki2',
+ 'ovl_Effect_Ss_Solder_Srch_Ball',
+ 'ovl_Effect_Ss_Stick',
+ 'ovl_Effect_Ss_Stone1',
+ 'ovl_Elf_Msg',
+ 'ovl_Elf_Msg2',
+ 'ovl_En_Am',
+ 'ovl_En_Ani',
+ 'ovl_En_Anubice',
+ 'ovl_En_Anubice_Fire',
+ 'ovl_En_Anubice_Tag',
+ 'ovl_En_Arow_Trap',
+ 'ovl_En_Arrow',
+ 'ovl_En_Attack_Niw',
+ 'ovl_En_Ba',
+ 'ovl_En_Bb',
+ 'ovl_En_Bdfire',
+ 'ovl_En_Bigokuta',
+ 'ovl_En_Bili',
+ 'ovl_En_Bird',
+ 'ovl_En_Blkobj',
+ 'ovl_En_Bom',
+ 'ovl_En_Bom_Bowl_Man',
+ 'ovl_En_Bom_Bowl_Pit',
+ 'ovl_En_Bom_Chu',
+ 'ovl_En_Bombf',
+ 'ovl_En_Boom',
+ 'ovl_En_Box',
+ 'ovl_En_Brob',
+ 'ovl_En_Bubble',
+ 'ovl_En_Butte',
+ 'ovl_En_Bw',
+ 'ovl_En_Bx',
+ 'ovl_En_Changer',
+ 'ovl_En_Clear_Tag',
+ 'ovl_En_Cow',
+ 'ovl_En_Crow',
+ 'ovl_En_Cs',
+ 'ovl_En_Daiku',
+ 'ovl_En_Daiku_Kakariko',
+ 'ovl_En_Dekubaba',
+ 'ovl_En_Dekunuts',
+ 'ovl_En_Dh',
+ 'ovl_En_Dha',
+ 'ovl_En_Diving_Game',
+ 'ovl_En_Dns',
+ 'ovl_En_Dnt_Demo',
+ 'ovl_En_Dnt_Jiji',
+ 'ovl_En_Dnt_Nomal',
+ 'ovl_En_Dodojr',
+ 'ovl_En_Dodongo',
+ 'ovl_En_Dog',
+ 'ovl_En_Door',
+ 'ovl_En_Ds',
+ 'ovl_En_Du',
+ 'ovl_En_Dy_Extra',
+ 'ovl_En_Eg',
+ 'ovl_En_Eiyer',
+ 'ovl_En_Elf',
+ 'ovl_En_Encount1',
+ 'ovl_En_Encount2',
+ 'ovl_En_Ex_Item',
+ 'ovl_En_Ex_Ruppy',
+ 'ovl_En_Fd',
+ 'ovl_En_Fd_Fire',
+ 'ovl_En_Fhg_Fire',
+ 'ovl_En_Fire_Rock',
+ 'ovl_En_Firefly',
+ 'ovl_En_Fish',
+ 'ovl_En_Floormas',
+ 'ovl_En_Fr',
+ 'ovl_En_Fu',
+ 'ovl_En_Fw',
+ 'ovl_En_Fz',
+ 'ovl_En_G_Switch',
+ 'ovl_En_Ganon_Mant',
+ 'ovl_En_Ganon_Organ',
+ 'ovl_En_Gb',
+ 'ovl_En_Ge1',
+ 'ovl_En_Ge2',
+ 'ovl_En_Ge3',
+ 'ovl_En_GeldB',
+ 'ovl_En_GirlA',
+ 'ovl_En_Gm',
+ 'ovl_En_Go',
+ 'ovl_En_Go2',
+ 'ovl_En_Goma',
+ 'ovl_En_Goroiwa',
+ 'ovl_En_Gs',
+ 'ovl_En_Guest',
+ 'ovl_En_Hata',
+ 'ovl_En_Heishi1',
+ 'ovl_En_Heishi2',
+ 'ovl_En_Heishi3',
+ 'ovl_En_Heishi4',
+ 'ovl_En_Hintnuts',
+ 'ovl_En_Holl',
+ 'ovl_En_Honotrap',
+ 'ovl_En_Horse',
+ 'ovl_En_Horse_Game_Check',
+ 'ovl_En_Horse_Ganon',
+ 'ovl_En_Horse_Link_Child',
+ 'ovl_En_Horse_Normal',
+ 'ovl_En_Horse_Zelda',
+ 'ovl_En_Hs',
+ 'ovl_En_Hs2',
+ 'ovl_En_Hy',
+ 'ovl_En_Ice_Hono',
+ 'ovl_En_Ik',
+ 'ovl_En_In',
+ 'ovl_En_Insect',
+ 'ovl_En_Ishi',
+ 'ovl_En_It',
+ 'ovl_En_Jj',
+ 'ovl_En_Js',
+ 'ovl_En_Jsjutan',
+ 'ovl_En_Kakasi',
+ 'ovl_En_Kakasi2',
+ 'ovl_En_Kakasi3',
+ 'ovl_En_Kanban',
+ 'ovl_En_Karebaba',
+ 'ovl_En_Ko',
+ 'ovl_En_Kusa',
+ 'ovl_En_Kz',
+ 'ovl_En_Light',
+ 'ovl_En_Lightbox',
+ 'ovl_En_M_Fire1',
+ 'ovl_En_M_Thunder',
+ 'ovl_En_Ma1',
+ 'ovl_En_Ma2',
+ 'ovl_En_Ma3',
+ 'ovl_En_Mag',
+ 'ovl_En_Mb',
+ 'ovl_En_Md',
+ 'ovl_En_Mk',
+ 'ovl_En_Mm',
+ 'ovl_En_Mm2',
+ 'ovl_En_Ms',
+ 'ovl_En_Mu',
+ 'ovl_En_Nb',
+ 'ovl_En_Niw',
+ 'ovl_En_Niw_Girl',
+ 'ovl_En_Niw_Lady',
+ 'ovl_En_Nutsball',
+ 'ovl_En_Nwc',
+ 'ovl_En_Ny',
+ 'ovl_En_OE2',
+ 'ovl_En_Okarina_Effect',
+ 'ovl_En_Okarina_Tag',
+ 'ovl_En_Okuta',
+ 'ovl_En_Ossan',
+ 'ovl_En_Owl',
+ 'ovl_En_Part',
+ 'ovl_En_Peehat',
+ 'ovl_En_Po_Desert',
+ 'ovl_En_Po_Field',
+ 'ovl_En_Po_Relay',
+ 'ovl_En_Po_Sisters',
+ 'ovl_En_Poh',
+ 'ovl_En_Pu_box',
+ 'ovl_En_Rd',
+ 'ovl_En_Reeba',
+ 'ovl_En_River_Sound',
+ 'ovl_En_Rl',
+ 'ovl_En_Rr',
+ 'ovl_En_Ru1',
+ 'ovl_En_Ru2',
+ 'ovl_En_Sa',
+ 'ovl_En_Sb',
+ 'ovl_En_Scene_Change',
+ 'ovl_En_Sda',
+ 'ovl_En_Shopnuts',
+ 'ovl_En_Si',
+ 'ovl_En_Siofuki',
+ 'ovl_En_Skb',
+ 'ovl_En_Skj',
+ 'ovl_En_Skjneedle',
+ 'ovl_En_Ssh',
+ 'ovl_En_St',
+ 'ovl_En_Sth',
+ 'ovl_En_Stream',
+ 'ovl_En_Sw',
+ 'ovl_En_Syateki_Itm',
+ 'ovl_En_Syateki_Man',
+ 'ovl_En_Syateki_Niw',
+ 'ovl_En_Ta',
+ 'ovl_En_Takara_Man',
+ 'ovl_En_Tana',
+ 'ovl_En_Tg',
+ 'ovl_En_Tite',
+ 'ovl_En_Tk',
+ 'ovl_En_Torch',
+ 'ovl_En_Torch2',
+ 'ovl_En_Toryo',
+ 'ovl_En_Tp',
+ 'ovl_En_Tr',
+ 'ovl_En_Trap',
+ 'ovl_En_Tubo_Trap',
+ 'ovl_En_Vali',
+ 'ovl_En_Vase',
+ 'ovl_En_Vb_Ball',
+ 'ovl_En_Viewer',
+ 'ovl_En_Vm',
+ 'ovl_En_Wall_Tubo',
+ 'ovl_En_Wallmas',
+ 'ovl_En_Weather_Tag',
+ 'ovl_En_Weiyer',
+ 'ovl_En_Wf',
+ 'ovl_En_Wonder_Item',
+ 'ovl_En_Wonder_Talk',
+ 'ovl_En_Wonder_Talk2',
+ 'ovl_En_Wood02',
+ 'ovl_En_Xc',
+ 'ovl_En_Yabusame_Mark',
+ 'ovl_En_Yukabyun',
+ 'ovl_En_Zf',
+ 'ovl_En_Zl1',
+ 'ovl_En_Zl2',
+ 'ovl_En_Zl3',
+ 'ovl_En_Zl4',
+ 'ovl_En_Zo',
+ 'ovl_En_fHG',
+ 'ovl_End_Title',
+ 'ovl_Fishing',
+ 'ovl_Item_B_Heart',
+ 'ovl_Item_Etcetera',
+ 'ovl_Item_Inbox',
+ 'ovl_Item_Ocarina',
+ 'ovl_Item_Shield',
+ 'ovl_Magic_Dark',
+ 'ovl_Magic_Fire',
+ 'ovl_Magic_Wind',
+ 'ovl_Mir_Ray',
+ 'ovl_Obj_Bean',
+ 'ovl_Obj_Blockstop',
+ 'ovl_Obj_Bombiwa',
+ 'ovl_Obj_Comb',
+ 'ovl_Obj_Dekujr',
+ 'ovl_Obj_Elevator',
+ 'ovl_Obj_Hamishi',
+ 'ovl_Obj_Hana',
+ 'ovl_Obj_Hsblock',
+ 'ovl_Obj_Ice_Poly',
+ 'ovl_Obj_Kibako',
+ 'ovl_Obj_Kibako2',
+ 'ovl_Obj_Lift',
+ 'ovl_Obj_Lightswitch',
+ 'ovl_Obj_Makekinsuta',
+ 'ovl_Obj_Makeoshihiki',
+ 'ovl_Obj_Mure',
+ 'ovl_Obj_Mure2',
+ 'ovl_Obj_Mure3',
+ 'ovl_Obj_Oshihiki',
+ 'ovl_Obj_Roomtimer',
+ 'ovl_Obj_Switch',
+ 'ovl_Obj_Syokudai',
+ 'ovl_Obj_Timeblock',
+ 'ovl_Obj_Tsubo',
+ 'ovl_Obj_Warp2block',
+ 'ovl_Object_Kankyo',
+ 'ovl_Oceff_Spot',
+ 'ovl_Oceff_Storm',
+ 'ovl_Oceff_Wipe',
+ 'ovl_Oceff_Wipe2',
+ 'ovl_Oceff_Wipe3',
+ 'ovl_Oceff_Wipe4',
+ 'ovl_Shot_Sun',
+ 'gameplay_keep',
+ 'gameplay_field_keep',
+ 'gameplay_dangeon_keep',
+ 'gameplay_object_exchange_static',
+ 'object_link_boy',
+ 'object_link_child',
+ 'object_box',
+ 'object_human',
+ 'object_okuta',
+ 'object_poh',
+ 'object_wallmaster',
+ 'object_dy_obj',
+ 'object_firefly',
+ 'object_dodongo',
+ 'object_fire',
+ 'object_niw',
+ 'object_tite',
+ 'object_reeba',
+ 'object_peehat',
+ 'object_kingdodongo',
+ 'object_horse',
+ 'object_zf',
+ 'object_goma',
+ 'object_zl1',
+ 'object_gol',
+ 'object_bubble',
+ 'object_dodojr',
+ 'object_torch2',
+ 'object_bl',
+ 'object_tp',
+ 'object_oA1',
+ 'object_st',
+ 'object_bw',
+ 'object_ei',
+ 'object_horse_normal',
+ 'object_oB1',
+ 'object_o_anime',
+ 'object_spot04_objects',
+ 'object_ddan_objects',
+ 'object_hidan_objects',
+ 'object_horse_ganon',
+ 'object_oA2',
+ 'object_spot00_objects',
+ 'object_mb',
+ 'object_bombf',
+ 'object_sk2',
+ 'object_oE1',
+ 'object_oE_anime',
+ 'object_oE2',
+ 'object_ydan_objects',
+ 'object_gnd',
+ 'object_am',
+ 'object_dekubaba',
+ 'object_oA3',
+ 'object_oA4',
+ 'object_oA5',
+ 'object_oA6',
+ 'object_oA7',
+ 'object_jj',
+ 'object_oA8',
+ 'object_oA9',
+ 'object_oB2',
+ 'object_oB3',
+ 'object_oB4',
+ 'object_horse_zelda',
+ 'object_opening_demo1',
+ 'object_warp1',
+ 'object_b_heart',
+ 'object_dekunuts',
+ 'object_oE3',
+ 'object_oE4',
+ 'object_menkuri_objects',
+ 'object_oE5',
+ 'object_oE6',
+ 'object_oE7',
+ 'object_oE8',
+ 'object_oE9',
+ 'object_oE10',
+ 'object_oE11',
+ 'object_oE12',
+ 'object_vali',
+ 'object_oA10',
+ 'object_oA11',
+ 'object_mizu_objects',
+ 'object_fhg',
+ 'object_ossan',
+ 'object_mori_hineri1',
+ 'object_Bb',
+ 'object_toki_objects',
+ 'object_yukabyun',
+ 'object_zl2',
+ 'object_mjin',
+ 'object_mjin_flash',
+ 'object_mjin_dark',
+ 'object_mjin_flame',
+ 'object_mjin_ice',
+ 'object_mjin_soul',
+ 'object_mjin_wind',
+ 'object_mjin_oka',
+ 'object_haka_objects',
+ 'object_spot06_objects',
+ 'object_ice_objects',
+ 'object_relay_objects',
+ 'object_mori_hineri1a',
+ 'object_mori_hineri2',
+ 'object_mori_hineri2a',
+ 'object_mori_objects',
+ 'object_mori_tex',
+ 'object_spot08_obj',
+ 'object_warp2',
+ 'object_hata',
+ 'object_bird',
+ 'object_wood02',
+ 'object_lightbox',
+ 'object_pu_box',
+ 'object_trap',
+ 'object_vase',
+ 'object_im',
+ 'object_ta',
+ 'object_tk',
+ 'object_xc',
+ 'object_vm',
+ 'object_bv',
+ 'object_hakach_objects',
+ 'object_efc_crystal_light',
+ 'object_efc_fire_ball',
+ 'object_efc_flash',
+ 'object_efc_lgt_shower',
+ 'object_efc_star_field',
+ 'object_god_lgt',
+ 'object_light_ring',
+ 'object_triforce_spot',
+ 'object_medal',
+ 'object_bdan_objects',
+ 'object_sd',
+ 'object_rd',
+ 'object_po_sisters',
+ 'object_heavy_object',
+ 'object_gndd',
+ 'object_fd',
+ 'object_du',
+ 'object_fw',
+ 'object_horse_link_child',
+ 'object_spot02_objects',
+ 'object_haka',
+ 'object_ru1',
+ 'object_syokudai',
+ 'object_fd2',
+ 'object_dh',
+ 'object_rl',
+ 'object_efc_tw',
+ 'object_demo_tre_lgt',
+ 'object_gi_key',
+ 'object_mir_ray',
+ 'object_brob',
+ 'object_gi_jewel',
+ 'object_spot09_obj',
+ 'object_spot18_obj',
+ 'object_bdoor',
+ 'object_spot17_obj',
+ 'object_shop_dungen',
+ 'object_nb',
+ 'object_mo',
+ 'object_sb',
+ 'object_gi_melody',
+ 'object_gi_heart',
+ 'object_gi_compass',
+ 'object_gi_bosskey',
+ 'object_gi_medal',
+ 'object_gi_nuts',
+ 'object_sa',
+ 'object_gi_hearts',
+ 'object_gi_arrowcase',
+ 'object_gi_bombpouch',
+ 'object_in',
+ 'object_tr',
+ 'object_spot16_obj',
+ 'object_oE1s',
+ 'object_oE4s',
+ 'object_os_anime',
+ 'object_gi_bottle',
+ 'object_gi_stick',
+ 'object_gi_map',
+ 'object_oF1d_map',
+ 'object_ru2',
+ 'object_gi_shield_1',
+ 'object_dekujr',
+ 'object_gi_magicpot',
+ 'object_gi_bomb_1',
+ 'object_oF1s',
+ 'object_ma2',
+ 'object_gi_purse',
+ 'object_hni',
+ 'object_tw',
+ 'object_rr',
+ 'object_bxa',
+ 'object_anubice',
+ 'object_gi_gerudo',
+ 'object_gi_arrow',
+ 'object_gi_bomb_2',
+ 'object_gi_egg',
+ 'object_gi_scale',
+ 'object_gi_shield_2',
+ 'object_gi_hookshot',
+ 'object_gi_ocarina',
+ 'object_gi_milk',
+ 'object_ma1',
+ 'object_ganon',
+ 'object_sst',
+ 'object_ny',
+ 'object_fr',
+ 'object_gi_pachinko',
+ 'object_gi_boomerang',
+ 'object_gi_bow',
+ 'object_gi_glasses',
+ 'object_gi_liquid',
+ 'object_ani',
+ 'object_demo_6k',
+ 'object_gi_shield_3',
+ 'object_gi_letter',
+ 'object_spot15_obj',
+ 'object_jya_obj',
+ 'object_gi_clothes',
+ 'object_gi_bean',
+ 'object_gi_fish',
+ 'object_gi_saw',
+ 'object_gi_hammer',
+ 'object_gi_grass',
+ 'object_gi_longsword',
+ 'object_spot01_objects',
+ 'object_md',
+ 'object_km1',
+ 'object_kw1',
+ 'object_zo',
+ 'object_kz',
+ 'object_umajump',
+ 'object_masterkokiri',
+ 'object_masterkokirihead',
+ 'object_mastergolon',
+ 'object_masterzoora',
+ 'object_aob',
+ 'object_ik',
+ 'object_ahg',
+ 'object_cne',
+ 'object_gi_niwatori',
+ 'object_skj',
+ 'object_gi_bottle_letter',
+ 'object_bji',
+ 'object_bba',
+ 'object_gi_ocarina_0',
+ 'object_ds',
+ 'object_ane',
+ 'object_boj',
+ 'object_spot03_object',
+ 'object_spot07_object',
+ 'object_fz',
+ 'object_bob',
+ 'object_ge1',
+ 'object_yabusame_point',
+ 'object_gi_boots_2',
+ 'object_gi_seed',
+ 'object_gnd_magic',
+ 'object_d_elevator',
+ 'object_d_hsblock',
+ 'object_d_lift',
+ 'object_mamenoki',
+ 'object_goroiwa',
+ 'object_toryo',
+ 'object_daiku',
+ 'object_nwc',
+ 'object_blkobj',
+ 'object_gm',
+ 'object_ms',
+ 'object_hs',
+ 'object_ingate',
+ 'object_lightswitch',
+ 'object_kusa',
+ 'object_tsubo',
+ 'object_gi_gloves',
+ 'object_gi_coin',
+ 'object_kanban',
+ 'object_gjyo_objects',
+ 'object_owl',
+ 'object_mk',
+ 'object_fu',
+ 'object_gi_ki_tan_mask',
+ 'object_gi_redead_mask',
+ 'object_gi_skj_mask',
+ 'object_gi_rabit_mask',
+ 'object_gi_truth_mask',
+ 'object_ganon_objects',
+ 'object_siofuki',
+ 'object_stream',
+ 'object_mm',
+ 'object_fa',
+ 'object_os',
+ 'object_gi_eye_lotion',
+ 'object_gi_powder',
+ 'object_gi_mushroom',
+ 'object_gi_ticketstone',
+ 'object_gi_brokensword',
+ 'object_js',
+ 'object_cs',
+ 'object_gi_prescription',
+ 'object_gi_bracelet',
+ 'object_gi_soldout',
+ 'object_gi_frog',
+ 'object_mag',
+ 'object_door_gerudo',
+ 'object_gt',
+ 'object_efc_erupc',
+ 'object_zl2_anime1',
+ 'object_zl2_anime2',
+ 'object_gi_golonmask',
+ 'object_gi_zoramask',
+ 'object_gi_gerudomask',
+ 'object_ganon2',
+ 'object_ka',
+ 'object_ts',
+ 'object_zg',
+ 'object_gi_hoverboots',
+ 'object_gi_m_arrow',
+ 'object_ds2',
+ 'object_ec',
+ 'object_fish',
+ 'object_gi_sutaru',
+ 'object_gi_goddess',
+ 'object_ssh',
+ 'object_bigokuta',
+ 'object_bg',
+ 'object_spot05_objects',
+ 'object_spot12_obj',
+ 'object_bombiwa',
+ 'object_hintnuts',
+ 'object_rs',
+ 'object_spot00_break',
+ 'object_gla',
+ 'object_shopnuts',
+ 'object_geldb',
+ 'object_gr',
+ 'object_dog',
+ 'object_jya_iron',
+ 'object_jya_door',
+ 'object_spot01_objects2',
+ 'object_spot11_obj',
+ 'object_kibako2',
+ 'object_dns',
+ 'object_dnk',
+ 'object_gi_fire',
+ 'object_gi_insect',
+ 'object_gi_butterfly',
+ 'object_gi_ghost',
+ 'object_gi_soul',
+ 'object_bowl',
+ 'object_po_field',
+ 'object_demo_kekkai',
+ 'object_efc_doughnut',
+ 'object_gi_dekupouch',
+ 'object_ganon_anime1',
+ 'object_ganon_anime2',
+ 'object_ganon_anime3',
+ 'object_gi_rupy',
+ 'object_spot01_matoya',
+ 'object_spot01_matoyab',
+ 'object_po_composer',
+ 'object_mu',
+ 'object_wf',
+ 'object_skb',
+ 'object_gj',
+ 'object_geff',
+ 'object_haka_door',
+ 'object_gs',
+ 'object_ps',
+ 'object_bwall',
+ 'object_crow',
+ 'object_cow',
+ 'object_cob',
+ 'object_gi_sword_1',
+ 'object_door_killer',
+ 'object_ouke_haka',
+ 'object_timeblock',
+ 'object_zl4',
+ 'g_pn_01',
+ 'g_pn_02',
+ 'g_pn_03',
+ 'g_pn_04',
+ 'g_pn_05',
+ 'g_pn_06',
+ 'g_pn_07',
+ 'g_pn_08',
+ 'g_pn_09',
+ 'g_pn_10',
+ 'g_pn_11',
+ 'g_pn_12',
+ 'g_pn_13',
+ 'g_pn_14',
+ 'g_pn_15',
+ 'g_pn_16',
+ 'g_pn_17',
+ 'g_pn_18',
+ 'g_pn_19',
+ 'g_pn_20',
+ 'g_pn_21',
+ 'g_pn_22',
+ 'g_pn_23',
+ 'g_pn_24',
+ 'g_pn_25',
+ 'g_pn_26',
+ 'g_pn_27',
+ 'g_pn_28',
+ 'g_pn_29',
+ 'g_pn_30',
+ 'g_pn_31',
+ 'g_pn_32',
+ 'g_pn_33',
+ 'g_pn_34',
+ 'g_pn_35',
+ 'g_pn_36',
+ 'g_pn_37',
+ 'g_pn_38',
+ 'g_pn_39',
+ 'g_pn_40',
+ 'g_pn_41',
+ 'g_pn_42',
+ 'g_pn_43',
+ 'g_pn_44',
+ 'g_pn_45',
+ 'g_pn_46',
+ 'g_pn_47',
+ 'g_pn_48',
+ 'g_pn_49',
+ 'g_pn_50',
+ 'g_pn_51',
+ 'g_pn_52',
+ 'g_pn_53',
+ 'g_pn_54',
+ 'g_pn_55',
+ 'g_pn_56',
+ 'g_pn_57',
+ 'z_select_static',
+ 'nintendo_rogo_static',
+ 'title_static',
+ 'parameter_static',
+ 'vr_fine0_static',
+ 'vr_fine0_pal_static',
+ 'vr_fine1_static',
+ 'vr_fine1_pal_static',
+ 'vr_fine2_static',
+ 'vr_fine2_pal_static',
+ 'vr_fine3_static',
+ 'vr_fine3_pal_static',
+ 'vr_cloud0_static',
+ 'vr_cloud0_pal_static',
+ 'vr_cloud1_static',
+ 'vr_cloud1_pal_static',
+ 'vr_cloud2_static',
+ 'vr_cloud2_pal_static',
+ 'vr_cloud3_static',
+ 'vr_cloud3_pal_static',
+ 'vr_holy0_static',
+ 'vr_holy0_pal_static',
+ 'vr_holy1_static',
+ 'vr_holy1_pal_static',
+ 'vr_MDVR_static',
+ 'vr_MDVR_pal_static',
+ 'vr_MNVR_static',
+ 'vr_MNVR_pal_static',
+ 'vr_RUVR_static',
+ 'vr_RUVR_pal_static',
+ 'vr_LHVR_static',
+ 'vr_LHVR_pal_static',
+ 'vr_KHVR_static',
+ 'vr_KHVR_pal_static',
+ 'vr_K3VR_static',
+ 'vr_K3VR_pal_static',
+ 'vr_K4VR_static',
+ 'vr_K4VR_pal_static',
+ 'vr_K5VR_static',
+ 'vr_K5VR_pal_static',
+ 'vr_SP1a_static',
+ 'vr_SP1a_pal_static',
+ 'vr_MLVR_static',
+ 'vr_MLVR_pal_static',
+ 'vr_KKRVR_static',
+ 'vr_KKRVR_pal_static',
+ 'vr_KR3VR_static',
+ 'vr_KR3VR_pal_static',
+ 'vr_IPVR_static',
+ 'vr_IPVR_pal_static',
+ 'vr_KSVR_static',
+ 'vr_KSVR_pal_static',
+ 'vr_GLVR_static',
+ 'vr_GLVR_pal_static',
+ 'vr_ZRVR_static',
+ 'vr_ZRVR_pal_static',
+ 'vr_DGVR_static',
+ 'vr_DGVR_pal_static',
+ 'vr_ALVR_static',
+ 'vr_ALVR_pal_static',
+ 'vr_NSVR_static',
+ 'vr_NSVR_pal_static',
+ 'vr_LBVR_static',
+ 'vr_LBVR_pal_static',
+ 'vr_TTVR_static',
+ 'vr_TTVR_pal_static',
+ 'vr_FCVR_static',
+ 'vr_FCVR_pal_static',
+ 'elf_message_field',
+ 'elf_message_ydan',
+ 'ydan_scene',
+'ydan_room_0',
+'ydan_room_1',
+'ydan_room_2',
+'ydan_room_3',
+'ydan_room_4',
+'ydan_room_5',
+'ydan_room_6',
+'ydan_room_7',
+'ydan_room_8',
+'ydan_room_9',
+'ydan_room_10',
+'ydan_room_11',
+'ddan_scene',
+'ddan_room_0',
+'ddan_room_1',
+'ddan_room_2',
+'ddan_room_3',
+'ddan_room_4',
+'ddan_room_5',
+'ddan_room_6',
+'ddan_room_7',
+'ddan_room_8',
+'ddan_room_9',
+'ddan_room_10',
+'ddan_room_11',
+'ddan_room_12',
+'ddan_room_13',
+'ddan_room_14',
+'ddan_room_15',
+'ddan_room_16',
+'bdan_scene',
+'bdan_room_0',
+'bdan_room_1',
+'bdan_room_2',
+'bdan_room_3',
+'bdan_room_4',
+'bdan_room_5',
+'bdan_room_6',
+'bdan_room_7',
+'bdan_room_8',
+'bdan_room_9',
+'bdan_room_10',
+'bdan_room_11',
+'bdan_room_12',
+'bdan_room_13',
+'bdan_room_14',
+'bdan_room_15',
+'Bmori1_scene',
+'Bmori1_room_0',
+'Bmori1_room_1',
+'Bmori1_room_2',
+'Bmori1_room_3',
+'Bmori1_room_4',
+'Bmori1_room_5',
+'Bmori1_room_6',
+'Bmori1_room_7',
+'Bmori1_room_8',
+'Bmori1_room_9',
+'Bmori1_room_10',
+'Bmori1_room_11',
+'Bmori1_room_12',
+'Bmori1_room_13',
+'Bmori1_room_14',
+'Bmori1_room_15',
+'Bmori1_room_16',
+'Bmori1_room_17',
+'Bmori1_room_18',
+'Bmori1_room_19',
+'Bmori1_room_20',
+'Bmori1_room_21',
+'Bmori1_room_22',
+'HIDAN_scene',
+'HIDAN_room_0',
+'HIDAN_room_1',
+'HIDAN_room_2',
+'HIDAN_room_3',
+'HIDAN_room_4',
+'HIDAN_room_5',
+'HIDAN_room_6',
+'HIDAN_room_7',
+'HIDAN_room_8',
+'HIDAN_room_9',
+'HIDAN_room_10',
+'HIDAN_room_11',
+'HIDAN_room_12',
+'HIDAN_room_13',
+'HIDAN_room_14',
+'HIDAN_room_15',
+'HIDAN_room_16',
+'HIDAN_room_17',
+'HIDAN_room_18',
+'HIDAN_room_19',
+'HIDAN_room_20',
+'HIDAN_room_21',
+'HIDAN_room_22',
+'HIDAN_room_23',
+'HIDAN_room_24',
+'HIDAN_room_25',
+'HIDAN_room_26',
+'MIZUsin_scene',
+'MIZUsin_room_0',
+'MIZUsin_room_1',
+'MIZUsin_room_2',
+'MIZUsin_room_3',
+'MIZUsin_room_4',
+'MIZUsin_room_5',
+'MIZUsin_room_6',
+'MIZUsin_room_7',
+'MIZUsin_room_8',
+'MIZUsin_room_9',
+'MIZUsin_room_10',
+'MIZUsin_room_11',
+'MIZUsin_room_12',
+'MIZUsin_room_13',
+'MIZUsin_room_14',
+'MIZUsin_room_15',
+'MIZUsin_room_16',
+'MIZUsin_room_17',
+'MIZUsin_room_18',
+'MIZUsin_room_19',
+'MIZUsin_room_20',
+'MIZUsin_room_21',
+'MIZUsin_room_22',
+'jyasinzou_scene',
+'jyasinzou_room_0',
+'jyasinzou_room_1',
+'jyasinzou_room_2',
+'jyasinzou_room_3',
+'jyasinzou_room_4',
+'jyasinzou_room_5',
+'jyasinzou_room_6',
+'jyasinzou_room_7',
+'jyasinzou_room_8',
+'jyasinzou_room_9',
+'jyasinzou_room_10',
+'jyasinzou_room_11',
+'jyasinzou_room_12',
+'jyasinzou_room_13',
+'jyasinzou_room_14',
+'jyasinzou_room_15',
+'jyasinzou_room_16',
+'jyasinzou_room_17',
+'jyasinzou_room_18',
+'jyasinzou_room_19',
+'jyasinzou_room_20',
+'jyasinzou_room_21',
+'jyasinzou_room_22',
+'jyasinzou_room_23',
+'jyasinzou_room_24',
+'jyasinzou_room_25',
+'jyasinzou_room_26',
+'jyasinzou_room_27',
+'jyasinzou_room_28',
+'HAKAdan_scene',
+'HAKAdan_room_0',
+'HAKAdan_room_1',
+'HAKAdan_room_2',
+'HAKAdan_room_3',
+'HAKAdan_room_4',
+'HAKAdan_room_5',
+'HAKAdan_room_6',
+'HAKAdan_room_7',
+'HAKAdan_room_8',
+'HAKAdan_room_9',
+'HAKAdan_room_10',
+'HAKAdan_room_11',
+'HAKAdan_room_12',
+'HAKAdan_room_13',
+'HAKAdan_room_14',
+'HAKAdan_room_15',
+'HAKAdan_room_16',
+'HAKAdan_room_17',
+'HAKAdan_room_18',
+'HAKAdan_room_19',
+'HAKAdan_room_20',
+'HAKAdan_room_21',
+'HAKAdan_room_22',
+'HAKAdanCH_scene',
+'HAKAdanCH_room_0',
+'HAKAdanCH_room_1',
+'HAKAdanCH_room_2',
+'HAKAdanCH_room_3',
+'HAKAdanCH_room_4',
+'HAKAdanCH_room_5',
+'HAKAdanCH_room_6',
+'ice_doukutu_scene',
+'ice_doukutu_room_0',
+'ice_doukutu_room_1',
+'ice_doukutu_room_2',
+'ice_doukutu_room_3',
+'ice_doukutu_room_4',
+'ice_doukutu_room_5',
+'ice_doukutu_room_6',
+'ice_doukutu_room_7',
+'ice_doukutu_room_8',
+'ice_doukutu_room_9',
+'ice_doukutu_room_10',
+'ice_doukutu_room_11',
+'men_scene',
+'men_room_0',
+'men_room_1',
+'men_room_2',
+'men_room_3',
+'men_room_4',
+'men_room_5',
+'men_room_6',
+'men_room_7',
+'men_room_8',
+'men_room_9',
+'men_room_10',
+'ganontika_scene',
+'ganontika_room_0',
+'ganontika_room_1',
+'ganontika_room_2',
+'ganontika_room_3',
+'ganontika_room_4',
+'ganontika_room_5',
+'ganontika_room_6',
+'ganontika_room_7',
+'ganontika_room_8',
+'ganontika_room_9',
+'ganontika_room_10',
+'ganontika_room_11',
+'ganontika_room_12',
+'ganontika_room_13',
+'ganontika_room_14',
+'ganontika_room_15',
+'ganontika_room_16',
+'ganontika_room_17',
+'ganontika_room_18',
+'ganontika_room_19',
+'spot00_scene',
+'spot00_room_0',
+'spot01_scene',
+'spot01_room_0',
+'spot02_scene',
+'spot02_room_0',
+'spot02_room_1',
+'spot03_scene',
+'spot03_room_0',
+'spot03_room_1',
+'spot04_scene',
+'spot04_room_0',
+'spot04_room_1',
+'spot04_room_2',
+'spot05_scene',
+'spot05_room_0',
+'spot06_scene',
+'spot06_room_0',
+'spot07_scene',
+'spot07_room_0',
+'spot07_room_1',
+'spot08_scene',
+'spot08_room_0',
+'spot09_scene',
+'spot09_room_0',
+'spot10_scene',
+'spot10_room_0',
+'spot10_room_1',
+'spot10_room_2',
+'spot10_room_3',
+'spot10_room_4',
+'spot10_room_5',
+'spot10_room_6',
+'spot10_room_7',
+'spot10_room_8',
+'spot10_room_9',
+'spot11_scene',
+'spot11_room_0',
+'spot12_scene',
+'spot12_room_0',
+'spot12_room_1',
+'spot13_scene',
+'spot13_room_0',
+'spot13_room_1',
+'spot15_scene',
+'spot15_room_0',
+'spot16_scene',
+'spot16_room_0',
+'spot17_scene',
+'spot17_room_0',
+'spot17_room_1',
+'spot18_scene',
+'spot18_room_0',
+'spot18_room_1',
+'spot18_room_2',
+'spot18_room_3',
+'market_day_scene',
+'market_day_room_0',
+'market_night_scene',
+'market_night_room_0',
+'kenjyanoma_scene',
+'kenjyanoma_room_0',
+'tokinoma_scene',
+'tokinoma_room_0',
+'tokinoma_room_1',
+'link_home_scene',
+'link_home_room_0',
+'kokiri_shop_scene',
+'kokiri_shop_room_0',
+'kokiri_home_scene',
+'kokiri_home_room_0',
+'kakusiana_scene',
+'kakusiana_room_0',
+'kakusiana_room_1',
+'kakusiana_room_2',
+'kakusiana_room_3',
+'kakusiana_room_4',
+'kakusiana_room_5',
+'kakusiana_room_6',
+'kakusiana_room_7',
+'kakusiana_room_8',
+'kakusiana_room_9',
+'kakusiana_room_10',
+'kakusiana_room_11',
+'kakusiana_room_12',
+'kakusiana_room_13',
+'entra_scene',
+'entra_room_0',
+'moribossroom_scene',
+'moribossroom_room_0',
+'moribossroom_room_1',
+'syatekijyou_scene',
+'syatekijyou_room_0',
+'shop1_scene',
+'shop1_room_0',
+'hairal_niwa_scene',
+'hairal_niwa_room_0',
+'ganon_tou_scene',
+'ganon_tou_room_0',
+'market_alley_scene',
+'market_alley_room_0',
+'spot20_scene',
+'spot20_room_0',
+'market_ruins_scene',
+'market_ruins_room_0',
+'entra_n_scene',
+'entra_n_room_0',
+'enrui_scene',
+'enrui_room_0',
+'market_alley_n_scene',
+'market_alley_n_room_0',
+'hiral_demo_scene',
+'hiral_demo_room_0',
+'kokiri_home3_scene',
+'kokiri_home3_room_0',
+'malon_stable_scene',
+'malon_stable_room_0',
+'kakariko_scene',
+'kakariko_room_0',
+'bdan_boss_scene',
+'bdan_boss_room_0',
+'bdan_boss_room_1',
+'FIRE_bs_scene',
+'FIRE_bs_room_0',
+'FIRE_bs_room_1',
+'hut_scene',
+'hut_room_0',
+'daiyousei_izumi_scene',
+'daiyousei_izumi_room_0',
+'hakaana_scene',
+'hakaana_room_0',
+'yousei_izumi_tate_scene',
+'yousei_izumi_tate_room_0',
+'yousei_izumi_yoko_scene',
+'yousei_izumi_yoko_room_0',
+'golon_scene',
+'golon_room_0',
+'zoora_scene',
+'zoora_room_0',
+'drag_scene',
+'drag_room_0',
+'alley_shop_scene',
+'alley_shop_room_0',
+'night_shop_scene',
+'night_shop_room_0',
+'impa_scene',
+'impa_room_0',
+'labo_scene',
+'labo_room_0',
+'tent_scene',
+'tent_room_0',
+'nakaniwa_scene',
+'nakaniwa_room_0',
+'ddan_boss_scene',
+'ddan_boss_room_0',
+'ddan_boss_room_1',
+'ydan_boss_scene',
+'ydan_boss_room_0',
+'ydan_boss_room_1',
+'HAKAdan_bs_scene',
+'HAKAdan_bs_room_0',
+'HAKAdan_bs_room_1',
+'MIZUsin_bs_scene',
+'MIZUsin_bs_room_0',
+'MIZUsin_bs_room_1',
+'ganon_scene',
+'ganon_room_0',
+'ganon_room_1',
+'ganon_room_2',
+'ganon_room_3',
+'ganon_room_4',
+'ganon_room_5',
+'ganon_room_6',
+'ganon_room_7',
+'ganon_room_8',
+'ganon_room_9',
+'ganon_boss_scene',
+'ganon_boss_room_0',
+'jyasinboss_scene',
+'jyasinboss_room_0',
+'jyasinboss_room_1',
+'jyasinboss_room_2',
+'jyasinboss_room_3',
+'kokiri_home4_scene',
+'kokiri_home4_room_0',
+'kokiri_home5_scene',
+'kokiri_home5_room_0',
+'ganon_final_scene',
+'ganon_final_room_0',
+'kakariko3_scene',
+'kakariko3_room_0',
+'hakasitarelay_scene',
+'hakasitarelay_room_0',
+'hakasitarelay_room_1',
+'hakasitarelay_room_2',
+'hakasitarelay_room_3',
+'hakasitarelay_room_4',
+'hakasitarelay_room_5',
+'hakasitarelay_room_6',
+'shrine_scene',
+'shrine_room_0',
+'turibori_scene',
+'turibori_room_0',
+'shrine_n_scene',
+'shrine_n_room_0',
+'shrine_r_scene',
+'shrine_r_room_0',
+'hakaana2_scene',
+'hakaana2_room_0',
+'gerudoway_scene',
+'gerudoway_room_0',
+'gerudoway_room_1',
+'gerudoway_room_2',
+'gerudoway_room_3',
+'gerudoway_room_4',
+'gerudoway_room_5',
+'hairal_niwa_n_scene',
+'hairal_niwa_n_room_0',
+'bowling_scene',
+'bowling_room_0',
+'hakaana_ouke_scene',
+'hakaana_ouke_room_0',
+'hakaana_ouke_room_1',
+'hakaana_ouke_room_2',
+'hylia_labo_scene',
+'hylia_labo_room_0',
+'souko_scene',
+'souko_room_0',
+'souko_room_1',
+'souko_room_2',
+'miharigoya_scene',
+'miharigoya_room_0',
+'mahouya_scene',
+'mahouya_room_0',
+'takaraya_scene',
+'takaraya_room_0',
+'takaraya_room_1',
+'takaraya_room_2',
+'takaraya_room_3',
+'takaraya_room_4',
+'takaraya_room_5',
+'takaraya_room_6',
+'ganon_sonogo_scene',
+'ganon_sonogo_room_0',
+'ganon_sonogo_room_1',
+'ganon_sonogo_room_2',
+'ganon_sonogo_room_3',
+'ganon_sonogo_room_4',
+'ganon_demo_scene',
+'ganon_demo_room_0',
+'face_shop_scene',
+'face_shop_room_0',
+'kinsuta_scene',
+'kinsuta_room_0',
+'ganontikasonogo_scene',
+'ganontikasonogo_room_0',
+'ganontikasonogo_room_1',
+ 'bump_texture_static',
+ 'anime_model_1_static',
+ 'anime_model_2_static',
+ 'anime_model_3_static',
+ 'anime_model_4_static',
+ 'anime_model_5_static',
+ 'anime_model_6_static',
+ 'anime_texture_1_static',
+ 'anime_texture_2_static',
+ 'anime_texture_3_static',
+ 'anime_texture_4_static',
+ 'anime_texture_5_static',
+ 'anime_texture_6_static',
+ 'softsprite_matrix_static',
+]
+
+romData = None
+
+
+def initialize_worker(rom_data):
+ global romData
+ romData = rom_data
+
+def read_uint32_be(offset):
+ return struct.unpack('>I', romData[offset:offset+4])[0]
+
+def write_output_file(name, offset, size):
+ try:
+ with open(name, 'wb') as f:
+ f.write(romData[offset:offset+size])
+ except IOError:
+ print('failed to write file ' + name)
+
+def ExtractFunc(i):
+ filename = 'baserom/' + FILE_NAMES[i]
+ entryOffset = FILE_TABLE_OFFSET + 16 * i
+
+ virtStart = read_uint32_be(entryOffset + 0)
+ virtEnd = read_uint32_be(entryOffset + 4)
+ physStart = read_uint32_be(entryOffset + 8)
+ physEnd = read_uint32_be(entryOffset + 12)
+
+ if physEnd == 0: # uncompressed
+ compressed = False
+ size = virtEnd - virtStart
+ else: # compressed
+ compressed = True
+ size = physEnd - physStart
+
+ print('extracting ' + filename + " (0x%08X, 0x%08X)" % (virtStart, virtEnd))
+ write_output_file(filename, physStart, size)
+ if compressed:
+ os.system('tools/yaz0 -d ' + filename + ' ' + filename)
+
+#####################################################################
+
+def main():
+ try:
+ os.mkdir('baserom')
+ except:
+ pass
+
+ # read baserom data
+ try:
+ with open(ROM_FILE_NAME, 'rb') as f:
+ rom_data = f.read()
+ except IOError:
+ print('failed to read ' + ROM_FILE_NAME)
+ sys.exit(1)
+
+ # extract files
+ num_cores = cpu_count()
+ print("Extracting baserom with " + str(num_cores) + " CPU cores.")
+ with Pool(num_cores, initialize_worker, (rom_data,)) as p:
+ p.map(ExtractFunc, range(len(FILE_NAMES)))
+
+if __name__ == "__main__":
+ main()
diff --git a/OTRGui/assets/extractor/Config.xml b/OTRGui/assets/extractor/Config_GC_MQ_D.xml
similarity index 83%
rename from OTRGui/assets/extractor/Config.xml
rename to OTRGui/assets/extractor/Config_GC_MQ_D.xml
index 6e86fa8d8..51e536292 100644
--- a/OTRGui/assets/extractor/Config.xml
+++ b/OTRGui/assets/extractor/Config_GC_MQ_D.xml
@@ -2,7 +2,7 @@
-
+
diff --git a/OTRGui/assets/extractor/Config_GC_NMQ_D.xml b/OTRGui/assets/extractor/Config_GC_NMQ_D.xml
new file mode 100644
index 000000000..7cc11ac18
--- /dev/null
+++ b/OTRGui/assets/extractor/Config_GC_NMQ_D.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml b/OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml
new file mode 100644
index 000000000..b98acfb00
--- /dev/null
+++ b/OTRGui/assets/extractor/Config_GC_NMQ_PAL_F.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/OTRGui/assets/extractor/filelists/gamecube_pal.txt b/OTRGui/assets/extractor/filelists/gamecube_pal.txt
new file mode 100644
index 000000000..c9746c1da
--- /dev/null
+++ b/OTRGui/assets/extractor/filelists/gamecube_pal.txt
@@ -0,0 +1,1510 @@
+makerom
+boot
+dmadata
+Audiobank
+Audioseq
+Audiotable
+link_animetion
+icon_item_static
+icon_item_24_static
+icon_item_field_static
+icon_item_dungeon_static
+icon_item_gameover_static
+icon_item_nes_static
+icon_item_ger_static
+icon_item_fra_static
+item_name_static
+map_name_static
+do_action_static
+message_static
+message_texture_static
+nes_font_static
+nes_message_data_static
+ger_message_data_static
+fra_message_data_static
+staff_message_data_static
+map_grand_static
+map_48x85_static
+map_i_static
+code
+ovl_title
+ovl_select
+ovl_opening
+ovl_file_choose
+ovl_kaleido_scope
+ovl_player_actor
+ovl_map_mark_data
+ovl_En_Test
+ovl_Arms_Hook
+ovl_Arrow_Fire
+ovl_Arrow_Ice
+ovl_Arrow_Light
+ovl_Bg_Bdan_Objects
+ovl_Bg_Bdan_Switch
+ovl_Bg_Bom_Guard
+ovl_Bg_Bombwall
+ovl_Bg_Bowl_Wall
+ovl_Bg_Breakwall
+ovl_Bg_Ddan_Jd
+ovl_Bg_Ddan_Kd
+ovl_Bg_Dodoago
+ovl_Bg_Dy_Yoseizo
+ovl_Bg_Ganon_Otyuka
+ovl_Bg_Gate_Shutter
+ovl_Bg_Gjyo_Bridge
+ovl_Bg_Gnd_Darkmeiro
+ovl_Bg_Gnd_Firemeiro
+ovl_Bg_Gnd_Iceblock
+ovl_Bg_Gnd_Nisekabe
+ovl_Bg_Gnd_Soulmeiro
+ovl_Bg_Haka
+ovl_Bg_Haka_Gate
+ovl_Bg_Haka_Huta
+ovl_Bg_Haka_Megane
+ovl_Bg_Haka_MeganeBG
+ovl_Bg_Haka_Sgami
+ovl_Bg_Haka_Ship
+ovl_Bg_Haka_Trap
+ovl_Bg_Haka_Tubo
+ovl_Bg_Haka_Water
+ovl_Bg_Haka_Zou
+ovl_Bg_Heavy_Block
+ovl_Bg_Hidan_Curtain
+ovl_Bg_Hidan_Dalm
+ovl_Bg_Hidan_Firewall
+ovl_Bg_Hidan_Fslift
+ovl_Bg_Hidan_Fwbig
+ovl_Bg_Hidan_Hamstep
+ovl_Bg_Hidan_Hrock
+ovl_Bg_Hidan_Kousi
+ovl_Bg_Hidan_Kowarerukabe
+ovl_Bg_Hidan_Rock
+ovl_Bg_Hidan_Rsekizou
+ovl_Bg_Hidan_Sekizou
+ovl_Bg_Hidan_Sima
+ovl_Bg_Hidan_Syoku
+ovl_Bg_Ice_Objects
+ovl_Bg_Ice_Shelter
+ovl_Bg_Ice_Shutter
+ovl_Bg_Ice_Turara
+ovl_Bg_Ingate
+ovl_Bg_Jya_1flift
+ovl_Bg_Jya_Amishutter
+ovl_Bg_Jya_Bigmirror
+ovl_Bg_Jya_Block
+ovl_Bg_Jya_Bombchuiwa
+ovl_Bg_Jya_Bombiwa
+ovl_Bg_Jya_Cobra
+ovl_Bg_Jya_Goroiwa
+ovl_Bg_Jya_Haheniron
+ovl_Bg_Jya_Ironobj
+ovl_Bg_Jya_Kanaami
+ovl_Bg_Jya_Lift
+ovl_Bg_Jya_Megami
+ovl_Bg_Jya_Zurerukabe
+ovl_Bg_Menkuri_Eye
+ovl_Bg_Menkuri_Kaiten
+ovl_Bg_Menkuri_Nisekabe
+ovl_Bg_Mizu_Bwall
+ovl_Bg_Mizu_Movebg
+ovl_Bg_Mizu_Shutter
+ovl_Bg_Mizu_Uzu
+ovl_Bg_Mizu_Water
+ovl_Bg_Mjin
+ovl_Bg_Mori_Bigst
+ovl_Bg_Mori_Elevator
+ovl_Bg_Mori_Hashigo
+ovl_Bg_Mori_Hashira4
+ovl_Bg_Mori_Hineri
+ovl_Bg_Mori_Idomizu
+ovl_Bg_Mori_Kaitenkabe
+ovl_Bg_Mori_Rakkatenjo
+ovl_Bg_Po_Event
+ovl_Bg_Po_Syokudai
+ovl_Bg_Pushbox
+ovl_Bg_Relay_Objects
+ovl_Bg_Spot00_Break
+ovl_Bg_Spot00_Hanebasi
+ovl_Bg_Spot01_Fusya
+ovl_Bg_Spot01_Idohashira
+ovl_Bg_Spot01_Idomizu
+ovl_Bg_Spot01_Idosoko
+ovl_Bg_Spot01_Objects2
+ovl_Bg_Spot02_Objects
+ovl_Bg_Spot03_Taki
+ovl_Bg_Spot05_Soko
+ovl_Bg_Spot06_Objects
+ovl_Bg_Spot07_Taki
+ovl_Bg_Spot08_Bakudankabe
+ovl_Bg_Spot08_Iceblock
+ovl_Bg_Spot09_Obj
+ovl_Bg_Spot11_Bakudankabe
+ovl_Bg_Spot11_Oasis
+ovl_Bg_Spot12_Gate
+ovl_Bg_Spot12_Saku
+ovl_Bg_Spot15_Rrbox
+ovl_Bg_Spot15_Saku
+ovl_Bg_Spot16_Bombstone
+ovl_Bg_Spot16_Doughnut
+ovl_Bg_Spot17_Bakudankabe
+ovl_Bg_Spot17_Funen
+ovl_Bg_Spot18_Basket
+ovl_Bg_Spot18_Futa
+ovl_Bg_Spot18_Obj
+ovl_Bg_Spot18_Shutter
+ovl_Bg_Sst_Floor
+ovl_Bg_Toki_Hikari
+ovl_Bg_Toki_Swd
+ovl_Bg_Treemouth
+ovl_Bg_Umajump
+ovl_Bg_Vb_Sima
+ovl_Bg_Ydan_Hasi
+ovl_Bg_Ydan_Maruta
+ovl_Bg_Ydan_Sp
+ovl_Bg_Zg
+ovl_Boss_Dodongo
+ovl_Boss_Fd
+ovl_Boss_Fd2
+ovl_Boss_Ganon
+ovl_Boss_Ganon2
+ovl_Boss_Ganondrof
+ovl_Boss_Goma
+ovl_Boss_Mo
+ovl_Boss_Sst
+ovl_Boss_Tw
+ovl_Boss_Va
+ovl_Demo_6K
+ovl_Demo_Du
+ovl_Demo_Ec
+ovl_Demo_Effect
+ovl_Demo_Ext
+ovl_Demo_Geff
+ovl_Demo_Gj
+ovl_Demo_Go
+ovl_Demo_Gt
+ovl_Demo_Ik
+ovl_Demo_Im
+ovl_Demo_Kankyo
+ovl_Demo_Kekkai
+ovl_Demo_Sa
+ovl_Demo_Shd
+ovl_Demo_Tre_Lgt
+ovl_Door_Ana
+ovl_Door_Gerudo
+ovl_Door_Killer
+ovl_Door_Shutter
+ovl_Door_Toki
+ovl_Door_Warp1
+ovl_Efc_Erupc
+ovl_Eff_Dust
+ovl_Effect_Ss_Blast
+ovl_Effect_Ss_Bomb
+ovl_Effect_Ss_Bomb2
+ovl_Effect_Ss_Bubble
+ovl_Effect_Ss_D_Fire
+ovl_Effect_Ss_Dead_Db
+ovl_Effect_Ss_Dead_Dd
+ovl_Effect_Ss_Dead_Ds
+ovl_Effect_Ss_Dead_Sound
+ovl_Effect_Ss_Dt_Bubble
+ovl_Effect_Ss_Dust
+ovl_Effect_Ss_En_Fire
+ovl_Effect_Ss_En_Ice
+ovl_Effect_Ss_Extra
+ovl_Effect_Ss_Fcircle
+ovl_Effect_Ss_Fhg_Flash
+ovl_Effect_Ss_Fire_Tail
+ovl_Effect_Ss_G_Fire
+ovl_Effect_Ss_G_Magma
+ovl_Effect_Ss_G_Magma2
+ovl_Effect_Ss_G_Ripple
+ovl_Effect_Ss_G_Spk
+ovl_Effect_Ss_G_Splash
+ovl_Effect_Ss_Hahen
+ovl_Effect_Ss_HitMark
+ovl_Effect_Ss_Ice_Piece
+ovl_Effect_Ss_Ice_Smoke
+ovl_Effect_Ss_K_Fire
+ovl_Effect_Ss_Kakera
+ovl_Effect_Ss_KiraKira
+ovl_Effect_Ss_Lightning
+ovl_Effect_Ss_Sibuki
+ovl_Effect_Ss_Sibuki2
+ovl_Effect_Ss_Solder_Srch_Ball
+ovl_Effect_Ss_Stick
+ovl_Effect_Ss_Stone1
+ovl_Elf_Msg
+ovl_Elf_Msg2
+ovl_En_Am
+ovl_En_Ani
+ovl_En_Anubice
+ovl_En_Anubice_Fire
+ovl_En_Anubice_Tag
+ovl_En_Arow_Trap
+ovl_En_Arrow
+ovl_En_Attack_Niw
+ovl_En_Ba
+ovl_En_Bb
+ovl_En_Bdfire
+ovl_En_Bigokuta
+ovl_En_Bili
+ovl_En_Bird
+ovl_En_Blkobj
+ovl_En_Bom
+ovl_En_Bom_Bowl_Man
+ovl_En_Bom_Bowl_Pit
+ovl_En_Bom_Chu
+ovl_En_Bombf
+ovl_En_Boom
+ovl_En_Box
+ovl_En_Brob
+ovl_En_Bubble
+ovl_En_Butte
+ovl_En_Bw
+ovl_En_Bx
+ovl_En_Changer
+ovl_En_Clear_Tag
+ovl_En_Cow
+ovl_En_Crow
+ovl_En_Cs
+ovl_En_Daiku
+ovl_En_Daiku_Kakariko
+ovl_En_Dekubaba
+ovl_En_Dekunuts
+ovl_En_Dh
+ovl_En_Dha
+ovl_En_Diving_Game
+ovl_En_Dns
+ovl_En_Dnt_Demo
+ovl_En_Dnt_Jiji
+ovl_En_Dnt_Nomal
+ovl_En_Dodojr
+ovl_En_Dodongo
+ovl_En_Dog
+ovl_En_Door
+ovl_En_Ds
+ovl_En_Du
+ovl_En_Dy_Extra
+ovl_En_Eg
+ovl_En_Eiyer
+ovl_En_Elf
+ovl_En_Encount1
+ovl_En_Encount2
+ovl_En_Ex_Item
+ovl_En_Ex_Ruppy
+ovl_En_Fd
+ovl_En_Fd_Fire
+ovl_En_Fhg_Fire
+ovl_En_Fire_Rock
+ovl_En_Firefly
+ovl_En_Fish
+ovl_En_Floormas
+ovl_En_Fr
+ovl_En_Fu
+ovl_En_Fw
+ovl_En_Fz
+ovl_En_G_Switch
+ovl_En_Ganon_Mant
+ovl_En_Ganon_Organ
+ovl_En_Gb
+ovl_En_Ge1
+ovl_En_Ge2
+ovl_En_Ge3
+ovl_En_GeldB
+ovl_En_GirlA
+ovl_En_Gm
+ovl_En_Go
+ovl_En_Go2
+ovl_En_Goma
+ovl_En_Goroiwa
+ovl_En_Gs
+ovl_En_Guest
+ovl_En_Hata
+ovl_En_Heishi1
+ovl_En_Heishi2
+ovl_En_Heishi3
+ovl_En_Heishi4
+ovl_En_Hintnuts
+ovl_En_Holl
+ovl_En_Honotrap
+ovl_En_Horse
+ovl_En_Horse_Game_Check
+ovl_En_Horse_Ganon
+ovl_En_Horse_Link_Child
+ovl_En_Horse_Normal
+ovl_En_Horse_Zelda
+ovl_En_Hs
+ovl_En_Hs2
+ovl_En_Hy
+ovl_En_Ice_Hono
+ovl_En_Ik
+ovl_En_In
+ovl_En_Insect
+ovl_En_Ishi
+ovl_En_It
+ovl_En_Jj
+ovl_En_Js
+ovl_En_Jsjutan
+ovl_En_Kakasi
+ovl_En_Kakasi2
+ovl_En_Kakasi3
+ovl_En_Kanban
+ovl_En_Karebaba
+ovl_En_Ko
+ovl_En_Kusa
+ovl_En_Kz
+ovl_En_Light
+ovl_En_Lightbox
+ovl_En_M_Fire1
+ovl_En_M_Thunder
+ovl_En_Ma1
+ovl_En_Ma2
+ovl_En_Ma3
+ovl_En_Mag
+ovl_En_Mb
+ovl_En_Md
+ovl_En_Mk
+ovl_En_Mm
+ovl_En_Mm2
+ovl_En_Ms
+ovl_En_Mu
+ovl_En_Nb
+ovl_En_Niw
+ovl_En_Niw_Girl
+ovl_En_Niw_Lady
+ovl_En_Nutsball
+ovl_En_Nwc
+ovl_En_Ny
+ovl_En_OE2
+ovl_En_Okarina_Effect
+ovl_En_Okarina_Tag
+ovl_En_Okuta
+ovl_En_Ossan
+ovl_En_Owl
+ovl_En_Part
+ovl_En_Peehat
+ovl_En_Po_Desert
+ovl_En_Po_Field
+ovl_En_Po_Relay
+ovl_En_Po_Sisters
+ovl_En_Poh
+ovl_En_Pu_box
+ovl_En_Rd
+ovl_En_Reeba
+ovl_En_River_Sound
+ovl_En_Rl
+ovl_En_Rr
+ovl_En_Ru1
+ovl_En_Ru2
+ovl_En_Sa
+ovl_En_Sb
+ovl_En_Scene_Change
+ovl_En_Sda
+ovl_En_Shopnuts
+ovl_En_Si
+ovl_En_Siofuki
+ovl_En_Skb
+ovl_En_Skj
+ovl_En_Skjneedle
+ovl_En_Ssh
+ovl_En_St
+ovl_En_Sth
+ovl_En_Stream
+ovl_En_Sw
+ovl_En_Syateki_Itm
+ovl_En_Syateki_Man
+ovl_En_Syateki_Niw
+ovl_En_Ta
+ovl_En_Takara_Man
+ovl_En_Tana
+ovl_En_Tg
+ovl_En_Tite
+ovl_En_Tk
+ovl_En_Torch
+ovl_En_Torch2
+ovl_En_Toryo
+ovl_En_Tp
+ovl_En_Tr
+ovl_En_Trap
+ovl_En_Tubo_Trap
+ovl_En_Vali
+ovl_En_Vase
+ovl_En_Vb_Ball
+ovl_En_Viewer
+ovl_En_Vm
+ovl_En_Wall_Tubo
+ovl_En_Wallmas
+ovl_En_Weather_Tag
+ovl_En_Weiyer
+ovl_En_Wf
+ovl_En_Wonder_Item
+ovl_En_Wonder_Talk
+ovl_En_Wonder_Talk2
+ovl_En_Wood02
+ovl_En_Xc
+ovl_En_Yabusame_Mark
+ovl_En_Yukabyun
+ovl_En_Zf
+ovl_En_Zl1
+ovl_En_Zl2
+ovl_En_Zl3
+ovl_En_Zl4
+ovl_En_Zo
+ovl_En_fHG
+ovl_End_Title
+ovl_Fishing
+ovl_Item_B_Heart
+ovl_Item_Etcetera
+ovl_Item_Inbox
+ovl_Item_Ocarina
+ovl_Item_Shield
+ovl_Magic_Dark
+ovl_Magic_Fire
+ovl_Magic_Wind
+ovl_Mir_Ray
+ovl_Obj_Bean
+ovl_Obj_Blockstop
+ovl_Obj_Bombiwa
+ovl_Obj_Comb
+ovl_Obj_Dekujr
+ovl_Obj_Elevator
+ovl_Obj_Hamishi
+ovl_Obj_Hana
+ovl_Obj_Hsblock
+ovl_Obj_Ice_Poly
+ovl_Obj_Kibako
+ovl_Obj_Kibako2
+ovl_Obj_Lift
+ovl_Obj_Lightswitch
+ovl_Obj_Makekinsuta
+ovl_Obj_Makeoshihiki
+ovl_Obj_Mure
+ovl_Obj_Mure2
+ovl_Obj_Mure3
+ovl_Obj_Oshihiki
+ovl_Obj_Roomtimer
+ovl_Obj_Switch
+ovl_Obj_Syokudai
+ovl_Obj_Timeblock
+ovl_Obj_Tsubo
+ovl_Obj_Warp2block
+ovl_Object_Kankyo
+ovl_Oceff_Spot
+ovl_Oceff_Storm
+ovl_Oceff_Wipe
+ovl_Oceff_Wipe2
+ovl_Oceff_Wipe3
+ovl_Oceff_Wipe4
+ovl_Shot_Sun
+gameplay_keep
+gameplay_field_keep
+gameplay_dangeon_keep
+gameplay_object_exchange_static
+object_link_boy
+object_link_child
+object_box
+object_human
+object_okuta
+object_poh
+object_wallmaster
+object_dy_obj
+object_firefly
+object_dodongo
+object_fire
+object_niw
+object_tite
+object_reeba
+object_peehat
+object_kingdodongo
+object_horse
+object_zf
+object_goma
+object_zl1
+object_gol
+object_bubble
+object_dodojr
+object_torch2
+object_bl
+object_tp
+object_oA1
+object_st
+object_bw
+object_ei
+object_horse_normal
+object_oB1
+object_o_anime
+object_spot04_objects
+object_ddan_objects
+object_hidan_objects
+object_horse_ganon
+object_oA2
+object_spot00_objects
+object_mb
+object_bombf
+object_sk2
+object_oE1
+object_oE_anime
+object_oE2
+object_ydan_objects
+object_gnd
+object_am
+object_dekubaba
+object_oA3
+object_oA4
+object_oA5
+object_oA6
+object_oA7
+object_jj
+object_oA8
+object_oA9
+object_oB2
+object_oB3
+object_oB4
+object_horse_zelda
+object_opening_demo1
+object_warp1
+object_b_heart
+object_dekunuts
+object_oE3
+object_oE4
+object_menkuri_objects
+object_oE5
+object_oE6
+object_oE7
+object_oE8
+object_oE9
+object_oE10
+object_oE11
+object_oE12
+object_vali
+object_oA10
+object_oA11
+object_mizu_objects
+object_fhg
+object_ossan
+object_mori_hineri1
+object_Bb
+object_toki_objects
+object_yukabyun
+object_zl2
+object_mjin
+object_mjin_flash
+object_mjin_dark
+object_mjin_flame
+object_mjin_ice
+object_mjin_soul
+object_mjin_wind
+object_mjin_oka
+object_haka_objects
+object_spot06_objects
+object_ice_objects
+object_relay_objects
+object_mori_hineri1a
+object_mori_hineri2
+object_mori_hineri2a
+object_mori_objects
+object_mori_tex
+object_spot08_obj
+object_warp2
+object_hata
+object_bird
+object_wood02
+object_lightbox
+object_pu_box
+object_trap
+object_vase
+object_im
+object_ta
+object_tk
+object_xc
+object_vm
+object_bv
+object_hakach_objects
+object_efc_crystal_light
+object_efc_fire_ball
+object_efc_flash
+object_efc_lgt_shower
+object_efc_star_field
+object_god_lgt
+object_light_ring
+object_triforce_spot
+object_medal
+object_bdan_objects
+object_sd
+object_rd
+object_po_sisters
+object_heavy_object
+object_gndd
+object_fd
+object_du
+object_fw
+object_horse_link_child
+object_spot02_objects
+object_haka
+object_ru1
+object_syokudai
+object_fd2
+object_dh
+object_rl
+object_efc_tw
+object_demo_tre_lgt
+object_gi_key
+object_mir_ray
+object_brob
+object_gi_jewel
+object_spot09_obj
+object_spot18_obj
+object_bdoor
+object_spot17_obj
+object_shop_dungen
+object_nb
+object_mo
+object_sb
+object_gi_melody
+object_gi_heart
+object_gi_compass
+object_gi_bosskey
+object_gi_medal
+object_gi_nuts
+object_sa
+object_gi_hearts
+object_gi_arrowcase
+object_gi_bombpouch
+object_in
+object_tr
+object_spot16_obj
+object_oE1s
+object_oE4s
+object_os_anime
+object_gi_bottle
+object_gi_stick
+object_gi_map
+object_oF1d_map
+object_ru2
+object_gi_shield_1
+object_dekujr
+object_gi_magicpot
+object_gi_bomb_1
+object_oF1s
+object_ma2
+object_gi_purse
+object_hni
+object_tw
+object_rr
+object_bxa
+object_anubice
+object_gi_gerudo
+object_gi_arrow
+object_gi_bomb_2
+object_gi_egg
+object_gi_scale
+object_gi_shield_2
+object_gi_hookshot
+object_gi_ocarina
+object_gi_milk
+object_ma1
+object_ganon
+object_sst
+object_ny
+object_fr
+object_gi_pachinko
+object_gi_boomerang
+object_gi_bow
+object_gi_glasses
+object_gi_liquid
+object_ani
+object_demo_6k
+object_gi_shield_3
+object_gi_letter
+object_spot15_obj
+object_jya_obj
+object_gi_clothes
+object_gi_bean
+object_gi_fish
+object_gi_saw
+object_gi_hammer
+object_gi_grass
+object_gi_longsword
+object_spot01_objects
+object_md
+object_km1
+object_kw1
+object_zo
+object_kz
+object_umajump
+object_masterkokiri
+object_masterkokirihead
+object_mastergolon
+object_masterzoora
+object_aob
+object_ik
+object_ahg
+object_cne
+object_gi_niwatori
+object_skj
+object_gi_bottle_letter
+object_bji
+object_bba
+object_gi_ocarina_0
+object_ds
+object_ane
+object_boj
+object_spot03_object
+object_spot07_object
+object_fz
+object_bob
+object_ge1
+object_yabusame_point
+object_gi_boots_2
+object_gi_seed
+object_gnd_magic
+object_d_elevator
+object_d_hsblock
+object_d_lift
+object_mamenoki
+object_goroiwa
+object_toryo
+object_daiku
+object_nwc
+object_blkobj
+object_gm
+object_ms
+object_hs
+object_ingate
+object_lightswitch
+object_kusa
+object_tsubo
+object_gi_gloves
+object_gi_coin
+object_kanban
+object_gjyo_objects
+object_owl
+object_mk
+object_fu
+object_gi_ki_tan_mask
+object_gi_redead_mask
+object_gi_skj_mask
+object_gi_rabit_mask
+object_gi_truth_mask
+object_ganon_objects
+object_siofuki
+object_stream
+object_mm
+object_fa
+object_os
+object_gi_eye_lotion
+object_gi_powder
+object_gi_mushroom
+object_gi_ticketstone
+object_gi_brokensword
+object_js
+object_cs
+object_gi_prescription
+object_gi_bracelet
+object_gi_soldout
+object_gi_frog
+object_mag
+object_door_gerudo
+object_gt
+object_efc_erupc
+object_zl2_anime1
+object_zl2_anime2
+object_gi_golonmask
+object_gi_zoramask
+object_gi_gerudomask
+object_ganon2
+object_ka
+object_ts
+object_zg
+object_gi_hoverboots
+object_gi_m_arrow
+object_ds2
+object_ec
+object_fish
+object_gi_sutaru
+object_gi_goddess
+object_ssh
+object_bigokuta
+object_bg
+object_spot05_objects
+object_spot12_obj
+object_bombiwa
+object_hintnuts
+object_rs
+object_spot00_break
+object_gla
+object_shopnuts
+object_geldb
+object_gr
+object_dog
+object_jya_iron
+object_jya_door
+object_spot01_objects2
+object_spot11_obj
+object_kibako2
+object_dns
+object_dnk
+object_gi_fire
+object_gi_insect
+object_gi_butterfly
+object_gi_ghost
+object_gi_soul
+object_bowl
+object_po_field
+object_demo_kekkai
+object_efc_doughnut
+object_gi_dekupouch
+object_ganon_anime1
+object_ganon_anime2
+object_ganon_anime3
+object_gi_rupy
+object_spot01_matoya
+object_spot01_matoyab
+object_po_composer
+object_mu
+object_wf
+object_skb
+object_gj
+object_geff
+object_haka_door
+object_gs
+object_ps
+object_bwall
+object_crow
+object_cow
+object_cob
+object_gi_sword_1
+object_door_killer
+object_ouke_haka
+object_timeblock
+object_zl4
+g_pn_01
+g_pn_02
+g_pn_03
+g_pn_04
+g_pn_05
+g_pn_06
+g_pn_07
+g_pn_08
+g_pn_09
+g_pn_10
+g_pn_11
+g_pn_12
+g_pn_13
+g_pn_14
+g_pn_15
+g_pn_16
+g_pn_17
+g_pn_18
+g_pn_19
+g_pn_20
+g_pn_21
+g_pn_22
+g_pn_23
+g_pn_24
+g_pn_25
+g_pn_26
+g_pn_27
+g_pn_28
+g_pn_29
+g_pn_30
+g_pn_31
+g_pn_32
+g_pn_33
+g_pn_34
+g_pn_35
+g_pn_36
+g_pn_37
+g_pn_38
+g_pn_39
+g_pn_40
+g_pn_41
+g_pn_42
+g_pn_43
+g_pn_44
+g_pn_45
+g_pn_46
+g_pn_47
+g_pn_48
+g_pn_49
+g_pn_50
+g_pn_51
+g_pn_52
+g_pn_53
+g_pn_54
+g_pn_55
+g_pn_56
+g_pn_57
+z_select_static
+nintendo_rogo_static
+title_static
+parameter_static
+vr_fine0_static
+vr_fine0_pal_static
+vr_fine1_static
+vr_fine1_pal_static
+vr_fine2_static
+vr_fine2_pal_static
+vr_fine3_static
+vr_fine3_pal_static
+vr_cloud0_static
+vr_cloud0_pal_static
+vr_cloud1_static
+vr_cloud1_pal_static
+vr_cloud2_static
+vr_cloud2_pal_static
+vr_cloud3_static
+vr_cloud3_pal_static
+vr_holy0_static
+vr_holy0_pal_static
+vr_holy1_static
+vr_holy1_pal_static
+vr_MDVR_static
+vr_MDVR_pal_static
+vr_MNVR_static
+vr_MNVR_pal_static
+vr_RUVR_static
+vr_RUVR_pal_static
+vr_LHVR_static
+vr_LHVR_pal_static
+vr_KHVR_static
+vr_KHVR_pal_static
+vr_K3VR_static
+vr_K3VR_pal_static
+vr_K4VR_static
+vr_K4VR_pal_static
+vr_K5VR_static
+vr_K5VR_pal_static
+vr_SP1a_static
+vr_SP1a_pal_static
+vr_MLVR_static
+vr_MLVR_pal_static
+vr_KKRVR_static
+vr_KKRVR_pal_static
+vr_KR3VR_static
+vr_KR3VR_pal_static
+vr_IPVR_static
+vr_IPVR_pal_static
+vr_KSVR_static
+vr_KSVR_pal_static
+vr_GLVR_static
+vr_GLVR_pal_static
+vr_ZRVR_static
+vr_ZRVR_pal_static
+vr_DGVR_static
+vr_DGVR_pal_static
+vr_ALVR_static
+vr_ALVR_pal_static
+vr_NSVR_static
+vr_NSVR_pal_static
+vr_LBVR_static
+vr_LBVR_pal_static
+vr_TTVR_static
+vr_TTVR_pal_static
+vr_FCVR_static
+vr_FCVR_pal_static
+elf_message_field
+elf_message_ydan
+ydan_scene
+ydan_room_0
+ydan_room_1
+ydan_room_2
+ydan_room_3
+ydan_room_4
+ydan_room_5
+ydan_room_6
+ydan_room_7
+ydan_room_8
+ydan_room_9
+ydan_room_10
+ydan_room_11
+ddan_scene
+ddan_room_0
+ddan_room_1
+ddan_room_2
+ddan_room_3
+ddan_room_4
+ddan_room_5
+ddan_room_6
+ddan_room_7
+ddan_room_8
+ddan_room_9
+ddan_room_10
+ddan_room_11
+ddan_room_12
+ddan_room_13
+ddan_room_14
+ddan_room_15
+ddan_room_16
+bdan_scene
+bdan_room_0
+bdan_room_1
+bdan_room_2
+bdan_room_3
+bdan_room_4
+bdan_room_5
+bdan_room_6
+bdan_room_7
+bdan_room_8
+bdan_room_9
+bdan_room_10
+bdan_room_11
+bdan_room_12
+bdan_room_13
+bdan_room_14
+bdan_room_15
+Bmori1_scene
+Bmori1_room_0
+Bmori1_room_1
+Bmori1_room_2
+Bmori1_room_3
+Bmori1_room_4
+Bmori1_room_5
+Bmori1_room_6
+Bmori1_room_7
+Bmori1_room_8
+Bmori1_room_9
+Bmori1_room_10
+Bmori1_room_11
+Bmori1_room_12
+Bmori1_room_13
+Bmori1_room_14
+Bmori1_room_15
+Bmori1_room_16
+Bmori1_room_17
+Bmori1_room_18
+Bmori1_room_19
+Bmori1_room_20
+Bmori1_room_21
+Bmori1_room_22
+HIDAN_scene
+HIDAN_room_0
+HIDAN_room_1
+HIDAN_room_2
+HIDAN_room_3
+HIDAN_room_4
+HIDAN_room_5
+HIDAN_room_6
+HIDAN_room_7
+HIDAN_room_8
+HIDAN_room_9
+HIDAN_room_10
+HIDAN_room_11
+HIDAN_room_12
+HIDAN_room_13
+HIDAN_room_14
+HIDAN_room_15
+HIDAN_room_16
+HIDAN_room_17
+HIDAN_room_18
+HIDAN_room_19
+HIDAN_room_20
+HIDAN_room_21
+HIDAN_room_22
+HIDAN_room_23
+HIDAN_room_24
+HIDAN_room_25
+HIDAN_room_26
+MIZUsin_scene
+MIZUsin_room_0
+MIZUsin_room_1
+MIZUsin_room_2
+MIZUsin_room_3
+MIZUsin_room_4
+MIZUsin_room_5
+MIZUsin_room_6
+MIZUsin_room_7
+MIZUsin_room_8
+MIZUsin_room_9
+MIZUsin_room_10
+MIZUsin_room_11
+MIZUsin_room_12
+MIZUsin_room_13
+MIZUsin_room_14
+MIZUsin_room_15
+MIZUsin_room_16
+MIZUsin_room_17
+MIZUsin_room_18
+MIZUsin_room_19
+MIZUsin_room_20
+MIZUsin_room_21
+MIZUsin_room_22
+jyasinzou_scene
+jyasinzou_room_0
+jyasinzou_room_1
+jyasinzou_room_2
+jyasinzou_room_3
+jyasinzou_room_4
+jyasinzou_room_5
+jyasinzou_room_6
+jyasinzou_room_7
+jyasinzou_room_8
+jyasinzou_room_9
+jyasinzou_room_10
+jyasinzou_room_11
+jyasinzou_room_12
+jyasinzou_room_13
+jyasinzou_room_14
+jyasinzou_room_15
+jyasinzou_room_16
+jyasinzou_room_17
+jyasinzou_room_18
+jyasinzou_room_19
+jyasinzou_room_20
+jyasinzou_room_21
+jyasinzou_room_22
+jyasinzou_room_23
+jyasinzou_room_24
+jyasinzou_room_25
+jyasinzou_room_26
+jyasinzou_room_27
+jyasinzou_room_28
+HAKAdan_scene
+HAKAdan_room_0
+HAKAdan_room_1
+HAKAdan_room_2
+HAKAdan_room_3
+HAKAdan_room_4
+HAKAdan_room_5
+HAKAdan_room_6
+HAKAdan_room_7
+HAKAdan_room_8
+HAKAdan_room_9
+HAKAdan_room_10
+HAKAdan_room_11
+HAKAdan_room_12
+HAKAdan_room_13
+HAKAdan_room_14
+HAKAdan_room_15
+HAKAdan_room_16
+HAKAdan_room_17
+HAKAdan_room_18
+HAKAdan_room_19
+HAKAdan_room_20
+HAKAdan_room_21
+HAKAdan_room_22
+HAKAdanCH_scene
+HAKAdanCH_room_0
+HAKAdanCH_room_1
+HAKAdanCH_room_2
+HAKAdanCH_room_3
+HAKAdanCH_room_4
+HAKAdanCH_room_5
+HAKAdanCH_room_6
+ice_doukutu_scene
+ice_doukutu_room_0
+ice_doukutu_room_1
+ice_doukutu_room_2
+ice_doukutu_room_3
+ice_doukutu_room_4
+ice_doukutu_room_5
+ice_doukutu_room_6
+ice_doukutu_room_7
+ice_doukutu_room_8
+ice_doukutu_room_9
+ice_doukutu_room_10
+ice_doukutu_room_11
+men_scene
+men_room_0
+men_room_1
+men_room_2
+men_room_3
+men_room_4
+men_room_5
+men_room_6
+men_room_7
+men_room_8
+men_room_9
+men_room_10
+ganontika_scene
+ganontika_room_0
+ganontika_room_1
+ganontika_room_2
+ganontika_room_3
+ganontika_room_4
+ganontika_room_5
+ganontika_room_6
+ganontika_room_7
+ganontika_room_8
+ganontika_room_9
+ganontika_room_10
+ganontika_room_11
+ganontika_room_12
+ganontika_room_13
+ganontika_room_14
+ganontika_room_15
+ganontika_room_16
+ganontika_room_17
+ganontika_room_18
+ganontika_room_19
+spot00_scene
+spot00_room_0
+spot01_scene
+spot01_room_0
+spot02_scene
+spot02_room_0
+spot02_room_1
+spot03_scene
+spot03_room_0
+spot03_room_1
+spot04_scene
+spot04_room_0
+spot04_room_1
+spot04_room_2
+spot05_scene
+spot05_room_0
+spot06_scene
+spot06_room_0
+spot07_scene
+spot07_room_0
+spot07_room_1
+spot08_scene
+spot08_room_0
+spot09_scene
+spot09_room_0
+spot10_scene
+spot10_room_0
+spot10_room_1
+spot10_room_2
+spot10_room_3
+spot10_room_4
+spot10_room_5
+spot10_room_6
+spot10_room_7
+spot10_room_8
+spot10_room_9
+spot11_scene
+spot11_room_0
+spot12_scene
+spot12_room_0
+spot12_room_1
+spot13_scene
+spot13_room_0
+spot13_room_1
+spot15_scene
+spot15_room_0
+spot16_scene
+spot16_room_0
+spot17_scene
+spot17_room_0
+spot17_room_1
+spot18_scene
+spot18_room_0
+spot18_room_1
+spot18_room_2
+spot18_room_3
+market_day_scene
+market_day_room_0
+market_night_scene
+market_night_room_0
+kenjyanoma_scene
+kenjyanoma_room_0
+tokinoma_scene
+tokinoma_room_0
+tokinoma_room_1
+link_home_scene
+link_home_room_0
+kokiri_shop_scene
+kokiri_shop_room_0
+kokiri_home_scene
+kokiri_home_room_0
+kakusiana_scene
+kakusiana_room_0
+kakusiana_room_1
+kakusiana_room_2
+kakusiana_room_3
+kakusiana_room_4
+kakusiana_room_5
+kakusiana_room_6
+kakusiana_room_7
+kakusiana_room_8
+kakusiana_room_9
+kakusiana_room_10
+kakusiana_room_11
+kakusiana_room_12
+kakusiana_room_13
+entra_scene
+entra_room_0
+moribossroom_scene
+moribossroom_room_0
+moribossroom_room_1
+syatekijyou_scene
+syatekijyou_room_0
+shop1_scene
+shop1_room_0
+hairal_niwa_scene
+hairal_niwa_room_0
+ganon_tou_scene
+ganon_tou_room_0
+market_alley_scene
+market_alley_room_0
+spot20_scene
+spot20_room_0
+market_ruins_scene
+market_ruins_room_0
+entra_n_scene
+entra_n_room_0
+enrui_scene
+enrui_room_0
+market_alley_n_scene
+market_alley_n_room_0
+hiral_demo_scene
+hiral_demo_room_0
+kokiri_home3_scene
+kokiri_home3_room_0
+malon_stable_scene
+malon_stable_room_0
+kakariko_scene
+kakariko_room_0
+bdan_boss_scene
+bdan_boss_room_0
+bdan_boss_room_1
+FIRE_bs_scene
+FIRE_bs_room_0
+FIRE_bs_room_1
+hut_scene
+hut_room_0
+daiyousei_izumi_scene
+daiyousei_izumi_room_0
+hakaana_scene
+hakaana_room_0
+yousei_izumi_tate_scene
+yousei_izumi_tate_room_0
+yousei_izumi_yoko_scene
+yousei_izumi_yoko_room_0
+golon_scene
+golon_room_0
+zoora_scene
+zoora_room_0
+drag_scene
+drag_room_0
+alley_shop_scene
+alley_shop_room_0
+night_shop_scene
+night_shop_room_0
+impa_scene
+impa_room_0
+labo_scene
+labo_room_0
+tent_scene
+tent_room_0
+nakaniwa_scene
+nakaniwa_room_0
+ddan_boss_scene
+ddan_boss_room_0
+ddan_boss_room_1
+ydan_boss_scene
+ydan_boss_room_0
+ydan_boss_room_1
+HAKAdan_bs_scene
+HAKAdan_bs_room_0
+HAKAdan_bs_room_1
+MIZUsin_bs_scene
+MIZUsin_bs_room_0
+MIZUsin_bs_room_1
+ganon_scene
+ganon_room_0
+ganon_room_1
+ganon_room_2
+ganon_room_3
+ganon_room_4
+ganon_room_5
+ganon_room_6
+ganon_room_7
+ganon_room_8
+ganon_room_9
+ganon_boss_scene
+ganon_boss_room_0
+jyasinboss_scene
+jyasinboss_room_0
+jyasinboss_room_1
+jyasinboss_room_2
+jyasinboss_room_3
+kokiri_home4_scene
+kokiri_home4_room_0
+kokiri_home5_scene
+kokiri_home5_room_0
+ganon_final_scene
+ganon_final_room_0
+kakariko3_scene
+kakariko3_room_0
+hakasitarelay_scene
+hakasitarelay_room_0
+hakasitarelay_room_1
+hakasitarelay_room_2
+hakasitarelay_room_3
+hakasitarelay_room_4
+hakasitarelay_room_5
+hakasitarelay_room_6
+shrine_scene
+shrine_room_0
+turibori_scene
+turibori_room_0
+shrine_n_scene
+shrine_n_room_0
+shrine_r_scene
+shrine_r_room_0
+hakaana2_scene
+hakaana2_room_0
+gerudoway_scene
+gerudoway_room_0
+gerudoway_room_1
+gerudoway_room_2
+gerudoway_room_3
+gerudoway_room_4
+gerudoway_room_5
+hairal_niwa_n_scene
+hairal_niwa_n_room_0
+bowling_scene
+bowling_room_0
+hakaana_ouke_scene
+hakaana_ouke_room_0
+hakaana_ouke_room_1
+hakaana_ouke_room_2
+hylia_labo_scene
+hylia_labo_room_0
+souko_scene
+souko_room_0
+souko_room_1
+souko_room_2
+miharigoya_scene
+miharigoya_room_0
+mahouya_scene
+mahouya_room_0
+takaraya_scene
+takaraya_room_0
+takaraya_room_1
+takaraya_room_2
+takaraya_room_3
+takaraya_room_4
+takaraya_room_5
+takaraya_room_6
+ganon_sonogo_scene
+ganon_sonogo_room_0
+ganon_sonogo_room_1
+ganon_sonogo_room_2
+ganon_sonogo_room_3
+ganon_sonogo_room_4
+ganon_demo_scene
+ganon_demo_room_0
+face_shop_scene
+face_shop_room_0
+kinsuta_scene
+kinsuta_room_0
+ganontikasonogo_scene
+ganontikasonogo_room_0
+ganontikasonogo_room_1
+bump_texture_static
+anime_model_1_static
+anime_model_2_static
+anime_model_3_static
+anime_model_4_static
+anime_model_5_static
+anime_model_6_static
+anime_texture_1_static
+anime_texture_2_static
+anime_texture_3_static
+anime_texture_4_static
+anime_texture_5_static
+anime_texture_6_static
+softsprite_matrix_static
\ No newline at end of file
diff --git a/OTRGui/src/game/game.cpp b/OTRGui/src/game/game.cpp
index 3fc6438a8..88bd7201f 100644
--- a/OTRGui/src/game/game.cpp
+++ b/OTRGui/src/game/game.cpp
@@ -18,6 +18,7 @@ Shader shader = { 0 };
Light light = { 0 };
Vector3 lightPos = { -5.0f, 10.0f, 10.0f };
Vector2 dragOffset;
+bool isDragging = false;
std::string sohFolder = NULLSTR;
bool extracting = false;
bool rom_ready = false;
@@ -25,6 +26,7 @@ bool single_thread = false;
bool hide_second_btn = false;
RomVersion version;
const char* patched_rom = "tmp/rom.z64";
+extern bool oldExtractMode;
static std::string currentStep = "None";
@@ -71,11 +73,29 @@ void OTRGame::init(){
}
}
-void ExtractRom() {
- const WriteResult result = ExtractBaserom(patched_rom);
+void ExtractRom()
+{
+ WriteResult result;
+
+ if (oldExtractMode)
+ ExtractBaserom(patched_rom);
+ else
+ result.error = NULLSTR;
+
if (result.error == NULLSTR) {
if (MoonUtils::exists("oot.otr")) MoonUtils::rm("oot.otr");
- startWorker();
+ if (MoonUtils::exists("Extract")) MoonUtils::rm("Extract");
+
+ MoonUtils::mkdir("Extract");
+ //MoonUtils::copy("tmp/baserom/Audiobank", "Extract/Audiobank");
+ //MoonUtils::copy("tmp/baserom/Audioseq", "Extract/Audioseq");
+ //MoonUtils::copy("tmp/baserom/Audiotable", "Extract/Audiotable");
+ //MoonUtils::copy("tmp/baserom/version", "Extract/version");
+ MoonUtils::write("Extract/version", (char*)&version.crc, sizeof(version.crc));
+
+ MoonUtils::copy("assets/game/", "Extract/assets/");
+
+ startWorker(version);
extracting = true;
}
}
@@ -95,69 +115,103 @@ void OTRGame::update(){
}
void OTRGame::draw() {
+ Vector2 windowSize(GetScreenWidth(), GetScreenHeight());
+ Rectangle titlebar = Rectangle(0, 0, windowSize.x - 50, 35);
+ Vector2 mousePos = GetMousePosition();
+ Vector2 mouseDelta = GetMouseDelta();
+
+ if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) && !isDragging &&
+ mousePos.x >= titlebar.x && mousePos.y >= titlebar.y && mousePos.x <= titlebar.x + titlebar.width && mousePos.y <= titlebar.y + titlebar.height) {
+ isDragging = true;
+ dragOffset = mousePos;
+ }
+ else if (IsMouseButtonReleased(MOUSE_BUTTON_LEFT) && isDragging) {
+ isDragging = false;
+ dragOffset = Vector2(0, 0);
+ }
+
+ if (isDragging && (mouseDelta.x != 0.0f || mouseDelta.y != 0.0f)) {
+ Vector2 wndPos = GetWindowPosition();
+ wndPos = Vector2(wndPos.x + (mousePos.x - dragOffset.x), wndPos.y + (mousePos.y - dragOffset.y));
+
+ // Calculate virtual screen total size in case there are multiple monitors
+
+ int vsX1 = 0, vsY1 = 0, vsX2 = 0, vsY2 = 0;
+ int monitorCount = GetMonitorCount();
+
+ for (int m = 0; m < monitorCount; m++) {
+ Vector2 monitorPos = GetMonitorPosition(m);
+ Vector2 monitorSize = Vector2(GetMonitorWidth(m), GetMonitorHeight(m));
+
+ if (monitorPos.x < vsX1) vsX1 = monitorPos.x;
+ if (monitorPos.y < vsY1) vsY1 = monitorPos.y;
+ if (monitorPos.x + monitorSize.x > vsX2) vsX2 = monitorPos.x + monitorSize.x;
+ if (monitorPos.y + monitorSize.y > vsY2) vsY2 = monitorPos.y + monitorSize.y;
+ }
+
+ // Clamp the window to the borders of the monitors
+ if (wndPos.x < vsX1) wndPos.x = vsX1;
+ if (wndPos.x < vsX1) wndPos.x = vsX1;
+ if (wndPos.y < vsY1) wndPos.y = vsY1;
+ if (wndPos.x + windowSize.x > vsX2) wndPos.x = vsX2 - windowSize.x;
+ if (wndPos.y + windowSize.y > vsY2) wndPos.y = vsY2 - windowSize.y;
+
+ SetWindowPosition(wndPos.x, wndPos.y);
+ }
+
BeginDrawing();
- ClearBackground(Color(40, 40, 40, 255));
- Vector3 windowSize(GetScreenWidth(), GetScreenHeight());
- Rectangle titlebar = Rectangle(0, 0, windowSize.x - 50, 35);
- Vector2 mousePos = Vector2(GetMouseX(), GetMouseY());
- bool hoveredTitlebar = mousePos.x >= titlebar.x && mousePos.y >= titlebar.y && mousePos.x <= titlebar.x + titlebar.width && mousePos.y <= titlebar.y + titlebar.height;
+ ClearBackground(Color(40, 40, 40, 255));
- if (hoveredTitlebar && IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
- if (dragOffset.x == 0 && dragOffset.y == 0) dragOffset = mousePos;
- Vector2 wndPos = GetWindowPosition();
+ DrawTexture(Textures["Frame"], 0, 0, WHITE);
- SetWindowPosition(wndPos.x + (mousePos.x - dragOffset.x), wndPos.y + (mousePos.y - dragOffset.y));
- }
- else dragOffset = Vector2(0, 0);
+ Texture2D titleTex = Textures["Title"];
+ DrawTexture(titleTex, windowSize.x / 2 - titleTex.width / 2, titlebar.height / 2 - titleTex.height / 2, WHITE);
- DrawTexture(Textures["Frame"], 0, 0, WHITE);
+ if (UIUtils::GuiIcon("Exit", windowSize.x - 36, titlebar.height / 2 - 10) && (extracting && currentStep.find("Done") != std::string::npos || !extracting)) {
+ closeRequested = true;
+ }
- Texture2D titleTex = Textures["Title"];
- DrawTexture(titleTex, windowSize.x / 2 - titleTex.width / 2, titlebar.height / 2 - titleTex.height / 2, WHITE);
+ BeginMode3D(camera);
+ DrawModelEx(Models["Ship"], Vector3Zero(), Vector3(.0f, 1.0f, .0f), this->ModelRotation, SCALE(1.0f), WHITE);
+ EndMode3D();
- if (UIUtils::GuiIcon("Exit", windowSize.x - 36, titlebar.height / 2 - 10) && (extracting && currentStep.find("Done") != std::string::npos || !extracting)) {
- CloseWindow();
- }
+ constexpr float text_y = 125.f;
+ UIUtils::GuiShadowText(("Rom Type: " + version.version).c_str(), 32, text_y, 10, WHITE, BLACK);
+ UIUtils::GuiShadowText("Tool Version: 1.0", 32, text_y + 15, 10, WHITE, BLACK);
+ UIUtils::GuiShadowText("OTR Version: 1.0", 32, text_y + 30, 10, WHITE, BLACK);
- BeginMode3D(camera);
- DrawModelEx(Models["Ship"] ,Vector3Zero(), Vector3(.0f, 1.0f, .0f), this->ModelRotation, SCALE(1.0f), WHITE);
- EndMode3D();
-
- constexpr float text_y = 125.f;
- UIUtils::GuiShadowText(("Rom Type: " + version.version).c_str(), 32, text_y, 10, WHITE, BLACK);
- UIUtils::GuiShadowText("Tool Version: 1.0", 32, text_y + 15, 10, WHITE, BLACK);
- UIUtils::GuiShadowText("OTR Version: 1.0", 32, text_y + 30, 10, WHITE, BLACK);
+ if (oldExtractMode)
UIUtils::GuiToggle(&single_thread, "Single Thread", 32, text_y + 40, currentStep != NULLSTR);
-
- if(!hide_second_btn && UIUtils::GuiIconButton("Folder", "Open\nShip Folder", 109, 50, currentStep != NULLSTR, "Select your Ship of Harkinian Folder\n\nYou could use another folder\nfor development purposes")) {
- const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FOLDER);
- sohFolder = path;
- }
- if (UIUtils::GuiIconButton("Cartridge", "Open\nOoT Rom", 32, 50, currentStep != NULLSTR, "Select an Ocarina of Time\nMaster Quest or Vanilla Debug Rom\n\nYou can dump it or lend one from Nintendo")) {
- const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FILE);
- if (path != NULLSTR) {
- const std::string patched_n64 = std::string(patched_rom);
- MoonUtils::rm(patched_n64);
- version = GetVersion(fopen(path.c_str(), "r"));
- if (version.version != NULLSTR) {
- MoonUtils::copy(path, patched_n64);
- rom_ready = true;
- return;
- }
- fix_baserom(path.c_str(), patched_rom);
- version = GetVersion(fopen(patched_rom, "r"));
- if (version.version != NULLSTR) rom_ready = true;
+ if (!hide_second_btn && UIUtils::GuiIconButton("Folder", "Open\nShip Folder", 109, 50, currentStep != NULLSTR, "Select your Ship of Harkinian Folder\n\nYou could use another folder\nfor development purposes")) {
+ const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FOLDER);
+ sohFolder = path;
+ }
+
+ if (UIUtils::GuiIconButton("Cartridge", "Open\nOoT Rom", 32, 50, currentStep != NULLSTR, "Select an Ocarina of Time\nMaster Quest or Vanilla Debug Rom\n\nYou can dump it or lend one from Nintendo")) {
+ const std::string path = NativeFS->LaunchFileExplorer(LaunchType::FILE);
+ if (path != NULLSTR) {
+ const std::string patched_n64 = std::string(patched_rom);
+ MoonUtils::rm(patched_n64);
+ version = GetVersion(fopen(path.c_str(), "r"));
+ if (version.version != NULLSTR) {
+ MoonUtils::copy(path, patched_n64);
+ rom_ready = true;
+ return;
}
+ fix_baserom(path.c_str(), patched_rom);
+ version = GetVersion(fopen(patched_rom, "r"));
+ if (version.version != NULLSTR) rom_ready = true;
}
+ }
- if(currentStep != NULLSTR) {
- DrawRectangle(0, 0, windowSize.x, windowSize.y, Color(0, 0, 0, 160));
- DrawTexture(Textures["Modal"], windowSize.x / 2 - Textures["Modal"].width / 2, windowSize.y / 2 - Textures["Modal"].height / 2, WHITE);
- UIUtils::GuiShadowText(currentStep.c_str(), 0, windowSize.y / 2, 10, WHITE, BLACK, windowSize.x, true);
- }
+ if (currentStep != NULLSTR) {
+ DrawRectangle(0, 0, windowSize.x, windowSize.y, Color(0, 0, 0, 160));
+ DrawTexture(Textures["Modal"], windowSize.x / 2 - Textures["Modal"].width / 2, windowSize.y / 2 - Textures["Modal"].height / 2, WHITE);
+ UIUtils::GuiShadowText(currentStep.c_str(), 0, windowSize.y / 2, 10, WHITE, BLACK, windowSize.x, true);
+ }
- EndDrawing();
+ EndDrawing();
}
void setCurrentStep(const std::string& step) {
diff --git a/OTRGui/src/game/game.h b/OTRGui/src/game/game.h
index b284f857a..bd74b1c3f 100644
--- a/OTRGui/src/game/game.h
+++ b/OTRGui/src/game/game.h
@@ -19,6 +19,8 @@ public:
void update();
void draw();
void exit();
+
+ inline bool CloseRequested() { return closeRequested; }
protected:
void LoadTexture(const std::string& name, const std::string& path) {
const Image tmp = LoadImage(path.c_str());
@@ -32,6 +34,9 @@ protected:
SetTextureFilter(font.texture, TEXTURE_FILTER_POINT);
Fonts[name] = font;
}
+
+private:
+ bool closeRequested = false;
};
extern OTRGame* Game;
diff --git a/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp b/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp
index 86be26f6c..bd2fc42ea 100644
--- a/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp
+++ b/OTRGui/src/impl/baserom_extractor/baserom_extractor.cpp
@@ -83,37 +83,37 @@ RomVersion GetVersion(FILE* rom) {
break;
case OOT_NTSC_JP_GC:
version.version = "JP GameCube (MQ Disk)";
- version.listPath = "gamecube_mq.txt";
+ version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_GC;
break;
case OOT_NTSC_JP_GC_CE:
version.version = "GameCube (Collectors Edition Disk)";
- version.listPath = "gamecube_mq.txt";
+ version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_GC_CE;
break;
case OOT_NTSC_JP_MQ:
version.version = "JP Master Quest";
- version.listPath = "gamecube_mq.txt";
+ version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_MQ;
break;
case OOT_NTSC_US_MQ:
version.version = "NTSC Master Quest";
- version.listPath = "gamecube_mq.txt";
+ version.listPath = "gamecube.txt";
version.offset = OOT_OFF_JP_MQ;
break;
case OOT_NTSC_US_GC:
version.version = "NTSC GameCube";
- version.listPath = "gamecube_mq.txt";
+ version.listPath = "gamecube.txt";
version.offset = OOT_OFF_US_MQ;
break;
case OOT_PAL_GC:
version.version = "PAL GameCube";
- version.listPath = "gamecube_mq.txt";
+ version.listPath = "gamecube_pal.txt";
version.offset = OOT_OFF_PAL_GC;
break;
case OOT_PAL_MQ:
version.version = "PAL Master Quest";
- version.listPath = "pal_mq.txt";
+ version.listPath = "gamecube_pal.txt";
version.offset = OOT_OFF_PAL_MQ;
break;
case OOT_PAL_GC_DBG1:
@@ -179,6 +179,8 @@ WriteResult ExtractBaserom(const char* romPath) {
const std::vector lines = MoonUtils::split(read(MoonUtils::join("assets/extractor/filelists", version.listPath)), '\n');
+ std::vector decompressedData(1);
+
for (int i = 0; i < lines.size(); i++) {
FILE* outFile = fopen(MoonUtils::join("tmp/baserom", lines[i]).c_str(), "wb");
const int romOffset = version.offset + (DMA_ENTRY_SIZE * i);
@@ -196,10 +198,13 @@ WriteResult ExtractBaserom(const char* romPath) {
auto outData = new uint8_t[size];
memcpy(outData, romData + physStart, size);
+
if (compressed) {
- std::vector compressedData = yaz0_encode(outData, size);
- outData = compressedData.data();
- size = compressedData.size();
+ int decSize = virtEnd - virtStart;
+ decompressedData = std::vector(decSize);
+ yaz0_decode(outData, decompressedData.data(), decSize);
+ outData = decompressedData.data();
+ size = decSize;
}
fwrite(outData, sizeof(char), size, outFile);
diff --git a/OTRGui/src/impl/baserom_extractor/baserom_extractor.h b/OTRGui/src/impl/baserom_extractor/baserom_extractor.h
index 8548f4eca..9538c87f6 100644
--- a/OTRGui/src/impl/baserom_extractor/baserom_extractor.h
+++ b/OTRGui/src/impl/baserom_extractor/baserom_extractor.h
@@ -1,23 +1,7 @@
#ifndef EXTRACT_BASEROM_H_
#define EXTRACT_BASEROM_H_
-#define OOT_NTSC_10 0xEC7011B7
-#define OOT_NTSC_11 0xD43DA81F
-#define OOT_NTSC_12 0x693BA2AE
-#define OOT_PAL_10 0xB044B569
-#define OOT_PAL_11 0xB2055FBD
-#define OOT_NTSC_JP_GC_CE 0xF7F52DB8
-#define OOT_NTSC_JP_GC 0xF611F4BA
-#define OOT_NTSC_US_GC 0xF3DD35BA
-#define OOT_PAL_GC 0x09465AC3
-#define OOT_NTSC_JP_MQ 0xF43B45BA
-#define OOT_NTSC_US_MQ 0xF034001A
-#define OOT_PAL_MQ 0x1D4136F3
-#define OOT_PAL_GC_DBG1 0x871E1C92 // 03-21-2002 build
-#define OOT_PAL_GC_DBG2 0x87121EFE // 03-13-2002 build
-#define OOT_PAL_GC_MQ_DBG 0x917D18F6
-#define OOT_IQUE_TW 0x3D81FB3E
-#define OOT_IQUE_CN 0xB1E1E07B
+#include "../../libultraship/libultraship/GameVersions.h"
#include
#include
diff --git a/OTRGui/src/impl/extractor/extractor.cpp b/OTRGui/src/impl/extractor/extractor.cpp
index ec435a9e4..a2eab1bb6 100644
--- a/OTRGui/src/impl/extractor/extractor.cpp
+++ b/OTRGui/src/impl/extractor/extractor.cpp
@@ -5,6 +5,7 @@
#include "utils/mutils.h"
#include "ctpl/ctpl_stl.h"
#include
+#include
#ifdef _WIN32
#define PLATFORM Platforms::WINDOWS
@@ -13,6 +14,7 @@
#endif
namespace Util = MoonUtils;
+bool oldExtractMode = false;
static int maxResources = 0;
static int extractedResources = 0;
bool buildingOtr = false;
@@ -22,19 +24,29 @@ bool isWindows() {
return (PLATFORM == Platforms::WINDOWS);
}
-void BuildOTR(const std::string output) {
- Util::copy("tmp/baserom/Audiobank", "Extract/Audiobank");
- Util::copy("tmp/baserom/Audioseq", "Extract/Audioseq");
- Util::copy("tmp/baserom/Audiotable", "Extract/Audiotable");
-
- Util::copy("assets/game/", "Extract/assets/");
-
- std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out") + " botr -se OTR";
- ProcessResult result = NativeFS->LaunchProcess(execStr);
- if(result.exitCode != 0) {
- std::cout << "\nError when building the OTR file with error code: " << result.exitCode << " !" << std::endl;
- std::cout << "Aborting...\n" << std::endl;
+std::string GetXMLVersion(RomVersion version)
+{
+ switch (version.crc)
+ {
+ case OOT_PAL_GC_DBG1: return "GC_NMQ_D";
+ case OOT_PAL_GC_DBG2: return "GC_MQ_D";
+ case OOT_PAL_GC: return "GC_NMQ_PAL_F";
}
+
+ return "ERROR";
+}
+
+void BuildOTR(const std::string output) {
+ if (oldExtractMode)
+ {
+ std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out") + " botr -se OTR";
+ ProcessResult result = NativeFS->LaunchProcess(execStr);
+ if (result.exitCode != 0) {
+ std::cout << "\nError when building the OTR file with error code: " << result.exitCode << " !" << std::endl;
+ std::cout << "Aborting...\n" << std::endl;
+ }
+ }
+
setCurrentStep("Done!");
if (output == ".") return;
@@ -44,9 +56,9 @@ void BuildOTR(const std::string output) {
MoonUtils::copy("oot.otr", outputPath);
}
-void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPath) {
+void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPath, RomVersion version) {
std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out");
- std::string args = Util::format(" e -eh -i %s -b tmp/baserom/ -o %s -osf %s -gsf 1 -rconf assets/extractor/Config.xml -se OTR %s", xmlPath.c_str(), outPath.c_str(), outSrcPath.c_str(), xmlPath.find("overlays") != std::string::npos ? "--static" : "");
+ std::string args = Util::format(" e -eh -i %s -b tmp/baserom/ -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", xmlPath.c_str(), outPath.c_str(), outSrcPath.c_str(), GetXMLVersion(version).c_str(), xmlPath.find("overlays") != std::string::npos ? "--static" : "");
ProcessResult result = NativeFS->LaunchProcess(execStr + args);
if (result.exitCode != 0) {
@@ -55,49 +67,77 @@ void ExtractFile(std::string xmlPath, std::string outPath, std::string outSrcPat
}
}
-void ExtractFunc(std::string fullPath) {
+void ExtractFunc(std::string fullPath, RomVersion version) {
std::vector path = Util::split(fullPath, Util::pathSeparator());
std::string outPath = Util::join(Util::join("assets/extractor/xmls/output", path[4]), Util::basename(fullPath));
Util::mkdir(outPath);
- ExtractFile(fullPath, outPath, outPath);
+ ExtractFile(fullPath, outPath, outPath, version);
setCurrentStep("Extracting: " + Util::basename(fullPath));
extractedResources++;
}
-void startWorker() {
- std::string path = "assets/extractor/xmls";
- std::vector files;
- Util::dirscan(path, files);
- std::vector xmlFiles;
+void startWorker(RomVersion version) {
+ std::string path = "assets/extractor/xmls/";
- const int num_threads = std::thread::hardware_concurrency();
- ctpl::thread_pool pool(num_threads / 2);
- for(auto &file : files) {
- if (file.find(".xml") != std::string::npos) xmlFiles.push_back(file);
- }
+ path += GetXMLVersion(version);
- for (auto& file : xmlFiles) {
- if(single_thread) {
- ExtractFunc(file);
- } else {
- pool.push([file](int) {
- ExtractFunc(file);
- });
+ Util::write("tmp/baserom/version", (char*)&version.crc, sizeof(version.crc));
+
+ if (oldExtractMode)
+ {
+ std::vector files;
+ Util::dirscan(path, files);
+ std::vector xmlFiles;
+
+ const int num_threads = std::thread::hardware_concurrency();
+ ctpl::thread_pool pool(num_threads / 2);
+ for (auto& file : files) {
+ if (file.find(".xml") != std::string::npos) xmlFiles.push_back(file);
}
- }
- maxResources = xmlFiles.size();
+ for (auto& file : xmlFiles) {
+ if (single_thread) {
+ ExtractFunc(file, version);
+ }
+ else {
+ pool.push([file, version](int) {
+ ExtractFunc(file, version);
+ });
+ }
+ }
+
+ maxResources = xmlFiles.size();
+ }
+ else
+ {
+ std::string execStr = Util::format("assets/extractor/%s", isWindows() ? "ZAPD.exe" : "ZAPD.out");
+ std::string args = Util::format(" ed -eh -i %s -b tmp/rom.z64 -fl assets/extractor/filelists -o %s -osf %s -gsf 1 -rconf assets/extractor/Config_%s.xml -se OTR %s", path.c_str(), path + "../", path + "../", GetXMLVersion(version).c_str(), "");
+ ProcessResult result = NativeFS->LaunchProcess(execStr + args);
+
+ if (result.exitCode != 0) {
+ std::cout << "\nError when extracting the ROM with error code: " << result.exitCode << " !" << std::endl;
+ std::cout << "Aborting...\n" << std::endl;
+ }
+ else
+ {
+ printf("All done?\n");
+ }
+
+ maxResources = 1;
+ }
}
void updateWorker(const std::string& output) {
- if (maxResources > 0 && !buildingOtr && extractedResources >= maxResources) {
+ if (maxResources > 0 && !buildingOtr && (extractedResources >= maxResources || !oldExtractMode))
+ {
setCurrentStep("Building OTR...");
if (skipFrames < 3) {
skipFrames++;
return;
}
buildingOtr = true;
- if (single_thread){
+
+ if (single_thread || !oldExtractMode){
BuildOTR(output);
return;
}
diff --git a/OTRGui/src/impl/extractor/extractor.h b/OTRGui/src/impl/extractor/extractor.h
index 98dea147a..de48d7574 100644
--- a/OTRGui/src/impl/extractor/extractor.h
+++ b/OTRGui/src/impl/extractor/extractor.h
@@ -5,5 +5,7 @@ enum Platforms {
WINDOWS, LINUX
};
-void startWorker();
+struct RomVersion;
+
+void startWorker(RomVersion version);
void updateWorker(const std::string& output);
\ No newline at end of file
diff --git a/OTRGui/src/main.cpp b/OTRGui/src/main.cpp
index 87c9d26ee..2b3e40a7c 100644
--- a/OTRGui/src/main.cpp
+++ b/OTRGui/src/main.cpp
@@ -17,8 +17,8 @@ void UpdateDrawFrame(void) {
}
int main() {
- constexpr Vector2 windowSize = Vector2(400, 200);
- SetTargetFPS(144);
+ constexpr Vector2 windowSize = Vector2(400, 200);
+ SetConfigFlags(FLAG_VSYNC_HINT);
SetConfigFlags(FLAG_WINDOW_HIGHDPI);
SetConfigFlags(FLAG_WINDOW_UNDECORATED);
SetConfigFlags(FLAG_MSAA_4X_HINT);
@@ -32,7 +32,7 @@ int main() {
Game = new OTRGame();
Game->preload();
Game->init();
- while(!WindowShouldClose()) {
+ while(!WindowShouldClose() && !Game->CloseRequested()) {
UpdateDrawFrame();
}
CloseWindow();
diff --git a/OTRGui/src/utils/mutils.cpp b/OTRGui/src/utils/mutils.cpp
index 770df8423..2a649452e 100644
--- a/OTRGui/src/utils/mutils.cpp
+++ b/OTRGui/src/utils/mutils.cpp
@@ -72,7 +72,11 @@ namespace MoonUtils {
vector result;
stringstream ss (s);
string item;
- while (getline(ss, item, delim)) {
+ while (getline(ss, item, delim))
+ {
+ if (item.at(item.size() - 1) == '\r')
+ item = item.substr(0, item.size() - 1);
+
result.push_back (item);
}
return result;
diff --git a/README.md b/README.md
index cccc27c7c..7b4425048 100644
--- a/README.md
+++ b/README.md
@@ -7,9 +7,10 @@ The Ship does not include assets and as such requires a prior copy of the game t
## Quick Start
1) Download The Ship of Harkinian from Discord.
-2) Get a ZRET OoT Debug ROM
+2) Requires an `oot debug` rom (not Master Quest).
```
-Build date: `zelda@srd022j 03-02-21 00:49:18`
+Build team: `zelda@srd022j`
+Build date: `03-02-21 00:49:18` (year-month-day)
sha1: cee6bc3c2a634b41728f2af8da54d9bf8cc14099
```
3) Use the OTRGui to generate an `oot.otr` archive file.
@@ -50,54 +51,7 @@ Official Discord: https://discord.com/invite/BtBmd55HVH
## Building The Ship of Harkinian
-### Windows
-
- 1. Install [Python](https://www.python.org/ftp/python/3.10.2/python-3.10.2-amd64.exe)
- 2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/)
- 2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`.
- 4. Clone the Ship of Harkinian repository.
- 5. Put your 2020 OoT debug rom in the `soh` folder.
- 6. Launch `soh/fixbaserom.py`.
- 7. Launch `soh/extract_baserom.py`.
- 8. Copy the `baserom` folder from the `soh` folder into the `OTRExporter` folder.
- 9. Run `OTRExporter/OTRExporter.sln`.
- 10. Switch the solution to `Release x64`.
- 11. Build the solution.
- 12. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`.
- 13. Run `soh/soh.sln`
- 14. Switch the solution to `Release x86`.
- 15. Build the solution.
- 16. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`.
- 17. Launch `soh.exe`.
-
-### Linux
-
-```bash
-# Clone the repo
-git clone git@github.com:HarbourMasters/ShipWright.git
-cd ShipWright
-# Copy the baserom to the soh folder
-cp .../baserom_non_mq.z64 soh
-# Build the docker image
-sudo docker build . -t soh
-# Run the docker image with the working directory mounted to /soh
-sudo docker run --rm -it -v $(pwd):/soh soh /bin/bash
-```
-Inside the Docker container:
-```bash
-# Clone and build StormLib
-git clone https://github.com/ladislav-zezula/StormLib external/StormLib
-cmake -B external/StormLib/build -S external/StormLib
-cmake --build external/StormLib/build
-cp external/StormLib/build/libstorm.a external
-cp /usr/local/lib/libGLEW.a external
-
-cd soh
-# Extract the assets/Compile the exporter/Run the exporter
-make setup -j$(nproc)
-# Compile the code
-make -j $(nproc)
-```
+Refer to the [building instructions](https://github.com/HarbourMasters/Shipwright/blob/develop/BUILDING.md) to compile SoH.
## Troubleshooting The Exporter
- Affirm that you have an `/assets` folder filled with XMLs in the same directory as OTRGui.exe
@@ -125,6 +79,7 @@ make -j $(nproc)
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
diff --git a/ZAPDTR/ZAPD/CRC32.h b/ZAPDTR/ZAPD/CRC32.h
index 4158a5528..1f82c75c5 100644
--- a/ZAPDTR/ZAPD/CRC32.h
+++ b/ZAPDTR/ZAPD/CRC32.h
@@ -1,6 +1,6 @@
#pragma once
-static uint32_t CRC32B(unsigned char* message, int32_t size)
+static uint32_t CRC32B(const unsigned char* message, int32_t size)
{
int32_t byte, crc;
int32_t mask;
diff --git a/ZAPDTR/ZAPD/Declaration.cpp b/ZAPDTR/ZAPD/Declaration.cpp
index eeb988db7..27494b866 100644
--- a/ZAPDTR/ZAPD/Declaration.cpp
+++ b/ZAPDTR/ZAPD/Declaration.cpp
@@ -1,6 +1,7 @@
#include "Declaration.h"
#include "Globals.h"
+#include "ZVtx.h"
#include "Utils/StringHelper.h"
Declaration::Declaration(offset_t nAddress, DeclarationAlignment nAlignment, size_t nSize,
@@ -61,6 +62,12 @@ Declaration::Declaration(offset_t nAddress, const std::string& nIncludePath, siz
varName = nVarName;
}
+Declaration::~Declaration()
+{
+ //for (auto item : vertexHack)
+ //delete item;
+}
+
bool Declaration::IsStatic() const
{
switch (staticConf)
diff --git a/ZAPDTR/ZAPD/Declaration.h b/ZAPDTR/ZAPD/Declaration.h
index 4a743b50f..45d36f49e 100644
--- a/ZAPDTR/ZAPD/Declaration.h
+++ b/ZAPDTR/ZAPD/Declaration.h
@@ -22,6 +22,8 @@ enum class StaticConfig
On
};
+class ZVtx;
+
class Declaration
{
public:
@@ -38,6 +40,8 @@ public:
std::string varName;
std::string includePath;
+ std::vector vertexHack;
+
bool isExternal = false;
bool isArray = false;
bool forceArrayCnt = false;
@@ -65,6 +69,8 @@ public:
Declaration(offset_t nAddress, const std::string& nIncludePath, size_t nSize,
const std::string& nVarType, const std::string& nVarName);
+ ~Declaration();
+
bool IsStatic() const;
std::string GetNormalDeclarationStr() const;
diff --git a/ZAPDTR/ZAPD/FileWorker.cpp b/ZAPDTR/ZAPD/FileWorker.cpp
new file mode 100644
index 000000000..e69de29bb
diff --git a/ZAPDTR/ZAPD/FileWorker.h b/ZAPDTR/ZAPD/FileWorker.h
new file mode 100644
index 000000000..6ceae8076
--- /dev/null
+++ b/ZAPDTR/ZAPD/FileWorker.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include
true
$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\libjpeg\include;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath)
$(ProjectDir)Lib\SDL\lib\x86;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
false
$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath)
$(ProjectDir)Lib\SDL\lib\x86;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
true
$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath)
$(ProjectDir)Lib\SDL\lib\x64;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
true
$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath)
$(ProjectDir)Lib\SDL\lib\x64;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
false
$(ProjectDir)..\..\ZAPDTR\ZAPDUtils;$(ProjectDir)Lib\Fast3D\U64;$(ProjectDir)Lib\spdlog\include;$(ProjectDir)Lib\SDL;$(ProjectDir)Lib\GLEW;$(IncludePath)
$(ProjectDir)Lib\SDL\lib\x64;$(LibraryPath)
+ MinimumRecommendedRules.ruleset
+
+
@@ -326,6 +344,7 @@
+
@@ -416,6 +435,12 @@
+
+
+ {02d10590-9542-3f55-aaf8-6055677e2a2a}
+ false
+
+
diff --git a/libultraship/libultraship/libultraship.vcxproj.filters b/libultraship/libultraship/libultraship.vcxproj.filters
index deed867c8..5079d826e 100644
--- a/libultraship/libultraship/libultraship.vcxproj.filters
+++ b/libultraship/libultraship/libultraship.vcxproj.filters
@@ -626,5 +626,8 @@
Source Files\CustomImpl
+
+ Source Files\Resources
+
\ No newline at end of file
diff --git a/soh/Makefile b/soh/Makefile
index de3927d94..ee553c879 100644
--- a/soh/Makefile
+++ b/soh/Makefile
@@ -8,6 +8,13 @@ ZAPD := ../ZAPDTR/ZAPD.out
LIBULTRASHIP := ../libultraship/libultraship.a
ZAPDUTILS := ../ZAPDTR/ZAPDUtils/ZAPDUtils.a
+ROM_DEBUG ?= 0
+
+EXTRACT_BASEROM := ../OTRExporter/extract_baserom_gc.py
+ifneq ($(ROM_DEBUG), 0)
+EXTRACT_BASEROM := ../OTRExporter/extract_baserom_debug.py
+endif
+
ASAN ?= 0
DEBUG ?= 1
OPTFLAGS ?= -O0
@@ -91,7 +98,10 @@ CXX_FILES := \
soh/OTRGlobals.cpp \
soh/z_message_OTR.cpp \
soh/z_play_otr.cpp \
- soh/z_scene_otr.cpp
+ soh/z_scene_otr.cpp \
+ soh/Enhancements/debugger/debugger.cpp \
+ soh/Enhancements/debugger/debugSaveEditor.cpp \
+ soh/util.cpp
C_FILES := \
soh/Enhancements/bootcommands.c \
@@ -800,7 +810,7 @@ all:
$(MAKE) $(TARGET)
setup:
- python3 extract_baserom.py
+ python3 $(EXTRACT_BASEROM)
$(MAKE) mpq
mpq:
diff --git a/soh/assets/xml/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_D/code/fbdemo_circle.xml
similarity index 100%
rename from soh/assets/xml/code/fbdemo_circle.xml
rename to soh/assets/xml/GC_NMQ_D/code/fbdemo_circle.xml
diff --git a/soh/assets/xml/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_D/code/fbdemo_triforce.xml
similarity index 100%
rename from soh/assets/xml/code/fbdemo_triforce.xml
rename to soh/assets/xml/GC_NMQ_D/code/fbdemo_triforce.xml
diff --git a/soh/assets/xml/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_D/code/fbdemo_wipe1.xml
similarity index 100%
rename from soh/assets/xml/code/fbdemo_wipe1.xml
rename to soh/assets/xml/GC_NMQ_D/code/fbdemo_wipe1.xml
diff --git a/soh/assets/xml/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_D/misc/link_animetion.xml
similarity index 100%
rename from soh/assets/xml/misc/link_animetion.xml
rename to soh/assets/xml/GC_NMQ_D/misc/link_animetion.xml
diff --git a/soh/assets/xml/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_dangeon_keep.xml
similarity index 100%
rename from soh/assets/xml/objects/gameplay_dangeon_keep.xml
rename to soh/assets/xml/GC_NMQ_D/objects/gameplay_dangeon_keep.xml
diff --git a/soh/assets/xml/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_field_keep.xml
similarity index 100%
rename from soh/assets/xml/objects/gameplay_field_keep.xml
rename to soh/assets/xml/GC_NMQ_D/objects/gameplay_field_keep.xml
diff --git a/soh/assets/xml/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml
similarity index 100%
rename from soh/assets/xml/objects/gameplay_keep.xml
rename to soh/assets/xml/GC_NMQ_D/objects/gameplay_keep.xml
diff --git a/soh/assets/xml/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_Bb.xml
similarity index 100%
rename from soh/assets/xml/objects/object_Bb.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_Bb.xml
diff --git a/soh/assets/xml/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ahg.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ahg.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ahg.xml
diff --git a/soh/assets/xml/objects/object_am.xml b/soh/assets/xml/GC_NMQ_D/objects/object_am.xml
similarity index 100%
rename from soh/assets/xml/objects/object_am.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_am.xml
diff --git a/soh/assets/xml/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ane.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ane.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ane.xml
diff --git a/soh/assets/xml/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ani.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ani.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ani.xml
diff --git a/soh/assets/xml/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_D/objects/object_anubice.xml
similarity index 100%
rename from soh/assets/xml/objects/object_anubice.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_anubice.xml
diff --git a/soh/assets/xml/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_aob.xml
similarity index 100%
rename from soh/assets/xml/objects/object_aob.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_aob.xml
diff --git a/soh/assets/xml/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_D/objects/object_b_heart.xml
similarity index 100%
rename from soh/assets/xml/objects/object_b_heart.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_b_heart.xml
diff --git a/soh/assets/xml/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bba.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bba.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bba.xml
diff --git a/soh/assets/xml/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bdan_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bdan_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bdan_objects.xml
diff --git a/soh/assets/xml/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bdoor.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bdoor.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bdoor.xml
diff --git a/soh/assets/xml/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bg.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bg.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bg.xml
diff --git a/soh/assets/xml/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bigokuta.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bigokuta.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bigokuta.xml
diff --git a/soh/assets/xml/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bird.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bird.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bird.xml
diff --git a/soh/assets/xml/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bji.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bji.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bji.xml
diff --git a/soh/assets/xml/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bl.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bl.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bl.xml
diff --git a/soh/assets/xml/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_blkobj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_blkobj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_blkobj.xml
diff --git a/soh/assets/xml/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bob.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bob.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bob.xml
diff --git a/soh/assets/xml/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_boj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_boj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_boj.xml
diff --git a/soh/assets/xml/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bombf.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bombf.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bombf.xml
diff --git a/soh/assets/xml/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bombiwa.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bombiwa.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bombiwa.xml
diff --git a/soh/assets/xml/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bowl.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bowl.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bowl.xml
diff --git a/soh/assets/xml/objects/object_box.xml b/soh/assets/xml/GC_NMQ_D/objects/object_box.xml
similarity index 100%
rename from soh/assets/xml/objects/object_box.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_box.xml
diff --git a/soh/assets/xml/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_brob.xml
similarity index 100%
rename from soh/assets/xml/objects/object_brob.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_brob.xml
diff --git a/soh/assets/xml/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bubble.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bubble.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bubble.xml
diff --git a/soh/assets/xml/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bv.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bv.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bv.xml
diff --git a/soh/assets/xml/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bw.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bw.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bw.xml
diff --git a/soh/assets/xml/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bwall.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bwall.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bwall.xml
diff --git a/soh/assets/xml/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_bxa.xml
similarity index 100%
rename from soh/assets/xml/objects/object_bxa.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_bxa.xml
diff --git a/soh/assets/xml/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cne.xml
similarity index 100%
rename from soh/assets/xml/objects/object_cne.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_cne.xml
diff --git a/soh/assets/xml/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cob.xml
similarity index 100%
rename from soh/assets/xml/objects/object_cob.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_cob.xml
diff --git a/soh/assets/xml/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cow.xml
similarity index 100%
rename from soh/assets/xml/objects/object_cow.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_cow.xml
diff --git a/soh/assets/xml/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_crow.xml
similarity index 100%
rename from soh/assets/xml/objects/object_crow.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_crow.xml
diff --git a/soh/assets/xml/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_cs.xml
similarity index 100%
rename from soh/assets/xml/objects/object_cs.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_cs.xml
diff --git a/soh/assets/xml/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_D/objects/object_d_elevator.xml
similarity index 100%
rename from soh/assets/xml/objects/object_d_elevator.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_d_elevator.xml
diff --git a/soh/assets/xml/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_D/objects/object_d_hsblock.xml
similarity index 100%
rename from soh/assets/xml/objects/object_d_hsblock.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_d_hsblock.xml
diff --git a/soh/assets/xml/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_D/objects/object_d_lift.xml
similarity index 100%
rename from soh/assets/xml/objects/object_d_lift.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_d_lift.xml
diff --git a/soh/assets/xml/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_D/objects/object_daiku.xml
similarity index 100%
rename from soh/assets/xml/objects/object_daiku.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_daiku.xml
diff --git a/soh/assets/xml/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ddan_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ddan_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ddan_objects.xml
diff --git a/soh/assets/xml/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dekubaba.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dekubaba.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dekubaba.xml
diff --git a/soh/assets/xml/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dekujr.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dekujr.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dekujr.xml
diff --git a/soh/assets/xml/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dekunuts.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dekunuts.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dekunuts.xml
diff --git a/soh/assets/xml/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_D/objects/object_demo_6k.xml
similarity index 100%
rename from soh/assets/xml/objects/object_demo_6k.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_demo_6k.xml
diff --git a/soh/assets/xml/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_D/objects/object_demo_kekkai.xml
similarity index 100%
rename from soh/assets/xml/objects/object_demo_kekkai.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_demo_kekkai.xml
diff --git a/soh/assets/xml/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_D/objects/object_demo_tre_lgt.xml
similarity index 100%
rename from soh/assets/xml/objects/object_demo_tre_lgt.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_demo_tre_lgt.xml
diff --git a/soh/assets/xml/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dh.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dh.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dh.xml
diff --git a/soh/assets/xml/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dnk.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dnk.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dnk.xml
diff --git a/soh/assets/xml/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dns.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dns.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dns.xml
diff --git a/soh/assets/xml/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dodojr.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dodojr.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dodojr.xml
diff --git a/soh/assets/xml/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dodongo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dodongo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dodongo.xml
diff --git a/soh/assets/xml/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dog.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dog.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dog.xml
diff --git a/soh/assets/xml/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_door_gerudo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_door_gerudo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_door_gerudo.xml
diff --git a/soh/assets/xml/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_D/objects/object_door_killer.xml
similarity index 100%
rename from soh/assets/xml/objects/object_door_killer.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_door_killer.xml
diff --git a/soh/assets/xml/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ds.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ds.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ds.xml
diff --git a/soh/assets/xml/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ds2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ds2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ds2.xml
diff --git a/soh/assets/xml/objects/object_du.xml b/soh/assets/xml/GC_NMQ_D/objects/object_du.xml
similarity index 100%
rename from soh/assets/xml/objects/object_du.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_du.xml
diff --git a/soh/assets/xml/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_dy_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_dy_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_dy_obj.xml
diff --git a/soh/assets/xml/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ec.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ec.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ec.xml
diff --git a/soh/assets/xml/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_crystal_light.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_crystal_light.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_crystal_light.xml
diff --git a/soh/assets/xml/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_doughnut.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_doughnut.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_doughnut.xml
diff --git a/soh/assets/xml/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_erupc.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_erupc.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_erupc.xml
diff --git a/soh/assets/xml/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_fire_ball.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_fire_ball.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_fire_ball.xml
diff --git a/soh/assets/xml/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_flash.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_flash.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_flash.xml
diff --git a/soh/assets/xml/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_lgt_shower.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_lgt_shower.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_lgt_shower.xml
diff --git a/soh/assets/xml/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_star_field.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_star_field.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_star_field.xml
diff --git a/soh/assets/xml/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_efc_tw.xml
similarity index 100%
rename from soh/assets/xml/objects/object_efc_tw.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_efc_tw.xml
diff --git a/soh/assets/xml/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ei.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ei.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ei.xml
diff --git a/soh/assets/xml/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fa.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fa.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fa.xml
diff --git a/soh/assets/xml/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fd.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fd.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fd.xml
diff --git a/soh/assets/xml/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fd2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fd2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fd2.xml
diff --git a/soh/assets/xml/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fhg.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fhg.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fhg.xml
diff --git a/soh/assets/xml/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fire.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fire.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fire.xml
diff --git a/soh/assets/xml/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_D/objects/object_firefly.xml
similarity index 100%
rename from soh/assets/xml/objects/object_firefly.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_firefly.xml
diff --git a/soh/assets/xml/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fish.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fish.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fish.xml
diff --git a/soh/assets/xml/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fr.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fr.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fr.xml
diff --git a/soh/assets/xml/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fu.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fu.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fu.xml
diff --git a/soh/assets/xml/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fw.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fw.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fw.xml
diff --git a/soh/assets/xml/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_D/objects/object_fz.xml
similarity index 100%
rename from soh/assets/xml/objects/object_fz.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_fz.xml
diff --git a/soh/assets/xml/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ganon.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon.xml
diff --git a/soh/assets/xml/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ganon2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon2.xml
diff --git a/soh/assets/xml/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ganon_anime1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime1.xml
diff --git a/soh/assets/xml/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ganon_anime2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime2.xml
diff --git a/soh/assets/xml/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime3.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ganon_anime3.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_anime3.xml
diff --git a/soh/assets/xml/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ganon_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ganon_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ganon_objects.xml
diff --git a/soh/assets/xml/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ge1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ge1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ge1.xml
diff --git a/soh/assets/xml/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_D/objects/object_geff.xml
similarity index 100%
rename from soh/assets/xml/objects/object_geff.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_geff.xml
diff --git a/soh/assets/xml/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_geldb.xml
similarity index 100%
rename from soh/assets/xml/objects/object_geldb.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_geldb.xml
diff --git a/soh/assets/xml/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_arrow.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_arrow.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_arrow.xml
diff --git a/soh/assets/xml/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_arrowcase.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_arrowcase.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_arrowcase.xml
diff --git a/soh/assets/xml/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bean.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bean.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bean.xml
diff --git a/soh/assets/xml/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bomb_1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_1.xml
diff --git a/soh/assets/xml/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bomb_2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bomb_2.xml
diff --git a/soh/assets/xml/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bombpouch.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bombpouch.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bombpouch.xml
diff --git a/soh/assets/xml/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_boomerang.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_boomerang.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_boomerang.xml
diff --git a/soh/assets/xml/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_boots_2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_boots_2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_boots_2.xml
diff --git a/soh/assets/xml/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bosskey.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bosskey.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bosskey.xml
diff --git a/soh/assets/xml/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bottle.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle.xml
diff --git a/soh/assets/xml/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle_letter.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bottle_letter.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bottle_letter.xml
diff --git a/soh/assets/xml/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bow.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bow.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bow.xml
diff --git a/soh/assets/xml/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_bracelet.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_bracelet.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_bracelet.xml
diff --git a/soh/assets/xml/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_brokensword.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_brokensword.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_brokensword.xml
diff --git a/soh/assets/xml/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_butterfly.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_butterfly.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_butterfly.xml
diff --git a/soh/assets/xml/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_clothes.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_clothes.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_clothes.xml
diff --git a/soh/assets/xml/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_coin.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_coin.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_coin.xml
diff --git a/soh/assets/xml/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_compass.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_compass.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_compass.xml
diff --git a/soh/assets/xml/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_dekupouch.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_dekupouch.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_dekupouch.xml
diff --git a/soh/assets/xml/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_egg.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_egg.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_egg.xml
diff --git a/soh/assets/xml/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_eye_lotion.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_eye_lotion.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_eye_lotion.xml
diff --git a/soh/assets/xml/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_fire.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_fire.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_fire.xml
diff --git a/soh/assets/xml/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_fish.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_fish.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_fish.xml
diff --git a/soh/assets/xml/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_frog.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_frog.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_frog.xml
diff --git a/soh/assets/xml/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_gerudo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudo.xml
diff --git a/soh/assets/xml/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudomask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_gerudomask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_gerudomask.xml
diff --git a/soh/assets/xml/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ghost.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_ghost.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ghost.xml
diff --git a/soh/assets/xml/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_glasses.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_glasses.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_glasses.xml
diff --git a/soh/assets/xml/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_gloves.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_gloves.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_gloves.xml
diff --git a/soh/assets/xml/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_goddess.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_goddess.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_goddess.xml
diff --git a/soh/assets/xml/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_golonmask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_golonmask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_golonmask.xml
diff --git a/soh/assets/xml/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_grass.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_grass.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_grass.xml
diff --git a/soh/assets/xml/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hammer.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_hammer.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hammer.xml
diff --git a/soh/assets/xml/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_heart.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_heart.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_heart.xml
diff --git a/soh/assets/xml/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hearts.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_hearts.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hearts.xml
diff --git a/soh/assets/xml/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hookshot.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_hookshot.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hookshot.xml
diff --git a/soh/assets/xml/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_hoverboots.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_hoverboots.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_hoverboots.xml
diff --git a/soh/assets/xml/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_insect.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_insect.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_insect.xml
diff --git a/soh/assets/xml/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_jewel.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_jewel.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_jewel.xml
diff --git a/soh/assets/xml/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_key.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_key.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_key.xml
diff --git a/soh/assets/xml/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ki_tan_mask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_ki_tan_mask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ki_tan_mask.xml
diff --git a/soh/assets/xml/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_letter.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_letter.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_letter.xml
diff --git a/soh/assets/xml/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_liquid.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_liquid.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_liquid.xml
diff --git a/soh/assets/xml/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_longsword.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_longsword.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_longsword.xml
diff --git a/soh/assets/xml/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_m_arrow.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_m_arrow.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_m_arrow.xml
diff --git a/soh/assets/xml/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_magicpot.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_magicpot.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_magicpot.xml
diff --git a/soh/assets/xml/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_map.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_map.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_map.xml
diff --git a/soh/assets/xml/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_medal.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_medal.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_medal.xml
diff --git a/soh/assets/xml/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_melody.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_melody.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_melody.xml
diff --git a/soh/assets/xml/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_milk.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_milk.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_milk.xml
diff --git a/soh/assets/xml/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_mushroom.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_mushroom.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_mushroom.xml
diff --git a/soh/assets/xml/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_niwatori.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_niwatori.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_niwatori.xml
diff --git a/soh/assets/xml/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_nuts.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_nuts.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_nuts.xml
diff --git a/soh/assets/xml/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_ocarina.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina.xml
diff --git a/soh/assets/xml/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina_0.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_ocarina_0.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ocarina_0.xml
diff --git a/soh/assets/xml/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_pachinko.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_pachinko.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_pachinko.xml
diff --git a/soh/assets/xml/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_powder.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_powder.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_powder.xml
diff --git a/soh/assets/xml/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_prescription.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_prescription.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_prescription.xml
diff --git a/soh/assets/xml/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_purse.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_purse.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_purse.xml
diff --git a/soh/assets/xml/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_rabit_mask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_rabit_mask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_rabit_mask.xml
diff --git a/soh/assets/xml/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_redead_mask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_redead_mask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_redead_mask.xml
diff --git a/soh/assets/xml/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_rupy.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_rupy.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_rupy.xml
diff --git a/soh/assets/xml/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_saw.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_saw.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_saw.xml
diff --git a/soh/assets/xml/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_scale.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_scale.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_scale.xml
diff --git a/soh/assets/xml/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_seed.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_seed.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_seed.xml
diff --git a/soh/assets/xml/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_shield_1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_1.xml
diff --git a/soh/assets/xml/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_shield_2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_2.xml
diff --git a/soh/assets/xml/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_3.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_shield_3.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_shield_3.xml
diff --git a/soh/assets/xml/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_skj_mask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_skj_mask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_skj_mask.xml
diff --git a/soh/assets/xml/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_soldout.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_soldout.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_soldout.xml
diff --git a/soh/assets/xml/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_soul.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_soul.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_soul.xml
diff --git a/soh/assets/xml/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_stick.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_stick.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_stick.xml
diff --git a/soh/assets/xml/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_sutaru.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_sutaru.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_sutaru.xml
diff --git a/soh/assets/xml/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_sword_1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_sword_1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_sword_1.xml
diff --git a/soh/assets/xml/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_ticketstone.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_ticketstone.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_ticketstone.xml
diff --git a/soh/assets/xml/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_truth_mask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_truth_mask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_truth_mask.xml
diff --git a/soh/assets/xml/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gi_zoramask.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gi_zoramask.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gi_zoramask.xml
diff --git a/soh/assets/xml/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gj.xml
diff --git a/soh/assets/xml/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gjyo_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gjyo_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gjyo_objects.xml
diff --git a/soh/assets/xml/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gla.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gla.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gla.xml
diff --git a/soh/assets/xml/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gm.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gm.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gm.xml
diff --git a/soh/assets/xml/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gnd.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gnd.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gnd.xml
diff --git a/soh/assets/xml/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gnd_magic.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gnd_magic.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gnd_magic.xml
diff --git a/soh/assets/xml/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gndd.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gndd.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gndd.xml
diff --git a/soh/assets/xml/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_D/objects/object_god_lgt.xml
similarity index 100%
rename from soh/assets/xml/objects/object_god_lgt.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_god_lgt.xml
diff --git a/soh/assets/xml/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gol.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gol.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gol.xml
diff --git a/soh/assets/xml/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_D/objects/object_goma.xml
similarity index 100%
rename from soh/assets/xml/objects/object_goma.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_goma.xml
diff --git a/soh/assets/xml/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_goroiwa.xml
similarity index 100%
rename from soh/assets/xml/objects/object_goroiwa.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_goroiwa.xml
diff --git a/soh/assets/xml/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gr.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gr.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gr.xml
diff --git a/soh/assets/xml/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gs.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gs.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gs.xml
diff --git a/soh/assets/xml/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_D/objects/object_gt.xml
similarity index 100%
rename from soh/assets/xml/objects/object_gt.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_gt.xml
diff --git a/soh/assets/xml/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_haka.xml
similarity index 100%
rename from soh/assets/xml/objects/object_haka.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_haka.xml
diff --git a/soh/assets/xml/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_D/objects/object_haka_door.xml
similarity index 100%
rename from soh/assets/xml/objects/object_haka_door.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_haka_door.xml
diff --git a/soh/assets/xml/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_haka_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_haka_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_haka_objects.xml
diff --git a/soh/assets/xml/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hakach_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_hakach_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_hakach_objects.xml
diff --git a/soh/assets/xml/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hata.xml
similarity index 100%
rename from soh/assets/xml/objects/object_hata.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_hata.xml
diff --git a/soh/assets/xml/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_D/objects/object_heavy_object.xml
similarity index 100%
rename from soh/assets/xml/objects/object_heavy_object.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_heavy_object.xml
diff --git a/soh/assets/xml/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hidan_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_hidan_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_hidan_objects.xml
diff --git a/soh/assets/xml/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hintnuts.xml
similarity index 100%
rename from soh/assets/xml/objects/object_hintnuts.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_hintnuts.xml
diff --git a/soh/assets/xml/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hni.xml
similarity index 100%
rename from soh/assets/xml/objects/object_hni.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_hni.xml
diff --git a/soh/assets/xml/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse.xml
similarity index 100%
rename from soh/assets/xml/objects/object_horse.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_horse.xml
diff --git a/soh/assets/xml/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_ganon.xml
similarity index 100%
rename from soh/assets/xml/objects/object_horse_ganon.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_ganon.xml
diff --git a/soh/assets/xml/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_link_child.xml
similarity index 100%
rename from soh/assets/xml/objects/object_horse_link_child.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_link_child.xml
diff --git a/soh/assets/xml/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_normal.xml
similarity index 100%
rename from soh/assets/xml/objects/object_horse_normal.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_normal.xml
diff --git a/soh/assets/xml/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_D/objects/object_horse_zelda.xml
similarity index 100%
rename from soh/assets/xml/objects/object_horse_zelda.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_horse_zelda.xml
diff --git a/soh/assets/xml/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_hs.xml
similarity index 100%
rename from soh/assets/xml/objects/object_hs.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_hs.xml
diff --git a/soh/assets/xml/objects/object_human.xml b/soh/assets/xml/GC_NMQ_D/objects/object_human.xml
similarity index 100%
rename from soh/assets/xml/objects/object_human.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_human.xml
diff --git a/soh/assets/xml/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ice_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ice_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ice_objects.xml
diff --git a/soh/assets/xml/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ik.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ik.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ik.xml
diff --git a/soh/assets/xml/objects/object_im.xml b/soh/assets/xml/GC_NMQ_D/objects/object_im.xml
similarity index 100%
rename from soh/assets/xml/objects/object_im.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_im.xml
diff --git a/soh/assets/xml/objects/object_in.xml b/soh/assets/xml/GC_NMQ_D/objects/object_in.xml
similarity index 100%
rename from soh/assets/xml/objects/object_in.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_in.xml
diff --git a/soh/assets/xml/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ingate.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ingate.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ingate.xml
diff --git a/soh/assets/xml/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_jj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_jj.xml
diff --git a/soh/assets/xml/objects/object_js.xml b/soh/assets/xml/GC_NMQ_D/objects/object_js.xml
similarity index 100%
rename from soh/assets/xml/objects/object_js.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_js.xml
diff --git a/soh/assets/xml/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jya_door.xml
similarity index 100%
rename from soh/assets/xml/objects/object_jya_door.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_jya_door.xml
diff --git a/soh/assets/xml/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jya_iron.xml
similarity index 100%
rename from soh/assets/xml/objects/object_jya_iron.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_jya_iron.xml
diff --git a/soh/assets/xml/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_jya_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_jya_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_jya_obj.xml
diff --git a/soh/assets/xml/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ka.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ka.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ka.xml
diff --git a/soh/assets/xml/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kanban.xml
similarity index 100%
rename from soh/assets/xml/objects/object_kanban.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_kanban.xml
diff --git a/soh/assets/xml/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kibako2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_kibako2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_kibako2.xml
diff --git a/soh/assets/xml/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kingdodongo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_kingdodongo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_kingdodongo.xml
diff --git a/soh/assets/xml/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_km1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_km1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_km1.xml
diff --git a/soh/assets/xml/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kusa.xml
similarity index 100%
rename from soh/assets/xml/objects/object_kusa.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_kusa.xml
diff --git a/soh/assets/xml/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kw1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_kw1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_kw1.xml
diff --git a/soh/assets/xml/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_D/objects/object_kz.xml
similarity index 100%
rename from soh/assets/xml/objects/object_kz.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_kz.xml
diff --git a/soh/assets/xml/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_D/objects/object_light_ring.xml
similarity index 100%
rename from soh/assets/xml/objects/object_light_ring.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_light_ring.xml
diff --git a/soh/assets/xml/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_D/objects/object_lightbox.xml
similarity index 100%
rename from soh/assets/xml/objects/object_lightbox.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_lightbox.xml
diff --git a/soh/assets/xml/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_D/objects/object_lightswitch.xml
similarity index 100%
rename from soh/assets/xml/objects/object_lightswitch.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_lightswitch.xml
diff --git a/soh/assets/xml/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_D/objects/object_link_boy.xml
similarity index 100%
rename from soh/assets/xml/objects/object_link_boy.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_link_boy.xml
diff --git a/soh/assets/xml/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_D/objects/object_link_child.xml
similarity index 100%
rename from soh/assets/xml/objects/object_link_child.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_link_child.xml
diff --git a/soh/assets/xml/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ma1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ma1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ma1.xml
diff --git a/soh/assets/xml/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ma2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ma2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ma2.xml
diff --git a/soh/assets/xml/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mag.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mag.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mag.xml
diff --git a/soh/assets/xml/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mamenoki.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mamenoki.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mamenoki.xml
diff --git a/soh/assets/xml/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mastergolon.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mastergolon.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mastergolon.xml
diff --git a/soh/assets/xml/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_D/objects/object_masterkokiri.xml
similarity index 100%
rename from soh/assets/xml/objects/object_masterkokiri.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_masterkokiri.xml
diff --git a/soh/assets/xml/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_D/objects/object_masterkokirihead.xml
similarity index 100%
rename from soh/assets/xml/objects/object_masterkokirihead.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_masterkokirihead.xml
diff --git a/soh/assets/xml/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_D/objects/object_masterzoora.xml
similarity index 100%
rename from soh/assets/xml/objects/object_masterzoora.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_masterzoora.xml
diff --git a/soh/assets/xml/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mb.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mb.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mb.xml
diff --git a/soh/assets/xml/objects/object_md.xml b/soh/assets/xml/GC_NMQ_D/objects/object_md.xml
similarity index 100%
rename from soh/assets/xml/objects/object_md.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_md.xml
diff --git a/soh/assets/xml/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_D/objects/object_medal.xml
similarity index 100%
rename from soh/assets/xml/objects/object_medal.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_medal.xml
diff --git a/soh/assets/xml/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_menkuri_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_menkuri_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_menkuri_objects.xml
diff --git a/soh/assets/xml/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mir_ray.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mir_ray.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mir_ray.xml
diff --git a/soh/assets/xml/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mizu_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mizu_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mizu_objects.xml
diff --git a/soh/assets/xml/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin.xml
diff --git a/soh/assets/xml/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_dark.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_dark.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_dark.xml
diff --git a/soh/assets/xml/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_flame.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_flame.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_flame.xml
diff --git a/soh/assets/xml/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_flash.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_flash.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_flash.xml
diff --git a/soh/assets/xml/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_ice.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_ice.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_ice.xml
diff --git a/soh/assets/xml/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_oka.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_oka.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_oka.xml
diff --git a/soh/assets/xml/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_soul.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_soul.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_soul.xml
diff --git a/soh/assets/xml/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mjin_wind.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mjin_wind.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mjin_wind.xml
diff --git a/soh/assets/xml/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mk.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mk.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mk.xml
diff --git a/soh/assets/xml/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mm.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mm.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mm.xml
diff --git a/soh/assets/xml/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mo.xml
diff --git a/soh/assets/xml/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mori_hineri1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1.xml
diff --git a/soh/assets/xml/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1a.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mori_hineri1a.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri1a.xml
diff --git a/soh/assets/xml/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mori_hineri2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2.xml
diff --git a/soh/assets/xml/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2a.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mori_hineri2a.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_hineri2a.xml
diff --git a/soh/assets/xml/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mori_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_objects.xml
diff --git a/soh/assets/xml/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mori_tex.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mori_tex.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mori_tex.xml
diff --git a/soh/assets/xml/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ms.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ms.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ms.xml
diff --git a/soh/assets/xml/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_D/objects/object_mu.xml
similarity index 100%
rename from soh/assets/xml/objects/object_mu.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_mu.xml
diff --git a/soh/assets/xml/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_nb.xml
similarity index 100%
rename from soh/assets/xml/objects/object_nb.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_nb.xml
diff --git a/soh/assets/xml/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_niw.xml
similarity index 100%
rename from soh/assets/xml/objects/object_niw.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_niw.xml
diff --git a/soh/assets/xml/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_D/objects/object_nwc.xml
similarity index 100%
rename from soh/assets/xml/objects/object_nwc.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_nwc.xml
diff --git a/soh/assets/xml/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ny.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ny.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ny.xml
diff --git a/soh/assets/xml/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA1.xml
diff --git a/soh/assets/xml/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA10.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA10.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA10.xml
diff --git a/soh/assets/xml/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA11.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA11.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA11.xml
diff --git a/soh/assets/xml/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA2.xml
diff --git a/soh/assets/xml/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA3.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA3.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA3.xml
diff --git a/soh/assets/xml/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA4.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA4.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA4.xml
diff --git a/soh/assets/xml/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA5.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA5.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA5.xml
diff --git a/soh/assets/xml/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA6.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA6.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA6.xml
diff --git a/soh/assets/xml/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA7.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA7.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA7.xml
diff --git a/soh/assets/xml/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA8.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA8.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA8.xml
diff --git a/soh/assets/xml/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oA9.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oA9.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oA9.xml
diff --git a/soh/assets/xml/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oB1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oB1.xml
diff --git a/soh/assets/xml/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oB2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oB2.xml
diff --git a/soh/assets/xml/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB3.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oB3.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oB3.xml
diff --git a/soh/assets/xml/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oB4.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oB4.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oB4.xml
diff --git a/soh/assets/xml/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE1.xml
diff --git a/soh/assets/xml/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE10.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE10.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE10.xml
diff --git a/soh/assets/xml/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE11.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE11.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE11.xml
diff --git a/soh/assets/xml/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE12.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE12.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE12.xml
diff --git a/soh/assets/xml/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE1s.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE1s.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE1s.xml
diff --git a/soh/assets/xml/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE2.xml
diff --git a/soh/assets/xml/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE3.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE3.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE3.xml
diff --git a/soh/assets/xml/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE4.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE4.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE4.xml
diff --git a/soh/assets/xml/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE4s.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE4s.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE4s.xml
diff --git a/soh/assets/xml/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE5.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE5.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE5.xml
diff --git a/soh/assets/xml/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE6.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE6.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE6.xml
diff --git a/soh/assets/xml/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE7.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE7.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE7.xml
diff --git a/soh/assets/xml/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE8.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE8.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE8.xml
diff --git a/soh/assets/xml/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE9.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE9.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE9.xml
diff --git a/soh/assets/xml/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oE_anime.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oE_anime.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oE_anime.xml
diff --git a/soh/assets/xml/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oF1d_map.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oF1d_map.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oF1d_map.xml
diff --git a/soh/assets/xml/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_D/objects/object_oF1s.xml
similarity index 100%
rename from soh/assets/xml/objects/object_oF1s.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_oF1s.xml
diff --git a/soh/assets/xml/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_D/objects/object_o_anime.xml
similarity index 100%
rename from soh/assets/xml/objects/object_o_anime.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_o_anime.xml
diff --git a/soh/assets/xml/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_D/objects/object_okuta.xml
similarity index 100%
rename from soh/assets/xml/objects/object_okuta.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_okuta.xml
diff --git a/soh/assets/xml/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_opening_demo1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_opening_demo1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_opening_demo1.xml
diff --git a/soh/assets/xml/objects/object_os.xml b/soh/assets/xml/GC_NMQ_D/objects/object_os.xml
similarity index 100%
rename from soh/assets/xml/objects/object_os.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_os.xml
diff --git a/soh/assets/xml/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_D/objects/object_os_anime.xml
similarity index 100%
rename from soh/assets/xml/objects/object_os_anime.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_os_anime.xml
diff --git a/soh/assets/xml/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ossan.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ossan.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ossan.xml
diff --git a/soh/assets/xml/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ouke_haka.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ouke_haka.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ouke_haka.xml
diff --git a/soh/assets/xml/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_owl.xml
similarity index 100%
rename from soh/assets/xml/objects/object_owl.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_owl.xml
diff --git a/soh/assets/xml/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_D/objects/object_peehat.xml
similarity index 100%
rename from soh/assets/xml/objects/object_peehat.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_peehat.xml
diff --git a/soh/assets/xml/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_D/objects/object_po_composer.xml
similarity index 100%
rename from soh/assets/xml/objects/object_po_composer.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_po_composer.xml
diff --git a/soh/assets/xml/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_D/objects/object_po_field.xml
similarity index 100%
rename from soh/assets/xml/objects/object_po_field.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_po_field.xml
diff --git a/soh/assets/xml/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_D/objects/object_po_sisters.xml
similarity index 100%
rename from soh/assets/xml/objects/object_po_sisters.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_po_sisters.xml
diff --git a/soh/assets/xml/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_D/objects/object_poh.xml
similarity index 100%
rename from soh/assets/xml/objects/object_poh.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_poh.xml
diff --git a/soh/assets/xml/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ps.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ps.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ps.xml
diff --git a/soh/assets/xml/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_D/objects/object_pu_box.xml
similarity index 100%
rename from soh/assets/xml/objects/object_pu_box.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_pu_box.xml
diff --git a/soh/assets/xml/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rd.xml
similarity index 100%
rename from soh/assets/xml/objects/object_rd.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_rd.xml
diff --git a/soh/assets/xml/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_D/objects/object_reeba.xml
similarity index 100%
rename from soh/assets/xml/objects/object_reeba.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_reeba.xml
diff --git a/soh/assets/xml/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_relay_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_relay_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_relay_objects.xml
diff --git a/soh/assets/xml/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rl.xml
similarity index 100%
rename from soh/assets/xml/objects/object_rl.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_rl.xml
diff --git a/soh/assets/xml/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rr.xml
similarity index 100%
rename from soh/assets/xml/objects/object_rr.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_rr.xml
diff --git a/soh/assets/xml/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_D/objects/object_rs.xml
similarity index 100%
rename from soh/assets/xml/objects/object_rs.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_rs.xml
diff --git a/soh/assets/xml/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ru1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ru1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ru1.xml
diff --git a/soh/assets/xml/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ru2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ru2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ru2.xml
diff --git a/soh/assets/xml/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sa.xml
similarity index 100%
rename from soh/assets/xml/objects/object_sa.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_sa.xml
diff --git a/soh/assets/xml/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sb.xml
similarity index 100%
rename from soh/assets/xml/objects/object_sb.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_sb.xml
diff --git a/soh/assets/xml/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sd.xml
similarity index 100%
rename from soh/assets/xml/objects/object_sd.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_sd.xml
diff --git a/soh/assets/xml/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_D/objects/object_shop_dungen.xml
similarity index 100%
rename from soh/assets/xml/objects/object_shop_dungen.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_shop_dungen.xml
diff --git a/soh/assets/xml/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml
similarity index 100%
rename from soh/assets/xml/objects/object_shopnuts.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_shopnuts.xml
diff --git a/soh/assets/xml/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_D/objects/object_siofuki.xml
similarity index 100%
rename from soh/assets/xml/objects/object_siofuki.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_siofuki.xml
diff --git a/soh/assets/xml/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sk2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_sk2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_sk2.xml
diff --git a/soh/assets/xml/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_D/objects/object_skb.xml
similarity index 100%
rename from soh/assets/xml/objects/object_skb.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_skb.xml
diff --git a/soh/assets/xml/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_skj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_skj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_skj.xml
diff --git a/soh/assets/xml/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot00_break.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot00_break.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot00_break.xml
diff --git a/soh/assets/xml/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot00_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot00_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot00_objects.xml
diff --git a/soh/assets/xml/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoya.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot01_matoya.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoya.xml
diff --git a/soh/assets/xml/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoyab.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot01_matoyab.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_matoyab.xml
diff --git a/soh/assets/xml/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot01_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects.xml
diff --git a/soh/assets/xml/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot01_objects2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot01_objects2.xml
diff --git a/soh/assets/xml/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot02_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot02_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot02_objects.xml
diff --git a/soh/assets/xml/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot03_object.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot03_object.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot03_object.xml
diff --git a/soh/assets/xml/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot04_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot04_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot04_objects.xml
diff --git a/soh/assets/xml/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot05_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot05_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot05_objects.xml
diff --git a/soh/assets/xml/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot06_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot06_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot06_objects.xml
diff --git a/soh/assets/xml/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot07_object.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot07_object.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot07_object.xml
diff --git a/soh/assets/xml/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot08_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot08_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot08_obj.xml
diff --git a/soh/assets/xml/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot09_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot09_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot09_obj.xml
diff --git a/soh/assets/xml/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot11_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot11_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot11_obj.xml
diff --git a/soh/assets/xml/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot12_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot12_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot12_obj.xml
diff --git a/soh/assets/xml/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot15_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot15_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot15_obj.xml
diff --git a/soh/assets/xml/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot16_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot16_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot16_obj.xml
diff --git a/soh/assets/xml/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot17_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot17_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot17_obj.xml
diff --git a/soh/assets/xml/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_D/objects/object_spot18_obj.xml
similarity index 100%
rename from soh/assets/xml/objects/object_spot18_obj.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_spot18_obj.xml
diff --git a/soh/assets/xml/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ssh.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ssh.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ssh.xml
diff --git a/soh/assets/xml/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_D/objects/object_sst.xml
similarity index 100%
rename from soh/assets/xml/objects/object_sst.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_sst.xml
diff --git a/soh/assets/xml/objects/object_st.xml b/soh/assets/xml/GC_NMQ_D/objects/object_st.xml
similarity index 100%
rename from soh/assets/xml/objects/object_st.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_st.xml
diff --git a/soh/assets/xml/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_D/objects/object_stream.xml
similarity index 100%
rename from soh/assets/xml/objects/object_stream.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_stream.xml
diff --git a/soh/assets/xml/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_D/objects/object_syokudai.xml
similarity index 100%
rename from soh/assets/xml/objects/object_syokudai.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_syokudai.xml
diff --git a/soh/assets/xml/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ta.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ta.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ta.xml
diff --git a/soh/assets/xml/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_D/objects/object_timeblock.xml
similarity index 100%
rename from soh/assets/xml/objects/object_timeblock.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_timeblock.xml
diff --git a/soh/assets/xml/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tite.xml
similarity index 100%
rename from soh/assets/xml/objects/object_tite.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_tite.xml
diff --git a/soh/assets/xml/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tk.xml
similarity index 100%
rename from soh/assets/xml/objects/object_tk.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_tk.xml
diff --git a/soh/assets/xml/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_toki_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_toki_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_toki_objects.xml
diff --git a/soh/assets/xml/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_torch2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_torch2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_torch2.xml
diff --git a/soh/assets/xml/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_toryo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_toryo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_toryo.xml
diff --git a/soh/assets/xml/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tp.xml
similarity index 100%
rename from soh/assets/xml/objects/object_tp.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_tp.xml
diff --git a/soh/assets/xml/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tr.xml
similarity index 100%
rename from soh/assets/xml/objects/object_tr.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_tr.xml
diff --git a/soh/assets/xml/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_D/objects/object_trap.xml
similarity index 100%
rename from soh/assets/xml/objects/object_trap.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_trap.xml
diff --git a/soh/assets/xml/GC_NMQ_D/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_D/objects/object_triforce_spot.xml
new file mode 100644
index 000000000..87d449458
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_D/objects/object_triforce_spot.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ts.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ts.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ts.xml
diff --git a/soh/assets/xml/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tsubo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_tsubo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_tsubo.xml
diff --git a/soh/assets/xml/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_D/objects/object_tw.xml
similarity index 100%
rename from soh/assets/xml/objects/object_tw.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_tw.xml
diff --git a/soh/assets/xml/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_D/objects/object_umajump.xml
similarity index 100%
rename from soh/assets/xml/objects/object_umajump.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_umajump.xml
diff --git a/soh/assets/xml/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_D/objects/object_vali.xml
similarity index 100%
rename from soh/assets/xml/objects/object_vali.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_vali.xml
diff --git a/soh/assets/xml/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_D/objects/object_vase.xml
similarity index 100%
rename from soh/assets/xml/objects/object_vase.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_vase.xml
diff --git a/soh/assets/xml/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_D/objects/object_vm.xml
similarity index 100%
rename from soh/assets/xml/objects/object_vm.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_vm.xml
diff --git a/soh/assets/xml/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_D/objects/object_wallmaster.xml
similarity index 100%
rename from soh/assets/xml/objects/object_wallmaster.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_wallmaster.xml
diff --git a/soh/assets/xml/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_warp1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_warp1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_warp1.xml
diff --git a/soh/assets/xml/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_warp2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_warp2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_warp2.xml
diff --git a/soh/assets/xml/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_D/objects/object_wf.xml
similarity index 100%
rename from soh/assets/xml/objects/object_wf.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_wf.xml
diff --git a/soh/assets/xml/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_D/objects/object_wood02.xml
similarity index 100%
rename from soh/assets/xml/objects/object_wood02.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_wood02.xml
diff --git a/soh/assets/xml/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_D/objects/object_xc.xml
similarity index 100%
rename from soh/assets/xml/objects/object_xc.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_xc.xml
diff --git a/soh/assets/xml/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_D/objects/object_yabusame_point.xml
similarity index 100%
rename from soh/assets/xml/objects/object_yabusame_point.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_yabusame_point.xml
diff --git a/soh/assets/xml/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_D/objects/object_ydan_objects.xml
similarity index 100%
rename from soh/assets/xml/objects/object_ydan_objects.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_ydan_objects.xml
diff --git a/soh/assets/xml/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_D/objects/object_yukabyun.xml
similarity index 100%
rename from soh/assets/xml/objects/object_yukabyun.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_yukabyun.xml
diff --git a/soh/assets/xml/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zf.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zf.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zf.xml
diff --git a/soh/assets/xml/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zg.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zg.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zg.xml
diff --git a/soh/assets/xml/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zl1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zl1.xml
diff --git a/soh/assets/xml/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zl2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zl2.xml
diff --git a/soh/assets/xml/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime1.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zl2_anime1.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime1.xml
diff --git a/soh/assets/xml/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime2.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zl2_anime2.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zl2_anime2.xml
diff --git a/soh/assets/xml/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zl4.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zl4.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zl4.xml
diff --git a/soh/assets/xml/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_D/objects/object_zo.xml
similarity index 100%
rename from soh/assets/xml/objects/object_zo.xml
rename to soh/assets/xml/GC_NMQ_D/objects/object_zo.xml
diff --git a/soh/assets/xml/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Fire.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Arrow_Fire.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Fire.xml
diff --git a/soh/assets/xml/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Ice.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Arrow_Ice.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Ice.xml
diff --git a/soh/assets/xml/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Light.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Arrow_Light.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Arrow_Light.xml
diff --git a/soh/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Ganon_Otyuka.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Bg_Ganon_Otyuka.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Ganon_Otyuka.xml
diff --git a/soh/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Jya_Cobra.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Bg_Jya_Cobra.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Bg_Jya_Cobra.xml
diff --git a/soh/assets/xml/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Boss_Dodongo.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Dodongo.xml
diff --git a/soh/assets/xml/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Boss_Ganon.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon.xml
diff --git a/soh/assets/xml/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon2.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Boss_Ganon2.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Ganon2.xml
diff --git a/soh/assets/xml/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Sst.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Boss_Sst.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Boss_Sst.xml
diff --git a/soh/assets/xml/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Demo_Shd.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Demo_Shd.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Demo_Shd.xml
diff --git a/soh/assets/xml/overlays/ovl_Elf_Msg.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Elf_Msg.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg.xml
diff --git a/soh/assets/xml/overlays/ovl_Elf_Msg2.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg2.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Elf_Msg2.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Elf_Msg2.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Bili.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Bili.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Bili.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Clear_Tag.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Clear_Tag.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Clear_Tag.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Mant.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Ganon_Mant.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Mant.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Organ.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Ganon_Organ.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ganon_Organ.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Holl.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Holl.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Holl.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Jsjutan.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Jsjutan.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Jsjutan.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Kanban.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Kanban.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Kanban.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sda.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Sda.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sda.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ssh.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Ssh.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Ssh.xml
diff --git a/soh/assets/xml/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_St.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_St.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_St.xml
diff --git a/soh/assets/xml/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sth.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_En_Sth.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_En_Sth.xml
diff --git a/soh/assets/xml/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_End_Title.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_End_Title.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_End_Title.xml
diff --git a/soh/assets/xml/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_File_Choose.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_File_Choose.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_File_Choose.xml
diff --git a/soh/assets/xml/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Dark.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Magic_Dark.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Dark.xml
diff --git a/soh/assets/xml/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Fire.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Magic_Fire.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Fire.xml
diff --git a/soh/assets/xml/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Wind.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Magic_Wind.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Magic_Wind.xml
diff --git a/soh/assets/xml/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Spot.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Oceff_Spot.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Spot.xml
diff --git a/soh/assets/xml/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Storm.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Oceff_Storm.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Storm.xml
diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Oceff_Wipe.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe.xml
diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe2.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Oceff_Wipe2.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe2.xml
diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe3.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Oceff_Wipe3.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe3.xml
diff --git a/soh/assets/xml/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe4.xml
similarity index 100%
rename from soh/assets/xml/overlays/ovl_Oceff_Wipe4.xml
rename to soh/assets/xml/GC_NMQ_D/overlays/ovl_Oceff_Wipe4.xml
diff --git a/soh/assets/xml/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/Bmori1.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/Bmori1.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/Bmori1.xml
diff --git a/soh/assets/xml/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/FIRE_bs.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/FIRE_bs.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/FIRE_bs.xml
diff --git a/soh/assets/xml/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/HAKAdan.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan.xml
diff --git a/soh/assets/xml/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdanCH.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/HAKAdanCH.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdanCH.xml
diff --git a/soh/assets/xml/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan_bs.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/HAKAdan_bs.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HAKAdan_bs.xml
diff --git a/soh/assets/xml/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/HIDAN.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/HIDAN.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/HIDAN.xml
diff --git a/soh/assets/xml/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/MIZUsin.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin.xml
diff --git a/soh/assets/xml/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin_bs.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/MIZUsin_bs.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/MIZUsin_bs.xml
diff --git a/soh/assets/xml/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/bdan.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan.xml
diff --git a/soh/assets/xml/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan_boss.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/bdan_boss.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/bdan_boss.xml
diff --git a/soh/assets/xml/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ddan.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan.xml
diff --git a/soh/assets/xml/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan_boss.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ddan_boss.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ddan_boss.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganon.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_boss.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganon_boss.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_boss.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_demo.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganon_demo.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_demo.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_final.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganon_final.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_final.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_sonogo.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganon_sonogo.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_sonogo.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_tou.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganon_tou.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganon_tou.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontika.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganontika.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontika.xml
diff --git a/soh/assets/xml/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontikasonogo.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ganontikasonogo.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ganontikasonogo.xml
diff --git a/soh/assets/xml/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/gerudoway.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/gerudoway.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/gerudoway.xml
diff --git a/soh/assets/xml/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ice_doukutu.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ice_doukutu.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ice_doukutu.xml
diff --git a/soh/assets/xml/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinboss.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/jyasinboss.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinboss.xml
diff --git a/soh/assets/xml/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinzou.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/jyasinzou.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/jyasinzou.xml
diff --git a/soh/assets/xml/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/men.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/men.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/men.xml
diff --git a/soh/assets/xml/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/moribossroom.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/moribossroom.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/moribossroom.xml
diff --git a/soh/assets/xml/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ydan.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan.xml
diff --git a/soh/assets/xml/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan_boss.xml
similarity index 100%
rename from soh/assets/xml/scenes/dungeons/ydan_boss.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/dungeons/ydan_boss.xml
diff --git a/soh/assets/xml/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/bowling.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/bowling.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/bowling.xml
diff --git a/soh/assets/xml/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/daiyousei_izumi.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/daiyousei_izumi.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/daiyousei_izumi.xml
diff --git a/soh/assets/xml/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/hairal_niwa.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa.xml
diff --git a/soh/assets/xml/scenes/indoors/hairal_niwa2.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa2.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/hairal_niwa2.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa2.xml
diff --git a/soh/assets/xml/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa_n.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/hairal_niwa_n.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hairal_niwa_n.xml
diff --git a/soh/assets/xml/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hakasitarelay.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/hakasitarelay.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hakasitarelay.xml
diff --git a/soh/assets/xml/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hut.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/hut.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hut.xml
diff --git a/soh/assets/xml/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/hylia_labo.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/hylia_labo.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/hylia_labo.xml
diff --git a/soh/assets/xml/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/impa.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/impa.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/impa.xml
diff --git a/soh/assets/xml/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kakariko.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/kakariko.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kakariko.xml
diff --git a/soh/assets/xml/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kenjyanoma.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/kenjyanoma.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kenjyanoma.xml
diff --git a/soh/assets/xml/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/kokiri_home.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home.xml
diff --git a/soh/assets/xml/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home3.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/kokiri_home3.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home3.xml
diff --git a/soh/assets/xml/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home4.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/kokiri_home4.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home4.xml
diff --git a/soh/assets/xml/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home5.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/kokiri_home5.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/kokiri_home5.xml
diff --git a/soh/assets/xml/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/labo.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/labo.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/labo.xml
diff --git a/soh/assets/xml/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/link_home.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/link_home.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/link_home.xml
diff --git a/soh/assets/xml/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/mahouya.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/mahouya.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/mahouya.xml
diff --git a/soh/assets/xml/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/malon_stable.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/malon_stable.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/malon_stable.xml
diff --git a/soh/assets/xml/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/miharigoya.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/miharigoya.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/miharigoya.xml
diff --git a/soh/assets/xml/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/nakaniwa.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/nakaniwa.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/nakaniwa.xml
diff --git a/soh/assets/xml/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/syatekijyou.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/syatekijyou.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/syatekijyou.xml
diff --git a/soh/assets/xml/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/takaraya.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/takaraya.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/takaraya.xml
diff --git a/soh/assets/xml/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/tent.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/tent.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/tent.xml
diff --git a/soh/assets/xml/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/tokinoma.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/tokinoma.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/tokinoma.xml
diff --git a/soh/assets/xml/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_tate.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/yousei_izumi_tate.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_tate.xml
diff --git a/soh/assets/xml/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_yoko.xml
similarity index 100%
rename from soh/assets/xml/scenes/indoors/yousei_izumi_yoko.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/indoors/yousei_izumi_yoko.xml
diff --git a/soh/assets/xml/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/enrui.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/enrui.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/enrui.xml
diff --git a/soh/assets/xml/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/entra_n.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/entra_n.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/entra_n.xml
diff --git a/soh/assets/xml/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/hakaana.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana.xml
diff --git a/soh/assets/xml/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana2.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/hakaana2.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana2.xml
diff --git a/soh/assets/xml/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana_ouke.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/hakaana_ouke.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hakaana_ouke.xml
diff --git a/soh/assets/xml/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/hiral_demo.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/hiral_demo.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/hiral_demo.xml
diff --git a/soh/assets/xml/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/kakariko3.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/kakariko3.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/kakariko3.xml
diff --git a/soh/assets/xml/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/kakusiana.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/kakusiana.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/kakusiana.xml
diff --git a/soh/assets/xml/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/kinsuta.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/kinsuta.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/kinsuta.xml
diff --git a/soh/assets/xml/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/market_alley.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley.xml
diff --git a/soh/assets/xml/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley_n.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/market_alley_n.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_alley_n.xml
diff --git a/soh/assets/xml/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_day.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/market_day.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_day.xml
diff --git a/soh/assets/xml/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_night.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/market_night.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_night.xml
diff --git a/soh/assets/xml/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/market_ruins.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/market_ruins.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/market_ruins.xml
diff --git a/soh/assets/xml/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/shrine.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/shrine.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/shrine.xml
diff --git a/soh/assets/xml/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_n.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/shrine_n.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_n.xml
diff --git a/soh/assets/xml/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_r.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/shrine_r.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/shrine_r.xml
diff --git a/soh/assets/xml/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_D/scenes/misc/turibori.xml
similarity index 100%
rename from soh/assets/xml/scenes/misc/turibori.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/misc/turibori.xml
diff --git a/soh/assets/xml/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/entra.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/entra.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/entra.xml
diff --git a/soh/assets/xml/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/souko.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/souko.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/souko.xml
diff --git a/soh/assets/xml/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot00.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot00.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot00.xml
diff --git a/soh/assets/xml/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot01.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot01.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot01.xml
diff --git a/soh/assets/xml/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot02.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot02.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot02.xml
diff --git a/soh/assets/xml/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot03.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot03.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot03.xml
diff --git a/soh/assets/xml/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot04.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot04.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot04.xml
diff --git a/soh/assets/xml/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot05.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot05.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot05.xml
diff --git a/soh/assets/xml/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot06.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot06.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot06.xml
diff --git a/soh/assets/xml/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot07.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot07.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot07.xml
diff --git a/soh/assets/xml/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot08.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot08.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot08.xml
diff --git a/soh/assets/xml/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot09.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot09.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot09.xml
diff --git a/soh/assets/xml/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot10.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot10.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot10.xml
diff --git a/soh/assets/xml/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot11.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot11.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot11.xml
diff --git a/soh/assets/xml/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot12.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot12.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot12.xml
diff --git a/soh/assets/xml/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot13.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot13.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot13.xml
diff --git a/soh/assets/xml/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot15.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot15.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot15.xml
diff --git a/soh/assets/xml/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot16.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot16.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot16.xml
diff --git a/soh/assets/xml/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot17.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot17.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot17.xml
diff --git a/soh/assets/xml/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot18.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot18.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot18.xml
diff --git a/soh/assets/xml/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_D/scenes/overworld/spot20.xml
similarity index 100%
rename from soh/assets/xml/scenes/overworld/spot20.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/overworld/spot20.xml
diff --git a/soh/assets/xml/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/alley_shop.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/alley_shop.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/alley_shop.xml
diff --git a/soh/assets/xml/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/drag.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/drag.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/drag.xml
diff --git a/soh/assets/xml/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/face_shop.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/face_shop.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/face_shop.xml
diff --git a/soh/assets/xml/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/golon.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/golon.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/golon.xml
diff --git a/soh/assets/xml/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/kokiri_shop.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/kokiri_shop.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/kokiri_shop.xml
diff --git a/soh/assets/xml/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/night_shop.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/night_shop.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/night_shop.xml
diff --git a/soh/assets/xml/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/shop1.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/shop1.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/shop1.xml
diff --git a/soh/assets/xml/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_D/scenes/shops/zoora.xml
similarity index 100%
rename from soh/assets/xml/scenes/shops/zoora.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/shops/zoora.xml
diff --git a/soh/assets/xml/scenes/test_levels/besitu.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/besitu.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/besitu.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/besitu.xml
diff --git a/soh/assets/xml/scenes/test_levels/depth_test.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/depth_test.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/depth_test.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/depth_test.xml
diff --git a/soh/assets/xml/scenes/test_levels/sasatest.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/sasatest.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/sasatest.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/sasatest.xml
diff --git a/soh/assets/xml/scenes/test_levels/sutaru.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/sutaru.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/sutaru.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/sutaru.xml
diff --git a/soh/assets/xml/scenes/test_levels/syotes.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/syotes.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes.xml
diff --git a/soh/assets/xml/scenes/test_levels/syotes2.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes2.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/syotes2.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/syotes2.xml
diff --git a/soh/assets/xml/scenes/test_levels/test01.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/test01.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/test01.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/test01.xml
diff --git a/soh/assets/xml/scenes/test_levels/testroom.xml b/soh/assets/xml/GC_NMQ_D/scenes/test_levels/testroom.xml
similarity index 100%
rename from soh/assets/xml/scenes/test_levels/testroom.xml
rename to soh/assets/xml/GC_NMQ_D/scenes/test_levels/testroom.xml
diff --git a/soh/assets/xml/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_D/text/elf_message_field.xml
similarity index 100%
rename from soh/assets/xml/text/elf_message_field.xml
rename to soh/assets/xml/GC_NMQ_D/text/elf_message_field.xml
diff --git a/soh/assets/xml/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_D/text/elf_message_ydan.xml
similarity index 100%
rename from soh/assets/xml/text/elf_message_ydan.xml
rename to soh/assets/xml/GC_NMQ_D/text/elf_message_ydan.xml
diff --git a/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml
new file mode 100644
index 000000000..e2d39a916
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_D/text/nes_message_data_static.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml
new file mode 100644
index 000000000..f675929e1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_D/text/staff_message_data_static.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_D/textures/backgrounds.xml
similarity index 100%
rename from soh/assets/xml/textures/backgrounds.xml
rename to soh/assets/xml/GC_NMQ_D/textures/backgrounds.xml
diff --git a/soh/assets/xml/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_D/textures/do_action_static.xml
similarity index 100%
rename from soh/assets/xml/textures/do_action_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/do_action_static.xml
diff --git a/soh/assets/xml/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_24_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_24_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_24_static.xml
diff --git a/soh/assets/xml/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_dungeon_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_dungeon_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_dungeon_static.xml
diff --git a/soh/assets/xml/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_field_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_field_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_field_static.xml
diff --git a/soh/assets/xml/textures/icon_item_fra_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_fra_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_fra_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_fra_static.xml
diff --git a/soh/assets/xml/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_gameover_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_gameover_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_gameover_static.xml
diff --git a/soh/assets/xml/textures/icon_item_ger_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_ger_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_ger_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_ger_static.xml
diff --git a/soh/assets/xml/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_nes_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_nes_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_nes_static.xml
diff --git a/soh/assets/xml/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_D/textures/icon_item_static.xml
similarity index 100%
rename from soh/assets/xml/textures/icon_item_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/icon_item_static.xml
diff --git a/soh/assets/xml/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_D/textures/item_name_static.xml
similarity index 100%
rename from soh/assets/xml/textures/item_name_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/item_name_static.xml
diff --git a/soh/assets/xml/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_48x85_static.xml
similarity index 100%
rename from soh/assets/xml/textures/map_48x85_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/map_48x85_static.xml
diff --git a/soh/assets/xml/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_grand_static.xml
similarity index 100%
rename from soh/assets/xml/textures/map_grand_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/map_grand_static.xml
diff --git a/soh/assets/xml/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_i_static.xml
similarity index 100%
rename from soh/assets/xml/textures/map_i_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/map_i_static.xml
diff --git a/soh/assets/xml/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_D/textures/map_name_static.xml
similarity index 100%
rename from soh/assets/xml/textures/map_name_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/map_name_static.xml
diff --git a/soh/assets/xml/textures/message_static.xml b/soh/assets/xml/GC_NMQ_D/textures/message_static.xml
similarity index 100%
rename from soh/assets/xml/textures/message_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/message_static.xml
diff --git a/soh/assets/xml/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_D/textures/message_texture_static.xml
similarity index 100%
rename from soh/assets/xml/textures/message_texture_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/message_texture_static.xml
diff --git a/soh/assets/xml/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_D/textures/nes_font_static.xml
similarity index 100%
rename from soh/assets/xml/textures/nes_font_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/nes_font_static.xml
diff --git a/soh/assets/xml/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_D/textures/nintendo_rogo_static.xml
similarity index 100%
rename from soh/assets/xml/textures/nintendo_rogo_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/nintendo_rogo_static.xml
diff --git a/soh/assets/xml/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_D/textures/parameter_static.xml
similarity index 100%
rename from soh/assets/xml/textures/parameter_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/parameter_static.xml
diff --git a/soh/assets/xml/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_D/textures/place_title_cards.xml
similarity index 100%
rename from soh/assets/xml/textures/place_title_cards.xml
rename to soh/assets/xml/GC_NMQ_D/textures/place_title_cards.xml
diff --git a/soh/assets/xml/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_D/textures/skyboxes.xml
similarity index 100%
rename from soh/assets/xml/textures/skyboxes.xml
rename to soh/assets/xml/GC_NMQ_D/textures/skyboxes.xml
diff --git a/soh/assets/xml/textures/title_static.xml b/soh/assets/xml/GC_NMQ_D/textures/title_static.xml
similarity index 100%
rename from soh/assets/xml/textures/title_static.xml
rename to soh/assets/xml/GC_NMQ_D/textures/title_static.xml
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml
new file mode 100644
index 000000000..a3add03bc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_circle.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml
new file mode 100644
index 000000000..f4eff13ae
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_triforce.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml
new file mode 100644
index 000000000..537706cd1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/code/fbdemo_wipe1.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml b/soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml
new file mode 100644
index 000000000..9de1e92d3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/misc/link_animetion.xml
@@ -0,0 +1,577 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml
new file mode 100644
index 000000000..d16eb4c41
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_dangeon_keep.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml
new file mode 100644
index 000000000..28fa975d7
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_field_keep.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml
new file mode 100644
index 000000000..45c669307
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/gameplay_keep.xml
@@ -0,0 +1,960 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml
new file mode 100644
index 000000000..5d04bde45
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_Bb.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml
new file mode 100644
index 000000000..a32c00914
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ahg.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml
new file mode 100644
index 000000000..0a4b88ddf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_am.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml
new file mode 100644
index 000000000..1e29b351e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ane.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml
new file mode 100644
index 000000000..c69656043
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ani.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml
new file mode 100644
index 000000000..2140187e4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_anubice.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml
new file mode 100644
index 000000000..e6202d0cf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_aob.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml
new file mode 100644
index 000000000..00f7cd677
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_b_heart.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml
new file mode 100644
index 000000000..ccc5c2136
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bba.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml
new file mode 100644
index 000000000..dcd56d385
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdan_objects.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml
new file mode 100644
index 000000000..644c06ea8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bdoor.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml
new file mode 100644
index 000000000..791226b71
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bg.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml
new file mode 100644
index 000000000..1c7d39e31
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bigokuta.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml
new file mode 100644
index 000000000..167a5022d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bird.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml
new file mode 100644
index 000000000..e6b6c4221
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bji.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml
new file mode 100644
index 000000000..1c2ef4ec6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bl.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml
new file mode 100644
index 000000000..a073077b8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_blkobj.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml
new file mode 100644
index 000000000..289e994e4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bob.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml
new file mode 100644
index 000000000..4cc39906e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_boj.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml
new file mode 100644
index 000000000..83e60248d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombf.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml
new file mode 100644
index 000000000..26ab6b4f3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bombiwa.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml
new file mode 100644
index 000000000..ffe6d43db
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bowl.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml
new file mode 100644
index 000000000..efcec619b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_box.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml
new file mode 100644
index 000000000..718dcd561
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_brob.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml
new file mode 100644
index 000000000..f5de18692
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bubble.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml
new file mode 100644
index 000000000..83ff039f5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bv.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml
new file mode 100644
index 000000000..f7d5ecead
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bw.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml
new file mode 100644
index 000000000..d4f43ddc1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bwall.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml
new file mode 100644
index 000000000..fb78c117e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_bxa.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml
new file mode 100644
index 000000000..ce9c16082
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cne.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml
new file mode 100644
index 000000000..ba051cfa7
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cob.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml
new file mode 100644
index 000000000..5d067c329
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cow.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml
new file mode 100644
index 000000000..77337c644
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_crow.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml
new file mode 100644
index 000000000..83804ccaf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_cs.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml
new file mode 100644
index 000000000..6be59c154
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_elevator.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml
new file mode 100644
index 000000000..b9111b38b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_hsblock.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml
new file mode 100644
index 000000000..291238519
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_d_lift.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml
new file mode 100644
index 000000000..1524c7a26
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_daiku.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml
new file mode 100644
index 000000000..3fc563b96
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ddan_objects.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml
new file mode 100644
index 000000000..7202a833f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekubaba.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml
new file mode 100644
index 000000000..e906bf61c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekujr.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml
new file mode 100644
index 000000000..5fceef416
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dekunuts.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml
new file mode 100644
index 000000000..73058d5e4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_6k.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml
new file mode 100644
index 000000000..1b9c9b402
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_kekkai.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml
new file mode 100644
index 000000000..9ea19012b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_demo_tre_lgt.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml
new file mode 100644
index 000000000..7a52d7dbe
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dh.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml
new file mode 100644
index 000000000..b1e79464b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dnk.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml
new file mode 100644
index 000000000..086c4bd11
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dns.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml
new file mode 100644
index 000000000..4dfd7d6e4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodojr.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml
new file mode 100644
index 000000000..779e20e9d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dodongo.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml
new file mode 100644
index 000000000..ef00442b6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dog.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml
new file mode 100644
index 000000000..2f1726204
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_gerudo.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml
new file mode 100644
index 000000000..a37f590d6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_door_killer.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml
new file mode 100644
index 000000000..0413a9e2e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml
new file mode 100644
index 000000000..683bcc68d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ds2.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml
new file mode 100644
index 000000000..44bbd1aa0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_du.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml
new file mode 100644
index 000000000..4d141d546
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_dy_obj.xml
@@ -0,0 +1,121 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml
new file mode 100644
index 000000000..7ec83e284
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ec.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml
new file mode 100644
index 000000000..9215b6a39
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_crystal_light.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml
new file mode 100644
index 000000000..7f12c56f5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_doughnut.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml
new file mode 100644
index 000000000..800d9535f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_erupc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml
new file mode 100644
index 000000000..2fc65b16f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_fire_ball.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml
new file mode 100644
index 000000000..5f962f162
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_flash.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml
new file mode 100644
index 000000000..67ef5ce7e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_lgt_shower.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml
new file mode 100644
index 000000000..00b47c460
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_star_field.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml
new file mode 100644
index 000000000..de5376569
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_efc_tw.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml
new file mode 100644
index 000000000..e4132491f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ei.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml
new file mode 100644
index 000000000..2f1bf9a5e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fa.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml
new file mode 100644
index 000000000..1b96e9f22
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml
new file mode 100644
index 000000000..8689098b9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fd2.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml
new file mode 100644
index 000000000..f3a4a55ca
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fhg.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml
new file mode 100644
index 000000000..49bf620cb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fire.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml
new file mode 100644
index 000000000..8c26a4341
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_firefly.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml
new file mode 100644
index 000000000..f5ad4f6da
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fish.xml
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml
new file mode 100644
index 000000000..25ee2ad42
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fr.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml
new file mode 100644
index 000000000..82c449e3d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fu.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml
new file mode 100644
index 000000000..e71f83092
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fw.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml
new file mode 100644
index 000000000..dad6fec5c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_fz.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml
new file mode 100644
index 000000000..96adabb2b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml
new file mode 100644
index 000000000..8b66cfcc2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon2.xml
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml
new file mode 100644
index 000000000..6021fdd9b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml
new file mode 100644
index 000000000..96121689e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime2.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml
new file mode 100644
index 000000000..2af1e94f9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_anime3.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml
new file mode 100644
index 000000000..5e32610ff
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ganon_objects.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml
new file mode 100644
index 000000000..79e0768b8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ge1.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml
new file mode 100644
index 000000000..f0667743b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geff.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml
new file mode 100644
index 000000000..a1dbd18f4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_geldb.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml
new file mode 100644
index 000000000..4b58787a9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrow.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml
new file mode 100644
index 000000000..267b0a734
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_arrowcase.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml
new file mode 100644
index 000000000..e74247816
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bean.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml
new file mode 100644
index 000000000..bae86c11d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml
new file mode 100644
index 000000000..1400c4a4d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bomb_2.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml
new file mode 100644
index 000000000..07134748c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bombpouch.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml
new file mode 100644
index 000000000..3c1a0fe7f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boomerang.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml
new file mode 100644
index 000000000..8e9cd1028
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_boots_2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml
new file mode 100644
index 000000000..e5e4bc86c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bosskey.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml
new file mode 100644
index 000000000..3b0884a03
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml
new file mode 100644
index 000000000..443219caf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bottle_letter.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml
new file mode 100644
index 000000000..946e9c496
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bow.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml
new file mode 100644
index 000000000..5a0b62a60
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_bracelet.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml
new file mode 100644
index 000000000..408741ac5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_brokensword.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml
new file mode 100644
index 000000000..76ac70609
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_butterfly.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml
new file mode 100644
index 000000000..2a10dce11
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_clothes.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml
new file mode 100644
index 000000000..22e29f255
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_coin.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml
new file mode 100644
index 000000000..076229b11
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_compass.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml
new file mode 100644
index 000000000..3d6d95d98
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_dekupouch.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml
new file mode 100644
index 000000000..2b2e2847d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_egg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml
new file mode 100644
index 000000000..5128c5f6f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_eye_lotion.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml
new file mode 100644
index 000000000..a57fba6e8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fire.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml
new file mode 100644
index 000000000..edb39dc29
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_fish.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml
new file mode 100644
index 000000000..f180fd267
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_frog.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml
new file mode 100644
index 000000000..3be8d3462
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudo.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml
new file mode 100644
index 000000000..b53bf24af
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gerudomask.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml
new file mode 100644
index 000000000..186f4c74b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ghost.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml
new file mode 100644
index 000000000..63d32ab5a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_glasses.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml
new file mode 100644
index 000000000..1b4282dca
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_gloves.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml
new file mode 100644
index 000000000..50cbdd891
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_goddess.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml
new file mode 100644
index 000000000..98f53f1c2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_golonmask.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml
new file mode 100644
index 000000000..ae7834201
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_grass.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml
new file mode 100644
index 000000000..feb5c8659
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hammer.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml
new file mode 100644
index 000000000..48e78b1b5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_heart.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml
new file mode 100644
index 000000000..d2e763e63
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hearts.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml
new file mode 100644
index 000000000..a6b3b0fda
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hookshot.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml
new file mode 100644
index 000000000..c4a67877b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_hoverboots.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml
new file mode 100644
index 000000000..7af5b5b3b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_insect.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml
new file mode 100644
index 000000000..e83c65116
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_jewel.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml
new file mode 100644
index 000000000..a37d45a71
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_key.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml
new file mode 100644
index 000000000..f66535af3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ki_tan_mask.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml
new file mode 100644
index 000000000..167a7ff5d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_letter.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml
new file mode 100644
index 000000000..5eeeca0fd
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_liquid.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml
new file mode 100644
index 000000000..7161e42e3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_longsword.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml
new file mode 100644
index 000000000..0fd659ae9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_m_arrow.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml
new file mode 100644
index 000000000..7623e6353
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_magicpot.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml
new file mode 100644
index 000000000..8887dd22c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_map.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml
new file mode 100644
index 000000000..28e5b1e68
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_medal.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml
new file mode 100644
index 000000000..b01fca953
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_melody.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml
new file mode 100644
index 000000000..00b9530d9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_milk.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml
new file mode 100644
index 000000000..5b19bca74
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_mushroom.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml
new file mode 100644
index 000000000..713cc1ce5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_niwatori.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml
new file mode 100644
index 000000000..5508fe856
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_nuts.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml
new file mode 100644
index 000000000..7693cc122
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml
new file mode 100644
index 000000000..336d33894
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ocarina_0.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml
new file mode 100644
index 000000000..5f808baf9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_pachinko.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml
new file mode 100644
index 000000000..fb7dc0155
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_powder.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml
new file mode 100644
index 000000000..081de301c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_prescription.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml
new file mode 100644
index 000000000..3034942ff
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_purse.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml
new file mode 100644
index 000000000..75f855550
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rabit_mask.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml
new file mode 100644
index 000000000..7de08487f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_redead_mask.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml
new file mode 100644
index 000000000..0a1af96d0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_rupy.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml
new file mode 100644
index 000000000..dcc038b7c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_saw.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml
new file mode 100644
index 000000000..1cf5de5b9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_scale.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml
new file mode 100644
index 000000000..82c15c82d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_seed.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml
new file mode 100644
index 000000000..2e9369569
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml
new file mode 100644
index 000000000..176ae025f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_2.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml
new file mode 100644
index 000000000..250bf7fea
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_shield_3.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml
new file mode 100644
index 000000000..e6c90f76f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_skj_mask.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml
new file mode 100644
index 000000000..ae3f4685f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soldout.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml
new file mode 100644
index 000000000..76ffc5685
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_soul.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml
new file mode 100644
index 000000000..fed89f465
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_stick.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml
new file mode 100644
index 000000000..a2606afbe
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sutaru.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml
new file mode 100644
index 000000000..e1119abca
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_sword_1.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml
new file mode 100644
index 000000000..0fa37fe11
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_ticketstone.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml
new file mode 100644
index 000000000..f28c7cbca
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_truth_mask.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml
new file mode 100644
index 000000000..096fdeedf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gi_zoramask.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml
new file mode 100644
index 000000000..50d6337b4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gj.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml
new file mode 100644
index 000000000..ea4f8444f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gjyo_objects.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml
new file mode 100644
index 000000000..499a3720d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gla.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml
new file mode 100644
index 000000000..91b10cc42
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gm.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml
new file mode 100644
index 000000000..dfbe02315
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml
new file mode 100644
index 000000000..a88d419d7
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gnd_magic.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml
new file mode 100644
index 000000000..96e264c34
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gndd.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml
new file mode 100644
index 000000000..60df9e469
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_god_lgt.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml
new file mode 100644
index 000000000..7e04508cb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gol.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml
new file mode 100644
index 000000000..e7a6d0a54
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goma.xml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml
new file mode 100644
index 000000000..5d406e957
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_goroiwa.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml
new file mode 100644
index 000000000..103d4412e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gr.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml
new file mode 100644
index 000000000..145be1665
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gs.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml
new file mode 100644
index 000000000..1d79d4e39
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_gt.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml
new file mode 100644
index 000000000..f6b263c37
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml
new file mode 100644
index 000000000..753492445
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_door.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml
new file mode 100644
index 000000000..3ca6d27c0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_haka_objects.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml
new file mode 100644
index 000000000..b978e77a3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hakach_objects.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml
new file mode 100644
index 000000000..b0324c3be
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hata.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml
new file mode 100644
index 000000000..ecc795321
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_heavy_object.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml
new file mode 100644
index 000000000..5c54244bb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hidan_objects.xml
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml
new file mode 100644
index 000000000..f419f7546
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hintnuts.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml
new file mode 100644
index 000000000..6b317eb7a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hni.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml
new file mode 100644
index 000000000..74619e597
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml
new file mode 100644
index 000000000..98babb080
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_ganon.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml
new file mode 100644
index 000000000..1491189a1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_link_child.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml
new file mode 100644
index 000000000..2bc2cb0c6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_normal.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml
new file mode 100644
index 000000000..9595c3245
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_horse_zelda.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml
new file mode 100644
index 000000000..cf5d06e1a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_hs.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml
new file mode 100644
index 000000000..c52398446
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_human.xml
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml
new file mode 100644
index 000000000..a4e2e9b12
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ice_objects.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml
new file mode 100644
index 000000000..95606e6df
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ik.xml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml
new file mode 100644
index 000000000..a628a113a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_im.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml
new file mode 100644
index 000000000..84c114047
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_in.xml
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml
new file mode 100644
index 000000000..e6be42beb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ingate.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml
new file mode 100644
index 000000000..62bae8cb9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jj.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml
new file mode 100644
index 000000000..ff7bd3efa
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_js.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml
new file mode 100644
index 000000000..60a7b3788
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_door.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml
new file mode 100644
index 000000000..c6f6773c6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_iron.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml
new file mode 100644
index 000000000..4a203b0b9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_jya_obj.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml
new file mode 100644
index 000000000..eb952732b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ka.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml
new file mode 100644
index 000000000..9ffc7a2ce
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kanban.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml
new file mode 100644
index 000000000..a701b294d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kibako2.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml
new file mode 100644
index 000000000..9b104b3ea
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kingdodongo.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml
new file mode 100644
index 000000000..0a918a798
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_km1.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml
new file mode 100644
index 000000000..67291a554
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kusa.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml
new file mode 100644
index 000000000..eab561b1f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kw1.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml
new file mode 100644
index 000000000..20aeec4d9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_kz.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml
new file mode 100644
index 000000000..babe7d2aa
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_light_ring.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml
new file mode 100644
index 000000000..552a79d7c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightbox.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml
new file mode 100644
index 000000000..cfd5dcfb4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_lightswitch.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml
new file mode 100644
index 000000000..2f3cd943c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_boy.xml
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml
new file mode 100644
index 000000000..0de400373
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_link_child.xml
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml
new file mode 100644
index 000000000..63eeb3895
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma1.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml
new file mode 100644
index 000000000..ce5910fb8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ma2.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml
new file mode 100644
index 000000000..e691fbeb3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mag.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml
new file mode 100644
index 000000000..819d89022
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mamenoki.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml
new file mode 100644
index 000000000..6dd9d1659
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mastergolon.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml
new file mode 100644
index 000000000..af5a9ec15
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokiri.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml
new file mode 100644
index 000000000..1e489323c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterkokirihead.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml
new file mode 100644
index 000000000..2c703274e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_masterzoora.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml
new file mode 100644
index 000000000..a8471429d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mb.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml
new file mode 100644
index 000000000..0c80fb780
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_md.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml
new file mode 100644
index 000000000..533872a55
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_medal.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml
new file mode 100644
index 000000000..4c2b51df5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_menkuri_objects.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml
new file mode 100644
index 000000000..2acc9391a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mir_ray.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml
new file mode 100644
index 000000000..1abd73bc0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mizu_objects.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml
new file mode 100644
index 000000000..daf9b0541
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml
new file mode 100644
index 000000000..2fa0bdbe4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_dark.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml
new file mode 100644
index 000000000..6274feaee
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flame.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml
new file mode 100644
index 000000000..c1040ea11
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_flash.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml
new file mode 100644
index 000000000..1aaeea193
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_ice.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml
new file mode 100644
index 000000000..0f823b923
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_oka.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml
new file mode 100644
index 000000000..6386f7f9e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_soul.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml
new file mode 100644
index 000000000..8bba7eb91
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mjin_wind.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml
new file mode 100644
index 000000000..0b4aaae8a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mk.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml
new file mode 100644
index 000000000..834afe5ef
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mm.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml
new file mode 100644
index 000000000..526fa94dd
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mo.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml
new file mode 100644
index 000000000..bb1b31e2f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml
new file mode 100644
index 000000000..c750ce20d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri1a.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml
new file mode 100644
index 000000000..785b85857
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml
new file mode 100644
index 000000000..ad1bb4d5f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_hineri2a.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml
new file mode 100644
index 000000000..58ea8c085
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_objects.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml
new file mode 100644
index 000000000..b1a4b803c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mori_tex.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml
new file mode 100644
index 000000000..a87d0e6b3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ms.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml
new file mode 100644
index 000000000..7251ff721
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_mu.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml
new file mode 100644
index 000000000..74de9e285
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nb.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml
new file mode 100644
index 000000000..a74cbe7da
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_niw.xml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml
new file mode 100644
index 000000000..96ffa3238
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_nwc.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml
new file mode 100644
index 000000000..e2e8187ff
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ny.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml
new file mode 100644
index 000000000..1d665f101
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA1.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml
new file mode 100644
index 000000000..65d080834
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA10.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml
new file mode 100644
index 000000000..92ae474b6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA11.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml
new file mode 100644
index 000000000..ffdcd7989
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA2.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml
new file mode 100644
index 000000000..a492bd875
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA3.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml
new file mode 100644
index 000000000..dcdbbfff9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA4.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml
new file mode 100644
index 000000000..55072176d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA5.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml
new file mode 100644
index 000000000..c17a51088
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA6.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml
new file mode 100644
index 000000000..52c68f639
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA7.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml
new file mode 100644
index 000000000..8ed2d3df5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA8.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml
new file mode 100644
index 000000000..d5c16abfc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oA9.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml
new file mode 100644
index 000000000..2f50c967b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB1.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml
new file mode 100644
index 000000000..230783cea
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB2.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml
new file mode 100644
index 000000000..1c42ddacc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB3.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml
new file mode 100644
index 000000000..2924c9e75
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oB4.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml
new file mode 100644
index 000000000..4d5b1663f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml
new file mode 100644
index 000000000..04ce91437
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE10.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml
new file mode 100644
index 000000000..04f6f186d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE11.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml
new file mode 100644
index 000000000..a5fa39fd2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE12.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml
new file mode 100644
index 000000000..faf6ab734
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE1s.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml
new file mode 100644
index 000000000..af62ad6d1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE2.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml
new file mode 100644
index 000000000..95227da38
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE3.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml
new file mode 100644
index 000000000..ae48d2ade
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml
new file mode 100644
index 000000000..584019568
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE4s.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml
new file mode 100644
index 000000000..f5edf745a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE5.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml
new file mode 100644
index 000000000..95bb602b6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE6.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml
new file mode 100644
index 000000000..b3e588d4c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE7.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml
new file mode 100644
index 000000000..be5de2494
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE8.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml
new file mode 100644
index 000000000..8ea7ee18c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE9.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml
new file mode 100644
index 000000000..f6b4659e2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oE_anime.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml
new file mode 100644
index 000000000..c4f3a41f8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1d_map.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml
new file mode 100644
index 000000000..11359eff5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_oF1s.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml
new file mode 100644
index 000000000..4ef4ac44c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_o_anime.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml
new file mode 100644
index 000000000..b4fccea6f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_okuta.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml
new file mode 100644
index 000000000..fd0323027
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_opening_demo1.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml
new file mode 100644
index 000000000..7c3029443
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml
new file mode 100644
index 000000000..c90e37b37
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_os_anime.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml
new file mode 100644
index 000000000..963053f3f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ossan.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml
new file mode 100644
index 000000000..11da9b26e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ouke_haka.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml
new file mode 100644
index 000000000..fdc64b3aa
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_owl.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml
new file mode 100644
index 000000000..42ee66cde
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_peehat.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml
new file mode 100644
index 000000000..2ab8d64d8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_composer.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml
new file mode 100644
index 000000000..10b402e2c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_field.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml
new file mode 100644
index 000000000..e0c9f0834
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_po_sisters.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml
new file mode 100644
index 000000000..009d0fca3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_poh.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml
new file mode 100644
index 000000000..043e232d6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ps.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml
new file mode 100644
index 000000000..e1d686e97
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_pu_box.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml
new file mode 100644
index 000000000..05fa416d7
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rd.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml
new file mode 100644
index 000000000..32c697bd9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_reeba.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml
new file mode 100644
index 000000000..47b92fcd2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_relay_objects.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml
new file mode 100644
index 000000000..625ab83a1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rl.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml
new file mode 100644
index 000000000..98726b14b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rr.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml
new file mode 100644
index 000000000..1da1488af
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_rs.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml
new file mode 100644
index 000000000..3d413619f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru1.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml
new file mode 100644
index 000000000..2a8d70af3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ru2.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml
new file mode 100644
index 000000000..a19446453
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sa.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml
new file mode 100644
index 000000000..64d3bb005
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sb.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml
new file mode 100644
index 000000000..c72efeae1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sd.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml
new file mode 100644
index 000000000..594c43d39
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shop_dungen.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml
new file mode 100644
index 000000000..a4e12e38a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_shopnuts.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml
new file mode 100644
index 000000000..a23240a72
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_siofuki.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml
new file mode 100644
index 000000000..f2e7ef6d8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sk2.xml
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml
new file mode 100644
index 000000000..5b5efb484
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skb.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml
new file mode 100644
index 000000000..3abdd610f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_skj.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml
new file mode 100644
index 000000000..d3be88315
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_break.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml
new file mode 100644
index 000000000..10fb13aea
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot00_objects.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml
new file mode 100644
index 000000000..d44b944e0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoya.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml
new file mode 100644
index 000000000..720f50cd3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_matoyab.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml
new file mode 100644
index 000000000..413e032a9
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml
new file mode 100644
index 000000000..36741a949
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot01_objects2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml
new file mode 100644
index 000000000..65f45ff51
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot02_objects.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml
new file mode 100644
index 000000000..f182e7d99
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot03_object.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml
new file mode 100644
index 000000000..66293d752
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot04_objects.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml
new file mode 100644
index 000000000..6e7079149
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot05_objects.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml
new file mode 100644
index 000000000..e3da63b0f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot06_objects.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml
new file mode 100644
index 000000000..5bc2bfb6b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot07_object.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml
new file mode 100644
index 000000000..4d71f3473
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot08_obj.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml
new file mode 100644
index 000000000..b4d9ae42a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot09_obj.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml
new file mode 100644
index 000000000..257298f7c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot11_obj.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml
new file mode 100644
index 000000000..d619c781e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot12_obj.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml
new file mode 100644
index 000000000..bd59b8cd1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot15_obj.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml
new file mode 100644
index 000000000..d39de812a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot16_obj.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml
new file mode 100644
index 000000000..d4239d8d2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot17_obj.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml
new file mode 100644
index 000000000..cc12b7894
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_spot18_obj.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml
new file mode 100644
index 000000000..6283f8e9f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ssh.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml
new file mode 100644
index 000000000..a80780741
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_sst.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml
new file mode 100644
index 000000000..fe617cf14
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_st.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml
new file mode 100644
index 000000000..59b0838e4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_stream.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml
new file mode 100644
index 000000000..c1670edec
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_syokudai.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml
new file mode 100644
index 000000000..5e446bf5c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ta.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml
new file mode 100644
index 000000000..1d6b9e698
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_timeblock.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml
new file mode 100644
index 000000000..1be65c495
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tite.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml
new file mode 100644
index 000000000..6869280e6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tk.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml
new file mode 100644
index 000000000..cd07e60d2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toki_objects.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml
new file mode 100644
index 000000000..ec55bbe26
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_torch2.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml
new file mode 100644
index 000000000..73f3dcb1e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_toryo.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml
new file mode 100644
index 000000000..8ea908825
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tp.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml
new file mode 100644
index 000000000..e84d0896d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tr.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml
new file mode 100644
index 000000000..56195cf41
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_trap.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/objects/object_triforce_spot.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml
similarity index 100%
rename from soh/assets/xml/objects/object_triforce_spot.xml
rename to soh/assets/xml/GC_NMQ_PAL_F/objects/object_triforce_spot.xml
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml
new file mode 100644
index 000000000..567277bc3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ts.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml
new file mode 100644
index 000000000..ee2c5e184
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tsubo.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml
new file mode 100644
index 000000000..66cd3a7c2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_tw.xml
@@ -0,0 +1,332 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml
new file mode 100644
index 000000000..2ee4ade46
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_umajump.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml
new file mode 100644
index 000000000..2bab5efaa
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vali.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml
new file mode 100644
index 000000000..091d4c51e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vase.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml
new file mode 100644
index 000000000..c5b949b36
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_vm.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml
new file mode 100644
index 000000000..fbbc4f4af
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wallmaster.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml
new file mode 100644
index 000000000..1497d7a10
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp1.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml
new file mode 100644
index 000000000..b6d1b3624
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_warp2.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml
new file mode 100644
index 000000000..ebfb708d2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wf.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml
new file mode 100644
index 000000000..47ec342ca
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_wood02.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml
new file mode 100644
index 000000000..030ae9394
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_xc.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml
new file mode 100644
index 000000000..bed9e8a60
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yabusame_point.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml
new file mode 100644
index 000000000..e2adf307f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_ydan_objects.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml
new file mode 100644
index 000000000..d594ebbb8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_yukabyun.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml
new file mode 100644
index 000000000..7f20eb786
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zf.xml
@@ -0,0 +1,182 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml
new file mode 100644
index 000000000..79005516c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zg.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml
new file mode 100644
index 000000000..c7082a3db
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl1.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml
new file mode 100644
index 000000000..9af0a6527
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml
new file mode 100644
index 000000000..cada50486
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime1.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml
new file mode 100644
index 000000000..47016e2e0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl2_anime2.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml
new file mode 100644
index 000000000..b43e5ba34
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zl4.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml
new file mode 100644
index 000000000..77465760e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/objects/object_zo.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml
new file mode 100644
index 000000000..0f91c80be
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Fire.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml
new file mode 100644
index 000000000..001ac51d5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Ice.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml
new file mode 100644
index 000000000..e6e5c9776
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Arrow_Light.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml
new file mode 100644
index 000000000..e1ea84996
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Ganon_Otyuka.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml
new file mode 100644
index 000000000..857a14922
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Bg_Jya_Cobra.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml
new file mode 100644
index 000000000..f2ee5b7b8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Dodongo.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml
new file mode 100644
index 000000000..9f0e6e1f4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml
new file mode 100644
index 000000000..dfb01ba07
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Ganon2.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml
new file mode 100644
index 000000000..4e08c34f1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Boss_Sst.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml
new file mode 100644
index 000000000..1682fd16a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Demo_Shd.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml
new file mode 100644
index 000000000..8a77b7bd3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Bili.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml
new file mode 100644
index 000000000..fee5c6302
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Clear_Tag.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml
new file mode 100644
index 000000000..900ec46ac
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Mant.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml
new file mode 100644
index 000000000..91a5e31ac
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ganon_Organ.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml
new file mode 100644
index 000000000..65673c5ea
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Holl.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml
new file mode 100644
index 000000000..d7f2859cb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Jsjutan.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml
new file mode 100644
index 000000000..c2f8f7c23
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Kanban.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml
new file mode 100644
index 000000000..91321c648
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sda.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml
new file mode 100644
index 000000000..f12c4ee19
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Ssh.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml
new file mode 100644
index 000000000..d7b6b20cf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_St.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml
new file mode 100644
index 000000000..13daffa63
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_En_Sth.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml
new file mode 100644
index 000000000..77c39c63a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_End_Title.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml
new file mode 100644
index 000000000..f9aad776d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_File_Choose.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml
new file mode 100644
index 000000000..e6315effd
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Dark.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml
new file mode 100644
index 000000000..0ddfe4cfc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Fire.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml
new file mode 100644
index 000000000..3736e985e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Magic_Wind.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml
new file mode 100644
index 000000000..9a53952f0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Spot.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml
new file mode 100644
index 000000000..cb043eeb8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Storm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml
new file mode 100644
index 000000000..4ca01b04c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml
new file mode 100644
index 000000000..051f2177e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe2.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml
new file mode 100644
index 000000000..11f278866
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe3.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml
new file mode 100644
index 000000000..a4e410eba
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/overlays/ovl_Oceff_Wipe4.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml
new file mode 100644
index 000000000..70aac3464
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/Bmori1.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml
new file mode 100644
index 000000000..9e65ba617
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/FIRE_bs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml
new file mode 100644
index 000000000..cc2935a1c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml
new file mode 100644
index 000000000..eb55a19f5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdanCH.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml
new file mode 100644
index 000000000..d3280ffe6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HAKAdan_bs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml
new file mode 100644
index 000000000..dc4d56849
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/HIDAN.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml
new file mode 100644
index 000000000..beb765c85
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml
new file mode 100644
index 000000000..b64089530
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/MIZUsin_bs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml
new file mode 100644
index 000000000..c4edc9bea
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml
new file mode 100644
index 000000000..12d8d3e12
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/bdan_boss.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml
new file mode 100644
index 000000000..f6572b9f8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml
new file mode 100644
index 000000000..03eb73ea3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ddan_boss.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml
new file mode 100644
index 000000000..0582da79f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml
new file mode 100644
index 000000000..c75914c29
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_boss.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml
new file mode 100644
index 000000000..779cb9335
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_demo.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml
new file mode 100644
index 000000000..afe1cffdf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_final.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml
new file mode 100644
index 000000000..70313c8cf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_sonogo.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml
new file mode 100644
index 000000000..6642a8902
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganon_tou.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml
new file mode 100644
index 000000000..de24b26ff
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontika.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml
new file mode 100644
index 000000000..60020188f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ganontikasonogo.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml
new file mode 100644
index 000000000..531724ead
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/gerudoway.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml
new file mode 100644
index 000000000..4d25aa74f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ice_doukutu.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml
new file mode 100644
index 000000000..0f81c26fb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinboss.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml
new file mode 100644
index 000000000..ca5d0024a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/jyasinzou.xml
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml
new file mode 100644
index 000000000..acba3e7cb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/men.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml
new file mode 100644
index 000000000..9c4552e9e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/moribossroom.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml
new file mode 100644
index 000000000..465c5f0ca
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan.xml
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml
new file mode 100644
index 000000000..f4971e7fe
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/dungeons/ydan_boss.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml
new file mode 100644
index 000000000..e12fd269a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/bowling.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml
new file mode 100644
index 000000000..3c1fafb8d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/daiyousei_izumi.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml
new file mode 100644
index 000000000..04547ab21
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml
new file mode 100644
index 000000000..a33d77b07
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hairal_niwa_n.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml
new file mode 100644
index 000000000..bc1e2b966
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hakasitarelay.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml
new file mode 100644
index 000000000..a4ef5715f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hut.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml
new file mode 100644
index 000000000..829708604
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/hylia_labo.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml
new file mode 100644
index 000000000..db757e3d3
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/impa.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml
new file mode 100644
index 000000000..e4e9b102c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kakariko.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml
new file mode 100644
index 000000000..e6bcef90a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kenjyanoma.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml
new file mode 100644
index 000000000..8c0305493
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml
new file mode 100644
index 000000000..9f36eb41c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home3.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml
new file mode 100644
index 000000000..eb861aedb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home4.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml
new file mode 100644
index 000000000..974987fed
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/kokiri_home5.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml
new file mode 100644
index 000000000..c0a9d2eb8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/labo.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml
new file mode 100644
index 000000000..2fb88ae34
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/link_home.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml
new file mode 100644
index 000000000..653cffc3b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/mahouya.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml
new file mode 100644
index 000000000..aff97eeb8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/malon_stable.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml
new file mode 100644
index 000000000..41ff2db9f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/miharigoya.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml
new file mode 100644
index 000000000..49ff4a29c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/nakaniwa.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml
new file mode 100644
index 000000000..5490e84f1
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/syatekijyou.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml
new file mode 100644
index 000000000..ddee91543
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/takaraya.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml
new file mode 100644
index 000000000..de72cc5f4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tent.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml
new file mode 100644
index 000000000..e43f0a933
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/tokinoma.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml
new file mode 100644
index 000000000..990e1763b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_tate.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml
new file mode 100644
index 000000000..98923c569
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/indoors/yousei_izumi_yoko.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml
new file mode 100644
index 000000000..d8c06e545
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/enrui.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml
new file mode 100644
index 000000000..5b408ac3a
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/entra_n.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml
new file mode 100644
index 000000000..b13273bed
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml
new file mode 100644
index 000000000..146d0ce45
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana2.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml
new file mode 100644
index 000000000..1d31d66a4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hakaana_ouke.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml
new file mode 100644
index 000000000..1331fdd4c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/hiral_demo.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml
new file mode 100644
index 000000000..07b62c44d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakariko3.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml
new file mode 100644
index 000000000..e4254b750
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kakusiana.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml
new file mode 100644
index 000000000..d5dbacdb7
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/kinsuta.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml
new file mode 100644
index 000000000..c30467303
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml
new file mode 100644
index 000000000..65db60411
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_alley_n.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml
new file mode 100644
index 000000000..00887e69c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_day.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml
new file mode 100644
index 000000000..c58e38744
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_night.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml
new file mode 100644
index 000000000..f0ec75e75
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/market_ruins.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml
new file mode 100644
index 000000000..b9ddf2cf7
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml
new file mode 100644
index 000000000..4878338aa
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_n.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml
new file mode 100644
index 000000000..122036791
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/shrine_r.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml
new file mode 100644
index 000000000..ef6848edf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/misc/turibori.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml
new file mode 100644
index 000000000..92ee57f59
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/entra.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml
new file mode 100644
index 000000000..508beb85d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/souko.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml
new file mode 100644
index 000000000..4e933910c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot00.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml
new file mode 100644
index 000000000..e2da37e2d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot01.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml
new file mode 100644
index 000000000..334d0e599
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot02.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml
new file mode 100644
index 000000000..bf4039249
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot03.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml
new file mode 100644
index 000000000..c5824727f
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot04.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml
new file mode 100644
index 000000000..7c2c012bf
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot05.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml
new file mode 100644
index 000000000..c369533bb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot06.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml
new file mode 100644
index 000000000..e083e336d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot07.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml
new file mode 100644
index 000000000..136727c6d
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot08.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml
new file mode 100644
index 000000000..175fac890
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot09.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml
new file mode 100644
index 000000000..06349cf1e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot10.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml
new file mode 100644
index 000000000..99bf24c82
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot11.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml
new file mode 100644
index 000000000..77b0cfb07
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot12.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml
new file mode 100644
index 000000000..5686bbde5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot13.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml
new file mode 100644
index 000000000..f17e76d55
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot15.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml
new file mode 100644
index 000000000..026da9fd2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot16.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml
new file mode 100644
index 000000000..3aecc15a6
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot17.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml
new file mode 100644
index 000000000..513e67cbc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot18.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml
new file mode 100644
index 000000000..b75f3f5c0
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/overworld/spot20.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml
new file mode 100644
index 000000000..95548de1b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/alley_shop.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml
new file mode 100644
index 000000000..acb6515fb
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/drag.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml
new file mode 100644
index 000000000..16a974608
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/face_shop.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml
new file mode 100644
index 000000000..c58672798
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/golon.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml
new file mode 100644
index 000000000..50cd633e5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/kokiri_shop.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml
new file mode 100644
index 000000000..5954d9c83
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/night_shop.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml
new file mode 100644
index 000000000..525a06d63
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/shop1.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml
new file mode 100644
index 000000000..0e4ac18f8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/scenes/shops/zoora.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml
new file mode 100644
index 000000000..789a554ce
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_field.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml
new file mode 100644
index 000000000..f784afcf4
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/text/elf_message_ydan.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml
new file mode 100644
index 000000000..4cf46d252
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/text/nes_message_data_static.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml
new file mode 100644
index 000000000..0a7efda81
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/text/staff_message_data_static.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml
new file mode 100644
index 000000000..474734e71
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/backgrounds.xml
@@ -0,0 +1,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml
new file mode 100644
index 000000000..9ae8d9815
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/do_action_static.xml
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml
new file mode 100644
index 000000000..0c5f7621e
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_24_static.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml
new file mode 100644
index 000000000..873c490fc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_dungeon_static.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml
new file mode 100644
index 000000000..ed991406b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_field_static.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml
new file mode 100644
index 000000000..2c8ccad5b
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_fra_static.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml
new file mode 100644
index 000000000..fc2a50642
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_gameover_static.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml
new file mode 100644
index 000000000..ea71dda35
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_ger_static.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml
new file mode 100644
index 000000000..6cd92acfc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_nes_static.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml
new file mode 100644
index 000000000..7b61cf35c
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/icon_item_static.xml
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml
new file mode 100644
index 000000000..00c497490
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/item_name_static.xml
@@ -0,0 +1,373 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml
new file mode 100644
index 000000000..b5b1d1a85
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_48x85_static.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml
new file mode 100644
index 000000000..201955bfc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_grand_static.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml
new file mode 100644
index 000000000..1721f6d84
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_i_static.xml
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml
new file mode 100644
index 000000000..7f9d31589
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/map_name_static.xml
@@ -0,0 +1,106 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml
new file mode 100644
index 000000000..afdde60de
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_static.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml
new file mode 100644
index 000000000..bbf7e1259
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/message_texture_static.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml
new file mode 100644
index 000000000..b01646cb5
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/nes_font_static.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml
new file mode 100644
index 000000000..7a60524b2
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/nintendo_rogo_static.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml
new file mode 100644
index 000000000..bd4173431
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/parameter_static.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml
new file mode 100644
index 000000000..c1771d4c8
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/place_title_cards.xml
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml
new file mode 100644
index 000000000..9ff554c94
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/skyboxes.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml b/soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml
new file mode 100644
index 000000000..422b60cdc
--- /dev/null
+++ b/soh/assets/xml/GC_NMQ_PAL_F/textures/title_static.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/soh/assets/xml/text/nes_message_data_static.xml b/soh/assets/xml/text/nes_message_data_static.xml
deleted file mode 100644
index d7c0559c5..000000000
--- a/soh/assets/xml/text/nes_message_data_static.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/soh/assets/xml/text/staff_message_data_static.xml b/soh/assets/xml/text/staff_message_data_static.xml
deleted file mode 100644
index 447b91ccd..000000000
--- a/soh/assets/xml/text/staff_message_data_static.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/soh/build.c b/soh/build.c
deleted file mode 100644
index acb8d151d..000000000
--- a/soh/build.c
+++ /dev/null
@@ -1,8 +0,0 @@
-const char gBuildVersion[] = "DECKARD";
-const char gBuildTeam[] = "github.com/harbourmasters";
-#ifdef __TIMESTAMP__
-const char gBuildDate[] = __TIMESTAMP__;
-#else
-const char gBuildDate[] = __DATE__ " " __TIME__;
-#endif
-const char gBuildMakeOption[] = "";
\ No newline at end of file
diff --git a/soh/include/functions.h b/soh/include/functions.h
index adc3cef5f..d3bcc85dc 100644
--- a/soh/include/functions.h
+++ b/soh/include/functions.h
@@ -977,6 +977,7 @@ void LightContext_RemoveLight(GlobalContext* globalCtx, LightContext* lightCtx,
Lights* Lights_NewAndDraw(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambientB, u8 numLights, u8 r, u8 g,
u8 b, s8 x, s8 y, s8 z);
Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambientB);
+void Lights_GlowCheckPrepare(GlobalContext* globalCtx);
void Lights_GlowCheck(GlobalContext* globalCtx);
void Lights_DrawGlow(GlobalContext* globalCtx);
void ZeldaArena_CheckPointer(void* ptr, size_t size, const char* name, const char* action);
@@ -2397,6 +2398,9 @@ void FileChoose_Destroy(GameState* thisx);
char* SetQuote();
+void Heaps_Alloc(void);
+void Heaps_Free(void);
+
#ifdef __cplusplus
};
#endif
diff --git a/soh/include/macros.h b/soh/include/macros.h
index c48762228..43666eb1f 100644
--- a/soh/include/macros.h
+++ b/soh/include/macros.h
@@ -129,6 +129,7 @@ extern GraphicsContext* __gfxCtx;
#define WORK_DISP __gfxCtx->work.p
#define POLY_OPA_DISP __gfxCtx->polyOpa.p
#define POLY_XLU_DISP __gfxCtx->polyXlu.p
+#define TITLE_CARD_DISP __gfxCtx->titlecard.p
#define POLY_KAL_DISP __gfxCtx->polyKal.p
#define OVERLAY_DISP __gfxCtx->overlay.p
diff --git a/soh/include/variables.h b/soh/include/variables.h
index 80e3b792d..64b8c75c7 100644
--- a/soh/include/variables.h
+++ b/soh/include/variables.h
@@ -99,6 +99,7 @@ extern "C"
extern u32 gGsFlagsMasks[4];
extern u32 gGsFlagsShifts[4];
extern void* gItemIcons[0x82];
+ extern u8 gItemAgeReqs[];
extern u8 gItemSlots[56];
extern void (*gSceneCmdHandlers[26])(GlobalContext*, SceneCmd*);
extern s16 gLinkObjectIds[2];
@@ -237,8 +238,8 @@ extern void(*D_801755D0)(void);
extern u8 gGfxSPTaskYieldBuffer[OS_YIELD_DATA_SIZE]; // 0xC00 bytes
extern u8 gGfxSPTaskStack[0x400]; // 0x400 bytes
extern GfxPool gGfxPools[2]; // 0x24820 bytes
- extern u8 gAudioHeap[0x38000]; // 0x38000 bytes
- extern u8 gSystemHeap[];
+ extern u8* gAudioHeap;
+ extern u8* gSystemHeap;
#ifdef __cplusplus
};
diff --git a/soh/include/z64.h b/soh/include/z64.h
index 6e783eeb9..92966f239 100644
--- a/soh/include/z64.h
+++ b/soh/include/z64.h
@@ -83,6 +83,7 @@ typedef struct {
/* 0x00000 */ u16 headMagic; // GFXPOOL_HEAD_MAGIC
/* 0x00008 */ Gfx polyOpaBuffer[0x2FC0];
/* 0x0BF08 */ Gfx polyXluBuffer[0x1000];
+ /* 0xXXXXX */ Gfx titlecardBuffer[0x1000];
/* 0x0BF08 */ Gfx polyKalBuffer[0x1000];
/* 0x0FF08 */ Gfx overlayBuffer[0x800];
/* 0x11F08 */ Gfx workBuffer[0x100];
@@ -130,6 +131,7 @@ typedef struct OSScTask {
typedef struct GraphicsContext {
/* 0x0000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0"
/* 0x0004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1"
+ /* 0xXXX */ Gfx* titlecardBuffer; // Pointer to "Paris"
/* 0xXXX */ Gfx* polyKalBuffer; // Pointer to "Rome"
/* 0x0008 */ char unk_008[0x08]; // Unused, could this be pointers to "Zelda 2" / "Zelda 3"
/* 0x0010 */ Gfx* overlayBuffer; // Pointer to "Zelda 4"
@@ -149,6 +151,7 @@ typedef struct GraphicsContext {
/* 0x02A8 */ TwoHeadGfxArena overlay; // "Zelda 4"
/* 0x02B8 */ TwoHeadGfxArena polyOpa; // "Zelda 0"
/* 0x02C8 */ TwoHeadGfxArena polyXlu; // "Zelda 1"
+ /* 0x0XXX */ TwoHeadGfxArena titlecard; // When in Paris...
/* 0x0XXX */ TwoHeadGfxArena polyKal; // When in Rome...
/* 0x02D8 */ u32 gfxPoolIdx;
/* 0x02DC */ u16* curFrameBuffer;
@@ -336,16 +339,18 @@ typedef enum {
} SkyboxId;
typedef struct {
- /* 0x000 */ char unk_00[0x128];
- /* 0x128 */ void* staticSegments[2];
- /* 0x130 */ u16 (*palettes)[256];
- /* 0x134 */ Gfx (*dListBuf)[150];
- /* 0x138 */ Gfx* unk_138;
- /* 0x13C */ Vtx* roomVtx;
- /* 0x140 */ s16 unk_140;
- /* 0x144 */ Vec3f rot;
- /* 0x150 */ char unk_150[0x10];
-} SkyboxContext; // size = 0x160
+ char unk_00[0x128];
+ s16 skyboxId;
+ void* textures[2][6];
+ void* palettes[6];
+ u16 palette_size;
+ Gfx (*dListBuf)[150];
+ Gfx* unk_138;
+ Vtx* roomVtx;
+ s16 unk_140;
+ Vec3f rot;
+ char unk_150[0x10];
+} SkyboxContext;
typedef enum {
/* 0 */ OCARINA_SONG_MINUET,
diff --git a/soh/soh.vcxproj b/soh/soh.vcxproj
index 9d5b509f2..d35dd18b3 100644
--- a/soh/soh.vcxproj
+++ b/soh/soh.vcxproj
@@ -112,9 +112,6 @@
true
true
-
- copy /b $(ProjectDir)src\boot\build.c +,,
-
@@ -144,7 +141,7 @@
false
INCLUDE_GAME_PRINTF;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;ENABLE_DX11;%(PreprocessorDefinitions)GLEW_STATIC
true
- stdcpp17
+ stdcpp20
MultiThreadedDebug
true
@@ -178,11 +175,14 @@
+
+
+
@@ -922,8 +922,11 @@
+
+
+
@@ -1401,4 +1404,4 @@
-
\ No newline at end of file
+
diff --git a/soh/soh.vcxproj.filters b/soh/soh.vcxproj.filters
index 30ca9d4ed..c31a78b19 100644
--- a/soh/soh.vcxproj.filters
+++ b/soh/soh.vcxproj.filters
@@ -76,6 +76,12 @@
{18b9727f-30de-4ab8-a317-916090d4a110}
+
+ {9a4378ec-e30f-47b6-9ad6-5ce738b4cf99}
+
+
+ {04fc1c52-49ff-48e2-ae23-2c00867374f8}
+
@@ -2169,6 +2175,15 @@
Source Files\src\overlays\actors
+
+ Source Files\soh\Enhancements\debugger
+
+
+ Source Files\soh\Enhancements\debugger
+
+
+ Source Files\soh
+
@@ -3710,6 +3725,15 @@
Header Files
+
+ Header Files\soh\Enhancements\debugger
+
+
+ Header Files\soh\Enhancements\debugger
+
+
+ Header Files\soh
+
diff --git a/soh/soh/Enhancements/bootcommands.c b/soh/soh/Enhancements/bootcommands.c
index 6901c4644..da4276f77 100644
--- a/soh/soh/Enhancements/bootcommands.c
+++ b/soh/soh/Enhancements/bootcommands.c
@@ -24,6 +24,11 @@ void BootCommands_Init()
CVar_RegisterS32("gDisableLOD", 0);
CVar_RegisterS32("gDebugEnabled", 0);
CVar_RegisterS32("gPauseLiveLink", 0);
+ CVar_RegisterS32("gMinimalUI", 0);
+ CVar_RegisterS32("gRumbleEnabled", 0);
+ CVar_RegisterS32("gUniformLR", 1);
+ CVar_RegisterS32("gNewDrops", 0);
+ CVar_RegisterS32("gVisualAgony", 0);
}
//void BootCommands_ParseBootArgs(char* str)
diff --git a/soh/soh/Enhancements/debugconsole.cpp b/soh/soh/Enhancements/debugconsole.cpp
index bbce43255..c3e9da7d4 100644
--- a/soh/soh/Enhancements/debugconsole.cpp
+++ b/soh/soh/Enhancements/debugconsole.cpp
@@ -337,11 +337,11 @@ static bool SetCVarHandler(const std::vector& args) {
int vType = CheckVarType(args[2]);
if (vType == VARTYPE_STRING)
- CVar_SetString((char*)args[1].c_str(), (char*)args[2].c_str());
+ CVar_SetString(args[1].c_str(), (char*)args[2].c_str());
else if (vType == VARTYPE_FLOAT)
- CVar_SetFloat((char*)args[1].c_str(), std::stof(args[2]));
+ CVar_SetFloat(args[1].c_str(), std::stof(args[2]));
else
- CVar_SetS32((char*)args[1].c_str(), std::stoi(args[2]));
+ CVar_SetS32(args[1].c_str(), std::stoi(args[2]));
DebugConsole_SaveCVars();
@@ -354,7 +354,7 @@ static bool GetCVarHandler(const std::vector& args) {
if (args.size() < 2)
return CMD_FAILED;
- CVar* cvar = CVar_GetVar((char*) args[1].c_str());
+ CVar* cvar = CVar_GetVar(args[1].c_str());
if (cvar != nullptr)
{
@@ -446,4 +446,4 @@ void DebugConsole_SaveCVars()
}
File::WriteAllText("cvars.cfg", output);
-}
\ No newline at end of file
+}
diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.cpp b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
new file mode 100644
index 000000000..2aaac5a1b
--- /dev/null
+++ b/soh/soh/Enhancements/debugger/debugSaveEditor.cpp
@@ -0,0 +1,1140 @@
+#include "debugSaveEditor.h"
+#include "../../util.h"
+#include "../libultraship/SohImGuiImpl.h"
+
+#include
+#include
+#include
+#include
+
+extern "C" {
+#include
+#include "variables.h"
+#include "functions.h"
+#include "macros.h"
+extern GlobalContext* gGlobalCtx;
+
+#include "textures/icon_item_static/icon_item_static.h"
+#include "textures/icon_item_24_static/icon_item_24_static.h"
+}
+
+typedef struct {
+ uint32_t id;
+ std::string name;
+ std::string nameFaded;
+ std::string texturePath;
+} ItemMapEntry;
+
+#define ITEM_MAP_ENTRY(id) \
+ { \
+ id, { \
+ id, #id, #id "_Faded", static_cast(gItemIcons[id]) \
+ } \
+ }
+
+// Maps items ids to info for use in ImGui
+std::map itemMapping = {
+ ITEM_MAP_ENTRY(ITEM_STICK),
+ ITEM_MAP_ENTRY(ITEM_NUT),
+ ITEM_MAP_ENTRY(ITEM_BOMB),
+ ITEM_MAP_ENTRY(ITEM_BOW),
+ ITEM_MAP_ENTRY(ITEM_ARROW_FIRE),
+ ITEM_MAP_ENTRY(ITEM_DINS_FIRE),
+ ITEM_MAP_ENTRY(ITEM_SLINGSHOT),
+ ITEM_MAP_ENTRY(ITEM_OCARINA_FAIRY),
+ ITEM_MAP_ENTRY(ITEM_OCARINA_TIME),
+ ITEM_MAP_ENTRY(ITEM_BOMBCHU),
+ ITEM_MAP_ENTRY(ITEM_HOOKSHOT),
+ ITEM_MAP_ENTRY(ITEM_LONGSHOT),
+ ITEM_MAP_ENTRY(ITEM_ARROW_ICE),
+ ITEM_MAP_ENTRY(ITEM_FARORES_WIND),
+ ITEM_MAP_ENTRY(ITEM_BOOMERANG),
+ ITEM_MAP_ENTRY(ITEM_LENS),
+ ITEM_MAP_ENTRY(ITEM_BEAN),
+ ITEM_MAP_ENTRY(ITEM_HAMMER),
+ ITEM_MAP_ENTRY(ITEM_ARROW_LIGHT),
+ ITEM_MAP_ENTRY(ITEM_NAYRUS_LOVE),
+ ITEM_MAP_ENTRY(ITEM_BOTTLE),
+ ITEM_MAP_ENTRY(ITEM_POTION_RED),
+ ITEM_MAP_ENTRY(ITEM_POTION_GREEN),
+ ITEM_MAP_ENTRY(ITEM_POTION_BLUE),
+ ITEM_MAP_ENTRY(ITEM_FAIRY),
+ ITEM_MAP_ENTRY(ITEM_FISH),
+ ITEM_MAP_ENTRY(ITEM_MILK_BOTTLE),
+ ITEM_MAP_ENTRY(ITEM_LETTER_RUTO),
+ ITEM_MAP_ENTRY(ITEM_BLUE_FIRE),
+ ITEM_MAP_ENTRY(ITEM_BUG),
+ ITEM_MAP_ENTRY(ITEM_BIG_POE),
+ ITEM_MAP_ENTRY(ITEM_MILK_HALF),
+ ITEM_MAP_ENTRY(ITEM_POE),
+ ITEM_MAP_ENTRY(ITEM_WEIRD_EGG),
+ ITEM_MAP_ENTRY(ITEM_CHICKEN),
+ ITEM_MAP_ENTRY(ITEM_LETTER_ZELDA),
+ ITEM_MAP_ENTRY(ITEM_MASK_KEATON),
+ ITEM_MAP_ENTRY(ITEM_MASK_SKULL),
+ ITEM_MAP_ENTRY(ITEM_MASK_SPOOKY),
+ ITEM_MAP_ENTRY(ITEM_MASK_BUNNY),
+ ITEM_MAP_ENTRY(ITEM_MASK_GORON),
+ ITEM_MAP_ENTRY(ITEM_MASK_ZORA),
+ ITEM_MAP_ENTRY(ITEM_MASK_GERUDO),
+ ITEM_MAP_ENTRY(ITEM_MASK_TRUTH),
+ ITEM_MAP_ENTRY(ITEM_SOLD_OUT),
+ ITEM_MAP_ENTRY(ITEM_POCKET_EGG),
+ ITEM_MAP_ENTRY(ITEM_POCKET_CUCCO),
+ ITEM_MAP_ENTRY(ITEM_COJIRO),
+ ITEM_MAP_ENTRY(ITEM_ODD_MUSHROOM),
+ ITEM_MAP_ENTRY(ITEM_ODD_POTION),
+ ITEM_MAP_ENTRY(ITEM_SAW),
+ ITEM_MAP_ENTRY(ITEM_SWORD_BROKEN),
+ ITEM_MAP_ENTRY(ITEM_PRESCRIPTION),
+ ITEM_MAP_ENTRY(ITEM_FROG),
+ ITEM_MAP_ENTRY(ITEM_EYEDROPS),
+ ITEM_MAP_ENTRY(ITEM_CLAIM_CHECK),
+ ITEM_MAP_ENTRY(ITEM_BOW_ARROW_FIRE),
+ ITEM_MAP_ENTRY(ITEM_BOW_ARROW_ICE),
+ ITEM_MAP_ENTRY(ITEM_BOW_ARROW_LIGHT),
+ ITEM_MAP_ENTRY(ITEM_SWORD_KOKIRI),
+ ITEM_MAP_ENTRY(ITEM_SWORD_MASTER),
+ ITEM_MAP_ENTRY(ITEM_SWORD_BGS),
+ ITEM_MAP_ENTRY(ITEM_SHIELD_DEKU),
+ ITEM_MAP_ENTRY(ITEM_SHIELD_HYLIAN),
+ ITEM_MAP_ENTRY(ITEM_SHIELD_MIRROR),
+ ITEM_MAP_ENTRY(ITEM_TUNIC_KOKIRI),
+ ITEM_MAP_ENTRY(ITEM_TUNIC_GORON),
+ ITEM_MAP_ENTRY(ITEM_TUNIC_ZORA),
+ ITEM_MAP_ENTRY(ITEM_BOOTS_KOKIRI),
+ ITEM_MAP_ENTRY(ITEM_BOOTS_IRON),
+ ITEM_MAP_ENTRY(ITEM_BOOTS_HOVER),
+ ITEM_MAP_ENTRY(ITEM_BULLET_BAG_30),
+ ITEM_MAP_ENTRY(ITEM_BULLET_BAG_40),
+ ITEM_MAP_ENTRY(ITEM_BULLET_BAG_50),
+ ITEM_MAP_ENTRY(ITEM_QUIVER_30),
+ ITEM_MAP_ENTRY(ITEM_QUIVER_40),
+ ITEM_MAP_ENTRY(ITEM_QUIVER_50),
+ ITEM_MAP_ENTRY(ITEM_BOMB_BAG_20),
+ ITEM_MAP_ENTRY(ITEM_BOMB_BAG_30),
+ ITEM_MAP_ENTRY(ITEM_BOMB_BAG_40),
+ ITEM_MAP_ENTRY(ITEM_BRACELET),
+ ITEM_MAP_ENTRY(ITEM_GAUNTLETS_SILVER),
+ ITEM_MAP_ENTRY(ITEM_GAUNTLETS_GOLD),
+ ITEM_MAP_ENTRY(ITEM_SCALE_SILVER),
+ ITEM_MAP_ENTRY(ITEM_SCALE_GOLDEN),
+ ITEM_MAP_ENTRY(ITEM_SWORD_KNIFE),
+ ITEM_MAP_ENTRY(ITEM_WALLET_ADULT),
+ ITEM_MAP_ENTRY(ITEM_WALLET_GIANT),
+ ITEM_MAP_ENTRY(ITEM_SEEDS),
+ ITEM_MAP_ENTRY(ITEM_FISHING_POLE),
+ ITEM_MAP_ENTRY(ITEM_KEY_BOSS),
+ ITEM_MAP_ENTRY(ITEM_COMPASS),
+ ITEM_MAP_ENTRY(ITEM_DUNGEON_MAP),
+ ITEM_MAP_ENTRY(ITEM_KEY_SMALL),
+};
+
+// Maps entries in the GS flag array to the area name it represents
+std::vector gsMapping = {
+ "Deku Tree",
+ "Dodongo's Cavern",
+ "Inside Jabu-Jabu's Belly",
+ "Forest Temple",
+ "Fire Temple",
+ "Water Temple",
+ "Spirit Temple",
+ "Shadow Temple",
+ "Bottom of the Well",
+ "Ice Cavern",
+ "Hyrule Field",
+ "Lon Lon Ranch",
+ "Kokiri Forest",
+ "Lost Woods, Sacred Forest Meadow",
+ "Castle Town and Ganon's Castle",
+ "Death Mountain Trail, Goron City",
+ "Kakariko Village",
+ "Zora Fountain, River",
+ "Lake Hylia",
+ "Gerudo Valley",
+ "Gerudo Fortress",
+ "Desert Colossus, Haunted Wasteland",
+};
+
+extern "C" u8 gAreaGsFlags[];
+
+extern "C" u8 gAmmoItems[];
+
+// Modification of gAmmoItems that replaces ITEM_NONE with the item in inventory slot it represents
+u8 gAllAmmoItems[] = {
+ ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE,
+ ITEM_SLINGSHOT, ITEM_OCARINA_TIME, ITEM_BOMBCHU, ITEM_LONGSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND,
+ ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER,
+};
+
+typedef struct {
+ uint32_t id;
+ std::string name;
+ std::string nameFaded;
+ std::string texturePath;
+} QuestMapEntry;
+
+#define QUEST_MAP_ENTRY(id, tex) \
+ { \
+ id, { \
+ id, #id, #id "_Faded", tex \
+ } \
+ }
+
+// Maps quest items ids to info for use in ImGui
+std::map questMapping = {
+ QUEST_MAP_ENTRY(QUEST_MEDALLION_FOREST, gForestMedallionIconTex),
+ QUEST_MAP_ENTRY(QUEST_MEDALLION_FIRE, gFireMedallionIconTex),
+ QUEST_MAP_ENTRY(QUEST_MEDALLION_WATER, gWaterMedallionIconTex),
+ QUEST_MAP_ENTRY(QUEST_MEDALLION_SPIRIT, gSpiritMedallionIconTex),
+ QUEST_MAP_ENTRY(QUEST_MEDALLION_SHADOW, gShadowMedallionIconTex),
+ QUEST_MAP_ENTRY(QUEST_MEDALLION_LIGHT, gLightMedallionIconTex),
+ QUEST_MAP_ENTRY(QUEST_KOKIRI_EMERALD, gKokiriEmeraldIconTex),
+ QUEST_MAP_ENTRY(QUEST_GORON_RUBY, gGoronRubyIconTex),
+ QUEST_MAP_ENTRY(QUEST_ZORA_SAPPHIRE, gZoraSapphireIconTex),
+ QUEST_MAP_ENTRY(QUEST_STONE_OF_AGONY, gStoneOfAgonyIconTex),
+ QUEST_MAP_ENTRY(QUEST_GERUDO_CARD, gGerudosCardIconTex),
+};
+
+typedef struct {
+ uint32_t id;
+ std::string name;
+ std::string nameFaded;
+ ImVec4 color;
+} SongMapEntry;
+
+#define SONG_MAP_ENTRY(id, r, g, b) \
+ { \
+ id, #id, #id "_Faded", ImVec4(r / 255.0f, g / 255.0f, b / 255.0f, 1.0f) \
+ }
+
+// Maps song ids to info for use in ImGui
+std::array songMapping = { {
+ SONG_MAP_ENTRY(QUEST_SONG_LULLABY, 255, 255, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_EPONA, 255, 255, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_SARIA, 255, 255, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_SUN, 255, 255, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_TIME, 255, 255, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_STORMS, 255, 255, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_MINUET, 150, 255, 100),
+ SONG_MAP_ENTRY(QUEST_SONG_BOLERO, 255, 80, 40),
+ SONG_MAP_ENTRY(QUEST_SONG_SERENADE, 100, 150, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_REQUIEM, 255, 160, 0),
+ SONG_MAP_ENTRY(QUEST_SONG_NOCTURNE, 255, 100, 255),
+ SONG_MAP_ENTRY(QUEST_SONG_PRELUDE, 255, 240, 100),
+} };
+
+// Adds a text tooltip for the previous ImGui item
+void SetLastItemHoverText(const std::string& text) {
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::Text(text.c_str());
+ ImGui::EndTooltip();
+ }
+}
+
+// Adds a "?" next to the previous ImGui item with a custom tooltip
+void InsertHelpHoverText(const std::string& text) {
+ ImGui::SameLine();
+ ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "?");
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::Text(text.c_str());
+ ImGui::EndTooltip();
+ }
+}
+
+// Encapsulates what is drawn by the passed-in function within a border
+template
+void DrawGroupWithBorder(T&& drawFunc) {
+ // First group encapsulates the inner portion and border
+ ImGui::BeginGroup();
+
+ ImVec2 padding = ImGui::GetStyle().FramePadding;
+ ImVec2 p0 = ImGui::GetCursorScreenPos();
+ ImGui::SetCursorScreenPos(ImVec2(p0.x + padding.x, p0.y + padding.y));
+
+ // Second group encapsulates just the inner portion
+ ImGui::BeginGroup();
+
+ drawFunc();
+
+ ImGui::Dummy(padding);
+ ImGui::EndGroup();
+
+ ImVec2 p1 = ImGui::GetItemRectMax();
+ p1.x += padding.x;
+ ImVec4 borderCol = ImGui::GetStyle().Colors[ImGuiCol_Border];
+ ImGui::GetWindowDrawList()->AddRect(p0, p1, IM_COL32(borderCol.x * 255, borderCol.y * 255, borderCol.z * 255, borderCol.w * 255));
+
+ ImGui::EndGroup();
+}
+
+void DrawInfoTab() {
+ // TODO This is the bare minimum to get the player name showing
+ // There will need to be more effort to get it robust and editable
+ std::string name;
+ for (int i = 0; i < 8; i++) {
+ char letter = gSaveContext.playerName[i] + 0x3D;
+ if (letter == '{') {
+ letter = '\0';
+ }
+ name += letter;
+ }
+ name += '\0';
+
+ ImGui::PushItemWidth(ImGui::GetFontSize() * 6);
+
+ ImGui::Text("Name: %s", name.c_str());
+ InsertHelpHoverText("Player Name");
+
+ // Use an intermediary to keep the health from updating (and potentially killing the player)
+ // until it is done being edited
+ int16_t healthIntermediary = gSaveContext.healthCapacity;
+ ImGui::InputScalar("Max Health", ImGuiDataType_S16, &healthIntermediary);
+ if (ImGui::IsItemDeactivated()) {
+ gSaveContext.healthCapacity = healthIntermediary;
+ }
+ InsertHelpHoverText("Maximum health. 16 units per full heart");
+ if (gSaveContext.health > gSaveContext.healthCapacity) {
+ gSaveContext.health = gSaveContext.healthCapacity; // Clamp health to new max
+ }
+
+ const uint16_t healthMin = 0;
+ const uint16_t healthMax = gSaveContext.healthCapacity;
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
+ ImGui::SliderScalar("Health", ImGuiDataType_S16, &gSaveContext.health, &healthMin, &healthMax);
+ InsertHelpHoverText("Current health. 16 units per full heart");
+
+ bool doubleDefense = gSaveContext.doubleDefense != 0;
+ if (ImGui::Checkbox("Double Defense", &doubleDefense)) {
+ gSaveContext.doubleDefense = doubleDefense;
+ gSaveContext.inventory.defenseHearts =
+ gSaveContext.doubleDefense ? 20 : 0; // Set to get the border drawn in the UI
+ }
+ InsertHelpHoverText("Is double defense unlocked?");
+
+ std::string magicName;
+ if (gSaveContext.magicLevel == 2) {
+ magicName = "Double";
+ } else if (gSaveContext.magicLevel == 1) {
+ magicName = "Single";
+ } else {
+ magicName = "None";
+ }
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6);
+ if (ImGui::BeginCombo("Magic Level", magicName.c_str())) {
+ if (ImGui::Selectable("Double")) {
+ gSaveContext.magicLevel = 2;
+ gSaveContext.magicAcquired = true;
+ gSaveContext.doubleMagic = true;
+ }
+ if (ImGui::Selectable("Single")) {
+ gSaveContext.magicLevel = 1;
+ gSaveContext.magicAcquired = true;
+ gSaveContext.doubleMagic = false;
+ }
+ if (ImGui::Selectable("None")) {
+ gSaveContext.magicLevel = 0;
+ gSaveContext.magicAcquired = false;
+ gSaveContext.doubleMagic = false;
+ }
+
+ ImGui::EndCombo();
+ }
+ InsertHelpHoverText("Current magic level");
+ gSaveContext.unk_13F4 = gSaveContext.magicLevel * 0x30; // Set to get the bar drawn in the UI
+ if (gSaveContext.magic > gSaveContext.unk_13F4) {
+ gSaveContext.magic = gSaveContext.unk_13F4; // Clamp magic to new max
+ }
+
+ const uint8_t magicMin = 0;
+ const uint8_t magicMax = gSaveContext.unk_13F4;
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
+ ImGui::SliderScalar("Magic", ImGuiDataType_S8, &gSaveContext.magic, &magicMin, &magicMax);
+ InsertHelpHoverText("Current magic. 48 units per magic level");
+
+ ImGui::InputScalar("Rupees", ImGuiDataType_S16, &gSaveContext.rupees);
+ InsertHelpHoverText("Current rupees");
+
+ const uint16_t dayTimeMin = 0;
+ const uint16_t dayTimeMax = 0xFFFF;
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
+ ImGui::SliderScalar("Time", ImGuiDataType_U16, &gSaveContext.dayTime, &dayTimeMin, &dayTimeMax);
+ InsertHelpHoverText("Time of day");
+ if (ImGui::Button("Dawn")) {
+ gSaveContext.dayTime = 0x4000;
+ }
+ ImGui::SameLine();
+ if (ImGui::Button("Noon")) {
+ gSaveContext.dayTime = 0x8000;
+ }
+ ImGui::SameLine();
+ if (ImGui::Button("Sunset")) {
+ gSaveContext.dayTime = 0xC000;
+ }
+ ImGui::SameLine();
+ if (ImGui::Button("Midnight")) {
+ gSaveContext.dayTime = 0;
+ }
+
+ ImGui::InputScalar("Total Days", ImGuiDataType_S32, &gSaveContext.totalDays);
+ InsertHelpHoverText("Total number of days elapsed since the start of the game");
+
+ ImGui::InputScalar("Deaths", ImGuiDataType_U16, &gSaveContext.deaths);
+ InsertHelpHoverText("Total number of deaths");
+
+ bool bgsFlag = gSaveContext.bgsFlag != 0;
+ if (ImGui::Checkbox("Has BGS", &bgsFlag)) {
+ gSaveContext.bgsFlag = bgsFlag;
+ }
+ InsertHelpHoverText("Is Biggoron sword unlocked? Replaces Giant's knife");
+
+ ImGui::InputScalar("Sword Health", ImGuiDataType_U16, &gSaveContext.swordHealth);
+ InsertHelpHoverText("Giant's knife health. Default is 8. Must be >0 for Biggoron sword to work");
+
+ ImGui::InputScalar("Bgs Day Count", ImGuiDataType_S32, &gSaveContext.bgsDayCount);
+ InsertHelpHoverText("Total number of days elapsed since giving Biggoron the claim check");
+
+ // TODO Changing Link's age is more involved than just setting gSaveContext.linkAge
+ // It might not fit here and instead should be only changable when changing scenes
+ /*
+ if (ImGui::BeginCombo("Link Age", LINK_IS_ADULT ? "Adult" : "Child")) {
+ if (ImGui::Selectable("Adult")) {
+ gSaveContext.linkAge = 0;
+ }
+ if (ImGui::Selectable("Child")) {
+ gSaveContext.linkAge = 1;
+ }
+
+ ImGui::EndCombo();
+ }
+ */
+
+ ImGui::PopItemWidth();
+}
+
+void DrawInventoryTab() {
+ static bool restrictToValid = true;
+
+ ImGui::Checkbox("Restrict to valid items", &restrictToValid);
+ InsertHelpHoverText("Restricts items and ammo to only what is possible to legally acquire in-game");
+
+ for (int32_t y = 0; y < 4; y++) {
+ for (int32_t x = 0; x < 6; x++) {
+ int32_t index = x + y * 6;
+ static int32_t selectedIndex = -1;
+ static const char* itemPopupPicker = "itemPopupPicker";
+
+ ImGui::PushID(index);
+
+ if (x != 0) {
+ ImGui::SameLine();
+ }
+
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0));
+ ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
+ uint8_t item = gSaveContext.inventory.items[index];
+ if (item != ITEM_NONE) {
+ const ItemMapEntry& slotEntry = itemMapping.find(item)->second;
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0),
+ ImVec2(1, 1), 0)) {
+ selectedIndex = index;
+ ImGui::OpenPopup(itemPopupPicker);
+ }
+ } else {
+ if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) {
+ selectedIndex = index;
+ ImGui::OpenPopup(itemPopupPicker);
+ }
+ }
+ ImGui::PopStyleVar();
+ ImGui::PopStyleColor();
+
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
+ if (ImGui::BeginPopup(itemPopupPicker)) {
+ if (ImGui::Button("##itemNonePicker", ImVec2(32.0f, 32.0f))) {
+ gSaveContext.inventory.items[selectedIndex] = ITEM_NONE;
+ ImGui::CloseCurrentPopup();
+ }
+ SetLastItemHoverText("None");
+
+ std::vector possibleItems;
+ if (restrictToValid) {
+ // Scan gItemSlots to find legal items for this slot. Bottles are a special case
+ for (int slotIndex = 0; slotIndex < 56; slotIndex++) {
+ int testIndex = (selectedIndex == SLOT_BOTTLE_1 || selectedIndex == SLOT_BOTTLE_2 ||
+ selectedIndex == SLOT_BOTTLE_3 || selectedIndex == SLOT_BOTTLE_4)
+ ? SLOT_BOTTLE_1
+ : selectedIndex;
+ if (gItemSlots[slotIndex] == testIndex) {
+ possibleItems.push_back(itemMapping[slotIndex]);
+ }
+ }
+ } else {
+ for (const auto& entry : itemMapping) {
+ possibleItems.push_back(entry.second);
+ }
+ }
+
+ for (int32_t pickerIndex = 0; pickerIndex < possibleItems.size(); pickerIndex++) {
+ if (((pickerIndex + 1) % 8) != 0) {
+ ImGui::SameLine();
+ }
+ const ItemMapEntry& slotEntry = possibleItems[pickerIndex];
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f),
+ ImVec2(0, 0), ImVec2(1, 1), 0)) {
+ gSaveContext.inventory.items[selectedIndex] = slotEntry.id;
+ ImGui::CloseCurrentPopup();
+ }
+ SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id));
+ }
+
+ ImGui::EndPopup();
+ }
+ ImGui::PopStyleVar();
+
+ ImGui::PopID();
+ }
+ }
+
+ ImGui::Text("Ammo");
+ for (uint32_t ammoIndex = 0, drawnAmmoItems = 0; ammoIndex < 16; ammoIndex++) {
+ uint8_t item = (restrictToValid) ? gAmmoItems[ammoIndex] : gAllAmmoItems[ammoIndex];
+ if (item != ITEM_NONE) {
+ // For legal items, display as 1 row of 7. For unrestricted items, display rows of 6 to match
+ // inventory
+ if ((restrictToValid && (drawnAmmoItems != 0)) || ((drawnAmmoItems % 6) != 0)) {
+ ImGui::SameLine();
+ }
+ drawnAmmoItems++;
+
+ ImGui::PushID(ammoIndex);
+ ImGui::PushItemWidth(32.0f);
+ ImGui::BeginGroup();
+
+ ImGui::Image(SohImGui::GetTextureByName(itemMapping[item].name), ImVec2(32.0f, 32.0f));
+ ImGui::InputScalar("##ammoInput", ImGuiDataType_S8, &AMMO(item));
+
+ ImGui::EndGroup();
+ ImGui::PopItemWidth();
+ ImGui::PopID();
+ }
+ }
+}
+
+// Draw a flag bitfield as an grid of checkboxes
+void DrawFlagArray(const std::string& name, uint32_t& flags) {
+ ImGui::PushID(name.c_str());
+ for (int32_t flagIndex = 0; flagIndex < 32; flagIndex++) {
+ if ((flagIndex % 8) != 0) {
+ ImGui::SameLine();
+ }
+ ImGui::PushID(flagIndex);
+ uint32_t bitMask = 1 << flagIndex;
+ bool flag = (flags & bitMask) != 0;
+ if (ImGui::Checkbox("##check", &flag)) {
+ if (flag) {
+ flags |= bitMask;
+ } else {
+ flags &= ~bitMask;
+ }
+ }
+ ImGui::PopID();
+ }
+ ImGui::PopID();
+}
+
+void DrawFlagsTab() {
+ if (ImGui::TreeNode("Current Scene")) {
+ if (gGlobalCtx != nullptr) {
+ ActorContext* act = &gGlobalCtx->actorCtx;
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Switch");
+ InsertHelpHoverText("Permanently-saved switch flags");
+ DrawFlagArray("Switch", act->flags.swch);
+ });
+
+ ImGui::SameLine();
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Temp Switch");
+ InsertHelpHoverText("Temporary switch flags. Unset on scene transitions");
+ DrawFlagArray("Temp Switch", act->flags.tempSwch);
+ });
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Clear");
+ InsertHelpHoverText("Permanently-saved room-clear flags");
+ DrawFlagArray("Clear", act->flags.clear);
+ });
+
+ ImGui::SameLine();
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Temp Clear");
+ InsertHelpHoverText("Temporary room-clear flags. Unset on scene transitions");
+ DrawFlagArray("Temp Clear", act->flags.tempClear);
+ });
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Collect");
+ InsertHelpHoverText("Permanently-saved collect flags");
+ DrawFlagArray("Collect", act->flags.collect);
+ });
+
+ ImGui::SameLine();
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Temp Collect");
+ InsertHelpHoverText("Temporary collect flags. Unset on scene transitions");
+ DrawFlagArray("Temp Collect", act->flags.tempCollect);
+ });
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Chest");
+ InsertHelpHoverText("Permanently-saved chest flags");
+ DrawFlagArray("Chest", act->flags.chest);
+ });
+
+ ImGui::SameLine();
+
+ ImGui::BeginGroup();
+
+ if (ImGui::Button("Reload Flags")) {
+ act->flags.swch = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].swch;
+ act->flags.clear = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].clear;
+ act->flags.collect = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].collect;
+ act->flags.chest = gSaveContext.sceneFlags[gGlobalCtx->sceneNum].chest;
+ }
+ SetLastItemHoverText("Load flags from saved scene flags. Normally happens on scene load");
+
+ if (ImGui::Button("Save Flags")) {
+ gSaveContext.sceneFlags[gGlobalCtx->sceneNum].swch = act->flags.swch;
+ gSaveContext.sceneFlags[gGlobalCtx->sceneNum].clear = act->flags.clear;
+ gSaveContext.sceneFlags[gGlobalCtx->sceneNum].collect = act->flags.collect;
+ gSaveContext.sceneFlags[gGlobalCtx->sceneNum].chest = act->flags.chest;
+ }
+ SetLastItemHoverText("Save current scene flags. Normally happens on scene exit");
+
+ ImGui::EndGroup();
+ } else {
+ ImGui::Text("Current game state does not have an active scene");
+ }
+
+ ImGui::TreePop();
+ }
+
+ if (ImGui::TreeNode("Saved Scene Flags")) {
+ static uint32_t selectedSceneFlagMap = 0;
+ ImGui::Text("Map");
+ ImGui::SameLine();
+ if (ImGui::BeginCombo("##Map", SohUtils::GetSceneName(selectedSceneFlagMap).c_str())) {
+ for (int32_t sceneIndex = 0; sceneIndex < SCENE_ID_MAX; sceneIndex++) {
+ if (ImGui::Selectable(SohUtils::GetSceneName(sceneIndex).c_str())) {
+ selectedSceneFlagMap = sceneIndex;
+ }
+ }
+
+ ImGui::EndCombo();
+ }
+
+ // Don't show current scene button if there is no current scene
+ if (gGlobalCtx != nullptr) {
+ ImGui::SameLine();
+ if (ImGui::Button("Current")) {
+ selectedSceneFlagMap = gGlobalCtx->sceneNum;
+ }
+ SetLastItemHoverText("Open flags for current scene");
+ }
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Switch");
+ InsertHelpHoverText("Switch flags");
+ DrawFlagArray("Switch", gSaveContext.sceneFlags[selectedSceneFlagMap].swch);
+ });
+
+ ImGui::SameLine();
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Clear");
+ InsertHelpHoverText("Room-clear flags");
+ DrawFlagArray("Clear", gSaveContext.sceneFlags[selectedSceneFlagMap].clear);
+ });
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Collect");
+ InsertHelpHoverText("Collect flags");
+ DrawFlagArray("Collect", gSaveContext.sceneFlags[selectedSceneFlagMap].collect);
+ });
+
+ ImGui::SameLine();
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Chest");
+ InsertHelpHoverText("Chest flags");
+ DrawFlagArray("Chest", gSaveContext.sceneFlags[selectedSceneFlagMap].chest);
+ });
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Rooms");
+ InsertHelpHoverText("Flags for visted rooms");
+ DrawFlagArray("Rooms", gSaveContext.sceneFlags[selectedSceneFlagMap].rooms);
+ });
+
+ ImGui::SameLine();
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Floors");
+ InsertHelpHoverText("Flags for visted floors");
+ DrawFlagArray("Floors", gSaveContext.sceneFlags[selectedSceneFlagMap].floors);
+ });
+
+ ImGui::TreePop();
+ }
+
+ DrawGroupWithBorder([&]() {
+ static uint32_t selectedGsMap = 0;
+ ImGui::Text("Gold Skulltulas");
+ ImGui::Text("Map");
+ ImGui::SameLine();
+ if (ImGui::BeginCombo("##Gold Skulltula Map", gsMapping[selectedGsMap].c_str())) {
+ for (int32_t gsIndex = 0; gsIndex < gsMapping.size(); gsIndex++) {
+ if (ImGui::Selectable(gsMapping[gsIndex].c_str())) {
+ selectedGsMap = gsIndex;
+ }
+ }
+
+ ImGui::EndCombo();
+ }
+
+ // TODO We should write out descriptions for each one... ugh
+ ImGui::Text("Flags");
+ uint32_t currentFlags = GET_GS_FLAGS(selectedGsMap);
+ uint32_t allFlags = gAreaGsFlags[selectedGsMap];
+ uint32_t setMask = 1;
+ // Iterate over bitfield and create a checkbox for each skulltula
+ while (allFlags != 0) {
+ bool isThisSet = (currentFlags & 0x1) == 0x1;
+
+ ImGui::SameLine();
+ ImGui::PushID(allFlags);
+ if (ImGui::Checkbox("##gs", &isThisSet)) {
+ if (isThisSet) {
+ SET_GS_FLAGS(selectedGsMap, setMask);
+ } else {
+ // Have to do this roundabout method as the macro does not support clearing flags
+ uint32_t currentFlagsBase = GET_GS_FLAGS(selectedGsMap);
+ gSaveContext.gsFlags[selectedGsMap >> 2] &= ~gGsFlagsMasks[selectedGsMap & 3];
+ SET_GS_FLAGS(selectedGsMap, currentFlagsBase & ~setMask);
+ }
+ }
+
+ ImGui::PopID();
+
+ allFlags >>= 1;
+ currentFlags >>= 1;
+ setMask <<= 1;
+ }
+
+ static bool keepGsCountUpdated = true;
+ ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated);
+ InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags");
+ int32_t gsCount = 0;
+ if (keepGsCountUpdated) {
+ for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) {
+ gsCount += std::popcount(static_cast(gSaveContext.gsFlags[gsFlagIndex]));
+ }
+ gSaveContext.inventory.gsTokens = gsCount;
+ }
+ });
+}
+
+// Draws a combo that lets you choose and upgrade value from a drop-down of text values
+void DrawUpgrade(const std::string& categoryName, int32_t categoryId, const std::vector& names) {
+ ImGui::Text(categoryName.c_str());
+ ImGui::SameLine();
+ ImGui::PushID(categoryName.c_str());
+ if (ImGui::BeginCombo("##upgrade", names[CUR_UPG_VALUE(categoryId)].c_str())) {
+ for (int32_t i = 0; i < names.size(); i++) {
+ if (ImGui::Selectable(names[i].c_str())) {
+ Inventory_ChangeUpgrade(categoryId, i);
+ }
+ }
+
+ ImGui::EndCombo();
+ }
+ ImGui::PopID();
+ SetLastItemHoverText(categoryName.c_str());
+}
+
+// Draws a combo that lets you choose and upgrade value from a popup grid of icons
+void DrawUpgradeIcon(const std::string& categoryName, int32_t categoryId, const std::vector& items) {
+ static const char* upgradePopupPicker = "upgradePopupPicker";
+
+ ImGui::PushID(categoryName.c_str());
+
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1, 1, 1, 0));
+ ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
+ uint8_t item = items[CUR_UPG_VALUE(categoryId)];
+ if (item != ITEM_NONE) {
+ const ItemMapEntry& slotEntry = itemMapping[item];
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0),
+ ImVec2(1, 1), 0)) {
+ ImGui::OpenPopup(upgradePopupPicker);
+ }
+ } else {
+ if (ImGui::Button("##itemNone", ImVec2(32.0f, 32.0f))) {
+ ImGui::OpenPopup(upgradePopupPicker);
+ }
+ }
+ ImGui::PopStyleVar();
+ ImGui::PopStyleColor();
+ SetLastItemHoverText(categoryName.c_str());
+
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
+ if (ImGui::BeginPopup(upgradePopupPicker)) {
+ for (int32_t pickerIndex = 0; pickerIndex < items.size(); pickerIndex++) {
+ if ((pickerIndex % 8) != 0) {
+ ImGui::SameLine();
+ }
+
+ if (items[pickerIndex] == ITEM_NONE) {
+ if (ImGui::Button("##upgradePopupPicker", ImVec2(32.0f, 32.0f))) {
+ Inventory_ChangeUpgrade(categoryId, pickerIndex);
+ ImGui::CloseCurrentPopup();
+ }
+ SetLastItemHoverText("None");
+ } else {
+ const ItemMapEntry& slotEntry = itemMapping[items[pickerIndex]];
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(slotEntry.name), ImVec2(32.0f, 32.0f), ImVec2(0, 0),
+ ImVec2(1, 1), 0)) {
+ Inventory_ChangeUpgrade(categoryId, pickerIndex);
+ ImGui::CloseCurrentPopup();
+ }
+ SetLastItemHoverText(SohUtils::GetItemName(slotEntry.id));
+ }
+ }
+
+ ImGui::EndPopup();
+ }
+ ImGui::PopStyleVar();
+
+ ImGui::PopID();
+}
+
+void DrawEquipmentTab() {
+ const std::vector equipmentValues = {
+ ITEM_SWORD_KOKIRI, ITEM_SWORD_MASTER, ITEM_SWORD_BGS, ITEM_SWORD_BROKEN,
+ ITEM_SHIELD_DEKU, ITEM_SHIELD_HYLIAN, ITEM_SHIELD_MIRROR, ITEM_NONE,
+ ITEM_TUNIC_KOKIRI, ITEM_TUNIC_GORON, ITEM_TUNIC_ZORA, ITEM_NONE,
+ ITEM_BOOTS_KOKIRI, ITEM_BOOTS_IRON, ITEM_BOOTS_HOVER, ITEM_NONE,
+ };
+ for (int32_t i = 0; i < equipmentValues.size(); i++) {
+ // Skip over unused 4th slots for shields, boots, and tunics
+ if (equipmentValues[i] == ITEM_NONE) {
+ continue;
+ }
+ if ((i % 4) != 0) {
+ ImGui::SameLine();
+ }
+
+ ImGui::PushID(i);
+ uint32_t bitMask = 1 << i;
+ bool hasEquip = (bitMask & gSaveContext.inventory.equipment) != 0;
+ const ItemMapEntry& entry = itemMapping[equipmentValues[i]];
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(hasEquip ? entry.name : entry.nameFaded),
+ ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) {
+ if (hasEquip) {
+ gSaveContext.inventory.equipment &= ~bitMask;
+ } else {
+ gSaveContext.inventory.equipment |= bitMask;
+ }
+ }
+ ImGui::PopStyleColor();
+ ImGui::PopID();
+ SetLastItemHoverText(SohUtils::GetItemName(entry.id));
+ }
+
+ const std::vector bulletBagValues = {
+ ITEM_NONE,
+ ITEM_BULLET_BAG_30,
+ ITEM_BULLET_BAG_40,
+ ITEM_BULLET_BAG_50,
+ };
+ DrawUpgradeIcon("Bullet Bag", UPG_BULLET_BAG, bulletBagValues);
+
+ ImGui::SameLine();
+
+ const std::vector quiverValues = {
+ ITEM_NONE,
+ ITEM_QUIVER_30,
+ ITEM_QUIVER_40,
+ ITEM_QUIVER_50,
+ };
+ DrawUpgradeIcon("Quiver", UPG_QUIVER, quiverValues);
+
+ ImGui::SameLine();
+
+ const std::vector bombBagValues = {
+ ITEM_NONE,
+ ITEM_BOMB_BAG_20,
+ ITEM_BOMB_BAG_30,
+ ITEM_BOMB_BAG_40,
+ };
+ DrawUpgradeIcon("Bomb Bag", UPG_BOMB_BAG, bombBagValues);
+
+ ImGui::SameLine();
+
+ const std::vector scaleValues = {
+ ITEM_NONE,
+ ITEM_SCALE_SILVER,
+ ITEM_SCALE_GOLDEN,
+ };
+ DrawUpgradeIcon("Scale", UPG_SCALE, scaleValues);
+
+ ImGui::SameLine();
+
+ const std::vector strengthValues = {
+ ITEM_NONE,
+ ITEM_BRACELET,
+ ITEM_GAUNTLETS_SILVER,
+ ITEM_GAUNTLETS_GOLD,
+ };
+ DrawUpgradeIcon("Strength", UPG_STRENGTH, strengthValues);
+
+ // There is no icon for child wallet, so default to a text list
+ const std::vector walletNames = {
+ "Child (99)",
+ "Adult (200)",
+ "Giant (500)",
+ };
+ DrawUpgrade("Wallet", UPG_WALLET, walletNames);
+
+ const std::vector stickNames = {
+ "None",
+ "10",
+ "20",
+ "30",
+ };
+ DrawUpgrade("Sticks", UPG_STICKS, stickNames);
+
+ const std::vector nutNames = {
+ "None",
+ "20",
+ "30",
+ "40",
+ };
+ DrawUpgrade("Deku Nuts", UPG_NUTS, nutNames);
+}
+
+// Draws a toggleable icon for a quest item that is faded when disabled
+void DrawQuestItemButton(uint32_t item) {
+ const QuestMapEntry& entry = questMapping[item];
+ uint32_t bitMask = 1 << entry.id;
+ bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0;
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded),
+ ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) {
+ if (hasQuestItem) {
+ gSaveContext.inventory.questItems &= ~bitMask;
+ } else {
+ gSaveContext.inventory.questItems |= bitMask;
+ }
+ }
+ ImGui::PopStyleColor();
+ SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id));
+}
+
+// Draws a toggleable icon for a dungeon item that is faded when disabled
+void DrawDungeonItemButton(uint32_t item, uint32_t scene) {
+ const ItemMapEntry& entry = itemMapping[item];
+ uint32_t bitMask = 1 << (entry.id - ITEM_KEY_BOSS); // Bitset starts at ITEM_KEY_BOSS == 0. the rest are sequential
+ bool hasItem = (bitMask & gSaveContext.inventory.dungeonItems[scene]) != 0;
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(hasItem ? entry.name : entry.nameFaded),
+ ImVec2(32.0f, 32.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) {
+ if (hasItem) {
+ gSaveContext.inventory.dungeonItems[scene] &= ~bitMask;
+ } else {
+ gSaveContext.inventory.dungeonItems[scene] |= bitMask;
+ }
+ }
+ ImGui::PopStyleColor();
+ SetLastItemHoverText(SohUtils::GetItemName(entry.id));
+}
+
+void DrawQuestStatusTab() {
+ ImGui::PushItemWidth(ImGui::GetFontSize() * 6);
+
+ for (int32_t i = QUEST_MEDALLION_FOREST; i < QUEST_MEDALLION_LIGHT + 1; i++) {
+ if (i != QUEST_MEDALLION_FOREST) {
+ ImGui::SameLine();
+ }
+ DrawQuestItemButton(i);
+ }
+
+ for (int32_t i = QUEST_KOKIRI_EMERALD; i < QUEST_ZORA_SAPPHIRE + 1; i++) {
+ if (i != QUEST_KOKIRI_EMERALD) {
+ ImGui::SameLine();
+ }
+ DrawQuestItemButton(i);
+ }
+
+ // Put Stone of Agony and Gerudo Card on the same line with a little space between them
+ ImGui::SameLine();
+ ImGui::Dummy(ImVec2(20, 0));
+
+ ImGui::SameLine();
+ DrawQuestItemButton(QUEST_STONE_OF_AGONY);
+
+ ImGui::SameLine();
+ DrawQuestItemButton(QUEST_GERUDO_CARD);
+
+ for (const SongMapEntry& entry : songMapping) {
+ if ((entry.id != QUEST_SONG_MINUET) && (entry.id != QUEST_SONG_LULLABY)) {
+ ImGui::SameLine();
+ }
+
+ uint32_t bitMask = 1 << entry.id;
+ bool hasQuestItem = (bitMask & gSaveContext.inventory.questItems) != 0;
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ if (ImGui::ImageButton(SohImGui::GetTextureByName(hasQuestItem ? entry.name : entry.nameFaded),
+ ImVec2(16.0f, 24.0f), ImVec2(0, 0), ImVec2(1, 1), 0)) {
+ if (hasQuestItem) {
+ gSaveContext.inventory.questItems &= ~bitMask;
+ } else {
+ gSaveContext.inventory.questItems |= bitMask;
+ }
+ }
+ ImGui::PopStyleColor();
+ SetLastItemHoverText(SohUtils::GetQuestItemName(entry.id));
+ }
+
+ ImGui::InputScalar("GS Count", ImGuiDataType_S16, &gSaveContext.inventory.gsTokens);
+ InsertHelpHoverText("Number of gold skulltula tokens aquired");
+
+ uint32_t bitMask = 1 << QUEST_SKULL_TOKEN;
+ bool gsUnlocked = (bitMask & gSaveContext.inventory.questItems) != 0;
+ if (ImGui::Checkbox("GS unlocked", &gsUnlocked)) {
+ if (gsUnlocked) {
+ gSaveContext.inventory.questItems |= bitMask;
+ } else {
+ gSaveContext.inventory.questItems &= ~bitMask;
+ }
+ }
+ InsertHelpHoverText("If unlocked, enables showing the gold skulltula count in the quest status menu");
+
+ int32_t pohCount = (gSaveContext.inventory.questItems & 0xF0000000) >> 28;
+ if (ImGui::BeginCombo("PoH count", std::to_string(pohCount).c_str())) {
+ for (int32_t i = 0; i < 4; i++) {
+ if (ImGui::Selectable(std::to_string(i).c_str(), pohCount == i)) {
+ gSaveContext.inventory.questItems &= ~0xF0000000;
+ gSaveContext.inventory.questItems |= (i << 28);
+ }
+ }
+ ImGui::EndCombo();
+ }
+ InsertHelpHoverText("The number of pieces of heart acquired towards the next heart container");
+
+ DrawGroupWithBorder([&]() {
+ ImGui::Text("Dungeon Items");
+
+ static int32_t dungeonItemsScene = SCENE_YDAN;
+ ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f);
+ if (ImGui::BeginCombo("##DungeonSelect", SohUtils::GetSceneName(dungeonItemsScene).c_str())) {
+ for (int32_t dungeonIndex = SCENE_YDAN; dungeonIndex < SCENE_BDAN_BOSS + 1; dungeonIndex++) {
+ if (ImGui::Selectable(SohUtils::GetSceneName(dungeonIndex).c_str(),
+ dungeonIndex == dungeonItemsScene)) {
+ dungeonItemsScene = dungeonIndex;
+ }
+ }
+
+ ImGui::EndCombo();
+ }
+ ImGui::PopItemWidth();
+
+ DrawDungeonItemButton(ITEM_KEY_BOSS, dungeonItemsScene);
+ ImGui::SameLine();
+ DrawDungeonItemButton(ITEM_COMPASS, dungeonItemsScene);
+ ImGui::SameLine();
+ DrawDungeonItemButton(ITEM_DUNGEON_MAP, dungeonItemsScene);
+
+ if (dungeonItemsScene != SCENE_BDAN_BOSS) {
+ float lineHeight = ImGui::GetTextLineHeightWithSpacing();
+ ImGui::Image(SohImGui::GetTextureByName(itemMapping[ITEM_KEY_SMALL].name), ImVec2(lineHeight, lineHeight));
+ ImGui::SameLine();
+ ImGui::InputScalar("##Keys", ImGuiDataType_S8, gSaveContext.inventory.dungeonKeys + dungeonItemsScene);
+ } else {
+ // dungeonItems is size 20 but dungeonKeys is size 19, so there are no keys for the last scene (Barinade's Lair)
+ ImGui::Text("Barinade's Lair does not have small keys");
+ }
+ });
+
+ ImGui::PopItemWidth();
+}
+
+void DrawSaveEditor(bool& open) {
+ if (!open) {
+ return;
+ }
+
+ ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver);
+ if (!ImGui::Begin("Save Editor", &open)) {
+ ImGui::End();
+ return;
+ }
+
+ if (ImGui::BeginTabBar("SaveContextTabBar", ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)) {
+ if (ImGui::BeginTabItem("Info")) {
+ DrawInfoTab();
+ ImGui::EndTabItem();
+ }
+
+ if (ImGui::BeginTabItem("Inventory")) {
+ DrawInventoryTab();
+ ImGui::EndTabItem();
+ }
+
+ if (ImGui::BeginTabItem("Flags")) {
+ DrawFlagsTab();
+ ImGui::EndTabItem();
+ }
+
+ if (ImGui::BeginTabItem("Equipment")) {
+ DrawEquipmentTab();
+ ImGui::EndTabItem();
+ }
+
+ if (ImGui::BeginTabItem("Quest Status")) {
+ DrawQuestStatusTab();
+ ImGui::EndTabItem();
+ }
+
+ ImGui::EndTabBar();
+ }
+
+ ImGui::End();
+}
+
+void InitSaveEditor() {
+ SohImGui::AddWindow("Debug", "Save Editor", DrawSaveEditor);
+
+ // Load item icons into ImGui
+ for (const auto& entry : itemMapping) {
+ SohImGui::LoadResource(entry.second.name, entry.second.texturePath);
+ SohImGui::LoadResource(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f));
+ }
+ for (const auto& entry : questMapping) {
+ SohImGui::LoadResource(entry.second.name, entry.second.texturePath);
+ SohImGui::LoadResource(entry.second.nameFaded, entry.second.texturePath, ImVec4(1, 1, 1, 0.3f));
+ }
+ for (const auto& entry : songMapping) {
+ SohImGui::LoadResource(entry.name, gSongNoteTex, entry.color);
+ ImVec4 fadedCol = entry.color;
+ fadedCol.w = 0.3f;
+ SohImGui::LoadResource(entry.nameFaded, gSongNoteTex, fadedCol);
+ }
+}
diff --git a/soh/soh/Enhancements/debugger/debugSaveEditor.h b/soh/soh/Enhancements/debugger/debugSaveEditor.h
new file mode 100644
index 000000000..084f7cadc
--- /dev/null
+++ b/soh/soh/Enhancements/debugger/debugSaveEditor.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void InitSaveEditor();
diff --git a/soh/soh/Enhancements/debugger/debugger.cpp b/soh/soh/Enhancements/debugger/debugger.cpp
new file mode 100644
index 000000000..e493375cd
--- /dev/null
+++ b/soh/soh/Enhancements/debugger/debugger.cpp
@@ -0,0 +1,6 @@
+#include "debugger.h"
+#include "debugSaveEditor.h"
+
+void Debug_Init(void) {
+ InitSaveEditor();
+}
diff --git a/soh/soh/Enhancements/debugger/debugger.h b/soh/soh/Enhancements/debugger/debugger.h
new file mode 100644
index 000000000..4bc0f985b
--- /dev/null
+++ b/soh/soh/Enhancements/debugger/debugger.h
@@ -0,0 +1,3 @@
+#pragma once
+
+void Debug_Init(void);
diff --git a/soh/soh/GbiWrap.cpp b/soh/soh/GbiWrap.cpp
index 1f6a8003c..c7f69f1a9 100644
--- a/soh/soh/GbiWrap.cpp
+++ b/soh/soh/GbiWrap.cpp
@@ -9,6 +9,7 @@ void Graph_ProcessGfxCommands(Gfx* commands);
void OTRLogString(const char* src);
void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(void*, char));
void OTRSetFrameDivisor(int divisor);
+void OTRGetPixelDepthPrepare(float x, float y);
uint16_t OTRGetPixelDepth(float x, float y);
int32_t OTRGetLastScancode();
void ResourceMgr_CacheDirectory(const char* resName);
diff --git a/soh/soh/OTRGlobals.cpp b/soh/soh/OTRGlobals.cpp
index e26e80c63..baea4719d 100644
--- a/soh/soh/OTRGlobals.cpp
+++ b/soh/soh/OTRGlobals.cpp
@@ -3,6 +3,7 @@
#include
#include
#include "GlobalCtx2.h"
+#include "GameSettings.h"
#include "ResourceMgr.h"
#include "DisplayList.h"
#include "PlayerAnimation.h"
@@ -26,10 +27,20 @@
#include "Lib/stb/stb_image.h"
#include "AudioPlayer.h"
#include "Enhancements/debugconsole.h"
+#include "Enhancements/debugger/debugger.h"
+#include "Utils/BitConverter.h"
+#include "variables.h"
#include "macros.h"
OTRGlobals* OTRGlobals::Instance;
+static struct {
+ std::condition_variable cv_to_thread, cv_from_thread;
+ std::mutex mutex;
+ bool initialized;
+ bool processing;
+} audio;
+
OTRGlobals::OTRGlobals() {
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian");
context->GetWindow()->Init();
@@ -42,13 +53,27 @@ extern uintptr_t clearMtx;
extern "C" Mtx gMtxClear;
extern "C" MtxF gMtxFClear;
extern "C" void OTRMessage_Init();
+extern "C" void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples);
+extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len);
+extern "C" int AudioPlayer_Buffered(void);
+extern "C" int AudioPlayer_GetDesiredBuffered(void);
// C->C++ Bridge
extern "C" void InitOTR() {
OTRGlobals::Instance = new OTRGlobals();
+ auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version");
+
+ if (!t->bHasLoadError)
+ {
+ //uint32_t gameVersion = BitConverter::ToUInt32BE((uint8_t*)t->buffer.get(), 0);
+ uint32_t gameVersion = *((uint32_t*)t->buffer.get());
+ OTRGlobals::Instance->context->GetResourceManager()->SetGameVersion(gameVersion);
+ }
+
clearMtx = (uintptr_t)&gMtxClear;
OTRMessage_Init();
DebugConsole_Init();
+ Debug_Init();
}
#ifdef _MSC_VER
@@ -89,8 +114,67 @@ extern "C" void Graph_ProcessFrame(void (*run_one_game_iter)(void)) {
// C->C++ Bridge
extern "C" void Graph_ProcessGfxCommands(Gfx* commands) {
+ OTRGlobals::Instance->context->GetWindow()->SetFrameDivisor(R_UPDATE_RATE);
+
+ if (!audio.initialized) {
+ audio.initialized = true;
+ std::thread([]() {
+ for (;;) {
+ {
+ std::unique_lock Lock(audio.mutex);
+ while (!audio.processing) {
+ audio.cv_to_thread.wait(Lock);
+ }
+ }
+ //AudioMgr_ThreadEntry(&gAudioMgr);
+ // 528 and 544 relate to 60 fps at 32 kHz 32000/60 = 533.333..
+ // in an ideal world, one third of the calls should use num_samples=544 and two thirds num_samples=528
+ #define SAMPLES_HIGH 560
+ #define SAMPLES_LOW 528
+ // PAL values
+ //#define SAMPLES_HIGH 656
+ //#define SAMPLES_LOW 624
+ #define AUDIO_FRAMES_PER_UPDATE (R_UPDATE_RATE > 0 ? R_UPDATE_RATE : 1 )
+ #define NUM_AUDIO_CHANNELS 2
+ int samples_left = AudioPlayer_Buffered();
+ u32 num_audio_samples = samples_left < AudioPlayer_GetDesiredBuffered() ? SAMPLES_HIGH : SAMPLES_LOW;
+ // printf("Audio samples: %d %u\n", samples_left, num_audio_samples);
+
+ // 3 is the maximum authentic frame divisor.
+ s16 audio_buffer[SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3];
+ for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) {
+ AudioMgr_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), num_audio_samples);
+ }
+ //for (uint32_t i = 0; i < 2 * num_audio_samples; i++) {
+ // audio_buffer[i] = Rand_Next() & 0xFF;
+ //}
+ // printf("Audio samples before submitting: %d\n", audio_api->buffered());
+ AudioPlayer_Play((u8*)audio_buffer, num_audio_samples * (sizeof(int16_t) * NUM_AUDIO_CHANNELS * AUDIO_FRAMES_PER_UPDATE));
+
+ {
+ std::unique_lock Lock(audio.mutex);
+ audio.processing = false;
+ }
+ audio.cv_from_thread.notify_one();
+ }
+ }).detach();
+ }
+
+ {
+ std::unique_lock Lock(audio.mutex);
+ audio.processing = true;
+ }
+ audio.cv_to_thread.notify_one();
+
OTRGlobals::Instance->context->GetWindow()->RunCommands(commands);
+ {
+ std::unique_lock Lock(audio.mutex);
+ while (audio.processing) {
+ audio.cv_from_thread.wait(Lock);
+ }
+ }
+
// OTRTODO: FIGURE OUT END FRAME POINT
/* if (OTRGlobals::Instance->context->GetWindow()->lastScancode != -1)
OTRGlobals::Instance->context->GetWindow()->lastScancode = -1;*/
@@ -99,8 +183,8 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) {
float divisor_num = 0.0f;
-extern "C" void OTRSetFrameDivisor(int divisor) {
- OTRGlobals::Instance->context->GetWindow()->SetFrameDivisor(divisor);
+extern "C" void OTRGetPixelDepthPrepare(float x, float y) {
+ OTRGlobals::Instance->context->GetWindow()->GetPixelDepthPrepare(x, y);
}
extern "C" uint16_t OTRGetPixelDepth(float x, float y) {
@@ -117,6 +201,11 @@ extern "C" void OTRResetScancode()
OTRGlobals::Instance->context->GetWindow()->lastScancode = -1;
}
+extern "C" uint32_t ResourceMgr_GetGameVersion()
+{
+ return OTRGlobals::Instance->context->GetResourceManager()->GetGameVersion();
+}
+
extern "C" void ResourceMgr_CacheDirectory(const char* resName) {
OTRGlobals::Instance->context->GetResourceManager()->CacheDirectory(resName);
}
@@ -189,9 +278,9 @@ extern "C" char* ResourceMgr_LoadJPEG(char* data, int dataSize)
return (char*)finalBuffer;
}
-extern "C" char* ResourceMgr_LoadTexByName(char* texPath);
+extern "C" char* ResourceMgr_LoadTexByName(const char* texPath);
-extern "C" char* ResourceMgr_LoadTexOrDListByName(char* filePath) {
+extern "C" char* ResourceMgr_LoadTexOrDListByName(const char* filePath) {
auto res = OTRGlobals::Instance->context->GetResourceManager()->LoadResource(filePath);
if (res->resType == Ship::ResourceType::DisplayList)
@@ -202,28 +291,28 @@ extern "C" char* ResourceMgr_LoadTexOrDListByName(char* filePath) {
return ResourceMgr_LoadTexByName(filePath);
}
-extern "C" char* ResourceMgr_LoadPlayerAnimByName(char* animPath) {
+extern "C" char* ResourceMgr_LoadPlayerAnimByName(const char* animPath) {
auto anim = std::static_pointer_cast(
OTRGlobals::Instance->context->GetResourceManager()->LoadResource(animPath));
return (char*)&anim->limbRotData[0];
}
-extern "C" Gfx* ResourceMgr_LoadGfxByName(char* path)
+extern "C" Gfx* ResourceMgr_LoadGfxByName(const char* path)
{
auto res = std::static_pointer_cast(
OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
return (Gfx*)&res->instructions[0];
}
-extern "C" char* ResourceMgr_LoadArrayByName(char* path)
+extern "C" char* ResourceMgr_LoadArrayByName(const char* path)
{
auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
return (char*)res->scalars.data();
}
-extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(char* path) {
+extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(const char* path) {
auto res =
std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
@@ -245,7 +334,7 @@ extern "C" char* ResourceMgr_LoadArrayByNameAsVec3s(char* path) {
}
}
-extern "C" CollisionHeader* ResourceMgr_LoadColByName(char* path)
+extern "C" CollisionHeader* ResourceMgr_LoadColByName(const char* path)
{
auto colRes = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
@@ -339,7 +428,7 @@ extern "C" CollisionHeader* ResourceMgr_LoadColByName(char* path)
return (CollisionHeader*)colHeader;
}
-extern "C" Vtx * ResourceMgr_LoadVtxByName(char* path)
+extern "C" Vtx * ResourceMgr_LoadVtxByName(const char* path)
{
auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
return (Vtx*)res->vertices.data();
@@ -361,7 +450,7 @@ extern "C" int ResourceMgr_OTRSigCheck(char* imgData)
return 0;
}
-extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(char* path) {
+extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path) {
auto res = std::static_pointer_cast(
OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
@@ -430,7 +519,7 @@ extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(char* path) {
return anim;
}
-extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
+extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path) {
auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
if (res->cachedGameAsset != nullptr)
@@ -476,14 +565,14 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
limbC->sibling = limb->siblingIndex;
if (limb->dListPtr != "") {
- auto dList = ResourceMgr_LoadGfxByName((char*)limb->dListPtr.c_str());
+ auto dList = ResourceMgr_LoadGfxByName(limb->dListPtr.c_str());
limbC->dLists[0] = dList;
} else {
limbC->dLists[0] = nullptr;
}
if (limb->dList2Ptr != "") {
- auto dList = ResourceMgr_LoadGfxByName((char*)limb->dList2Ptr.c_str());
+ auto dList = ResourceMgr_LoadGfxByName(limb->dList2Ptr.c_str());
limbC->dLists[1] = dList;
} else {
limbC->dLists[1] = nullptr;
@@ -502,7 +591,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
limbC->dList = nullptr;
if (!limb->dListPtr.empty()) {
- const auto dList = ResourceMgr_LoadGfxByName(const_cast(limb->dListPtr.c_str()));
+ const auto dList = ResourceMgr_LoadGfxByName(limb->dListPtr.c_str());
limbC->dList = dList;
}
@@ -518,12 +607,12 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
limbC->dList[1] = nullptr;
if (!limb->dListPtr.empty()) {
- const auto dList = ResourceMgr_LoadGfxByName(const_cast(limb->dListPtr.c_str()));
+ const auto dList = ResourceMgr_LoadGfxByName(limb->dListPtr.c_str());
limbC->dList[0] = dList;
}
if (!limb->dList2Ptr.empty()) {
- const auto dList = ResourceMgr_LoadGfxByName(const_cast(limb->dList2Ptr.c_str()));
+ const auto dList = ResourceMgr_LoadGfxByName(limb->dList2Ptr.c_str());
limbC->dList[1] = dList;
}
@@ -549,7 +638,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
limbC->segmentType = 0;
if (limb->skinSegmentType == Ship::ZLimbSkinType::SkinType_DList)
- limbC->segment = ResourceMgr_LoadGfxByName(const_cast(limb->skinDList.c_str()));
+ limbC->segment = ResourceMgr_LoadGfxByName(limb->skinDList.c_str());
else if (limb->skinSegmentType == Ship::ZLimbSkinType::SkinType_4) {
const auto animData = new SkinAnimatedLimbData;
const int skinDataSize = limb->skinData.size();
@@ -557,7 +646,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
animData->totalVtxCount = limb->skinVtxCnt;
animData->limbModifCount = skinDataSize;
animData->limbModifications = new SkinLimbModif[animData->limbModifCount];
- animData->dlist = ResourceMgr_LoadGfxByName(const_cast(limb->skinDList2.c_str()));
+ animData->dlist = ResourceMgr_LoadGfxByName(limb->skinDList2.c_str());
for (int i = 0; i < skinDataSize; i++)
{
@@ -617,7 +706,7 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path) {
return baseHeader;
}
-extern "C" s32* ResourceMgr_LoadCSByName(char* path)
+extern "C" s32* ResourceMgr_LoadCSByName(const char* path)
{
auto res = std::static_pointer_cast(OTRGlobals::Instance->context->GetResourceManager()->LoadResource(path));
return (s32*)res->commands.data();
@@ -818,3 +907,13 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) {
OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Play(buf, len);
}
}
+
+extern "C" int Controller_ShouldRumble(size_t i) {
+ for (const auto& controller : Ship::Window::Controllers.at(i)) {
+ if (controller->CanRumble() && Game::Settings.controller.extra[i].rumble_strength > 0.001f) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
diff --git a/soh/soh/OTRGlobals.h b/soh/soh/OTRGlobals.h
index f7e525834..dfb235712 100644
--- a/soh/soh/OTRGlobals.h
+++ b/soh/soh/OTRGlobals.h
@@ -24,23 +24,24 @@ void Graph_ProcessFrame(void (*run_one_game_iter)(void));
void Graph_ProcessGfxCommands(Gfx* commands);
void OTRLogString(const char* src);
void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(void*, char));
-void OTRSetFrameDivisor(int divisor);
+void OTRGetPixelDepthPrepare(float x, float y);
uint16_t OTRGetPixelDepth(float x, float y);
int32_t OTRGetLastScancode();
+uint32_t ResourceMgr_GetGameVersion();
void ResourceMgr_CacheDirectory(const char* resName);
void ResourceMgr_LoadFile(const char* resName);
char* ResourceMgr_LoadFileFromDisk(const char* filePath);
-char* ResourceMgr_LoadTexByName(char* texPath);
-char* ResourceMgr_LoadTexOrDListByName(char* filePath);
-char* ResourceMgr_LoadPlayerAnimByName(char* animPath);
+char* ResourceMgr_LoadTexByName(const char* texPath);
+char* ResourceMgr_LoadTexOrDListByName(const char* filePath);
+char* ResourceMgr_LoadPlayerAnimByName(const char* animPath);
char* ResourceMgr_GetNameByCRC(uint64_t crc, char* alloc);
Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc);
-Gfx* ResourceMgr_LoadGfxByName(char* path);
+Gfx* ResourceMgr_LoadGfxByName(const char* path);
Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc);
-Vtx* ResourceMgr_LoadVtxByName(char* path);
-CollisionHeader* ResourceMgr_LoadColByName(char* path);
+Vtx* ResourceMgr_LoadVtxByName(const char* path);
+CollisionHeader* ResourceMgr_LoadColByName(const char* path);
uint64_t GetPerfCounter();
-struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(char* path);
+struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path);
int ResourceMgr_OTRSigCheck(char* imgData);
uint64_t osGetTime(void);
uint32_t osGetCount(void);
@@ -63,4 +64,5 @@ int AudioPlayer_Buffered(void);
int AudioPlayer_GetDesiredBuffered(void);
void AudioPlayer_Play(const uint8_t* buf, uint32_t len);
void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples);
+int Controller_ShouldRumble(size_t i);
#endif
diff --git a/soh/soh/stubs.c b/soh/soh/stubs.c
index 15f78e595..98f3b4823 100644
--- a/soh/soh/stubs.c
+++ b/soh/soh/stubs.c
@@ -102,7 +102,7 @@ void osCreateViManager(OSPri pri)
s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel)
{
-
+ return 0;
}
u32 osAiGetLength(void)
@@ -2099,4 +2099,4 @@ u8 gSequenceFontTable[0x1C0] = {
0x01, 0x12, 0x01, 0x24, 0x01, 0x18, 0x01, 0x19, 0x01, 0x13, 0x01, 0x20, 0x01, 0x1B, 0x01, 0x1C, 0x01, 0x1D, 0x01,
0x03, 0x01, 0x1F, 0x01, 0x20, 0x01, 0x20, 0x01, 0x09, 0x01, 0x21, 0x01, 0x22, 0x01, 0x21, 0x01, 0x09, 0x01, 0x20,
0x01, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
\ No newline at end of file
+};
diff --git a/soh/soh/util.cpp b/soh/soh/util.cpp
new file mode 100644
index 000000000..7a5d0205d
--- /dev/null
+++ b/soh/soh/util.cpp
@@ -0,0 +1,314 @@
+#include "util.h"
+
+#include
+
+std::vector sceneNames = {
+ "Inside the Deku Tree",
+ "Dodongo's Cavern",
+ "Inside Jabu-Jabu's Belly",
+ "Forest Temple",
+ "Fire Temple",
+ "Water Temple",
+ "Spirit Temple",
+ "Shadow Temple",
+ "Bottom of the Well",
+ "Ice Cavern",
+ "Ganon's Tower",
+ "Gerudo Training Ground",
+ "Thieves' Hideout",
+ "Inside Ganon's Castle",
+ "Ganon's Tower (Collapsing)",
+ "Inside Ganon's Castle (Collapsing)",
+ "Treasure Box Shop",
+ "Gohma's Lair",
+ "King Dodongo's Lair",
+ "Barinade's Lair",
+ "Phantom Ganon's Lair",
+ "Volvagia's Lair",
+ "Morpha's Lair",
+ "Twinrova's Lair & Nabooru's Mini-Boss Room",
+ "Bongo Bongo's Lair",
+ "Ganondorf's Lair",
+ "Tower Collapse Exterior",
+ "Market Entrance (Child - Day)",
+ "Market Entrance (Child - Night)",
+ "Market Entrance (Ruins)",
+ "Back Alley (Child - Day)",
+ "Back Alley (Child - Night)",
+ "Market (Child - Day)",
+ "Market (Child - Night)",
+ "Market (Ruins)",
+ "Temple of Time Exterior (Child - Day)",
+ "Temple of Time Exterior (Child - Night)",
+ "Temple of Time Exterior (Ruins)",
+ "Know-It-All Brothers' House",
+ "House of Twins",
+ "Mido's House",
+ "Saria's House",
+ "Carpenter Boss's House",
+ "Back Alley House (Man in Green)",
+ "Bazaar",
+ "Kokiri Shop",
+ "Goron Shop",
+ "Zora Shop",
+ "Kakariko Potion Shop",
+ "Market Potion Shop",
+ "Bombchu Shop",
+ "Happy Mask Shop",
+ "Link's House",
+ "Back Alley House (Dog Lady)",
+ "Stable",
+ "Impa's House",
+ "Lakeside Laboratory",
+ "Carpenters' Tent",
+ "Gravekeeper's Hut",
+ "Great Fairy's Fountain (Upgrades)",
+ "Fairy's Fountain",
+ "Great Fairy's Fountain (Spells)",
+ "Grottos",
+ "Grave (Redead)",
+ "Grave (Fairy's Fountain)",
+ "Royal Family's Tomb",
+ "Shooting Gallery",
+ "Temple of Time",
+ "Chamber of the Sages",
+ "Castle Hedge Maze (Day)",
+ "Castle Hedge Maze (Night)",
+ "Cutscene Map",
+ "Dampé's Grave & Windmill",
+ "Fishing Pond",
+ "Castle Courtyard",
+ "Bombchu Bowling Alley",
+ "Ranch House & Silo",
+ "Guard House",
+ "Granny's Potion Shop",
+ "Ganon's Tower Collapse & Battle Arena",
+ "House of Skulltula",
+ "Spot 00 - Hyrule Field",
+ "Spot 01 - Kakariko Village",
+ "Spot 02 - Graveyard",
+ "Spot 03 - Zora's River",
+ "Spot 04 - Kokiri Forest",
+ "Spot 05 - Sacred Forest Meadow",
+ "Spot 06 - Lake Hylia",
+ "Spot 07 - Zora's Domain",
+ "Spot 08 - Zora's Fountain",
+ "Spot 09 - Gerudo Valley",
+ "Spot 10 - Lost Woods",
+ "Spot 11 - Desert Colossus",
+ "Spot 12 - Gerudo's Fortress",
+ "Spot 13 - Haunted Wasteland",
+ "Spot 15 - Hyrule Castle",
+ "Spot 16 - Death Mountain Trail",
+ "Spot 17 - Death Mountain Crater",
+ "Spot 18 - Goron City",
+ "Spot 20 - Lon Lon Ranch",
+ "Ganon's Castle Exterior",
+ "Jungle Gym",
+ "Ganondorf Test Room",
+ "Depth Test",
+ "Stalfos Mini-Boss Room",
+ "Stalfos Boss Room",
+ "Sutaru",
+ "Castle Hedge Maze (Early)",
+ "Sasa Test",
+ "Treasure Chest Room",
+};
+
+std::vector itemNames = {
+ "Deku Stick",
+ "Deku Nut",
+ "Bomb",
+ "Fairy Bow",
+ "Fire Arrow",
+ "Din's Fire",
+ "Fairy Slingshot",
+ "Fairy Ocarina",
+ "Ocarina of Time",
+ "Bombchu",
+ "Hookshot",
+ "Longshot",
+ "Ice Arrow",
+ "Farore's Wind",
+ "Boomerang",
+ "Lens of Truth",
+ "Magic Bean",
+ "Megaton Hammer",
+ "Light Arrow",
+ "Nayru's Love",
+ "Empty Bottle",
+ "Red Potion",
+ "Green Potion",
+ "Blue Potion",
+ "Bottled Fairy",
+ "Fish",
+ "Lon Lon Milk & Bottle",
+ "Ruto's Letter",
+ "Blue Fire",
+ "Bug",
+ "Big Poe",
+ "Lon Lon Milk (Half)",
+ "Poe",
+ "Weird Egg",
+ "Chicken",
+ "Zelda's Letter",
+ "Keaton Mask",
+ "Skull Mask",
+ "Spooky Mask",
+ "Bunny Hood",
+ "Goron Mask",
+ "Zora Mask",
+ "Gerudo Mask",
+ "Mask of Truth",
+ "SOLD OUT",
+ "Pocket Egg",
+ "Pocket Cucco",
+ "Cojiro",
+ "Odd Mushroom",
+ "Odd Potion",
+ "Poacher's Saw",
+ "Goron's Sword (Broken)",
+ "Prescription",
+ "Eyeball Frog",
+ "Eye Drops",
+ "Claim Check",
+ "Fairy Bow & Fire Arrow",
+ "Fairy Bow & Ice Arrow",
+ "Fairy Bow & Light Arrow",
+ "Kokiri Sword",
+ "Master Sword",
+ "Giant's Knife & Biggoron's Sword",
+ "Deku Shield",
+ "Hylian Shield",
+ "Mirror Shield",
+ "Kokiri Tunic",
+ "Goron Tunic",
+ "Zora Tunic",
+ "Kokiri Boots",
+ "Iron Boots",
+ "Hover Boots",
+ "Bullet Bag (30)",
+ "Bullet Bag (40)",
+ "Bullet Bag (50)",
+ "Quiver (30)",
+ "Big Quiver (40)",
+ "Biggest Quiver (50)",
+ "Bomb Bag (20)",
+ "Big Bomb Bag (30)",
+ "Biggest Bomb Bag (40)",
+ "Goron's Bracelet",
+ "Silver Gauntlets",
+ "Golden Gauntlets",
+ "Silver Scale",
+ "Golden Scale",
+ "Giant's Knife (Broken)",
+ "Adult's Wallet",
+ "Giant's Wallet",
+ "Deku Seeds (5)",
+ "Fishing Pole",
+ "Minuet of Forest",
+ "Bolero of Fire",
+ "Serenade of Water",
+ "Requiem of Spirit",
+ "Nocturne of Shadow",
+ "Prelude of Light",
+ "Zelda's Lullaby",
+ "Epona's Song",
+ "Saria's Song",
+ "Sun's Song",
+ "Song of Time",
+ "Song of Storms",
+ "Forest Medallion",
+ "Fire Medallion",
+ "Water Medallion",
+ "Spirit Medallion",
+ "Shadow Medallion",
+ "Light Medallion",
+ "Kokiri's Emerald",
+ "Goron's Ruby",
+ "Zora's Sapphire",
+ "Stone of Agony",
+ "Gerudo's Card",
+ "Gold Skulltula Token",
+ "Heart Container",
+ "Piece of Heart [?]",
+ "Big Key",
+ "Compass",
+ "Dungeon Map",
+ "Small Key",
+ "Small Magic Jar",
+ "Large Magic Jar",
+ "Piece of Heart",
+ "[Removed]",
+ "[Removed]",
+ "[Removed]",
+ "[Removed]",
+ "[Removed]",
+ "[Removed]",
+ "[Removed]",
+ "Lon Lon Milk",
+ "Recovery Heart",
+ "Green Rupee",
+ "Blue Rupee",
+ "Red Rupee",
+ "Purple Rupee",
+ "Huge Rupee",
+ "[Removed]",
+ "Deku Sticks (5)",
+ "Deku Sticks (10)",
+ "Deku Nuts (5)",
+ "Deku Nuts (10)",
+ "Bombs (5)",
+ "Bombs (10)",
+ "Bombs (20)",
+ "Bombs (30)",
+ "Arrows (Small)",
+ "Arrows (Medium)",
+ "Arrows (Large)",
+ "Deku Seeds (30)",
+ "Bombchu (5)",
+ "Bombchu (20)",
+ "Deku Stick Upgrade (20)",
+ "Deku Stick Upgrade (30)",
+ "Deku Nut Upgrade (30)",
+ "Deku Nut Upgrade (40)",
+};
+
+std::vector questItemNames = {
+ "Forest Medallion",
+ "Fire Medallion",
+ "Water Medallion",
+ "Spirit Medallion",
+ "Shadow Medallion",
+ "Light Medallion",
+ "Minuet of Forest",
+ "Bolero of Fire",
+ "Serenade of Water",
+ "Requiem of Spirit",
+ "Nocturne of Shadow",
+ "Prelude of Light",
+ "Zelda's Lullaby",
+ "Epona's Song",
+ "Saria's Song",
+ "Sun's Song",
+ "Song of Time",
+ "Song of Storms",
+ "Kokiri's Emerald",
+ "Goron's Ruby",
+ "Zora's Sapphire",
+ "Stone of Agony",
+ "Gerudo's Card",
+ "Gold Skulltula Token",
+};
+
+const std::string& SohUtils::GetSceneName(int32_t scene) {
+ return sceneNames[scene];
+}
+
+const std::string& SohUtils::GetItemName(int32_t item) {
+ return itemNames[item];
+}
+
+const std::string& SohUtils::GetQuestItemName(int32_t item) {
+ return questItemNames[item];
+}
diff --git a/soh/soh/util.h b/soh/soh/util.h
new file mode 100644
index 000000000..9fd806f18
--- /dev/null
+++ b/soh/soh/util.h
@@ -0,0 +1,11 @@
+#pragma once
+#include
+#include
+
+namespace SohUtils {
+ const std::string& GetSceneName(int32_t scene);
+
+ const std::string& GetItemName(int32_t item);
+
+ const std::string& GetQuestItemName(int32_t item);
+} // namespace SohUtils
diff --git a/soh/soh/z_play_otr.cpp b/soh/soh/z_play_otr.cpp
index 45797a24b..3e2a990d7 100644
--- a/soh/soh/z_play_otr.cpp
+++ b/soh/soh/z_play_otr.cpp
@@ -31,6 +31,16 @@ extern "C" void OTRGameplay_SpawnScene(GlobalContext* globalCtx, s32 sceneNum, s
std::string scenePath = StringHelper::Sprintf("scenes/%s/%s", scene->sceneFile.fileName, scene->sceneFile.fileName);
globalCtx->sceneSegment = (Ship::Scene*)OTRGameplay_LoadFile(globalCtx, scenePath.c_str());
+
+ // Failed to load scene... default to doodongs cavern
+ if (globalCtx->sceneSegment == nullptr)
+ {
+ lusprintf(__FILE__, __LINE__, 2, "Unable to load scene %s... Defaulting to Doodong's Cavern!\n",
+ scenePath.c_str());
+ OTRGameplay_SpawnScene(globalCtx, 0x01, 0);
+ return;
+ }
+
scene->unk_13 = 0;
//ASSERT(globalCtx->sceneSegment != NULL, "this->sceneSegment != NULL", "../z_play.c", 4960);
diff --git a/soh/soh/z_scene_otr.cpp b/soh/soh/z_scene_otr.cpp
index f63df81e4..123f9c636 100644
--- a/soh/soh/z_scene_otr.cpp
+++ b/soh/soh/z_scene_otr.cpp
@@ -72,7 +72,7 @@ bool func_800985DC(GlobalContext* globalCtx, Ship::SceneCommand* cmd) {
else
{
ActorEntry* entries = (ActorEntry*)malloc(cmdActor->entries.size() * sizeof(ActorEntry));
-
+
for (int i = 0; i < cmdActor->entries.size(); i++)
{
entries[i].id = cmdActor->entries[i].actorNum;
@@ -241,7 +241,7 @@ bool func_800987F8(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
globalCtx->setupEntranceList[i].room = otrEntrance->entrances[i].roomToLoad;
globalCtx->setupEntranceList[i].spawn = otrEntrance->entrances[i].startPositionIndex;
}
-
+
otrEntrance->cachedGameData = globalCtx->setupEntranceList;
}
@@ -252,11 +252,11 @@ bool func_800987F8(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
bool func_8009883C(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
{
Ship::SetSpecialObjects* otrSpecial = (Ship::SetSpecialObjects*)cmd;
-
+
if (otrSpecial->globalObject != 0)
globalCtx->objectCtx.subKeepIndex = Object_Spawn(&globalCtx->objectCtx, otrSpecial->globalObject);
- if (otrSpecial->elfMessage != 0)
+ if (otrSpecial->elfMessage != 0)
{
auto res = (Ship::Blob*)OTRGameplay_LoadFile(globalCtx, sNaviMsgFiles[otrSpecial->elfMessage - 1].fileName);
globalCtx->cUpElfMsgs = (ElfMessage*)res->data.data();
@@ -436,7 +436,7 @@ extern "C" void* func_800982FC(ObjectContext * objectCtx, s32 bankIndex, s16 obj
bool func_8009899C(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
{
Ship::SetObjectList* cmdObj = (Ship::SetObjectList*)cmd;
-
+
s32 i;
s32 j;
s32 k;
@@ -743,7 +743,7 @@ bool func_8009918C(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
}
// Scene Command 0x18: Alternate Headers
-bool func_800991A0(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
+bool func_800991A0(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
{
Ship::SetAlternateHeaders* cmdHeaders = (Ship::SetAlternateHeaders*)cmd;
@@ -754,7 +754,7 @@ bool func_800991A0(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
//osSyncPrintf("\n[ZU]sceneset time =[%X]", ((void)0, gSaveContext.cutsceneIndex));
//osSyncPrintf("\n[ZU]sceneset counter=[%X]", ((void)0, gSaveContext.sceneSetupIndex));
- if (gSaveContext.sceneSetupIndex != 0)
+ if (gSaveContext.sceneSetupIndex != 0)
{
std::string desiredHeader = cmdHeaders->headers[gSaveContext.sceneSetupIndex - 1];
Ship::Scene* headerData = nullptr;
@@ -798,7 +798,7 @@ bool func_800991A0(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
}
// Scene Command 0x17: Cutscene Data
-bool func_8009934C(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
+bool func_8009934C(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
{
Ship::SetCutscenes* cmdCS = (Ship::SetCutscenes*)cmd;
@@ -810,7 +810,7 @@ bool func_8009934C(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
}
// Scene Command 0x19: Misc. Settings (Camera & World Map Area)
-bool func_800993C0(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
+bool func_800993C0(GlobalContext* globalCtx, Ship::SceneCommand* cmd)
{
Ship::SetCameraSettings* cmdCam = (Ship::SetCameraSettings*)cmd;
diff --git a/soh/src/boot/build.c b/soh/src/boot/build.c
index f3f9bdae6..f60380467 100644
--- a/soh/src/boot/build.c
+++ b/soh/src/boot/build.c
@@ -1,8 +1,4 @@
const char gBuildVersion[] = "DECKARD ALFA (1.0.0)";
const char gBuildTeam[] = "github.com/harbourmasters";
-#ifdef __TIMESTAMP__
-const char gBuildDate[] = __TIMESTAMP__;
-#else
const char gBuildDate[] = __DATE__ " " __TIME__;
-#endif
const char gBuildMakeOption[] = "";
diff --git a/soh/src/buffers/heaps.c b/soh/src/buffers/heaps.c
index 4309acd18..d09f86e72 100644
--- a/soh/src/buffers/heaps.c
+++ b/soh/src/buffers/heaps.c
@@ -1,7 +1,43 @@
#include "z64.h"
+#include
+#include
-// 0x38000 bytes
-u8 gAudioHeap[0x38000];
+#ifndef _MSC_VER
+#include
+#endif
-//u8 gSystemHeap[UNK_SIZE];
-u8 gSystemHeap[1024 * 1024 * 128];
+#define AUDIO_HEAP_SIZE 0x38000
+#define SYSTEM_HEAP_SIZE (1024 * 1024 * 128)
+
+u8* gAudioHeap;
+u8* gSystemHeap;
+
+void Heaps_Alloc(void)
+{
+#ifdef _MSC_VER
+ gAudioHeap = (u8*)_aligned_malloc(AUDIO_HEAP_SIZE, 0x10);
+ gSystemHeap = (u8*)_aligned_malloc(SYSTEM_HEAP_SIZE, 0x10);
+#elif defined(_POSIX_VERSION) && (_POSIX_VERSION >= 200112L)
+ if (posix_memalign((void**)&gAudioHeap, 0x10, AUDIO_HEAP_SIZE) != 0)
+ gAudioHeap = NULL;
+ if (posix_memalign((void**)&gSystemHeap, 0x10, SYSTEM_HEAP_SIZE) != 0)
+ gSystemHeap = NULL;
+#else
+ gAudioHeap = (u8*)memalign(0x10, AUDIO_HEAP_SIZE);
+ gSystemHeap = (u8*)memalign(0x10, SYSTEM_HEAP_SIZE);
+#endif
+
+ assert(gAudioHeap != NULL);
+ assert(gSystemHeap != NULL);
+}
+
+void Heaps_Free(void)
+{
+#ifdef _MSC_VER
+ _aligned_free(gAudioHeap);
+ _aligned_free(gSystemHeap);
+#else
+ free(gAudioHeap);
+ free(gSystemHeap);
+#endif
+}
diff --git a/soh/src/code/code_800EC960.c b/soh/src/code/code_800EC960.c
index 5efa93167..23d1ba375 100644
--- a/soh/src/code/code_800EC960.c
+++ b/soh/src/code/code_800EC960.c
@@ -824,10 +824,12 @@ NatureAmbienceDataIO sNatureAmbienceDataIO[20] = {
},
};
-u32 sOcarinaAllowedBtnMask = 0x800F;
-s32 sOcarinaABtnMap = 0x8000;
-s32 sOcarinaCUPBtnMap = 8;
-s32 sOcarinaCDownBtnMap = 4;
+u32 sOcarinaAllowedBtnMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT);
+s32 sOcarinaABtnMap = BTN_A;
+s32 sOcarinaCUPBtnMap = BTN_CUP;
+s32 sOcarinaCDownBtnMap = BTN_CDOWN;
+s32 sOcarinaCLeftBtnMap = BTN_CLEFT;
+s32 sOcarinaCRightBtnMap = BTN_CRIGHT;
u8 sOcarinaInpEnabled = 0;
s8 D_80130F10 = 0; // "OCA", ocarina active?
u8 sCurOcarinaBtnVal = 0xFF;
@@ -1245,19 +1247,23 @@ void func_800F56A8(void);
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
s32 Audio_SetGanonDistVol(u8 targetVol);
-void func_800EC960(u8 custom) {
- if (!custom) {
- osSyncPrintf("AUDIO : Ocarina Control Assign Normal\n");
+// Function originally not called, so repurposing for DPad input
+void func_800EC960(u8 dpad) {
+ if (dpad) {
+ sOcarinaAllowedBtnMask =
+ (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT | BTN_DUP | BTN_DDOWN | BTN_DLEFT | BTN_DRIGHT);
+ sOcarinaABtnMap = BTN_A;
+ sOcarinaCUPBtnMap = BTN_CUP | BTN_DUP;
+ sOcarinaCDownBtnMap = BTN_CDOWN | BTN_DDOWN;
+ sOcarinaCLeftBtnMap = BTN_CLEFT | BTN_DLEFT;
+ sOcarinaCRightBtnMap = BTN_CRIGHT | BTN_DRIGHT;
+ } else {
sOcarinaAllowedBtnMask = (BTN_A | BTN_CUP | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT);
sOcarinaABtnMap = BTN_A;
sOcarinaCUPBtnMap = BTN_CUP;
sOcarinaCDownBtnMap = BTN_CDOWN;
- } else {
- osSyncPrintf("AUDIO : Ocarina Control Assign Custom\n");
- sOcarinaAllowedBtnMask = (BTN_A | BTN_B | BTN_CDOWN | BTN_CLEFT | BTN_CRIGHT);
- sOcarinaABtnMap = BTN_B;
- sOcarinaCUPBtnMap = BTN_CDOWN;
- sOcarinaCDownBtnMap = BTN_A;
+ sOcarinaCLeftBtnMap = BTN_CLEFT;
+ sOcarinaCRightBtnMap = BTN_CRIGHT;
}
}
@@ -1542,6 +1548,7 @@ void func_800ED200(void) {
void func_800ED458(s32 arg0) {
u32 phi_v1_2;
+ bool dpad = CVar_GetS32("gDpadOcarinaText", 0);
if (D_80130F3C != 0 && D_80131880 != 0) {
D_80131880--;
@@ -1561,6 +1568,7 @@ void func_800ED458(s32 arg0) {
D_8016BA18 &= phi_v1_2;
}
+ func_800EC960(dpad);
if (D_8016BA18 & sOcarinaABtnMap) {
osSyncPrintf("Presss NA_KEY_D4 %08x\n", sOcarinaABtnMap);
sCurOcarinaBtnVal = 2;
@@ -1569,12 +1577,12 @@ void func_800ED458(s32 arg0) {
osSyncPrintf("Presss NA_KEY_F4 %08x\n", sOcarinaCDownBtnMap);
sCurOcarinaBtnVal = 5;
sCurOcarinaBtnIdx = 1;
- } else if (D_8016BA18 & 1) {
- osSyncPrintf("Presss NA_KEY_A4 %08x\n", 1);
+ } else if (D_8016BA18 & sOcarinaCRightBtnMap) {
+ osSyncPrintf("Presss NA_KEY_A4 %08x\n", sOcarinaCRightBtnMap);
sCurOcarinaBtnVal = 9;
sCurOcarinaBtnIdx = 2;
- } else if (D_8016BA18 & 2) {
- osSyncPrintf("Presss NA_KEY_B4 %08x\n", 2);
+ } else if (D_8016BA18 & sOcarinaCLeftBtnMap) {
+ osSyncPrintf("Presss NA_KEY_B4 %08x\n", sOcarinaCRightBtnMap);
sCurOcarinaBtnVal = 0xB;
sCurOcarinaBtnIdx = 3;
} else if (D_8016BA18 & sOcarinaCUPBtnMap) {
@@ -1671,7 +1679,7 @@ void Audio_OcaSetSongPlayback(s8 songIdxPlusOne, s8 playbackState) {
void Audio_OcaPlayback(void) {
u32 noteTimerStep;
- u32 nextNoteTimerStep;
+ u32 nextNoteTimerStep = 0;
if (sPlaybackState != 0) {
if (sStaffPlaybackPos == 0) {
@@ -4772,7 +4780,7 @@ void Audio_SetCodeReverb(s8 reverb) {
}
void func_800F6700(s8 arg0) {
- s8 sp1F;
+ s8 sp1F = 0;
switch (arg0) {
case 0:
diff --git a/soh/src/code/game.c b/soh/src/code/game.c
index ec8a0e9fa..b69537fd8 100644
--- a/soh/src/code/game.c
+++ b/soh/src/code/game.c
@@ -323,6 +323,106 @@ void GameState_Update(GameState* gameState) {
GameState_Draw(gameState, gfxCtx);
func_800C49F4(gfxCtx);
}
+
+ // -----------------------
+ // Cheats hooks
+ // -----------------------
+
+ // Inf Money
+ if (CVar_GetS32("gInfiniteMoney", 0) != 0) {
+ if (gSaveContext.rupees < CUR_CAPACITY(UPG_WALLET)) {
+ gSaveContext.rupees = CUR_CAPACITY(UPG_WALLET);
+ }
+ }
+
+ // Inf Health
+ if (CVar_GetS32("gInfiniteHealth", 0) != 0) {
+ if (gSaveContext.health < gSaveContext.healthCapacity) {
+ gSaveContext.health = gSaveContext.healthCapacity;
+ }
+ }
+
+ // Inf Ammo
+ if (CVar_GetS32("gInfiniteAmmo", 0) != 0) {
+ // Deku Sticks
+ if (AMMO(ITEM_STICK) < CUR_CAPACITY(UPG_STICKS)) {
+ AMMO(ITEM_STICK) = CUR_CAPACITY(UPG_STICKS);
+ }
+
+ // Deku Nuts
+ if (AMMO(ITEM_NUT) < CUR_CAPACITY(UPG_NUTS)) {
+ AMMO(ITEM_NUT) = CUR_CAPACITY(UPG_NUTS);
+ }
+
+ // Bombs
+ if (AMMO(ITEM_BOMB) < CUR_CAPACITY(UPG_BOMB_BAG)) {
+ AMMO(ITEM_BOMB) = CUR_CAPACITY(UPG_BOMB_BAG);
+ }
+
+ // Fairy Bow (Ammo)
+ if (AMMO(ITEM_BOW) < CUR_CAPACITY(UPG_QUIVER)) {
+ AMMO(ITEM_BOW) = CUR_CAPACITY(UPG_QUIVER);
+ }
+
+ // Fairy Slingshot (Ammo)
+ if (AMMO(ITEM_SLINGSHOT) < CUR_CAPACITY(UPG_BULLET_BAG)) {
+ AMMO(ITEM_SLINGSHOT) = CUR_CAPACITY(UPG_BULLET_BAG);
+ }
+
+ // Bombchus (max: 50, no upgrades)
+ if (AMMO(ITEM_BOMBCHU) < 50) {
+ AMMO(ITEM_BOMBCHU) = 50;
+ }
+ }
+
+ // Inf Magic
+ if (CVar_GetS32("gInfiniteMagic", 0) != 0) {
+ if (gSaveContext.magicAcquired && gSaveContext.magic != (gSaveContext.doubleMagic + 1) * 0x30) {
+ gSaveContext.magic = (gSaveContext.doubleMagic + 1) * 0x30;
+ }
+ }
+
+ // Inf Nayru's Love Timer
+ if (CVar_GetS32("gInfiniteNayru", 0) != 0) {
+ gSaveContext.nayrusLoveTimer = 0x44B;
+ }
+
+ // Moon Jump On L
+ if (CVar_GetS32("gMoonJumpOnL", 0) != 0) {
+ if (gGlobalCtx) {
+ Player* player = GET_PLAYER(gGlobalCtx);
+
+ if (CHECK_BTN_ANY(gGlobalCtx->state.input[0].cur.button, BTN_L)) {
+ player->actor.velocity.y = 6.34375f;
+ }
+ }
+ }
+
+ // Permanent infinite sword glitch (ISG)
+ if (CVar_GetS32("gEzISG", 0) != 0) {
+ if (gGlobalCtx) {
+ Player* player = GET_PLAYER(gGlobalCtx);
+ player->swordState = 1;
+ }
+ }
+
+ // Unrestricted Items
+ if (CVar_GetS32("gNoRestrictItems", 0) != 0) {
+ if (gGlobalCtx) {
+ memset(&gGlobalCtx->interfaceCtx.restrictions, 0, sizeof(gGlobalCtx->interfaceCtx.restrictions));
+ }
+ }
+
+ // Freeze Time
+ if (CVar_GetS32("gFreezeTime", 0) != 0) {
+ if (CVar_GetS32("gPrevTime", -1) == -1) {
+ CVar_SetS32("gPrevTime", gSaveContext.dayTime);
+ }
+
+ int32_t prevTime = CVar_GetS32("gPrevTime", gSaveContext.dayTime);
+ gSaveContext.dayTime = prevTime;
+ }
+
gameState->frames++;
}
diff --git a/soh/src/code/graph.c b/soh/src/code/graph.c
index 9d2886ef1..dbbbb9df1 100644
--- a/soh/src/code/graph.c
+++ b/soh/src/code/graph.c
@@ -95,12 +95,14 @@ void Graph_InitTHGA(GraphicsContext* gfxCtx) {
pool->tailMagic = GFXPOOL_TAIL_MAGIC;
THGA_Ct(&gfxCtx->polyOpa, pool->polyOpaBuffer, sizeof(pool->polyOpaBuffer));
THGA_Ct(&gfxCtx->polyXlu, pool->polyXluBuffer, sizeof(pool->polyXluBuffer));
+ THGA_Ct(&gfxCtx->titlecard, pool->titlecardBuffer, sizeof(pool->titlecardBuffer));
THGA_Ct(&gfxCtx->polyKal, pool->polyKalBuffer, sizeof(pool->polyKalBuffer));
THGA_Ct(&gfxCtx->overlay, pool->overlayBuffer, sizeof(pool->overlayBuffer));
THGA_Ct(&gfxCtx->work, pool->workBuffer, sizeof(pool->workBuffer));
gfxCtx->polyOpaBuffer = pool->polyOpaBuffer;
gfxCtx->polyXluBuffer = pool->polyXluBuffer;
+ gfxCtx->titlecardBuffer = pool->titlecardBuffer;
gfxCtx->polyKalBuffer = pool->polyKalBuffer;
gfxCtx->overlayBuffer = pool->overlayBuffer;
gfxCtx->workBuffer = pool->workBuffer;
@@ -274,6 +276,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) {
gDPNoOpString(WORK_DISP++, "WORK_DISP é–‹å§‹", 0);
gDPNoOpString(POLY_OPA_DISP++, "POLY_OPA_DISP é–‹å§‹", 0);
gDPNoOpString(POLY_XLU_DISP++, "POLY_XLU_DISP é–‹å§‹", 0);
+ gDPNoOpString(TITLE_CARD_DISP++, "TITLE_CARD_DISP é–‹å§‹", 0);//unsure if needed
gDPNoOpString(OVERLAY_DISP++, "OVERLAY_DISP é–‹å§‹", 0);
CLOSE_DISPS(gfxCtx, "../graph.c", 975);
@@ -286,6 +289,7 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) {
gDPNoOpString(WORK_DISP++, "WORK_DISP 終了", 0);
gDPNoOpString(POLY_OPA_DISP++, "POLY_OPA_DISP 終了", 0);
gDPNoOpString(POLY_XLU_DISP++, "POLY_XLU_DISP 終了", 0);
+ gDPNoOpString(TITLE_CARD_DISP++, "TITLE_CARD_DISP 終了", 0);
gDPNoOpString(OVERLAY_DISP++, "OVERLAY_DISP 終了", 0);
CLOSE_DISPS(gfxCtx, "../graph.c", 996);
@@ -294,7 +298,8 @@ void Graph_Update(GraphicsContext* gfxCtx, GameState* gameState) {
gSPBranchList(WORK_DISP++, gfxCtx->polyOpaBuffer);
gSPBranchList(POLY_OPA_DISP++, gfxCtx->polyXluBuffer);
- gSPBranchList(POLY_XLU_DISP++, gfxCtx->polyKalBuffer);
+ gSPBranchList(POLY_XLU_DISP++, gfxCtx->titlecardBuffer);
+ gSPBranchList(TITLE_CARD_DISP++, gfxCtx->polyKalBuffer);
gSPBranchList(POLY_KAL_DISP++, gfxCtx->overlayBuffer);
gDPPipeSync(OVERLAY_DISP++);
gDPFullSync(OVERLAY_DISP++);
@@ -468,35 +473,6 @@ static void RunFrame()
{
uint64_t ticksA, ticksB;
ticksA = GetPerfCounter();
-
- OTRSetFrameDivisor(R_UPDATE_RATE);
- //OTRSetFrameDivisor(0);
-
-
- //AudioMgr_ThreadEntry(&gAudioMgr);
- // 528 and 544 relate to 60 fps at 32 kHz 32000/60 = 533.333..
- // in an ideal world, one third of the calls should use num_samples=544 and two thirds num_samples=528
- #define SAMPLES_HIGH 560
- #define SAMPLES_LOW 528
- // PAL values
- //#define SAMPLES_HIGH 656
- //#define SAMPLES_LOW 624
- #define AUDIO_FRAMES_PER_UPDATE (R_UPDATE_RATE > 0 ? R_UPDATE_RATE : 1 )
- #define NUM_AUDIO_CHANNELS 2
- int samples_left = AudioPlayer_Buffered();
- u32 num_audio_samples = samples_left < AudioPlayer_GetDesiredBuffered() ? SAMPLES_HIGH : SAMPLES_LOW;
- // printf("Audio samples: %d %u\n", samples_left, num_audio_samples);
-
- // 3 is the maximum authentic frame divisor.
- s16 audio_buffer[SAMPLES_HIGH * NUM_AUDIO_CHANNELS * 3];
- for (int i = 0; i < AUDIO_FRAMES_PER_UPDATE; i++) {
- AudioMgr_CreateNextAudioBuffer(audio_buffer + i * (num_audio_samples * NUM_AUDIO_CHANNELS), num_audio_samples);
- }
- //for (uint32_t i = 0; i < 2 * num_audio_samples; i++) {
- // audio_buffer[i] = Rand_Next() & 0xFF;
- //}
- // printf("Audio samples before submitting: %d\n", audio_api->buffered());
- AudioPlayer_Play((u8*)audio_buffer, num_audio_samples * (sizeof(int16_t) * NUM_AUDIO_CHANNELS * AUDIO_FRAMES_PER_UPDATE));
PadMgr_ThreadEntry(&gPadMgr);
diff --git a/soh/src/code/main.c b/soh/src/code/main.c
index eaaa7b388..0680aad3e 100644
--- a/soh/src/code/main.c
+++ b/soh/src/code/main.c
@@ -63,6 +63,7 @@ void Main(void* arg) {
PreNmiBuff_Init(gAppNmiBufferPtr);
Fault_Init();
SysCfb_Init(0);
+ Heaps_Alloc();
sysHeap = gSystemHeap;
fb = SysCfb_GetFbPtr(0);
gSystemHeapSize = 1024 * 1024 * 4;
@@ -131,4 +132,6 @@ void Main(void* arg) {
osDestroyThread(&sGraphThread);
func_800FBFD8();
osSyncPrintf("mainproc 実行終了\n"); // "End of execution"
+
+ Heaps_Free();
}
diff --git a/soh/src/code/padmgr.c b/soh/src/code/padmgr.c
index 9a05c585e..b467f5ee6 100644
--- a/soh/src/code/padmgr.c
+++ b/soh/src/code/padmgr.c
@@ -271,12 +271,22 @@ void PadMgr_ProcessInputs(PadMgr* padMgr) {
input->press.stick_y += (s8)(input->cur.stick_y - input->prev.stick_y);
}
- controllerCallback.rumble = padMgr->rumbleEnable[0] > 0 ? 1 : 0;
+ controllerCallback.rumble = CVar_GetS32("gRumbleEnabled", 0) && (padMgr->rumbleEnable[0] > 0);
if (HealthMeter_IsCritical()) {
- controllerCallback.ledColor = 1;
- } else {
controllerCallback.ledColor = 0;
+ } else if (gGlobalCtx) {
+ switch (CUR_EQUIP_VALUE(EQUIP_TUNIC) - 1) {
+ case PLAYER_TUNIC_KOKIRI:
+ controllerCallback.ledColor = 1;
+ break;
+ case PLAYER_TUNIC_GORON:
+ controllerCallback.ledColor = 2;
+ break;
+ case PLAYER_TUNIC_ZORA:
+ controllerCallback.ledColor = 3;
+ break;
+ }
}
OTRControllerCallback(&controllerCallback);
@@ -295,6 +305,11 @@ void PadMgr_HandleRetraceMsg(PadMgr* padMgr) {
}
osRecvMesg(queue, NULL, OS_MESG_BLOCK);
osContGetReadData(padMgr->pads);
+
+ for (i = 0; i < __osMaxControllers; i++) {
+ padMgr->padStatus[i].status = CVar_GetS32("gRumbleEnabled", 0) && Controller_ShouldRumble(i);
+ }
+
if (padMgr->preNMIShutdown) {
memset(padMgr->pads, 0, sizeof(padMgr->pads));
}
diff --git a/soh/src/code/sys_math3d.c b/soh/src/code/sys_math3d.c
index d442b7c4a..39ffea881 100644
--- a/soh/src/code/sys_math3d.c
+++ b/soh/src/code/sys_math3d.c
@@ -1857,7 +1857,7 @@ s32 Math3D_CylTriVsIntersect(Cylinder16* cyl, TriNorm* tri, Vec3f* intersect) {
}
}
- if (minDistSq != 1.e38f) {
+ if (minDistSq != (f32)1.e38f) {
return true;
}
diff --git a/soh/src/code/z_actor.c b/soh/src/code/z_actor.c
index 8ac4402ba..ed2b4d19b 100644
--- a/soh/src/code/z_actor.c
+++ b/soh/src/code/z_actor.c
@@ -334,6 +334,38 @@ void func_8002BE98(TargetContext* targetCtx, s32 actorCategory, GlobalContext* g
void func_8002BF60(TargetContext* targetCtx, Actor* actor, s32 actorCategory, GlobalContext* globalCtx) {
NaviColor* naviColor = &sNaviColorList[actorCategory];
+ if (actorCategory == ACTORCAT_PLAYER) {
+ naviColor->inner.r = CVar_GetS32("gNavi_Idle_Inner_Red", naviColor->inner.r);
+ naviColor->inner.g = CVar_GetS32("gNavi_Idle_Inner_Green", naviColor->inner.g);
+ naviColor->inner.b = CVar_GetS32("gNavi_Idle_Inner_Blue", naviColor->inner.b);
+ naviColor->outer.r = CVar_GetS32("gNavi_Idle_Outer_Red", naviColor->outer.r);
+ naviColor->outer.g = CVar_GetS32("gNavi_Idle_Outer_Green", naviColor->outer.g);
+ naviColor->outer.b = CVar_GetS32("gNavi_Idle_Outer_Blue", naviColor->outer.b);
+ }
+ if (actorCategory == ACTORCAT_NPC) {
+ naviColor->inner.r = CVar_GetS32("gNavi_NPC_Inner_Red", naviColor->inner.r);
+ naviColor->inner.g = CVar_GetS32("gNavi_NPC_Inner_Green", naviColor->inner.g);
+ naviColor->inner.b = CVar_GetS32("gNavi_NPC_Inner_Blue", naviColor->inner.b);
+ naviColor->outer.r = CVar_GetS32("gNavi_NPC_Outer_Red", naviColor->outer.r);
+ naviColor->outer.g = CVar_GetS32("gNavi_NPC_Outer_Green", naviColor->outer.g);
+ naviColor->outer.b = CVar_GetS32("gNavi_NPC_Outer_Blue", naviColor->outer.b);
+ }
+ if (actorCategory == ACTORCAT_BOSS || actorCategory == ACTORCAT_ENEMY) {
+ naviColor->inner.r = CVar_GetS32("gNavi_Enemy_Inner_Red", naviColor->inner.r);
+ naviColor->inner.g = CVar_GetS32("gNavi_Enemy_Inner_Green", naviColor->inner.g);
+ naviColor->inner.b = CVar_GetS32("gNavi_Enemy_Inner_Blue", naviColor->inner.b);
+ naviColor->outer.r = CVar_GetS32("gNavi_Enemy_Outer_Red", naviColor->outer.r);
+ naviColor->outer.g = CVar_GetS32("gNavi_Enemy_Outer_Green", naviColor->outer.g);
+ naviColor->outer.b = CVar_GetS32("gNavi_Enemy_Outer_Blue", naviColor->outer.b);
+ }
+ if (actorCategory == ACTORCAT_PROP) {
+ naviColor->inner.r = CVar_GetS32("gNavi_Prop_Inner_Red", naviColor->inner.r);
+ naviColor->inner.g = CVar_GetS32("gNavi_Prop_Inner_Green", naviColor->inner.g);
+ naviColor->inner.b = CVar_GetS32("gNavi_Prop_Inner_Blue", naviColor->inner.b);
+ naviColor->outer.r = CVar_GetS32("gNavi_Prop_Outer_Red", naviColor->outer.r);
+ naviColor->outer.g = CVar_GetS32("gNavi_Prop_Outer_Green", naviColor->outer.g);
+ naviColor->outer.b = CVar_GetS32("gNavi_Prop_Outer_Blue", naviColor->outer.b);
+ }
targetCtx->naviRefPos.x = actor->focus.pos.x;
targetCtx->naviRefPos.y = actor->focus.pos.y + (actor->targetArrowOffset * actor->scale.y);
targetCtx->naviRefPos.z = actor->focus.pos.z;
@@ -766,9 +798,9 @@ void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCt
break;
case SCENE_JYASINZOU:
texture = gSpiritTempleTitleCardENGTex;
- break;
+ break;
case SCENE_HAKADAN:
- texture = gSpiritTempleTitleCardENGTex;
+ texture = gShadowTempleTitleCardENGTex;
break;
case SCENE_HAKADANCH:
texture = gBottomOfTheWellTitleCardENGTex;
@@ -977,7 +1009,6 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
s32 doubleWidth;
s32 titleY;
s32 titleSecondY;
- s32 textureLanguageOffset;
if (titleCtx->alpha != 0) {
width = titleCtx->width;
@@ -988,33 +1019,34 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2824);
- textureLanguageOffset = width * height * gSaveContext.language;
height = (width * height > 0x1000) ? 0x1000 / width : height;
titleSecondY = titleY + (height * 4);
- OVERLAY_DISP = func_80093808(OVERLAY_DISP);
+ //TITLE_CARD_DISP Goes over POLY_XLU_DISP but under POLY_KAL_DISP
+ TITLE_CARD_DISP = func_80093808(TITLE_CARD_DISP);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
+ gDPSetPrimColor(TITLE_CARD_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
(u8)titleCtx->alpha);
- gDPLoadTextureBlock(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset, G_IM_FMT_IA,
+ gDPLoadTextureBlock(TITLE_CARD_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);
- gSPTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1,
+ gSPTextureRectangle(TITLE_CARD_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1,
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(OVERLAY_DISP++, (uintptr_t)titleCtx->texture + textureLanguageOffset + 0x1000,
+ gDPLoadTextureBlock(TITLE_CARD_DISP++, (uintptr_t)titleCtx->texture + 0x1000,
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);
- gSPTextureRectangle(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
+ gSPTextureRectangle(TITLE_CARD_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
titleSecondY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
diff --git a/soh/src/code/z_bgcheck.c b/soh/src/code/z_bgcheck.c
index b736d0cf0..9ce139eed 100644
--- a/soh/src/code/z_bgcheck.c
+++ b/soh/src/code/z_bgcheck.c
@@ -1874,6 +1874,10 @@ s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResul
s32 bgId2;
f32 nx, ny, nz; // unit normal of polygon
+ if (CVar_GetS32("gNoClip", 0) != 0) {
+ return false;
+ }
+
result = false;
*outBgId = BGCHECK_SCENE;
*outPoly = NULL;
@@ -3996,7 +4000,11 @@ u32 func_80041D94(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
* SurfaceType Get Wall Flags
*/
s32 func_80041DB8(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
- return D_80119D90[func_80041D94(colCtx, poly, bgId)];
+ if (CVar_GetS32("gClimbEverything", 0) != 0) {
+ return (1 << 3) | D_80119D90[func_80041D94(colCtx, poly, bgId)];
+ } else {
+ return D_80119D90[func_80041D94(colCtx, poly, bgId)];
+ }
}
/**
diff --git a/soh/src/code/z_construct.c b/soh/src/code/z_construct.c
index 593a0c875..c74d3c14c 100644
--- a/soh/src/code/z_construct.c
+++ b/soh/src/code/z_construct.c
@@ -463,7 +463,7 @@ void func_80111070(void) {
WREG(28) = 0;
R_OW_MINIMAP_X = 238;
R_OW_MINIMAP_Y = 164;
- R_MINIMAP_DISABLED = false;
+ R_MINIMAP_DISABLED = CVar_GetS32("gMinimalUI", 0);
WREG(32) = 122;
WREG(33) = 60;
WREG(35) = 0;
diff --git a/soh/src/code/z_en_item00.c b/soh/src/code/z_en_item00.c
index 2693c4b0f..d0179a5e1 100644
--- a/soh/src/code/z_en_item00.c
+++ b/soh/src/code/z_en_item00.c
@@ -5,6 +5,9 @@
#define FLAGS 0
+//Used to force variable to be used in different function, feel free to correct me if you have a better way
+static s16 DroppedItemRot = 0;
+
void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx);
void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx);
@@ -355,11 +358,34 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
switch (this->actor.params) {
case ITEM00_RUPEE_GREEN:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.3f);
+ this->scale = 0.3f;
+ yOffset = 50.0f;
+ shadowScale = 0.3f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_RUPEE_BLUE:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.3f);
+ this->scale = 0.3f;
+ yOffset = 50.0f;
+ shadowScale = 0.3f;
+ this->actor.world.rot.x = 0x4000;
+ }
case ITEM00_RUPEE_RED:
- Actor_SetScale(&this->actor, 0.015f);
- this->scale = 0.015f;
- yOffset = 750.0f;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.3f);
+ this->scale = 0.3f;
+ yOffset = 50.0f;
+ shadowScale = 0.3f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ Actor_SetScale(&this->actor, 0.015f);
+ this->scale = 0.015f;
+ yOffset = 750.0f;
+ }
break;
case ITEM00_SMALL_KEY:
this->unk_158 = 0;
@@ -374,10 +400,18 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
this->scale = 0.02f;
break;
case ITEM00_HEART:
- this->actor.home.rot.z = Rand_CenteredFloat(65535.0f);
- yOffset = 430.0f;
- Actor_SetScale(&this->actor, 0.02f);
- this->scale = 0.02f;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ this->actor.home.rot.z = Rand_CenteredFloat(65535.0f);
+ yOffset = 25.0f;
+ Actor_SetScale(&this->actor, 0.3f);
+ this->scale = 0.3f;
+ shadowScale = 0.5f;
+ } else {
+ this->actor.home.rot.z = Rand_CenteredFloat(65535.0f);
+ yOffset = 430.0f;
+ Actor_SetScale(&this->actor, 0.02f);
+ this->scale = 0.02f;
+ }
break;
case ITEM00_HEART_CONTAINER:
yOffset = 430.0f;
@@ -386,42 +420,154 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
this->scale = 0.02f;
break;
case ITEM00_ARROWS_SINGLE:
- yOffset = 400.0f;
- Actor_SetScale(&this->actor, 0.02f);
- this->scale = 0.02f;
- break;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ yOffset = 400.0f;
+ Actor_SetScale(&this->actor, 0.02f);
+ this->scale = 0.02f;
+ }
+ break;
case ITEM00_ARROWS_SMALL:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_ARROWS_MEDIUM:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_ARROWS_LARGE:
- Actor_SetScale(&this->actor, 0.035f);
- this->scale = 0.035f;
- yOffset = 250.0f;
- break;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ Actor_SetScale(&this->actor, 0.035f);
+ this->scale = 0.035f;
+ yOffset = 250.0f;
+ }
+ break;
case ITEM00_BOMBS_A:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_BOMBS_B:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_NUTS:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_STICK:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_MAGIC_SMALL:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_SEEDS:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ break;
+ }
case ITEM00_BOMBS_SPECIAL:
- Actor_SetScale(&this->actor, 0.03f);
- this->scale = 0.03f;
- yOffset = 320.0f;
- break;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ Actor_SetScale(&this->actor, 0.03f);
+ this->scale = 0.03f;
+ yOffset = 320.0f;
+ }
+ break;
case ITEM00_MAGIC_LARGE:
- Actor_SetScale(&this->actor, 0.045 - 1e-10);
- this->scale = 0.045 - 1e-10;
- yOffset = 320.0f;
- break;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.2f);
+ this->scale = 0.2f;
+ yOffset = 50.0f;
+ shadowScale = 0.5f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ Actor_SetScale(&this->actor, 0.045 - 1e-10);
+ this->scale = 0.045 - 1e-10;
+ yOffset = 320.0f;
+ }
+ break;
case ITEM00_RUPEE_ORANGE:
- Actor_SetScale(&this->actor, 0.045 - 1e-10);
- this->scale = 0.045 - 1e-10;
- yOffset = 750.0f;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.45f);
+ this->scale = 0.45f;
+ yOffset = 50.0f;
+ shadowScale = 0.3f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ Actor_SetScale(&this->actor, 0.045 - 1e-10);
+ this->scale = 0.045 - 1e-10;
+ yOffset = 750.0f;
+ }
break;
case ITEM00_RUPEE_PURPLE:
- Actor_SetScale(&this->actor, 0.03f);
- this->scale = 0.03f;
- yOffset = 750.0f;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ Actor_SetScale(&this->actor, 0.4f);
+ this->scale = 0.4f;
+ yOffset = 50.0f;
+ shadowScale = 0.3f;
+ this->actor.world.rot.x = 0x4000;
+ } else {
+ Actor_SetScale(&this->actor, 0.03f);
+ this->scale = 0.03f;
+ yOffset = 750.0f;
+ }
break;
case ITEM00_FLEXIBLE:
yOffset = 500.0f;
@@ -558,6 +704,19 @@ void EnItem00_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
void func_8001DFC8(EnItem00* this, GlobalContext* globalCtx) {
+
+ if (CVar_GetS32("gNewDrops", 0) !=0) { //set the rotation system on selected model only :)
+ if ((this->actor.params == ITEM_RUPEE_GOLD) || (this->actor.params == ITEM_RUPEE_PURPLE) ||
+ (this->actor.params == ITEM00_ARROWS_SINGLE) || (this->actor.params == ITEM00_ARROWS_SMALL) ||
+ (this->actor.params == ITEM00_ARROWS_MEDIUM) || (this->actor.params == ITEM00_ARROWS_LARGE) ||
+ (this->actor.params == ITEM00_BOMBS_A) || (this->actor.params == ITEM00_BOMBS_B) ||
+ (this->actor.params == ITEM00_NUTS) || (this->actor.params == ITEM00_STICK) ||
+ (this->actor.params == ITEM00_MAGIC_SMALL) || (this->actor.params == ITEM00_SEEDS) ||
+ (this->actor.params == ITEM00_MAGIC_LARGE) || (this->actor.params == ITEM00_HEART) || (this->actor.params == ITEM00_BOMBS_SPECIAL)) {
+ this->actor.shape.rot.y = DroppedItemRot;
+ }
+ }
+
if ((this->actor.params <= ITEM00_RUPEE_RED) || ((this->actor.params == ITEM00_HEART) && (this->unk_15A < 0)) ||
(this->actor.params == ITEM00_HEART_PIECE)) {
this->actor.shape.rot.y += 960;
@@ -731,6 +890,10 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
EnItem00* this = (EnItem00*)thisx;
s32 pad;
+ if (CVar_GetS32("gNewDrops", 0) !=0) { //Update 3D Model rotation on frame update :)
+ DroppedItemRot += 100;
+ }
+
if (this->unk_15A > 0) {
this->unk_15A--;
}
@@ -934,15 +1097,35 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnItem00* this = (EnItem00*)thisx;
f32 mtxScale;
-
+
if (!(this->unk_156 & this->unk_158)) {
switch (this->actor.params) {
case ITEM00_RUPEE_GREEN:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_RUPEE_GREEN);
+ break;
+ }
case ITEM00_RUPEE_BLUE:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_RUPEE_BLUE);
+ break;
+ }
case ITEM00_RUPEE_RED:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_RUPEE_RED);
+ break;
+ }
case ITEM00_RUPEE_ORANGE:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_RUPEE_GOLD);
+ break;
+ }
case ITEM00_RUPEE_PURPLE:
- EnItem00_DrawRupee(this, globalCtx);
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_RUPEE_PURPLE);
+ } else {
+ EnItem00_DrawRupee(this, globalCtx);
+ }
break;
case ITEM00_HEART_PIECE:
EnItem00_DrawHeartPiece(this, globalCtx);
@@ -951,34 +1134,85 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnItem00_DrawHeartContainer(this, globalCtx);
break;
case ITEM00_HEART:
- if (this->unk_15A < 0) {
- if (this->unk_15A == -1) {
- s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART);
-
- if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) {
- this->actor.objBankIndex = bankIndex;
- Actor_SetObjectDependency(globalCtx, &this->actor);
- this->unk_15A = -2;
- }
- } else {
- mtxScale = 16.0f;
- Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
- GetItem_Draw(globalCtx, GID_HEART);
- }
- break;
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_HEART);
+ mtxScale = 16.0f;
+ Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
+ break;
+ } else {
+ if (this->unk_15A < 0) {
+ if (this->unk_15A == -1) {
+ s8 bankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_GI_HEART);
+
+ if (Object_IsLoaded(&globalCtx->objectCtx, bankIndex)) {
+ this->actor.objBankIndex = bankIndex;
+ Actor_SetObjectDependency(globalCtx, &this->actor);
+ this->unk_15A = -2;
+ }
+ } else {
+ mtxScale = 16.0f;
+ Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
+ GetItem_Draw(globalCtx, GID_HEART);
+ }
+ break;
+ }
}
case ITEM00_BOMBS_A:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_BOMB);
+ break;
+ }
case ITEM00_BOMBS_B:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_BOMB);
+ break;
+ }
case ITEM00_BOMBS_SPECIAL:
case ITEM00_ARROWS_SINGLE:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_ARROWS_SMALL);
+ break;
+ }
case ITEM00_ARROWS_SMALL:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_ARROWS_SMALL);
+ break;
+ }
case ITEM00_ARROWS_MEDIUM:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_ARROWS_MEDIUM);
+ break;
+ }
case ITEM00_ARROWS_LARGE:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_ARROWS_LARGE);
+ break;
+ }
case ITEM00_NUTS:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_NUTS);
+ break;
+ }
case ITEM00_STICK:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_STICK);
+ break;
+ }
case ITEM00_MAGIC_LARGE:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_MAGIC_LARGE);
+ break;
+ }
case ITEM00_MAGIC_SMALL:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_MAGIC_SMALL);
+ break;
+ }
case ITEM00_SEEDS:
+ if (CVar_GetS32("gNewDrops", 0) !=0) {
+ GetItem_Draw(globalCtx, GID_SEEDS);
+ break;
+ }
case ITEM00_SMALL_KEY:
EnItem00_DrawCollectible(this, globalCtx);
break;
diff --git a/soh/src/code/z_fbdemo_circle.c b/soh/src/code/z_fbdemo_circle.c
index 32eb495eb..22018e8be 100644
--- a/soh/src/code/z_fbdemo_circle.c
+++ b/soh/src/code/z_fbdemo_circle.c
@@ -56,8 +56,6 @@ void TransitionCircle_Start(void* thisx) {
break;
}
- this->texture = ResourceMgr_LoadTexByName(this->texture);
-
if (this->speed == 0) {
this->step = 0x14;
} else {
diff --git a/soh/src/code/z_kankyo.c b/soh/src/code/z_kankyo.c
index 90194835e..f3ac083ab 100644
--- a/soh/src/code/z_kankyo.c
+++ b/soh/src/code/z_kankyo.c
@@ -226,6 +226,9 @@ u16 Environment_GetPixelDepth(s32 x, s32 y) {
void Environment_GraphCallback(GraphicsContext* gfxCtx, void* param) {
GlobalContext* globalCtx = (GlobalContext*)param;
+ OTRGetPixelDepthPrepare(D_8015FD7E, D_8015FD80);
+ Lights_GlowCheckPrepare(globalCtx);
+
D_8011FB44 = Environment_GetPixelDepth(D_8015FD7E, D_8015FD80);
Lights_GlowCheck(globalCtx);
}
@@ -677,7 +680,9 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
SkyboxTableEntry entryA = sSkyboxTable[newSkybox1Index];
for (int i = 0; i < 5; i++)
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
+ LoadSkyboxTex(skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
+
+ Skybox_Update(skyboxCtx);
envCtx->skybox1Index = newSkybox1Index;
@@ -695,7 +700,9 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
SkyboxTableEntry entryA = sSkyboxTable[newSkybox2Index];
for (int i = 0; i < 5; i++)
- LoadSkyboxTex(globalCtx, skyboxCtx, 1, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
+ LoadSkyboxTex(skyboxCtx, 1, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
+
+ Skybox_Update(skyboxCtx);
envCtx->skybox2Index = newSkybox2Index;
@@ -712,7 +719,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
if ((newSkybox1Index & 1) ^ ((newSkybox1Index & 4) >> 2)) {
SkyboxTableEntry entryA = sSkyboxTable[newSkybox1Index];
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryA.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 0, entryA.palettes[0], 16, 8);
//size = gSkyboxFiles[newSkybox1Index].palette.vromEnd - gSkyboxFiles[newSkybox1Index].palette.vromStart;
//osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1);
@@ -721,7 +728,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
//"../z_kankyo.c", 1307);
} else {
SkyboxTableEntry entryA = sSkyboxTable[newSkybox1Index];
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryA.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 1, entryA.palettes[0], 16, 8);
//size = gSkyboxFiles[newSkybox1Index].palette.vromEnd - gSkyboxFiles[newSkybox1Index].palette.vromStart;
//osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1);
@@ -729,6 +736,8 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
//gSkyboxFiles[newSkybox1Index].palette.vromStart, size, 0, &envCtx->loadQueue, NULL,
//"../z_kankyo.c", 1320);
}
+
+ Skybox_Update(skyboxCtx);
}
if (envCtx->skyboxDmaState == SKYBOX_DMA_FILE2_DONE) {
@@ -737,7 +746,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
if ((newSkybox2Index & 1) ^ ((newSkybox2Index & 4) >> 2))
{
SkyboxTableEntry entryA = sSkyboxTable[newSkybox2Index];
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryA.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 0, entryA.palettes[0], 16, 8);
/*size = gSkyboxFiles[newSkybox2Index].palette.vromEnd - gSkyboxFiles[newSkybox2Index].palette.vromStart;
osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1);
@@ -747,7 +756,7 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
} else
{
SkyboxTableEntry entryA = sSkyboxTable[newSkybox2Index];
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryA.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 1, entryA.palettes[0], 16, 8);
/*size = gSkyboxFiles[newSkybox2Index].palette.vromEnd - gSkyboxFiles[newSkybox2Index].palette.vromStart;
osCreateMesgQueue(&envCtx->loadQueue, &envCtx->loadMsg, 1);
@@ -755,6 +764,8 @@ void Environment_UpdateSkybox(GlobalContext* globalCtx, u8 skyboxId, Environment
gSkyboxFiles[newSkybox2Index].palette.vromStart, size, 0, &envCtx->loadQueue, NULL,
"../z_kankyo.c", 1355);*/
}
+
+ Skybox_Update(skyboxCtx);
}
if ((envCtx->skyboxDmaState == SKYBOX_DMA_FILE1_START) || (envCtx->skyboxDmaState == SKYBOX_DMA_FILE2_START)) {
diff --git a/soh/src/code/z_lights.c b/soh/src/code/z_lights.c
index 2c7140c73..c9b60ceca 100644
--- a/soh/src/code/z_lights.c
+++ b/soh/src/code/z_lights.c
@@ -323,6 +323,44 @@ Lights* Lights_New(GraphicsContext* gfxCtx, u8 ambientR, u8 ambientG, u8 ambient
return lights;
}
+void Lights_GlowCheckPrepare(GlobalContext* globalCtx) {
+ LightNode* node;
+ LightPoint* params;
+ Vec3f pos;
+ Vec3f multDest;
+ f32 wDest;
+ f32 wX;
+ f32 wY;
+
+ node = globalCtx->lightCtx.listHead;
+
+ while (node != NULL) {
+ params = &node->info->params.point;
+
+ if (node->info->type == LIGHT_POINT_GLOW) {
+ f32 x, y;
+ u32 shrink;
+ uint32_t height;
+
+ pos.x = params->x;
+ pos.y = params->y;
+ pos.z = params->z;
+ func_8002BE04(globalCtx, &pos, &multDest, &wDest);
+ wX = multDest.x * wDest;
+ wY = multDest.y * wDest;
+
+ x = wX * 160 + 160;
+ y = wY * 120 + 120;
+ shrink = ShrinkWindow_GetCurrentVal();
+
+ if ((multDest.z > 1.0f) && y >= shrink && y <= SCREEN_HEIGHT - shrink) {
+ OTRGetPixelDepthPrepare(x, y);
+ }
+ }
+ node = node->next;
+ }
+}
+
void Lights_GlowCheck(GlobalContext* globalCtx) {
LightNode* node;
LightPoint* params;
diff --git a/soh/src/code/z_map_exp.c b/soh/src/code/z_map_exp.c
index 734209770..cfef800c9 100644
--- a/soh/src/code/z_map_exp.c
+++ b/soh/src/code/z_map_exp.c
@@ -664,6 +664,7 @@ void Minimap_Draw(GlobalContext* globalCtx) {
if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 255, 255, interfaceCtx->minimapAlpha);
+ gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment);
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, 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);
diff --git a/soh/src/code/z_message_PAL.c b/soh/src/code/z_message_PAL.c
index 4979f047c..6a29a6564 100644
--- a/soh/src/code/z_message_PAL.c
+++ b/soh/src/code/z_message_PAL.c
@@ -166,7 +166,7 @@ void Message_UpdateOcarinaGame(GlobalContext* globalCtx) {
u8 Message_ShouldAdvance(GlobalContext* globalCtx) {
Input* input = &globalCtx->state.input[0];
- bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B)
+ bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B)
: CHECK_BTN_ALL(input->press.button, BTN_B);
if (CHECK_BTN_ALL(input->press.button, BTN_A) || isB_Held || CHECK_BTN_ALL(input->press.button, BTN_CUP)) {
@@ -178,7 +178,7 @@ u8 Message_ShouldAdvance(GlobalContext* globalCtx) {
u8 Message_ShouldAdvanceSilent(GlobalContext* globalCtx) {
Input* input = &globalCtx->state.input[0];
- bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B)
+ bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B)
: CHECK_BTN_ALL(input->press.button, BTN_B);
return CHECK_BTN_ALL(input->press.button, BTN_A) || isB_Held || CHECK_BTN_ALL(input->press.button, BTN_CUP);
@@ -203,8 +203,9 @@ void Message_HandleChoiceSelection(GlobalContext* globalCtx, u8 numChoices) {
static s16 sAnalogStickHeld = false;
MessageContext* msgCtx = &globalCtx->msgCtx;
Input* input = &globalCtx->state.input[0];
+ bool dpad = CVar_GetS32("gDpadOcarinaText", 0);
- if (input->rel.stick_y >= 30 && !sAnalogStickHeld) {
+ if ((input->rel.stick_y >= 30 && !sAnalogStickHeld) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
sAnalogStickHeld = true;
msgCtx->choiceIndex--;
if (msgCtx->choiceIndex > 128) {
@@ -212,7 +213,7 @@ void Message_HandleChoiceSelection(GlobalContext* globalCtx, u8 numChoices) {
} else {
Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
}
- } else if (input->rel.stick_y <= -30 && !sAnalogStickHeld) {
+ } else if ((input->rel.stick_y <= -30 && !sAnalogStickHeld) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
sAnalogStickHeld = true;
msgCtx->choiceIndex++;
if (msgCtx->choiceIndex > numChoices) {
@@ -390,7 +391,7 @@ void Message_FindCreditsMessage(GlobalContext* globalCtx, u16 textId) {
if (messageTableEntry->textId == textId) {
foundSeg = messageTableEntry->segment;
font->charTexBuf[0] = messageTableEntry->typePos;
- messageTableEntry++;
+ //messageTableEntry++;
nextSeg = messageTableEntry->segment;
font->msgOffset = messageTableEntry->segment;
font->msgLength = messageTableEntry->msgSize;
@@ -950,7 +951,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
}
}
i = j - 1;
- msgCtx->textDrawPos = i + 1;
+ msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1);
if (character) {}
}
@@ -1060,7 +1061,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
msgCtx->textDelay = msgCtx->msgBufDecoded[++i];
break;
case MESSAGE_UNSKIPPABLE:
- msgCtx->textUnskippable = CVar_GetS32("gFastText", 0) != 1;
+ msgCtx->textUnskippable = CVar_GetS32("gSkipText", 0) != 1;
break;
case MESSAGE_TWO_CHOICE:
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_2_CHOICE;
@@ -1095,6 +1096,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
*gfxP = gfx;
return;
case MESSAGE_OCARINA:
+ msgCtx->textDrawPos = i + 1;
if (i + 1 == msgCtx->textDrawPos) {
Message_HandleOcarina(globalCtx);
*gfxP = gfx;
@@ -2025,7 +2027,7 @@ void Message_DrawMain(GlobalContext* globalCtx, Gfx** p) {
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
0);
- bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(globalCtx->state.input[0].cur.button, BTN_B)
+ bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(globalCtx->state.input[0].cur.button, BTN_B)
: CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B);
switch (msgCtx->msgMode) {
@@ -3032,7 +3034,7 @@ void Message_Update(GlobalContext* globalCtx) {
Input* input = &globalCtx->state.input[0];
s16 var;
s16 focusScreenPosX;
- s16 averageY;
+ s16 averageY = 0;
s16 playerFocusScreenPosY;
s16 actorFocusScreenPosY;
@@ -3066,7 +3068,7 @@ void Message_Update(GlobalContext* globalCtx) {
return;
}
- bool isB_Held = CVar_GetS32("gFastText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) && !sTextboxSkipped
+ bool isB_Held = CVar_GetS32("gSkipText", 0) != 0 ? CHECK_BTN_ALL(input->cur.button, BTN_B) && !sTextboxSkipped
: CHECK_BTN_ALL(input->press.button, BTN_B);
switch (msgCtx->msgMode) {
diff --git a/soh/src/code/z_parameter.c b/soh/src/code/z_parameter.c
index 3219527a9..edc4348b9 100644
--- a/soh/src/code/z_parameter.c
+++ b/soh/src/code/z_parameter.c
@@ -919,7 +919,11 @@ void func_80083108(GlobalContext* globalCtx) {
if (interfaceCtx->restrictions.tradeItems != 0) {
for (i = 1; i < 4; i++) {
- if ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) &&
+ if ((CVar_GetS32("gMMBunnyHood", 0) != 0)
+ && (gSaveContext.equips.buttonItems[i] >= ITEM_MASK_KEATON)
+ && (gSaveContext.equips.buttonItems[i] <= ITEM_MASK_TRUTH)) {
+ gSaveContext.buttonStatus[i] = BTN_ENABLED;
+ } else if ((gSaveContext.equips.buttonItems[i] >= ITEM_WEIRD_EGG) &&
(gSaveContext.equips.buttonItems[i] <= ITEM_CLAIM_CHECK)) {
if (gSaveContext.buttonStatus[i] == BTN_ENABLED) {
sp28 = 1;
@@ -3125,6 +3129,14 @@ void Interface_Draw(GlobalContext* globalCtx) {
};
static s16 rupeeDigitsFirst[] = { 1, 0, 0 };
static s16 rupeeDigitsCount[] = { 2, 3, 3 };
+
+ // courtesy of https://github.com/TestRunnerSRL/OoT-Randomizer/blob/Dev/ASM/c/hud_colors.c
+ static s16 rupeeWalletColors[3][3] = {
+ { 0xC8, 0xFF, 0x64 }, // Base Wallet (Green)
+ { 0x82, 0x82, 0xFF }, // Adult's Wallet (Blue)
+ { 0xFF, 0x64, 0x64 }, // Giant's Wallet (Red)
+ };
+
static s16 spoilingItemEntrances[] = { 0x01AD, 0x0153, 0x0153 };
static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused
static s16 D_80125B5C[] = { 91, 91 }; // unused
@@ -3143,6 +3155,7 @@ void Interface_Draw(GlobalContext* globalCtx) {
s16 svar4;
s16 svar5;
s16 svar6;
+ bool fullUi = !CVar_GetS32("gMinimalUI", 0) || !R_MINIMAP_DISABLED || globalCtx->pauseCtx.state != 0;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_parameter.c", 3405);
@@ -3158,111 +3171,131 @@ void Interface_Draw(GlobalContext* globalCtx) {
if (pauseCtx->debugState == 0) {
Interface_InitVertices(globalCtx);
func_8008A994(interfaceCtx);
- HealthMeter_Draw(globalCtx);
+ if (fullUi || gSaveContext.health != gSaveContext.healthCapacity) {
+ HealthMeter_Draw(globalCtx);
+ }
func_80094520(globalCtx->state.gfxCtx);
- // Rupee Icon
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 255, 100, interfaceCtx->magicAlpha);
- gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255);
- OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26),
- 206, 16, 16, 1 << 10, 1 << 10);
+ if (fullUi) {
+ // Rupee Icon
+ s16* rColor;
- switch (globalCtx->sceneNum) {
- case SCENE_BMORI1:
- case SCENE_HIDAN:
- case SCENE_MIZUSIN:
- case SCENE_JYASINZOU:
- case SCENE_HAKADAN:
- case SCENE_HAKADANCH:
- case SCENE_ICE_DOUKUTO:
- case SCENE_GANON:
- case SCENE_MEN:
- case SCENE_GERUDOWAY:
- case SCENE_GANONTIKA:
- case SCENE_GANON_SONOGO:
- case SCENE_GANONTIKA_SONOGO:
- case SCENE_TAKARAYA:
- if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] >= 0) {
- // Small Key Icon
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 230, 255, interfaceCtx->magicAlpha);
- gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 20, 255);
- OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gSmallKeyCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), 190, 16, 16,
- 1 << 10, 1 << 10);
+ if (CVar_GetS32("gDynamicWalletIcon", 0)) {
+ rColor = &rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)];
+ } else {
+ rColor = &rupeeWalletColors[0];
+ }
- // Small Key Counter
- gDPPipeSync(OVERLAY_DISP++);
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha);
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
- TEXEL0, 0, PRIMITIVE, 0);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, rColor[0], rColor[1], rColor[2], interfaceCtx->magicAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255);
+ OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26),
+ 206, 16, 16, 1 << 10, 1 << 10);
- interfaceCtx->counterDigits[2] = 0;
- interfaceCtx->counterDigits[3] = gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex];
+ switch (globalCtx->sceneNum) {
+ case SCENE_BMORI1:
+ case SCENE_HIDAN:
+ case SCENE_MIZUSIN:
+ case SCENE_JYASINZOU:
+ case SCENE_HAKADAN:
+ case SCENE_HAKADANCH:
+ case SCENE_ICE_DOUKUTO:
+ case SCENE_GANON:
+ case SCENE_MEN:
+ case SCENE_GERUDOWAY:
+ case SCENE_GANONTIKA:
+ case SCENE_GANON_SONOGO:
+ case SCENE_GANONTIKA_SONOGO:
+ case SCENE_TAKARAYA:
+ if (gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex] >= 0) {
+ // Small Key Icon
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 230, 255, interfaceCtx->magicAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 20, 255);
+ OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gSmallKeyCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26), 190, 16, 16,
+ 1 << 10, 1 << 10);
- while (interfaceCtx->counterDigits[3] >= 10) {
- interfaceCtx->counterDigits[2]++;
- interfaceCtx->counterDigits[3] -= 10;
+ // Small Key Counter
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha);
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE,
+ TEXEL0, 0, PRIMITIVE, 0);
+
+ interfaceCtx->counterDigits[2] = 0;
+ interfaceCtx->counterDigits[3] = gSaveContext.inventory.dungeonKeys[gSaveContext.mapIndex];
+
+ while (interfaceCtx->counterDigits[3] >= 10) {
+ interfaceCtx->counterDigits[2]++;
+ interfaceCtx->counterDigits[3] -= 10;
+ }
+
+ svar3 = OTRGetRectDimensionFromLeftEdge(42);
+
+ if (interfaceCtx->counterDigits[2] != 0) {
+ OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, ((u8*)((u8*)digitTextures[interfaceCtx->counterDigits[2]])), 8,
+ 16, svar3, 190, 8, 16, 1 << 10, 1 << 10);
+ svar3 += 8;
+ }
+
+ OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP,
+ ((u8*)digitTextures[interfaceCtx->counterDigits[3]]), 8, 16,
+ svar3, 190, 8, 16, 1 << 10, 1 << 10);
}
+ break;
+ default:
+ break;
+ }
- svar3 = OTRGetRectDimensionFromLeftEdge(42);
+ // Rupee Counter
+ gDPPipeSync(OVERLAY_DISP++);
- if (interfaceCtx->counterDigits[2] != 0) {
- OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP, ((u8*)((u8*)digitTextures[interfaceCtx->counterDigits[2]])), 8,
- 16, svar3, 190, 8, 16, 1 << 10, 1 << 10);
- svar3 += 8;
- }
+ if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET)) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, interfaceCtx->magicAlpha);
+ } else if (gSaveContext.rupees != 0) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha);
+ } else {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, interfaceCtx->magicAlpha);
+ }
- OVERLAY_DISP = Gfx_TextureI8(OVERLAY_DISP,
- ((u8*)digitTextures[interfaceCtx->counterDigits[3]]), 8, 16,
- svar3, 190, 8, 16, 1 << 10, 1 << 10);
- }
- break;
- default:
- break;
+ gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
+ PRIMITIVE, 0);
+
+ interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0;
+ interfaceCtx->counterDigits[2] = gSaveContext.rupees;
+
+ if ((interfaceCtx->counterDigits[2] > 9999) || (interfaceCtx->counterDigits[2] < 0)) {
+ interfaceCtx->counterDigits[2] &= 0xDDD;
+ }
+
+ while (interfaceCtx->counterDigits[2] >= 100) {
+ interfaceCtx->counterDigits[0]++;
+ interfaceCtx->counterDigits[2] -= 100;
+ }
+
+ while (interfaceCtx->counterDigits[2] >= 10) {
+ interfaceCtx->counterDigits[1]++;
+ interfaceCtx->counterDigits[2] -= 10;
+ }
+
+ svar2 = rupeeDigitsFirst[CUR_UPG_VALUE(UPG_WALLET)];
+ svar5 = rupeeDigitsCount[CUR_UPG_VALUE(UPG_WALLET)];
+
+ for (svar1 = 0, svar3 = 42; svar1 < svar5; svar1++, svar2++, svar3 += 8) {
+ OVERLAY_DISP =
+ Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16,
+ OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10);
+ }
+ }
+ else {
+ // Make sure item counts have black backgrounds
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->magicAlpha);
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 0);
}
- // Rupee Counter
- gDPPipeSync(OVERLAY_DISP++);
-
- if (gSaveContext.rupees == CUR_CAPACITY(UPG_WALLET)) {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 120, 255, 0, interfaceCtx->magicAlpha);
- } else if (gSaveContext.rupees != 0) {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->magicAlpha);
- } else {
- gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 100, 100, interfaceCtx->magicAlpha);
+ if (fullUi || gSaveContext.unk_13F0 > 0) {
+ Interface_DrawMagicBar(globalCtx);
}
- gDPSetCombineLERP(OVERLAY_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0,
- PRIMITIVE, 0);
-
- interfaceCtx->counterDigits[0] = interfaceCtx->counterDigits[1] = 0;
- interfaceCtx->counterDigits[2] = gSaveContext.rupees;
-
- if ((interfaceCtx->counterDigits[2] > 9999) || (interfaceCtx->counterDigits[2] < 0)) {
- interfaceCtx->counterDigits[2] &= 0xDDD;
- }
-
- while (interfaceCtx->counterDigits[2] >= 100) {
- interfaceCtx->counterDigits[0]++;
- interfaceCtx->counterDigits[2] -= 100;
- }
-
- while (interfaceCtx->counterDigits[2] >= 10) {
- interfaceCtx->counterDigits[1]++;
- interfaceCtx->counterDigits[2] -= 10;
- }
-
- svar2 = rupeeDigitsFirst[CUR_UPG_VALUE(UPG_WALLET)];
- svar5 = rupeeDigitsCount[CUR_UPG_VALUE(UPG_WALLET)];
-
- for (svar1 = 0, svar3 = 42; svar1 < svar5; svar1++, svar2++, svar3 += 8) {
- OVERLAY_DISP =
- Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16,
- OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10);
- }
-
- Interface_DrawMagicBar(globalCtx);
Minimap_Draw(globalCtx);
if ((R_PAUSE_MENU_MODE != 2) && (R_PAUSE_MENU_MODE != 3)) {
@@ -3271,7 +3304,9 @@ void Interface_Draw(GlobalContext* globalCtx) {
func_80094520(globalCtx->state.gfxCtx);
- Interface_DrawItemButtons(globalCtx);
+ if (fullUi) {
+ Interface_DrawItemButtons(globalCtx);
+ }
gDPPipeSync(OVERLAY_DISP++);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, interfaceCtx->bAlpha);
@@ -3281,10 +3316,17 @@ void Interface_Draw(GlobalContext* globalCtx) {
// B Button Icon & Ammo Count
if (gSaveContext.equips.buttonItems[0] != ITEM_NONE)
{
- Interface_DrawItemIconTexture(globalCtx, gItemIcons[gSaveContext.equips.buttonItems[0]], 0);
+ if (fullUi) {
+ Interface_DrawItemIconTexture(globalCtx, gItemIcons[gSaveContext.equips.buttonItems[0]], 0);
+ }
if ((player->stateFlags1 & 0x00800000) || (globalCtx->shootingGalleryStatus > 1) ||
((globalCtx->sceneNum == SCENE_BOWLING) && Flags_GetSwitch(globalCtx, 0x38))) {
+
+ if (!fullUi) {
+ Interface_DrawItemIconTexture(globalCtx, gItemIcons[gSaveContext.equips.buttonItems[0]], 0);
+ }
+
gDPPipeSync(OVERLAY_DISP++);
gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE,
0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
@@ -3357,7 +3399,9 @@ void Interface_Draw(GlobalContext* globalCtx) {
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_A_BTN_COLOR(0), R_A_BTN_COLOR(1), R_A_BTN_COLOR(2),
interfaceCtx->aAlpha);
- Interface_DrawActionButton(globalCtx, rABtnX, R_A_BTN_Y);
+ if (fullUi) {
+ Interface_DrawActionButton(globalCtx, rABtnX, R_A_BTN_Y);
+ }
gDPPipeSync(OVERLAY_DISP++);
const f32 rAIconX = OTRGetDimensionFromRightEdge(R_A_ICON_X);
//func_8008A8B8(globalCtx, R_A_ICON_Y, R_A_ICON_Y + 45, rAIconX, rAIconX + 45);
@@ -4078,11 +4122,11 @@ void Interface_Update(GlobalContext* globalCtx) {
D_80125A58 = func_8008F2F8(globalCtx);
if (D_80125A58 == 1) {
- if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 2) {
+ if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 2 || CVar_GetS32("gSuperTunic", 0) != 0) {
D_80125A58 = 0;
}
} else if ((func_8008F2F8(globalCtx) >= 2) && (func_8008F2F8(globalCtx) < 5)) {
- if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 3) {
+ if (CUR_EQUIP_VALUE(EQUIP_TUNIC) == 3 || CVar_GetS32("gSuperTunic", 0) != 0) {
D_80125A58 = 0;
}
}
diff --git a/soh/src/code/z_play.c b/soh/src/code/z_play.c
index f0880b3da..6218b7d76 100644
--- a/soh/src/code/z_play.c
+++ b/soh/src/code/z_play.c
@@ -1119,6 +1119,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) {
gfxP = Graph_GfxPlusOne(sp1CC);
gSPDisplayList(OVERLAY_DISP++, gfxP);
+ gsSPGrayscale(gfxP++, false);
if ((globalCtx->transitionMode == 3) || (globalCtx->transitionMode == 11) ||
(globalCtx->transitionCtx.transitionType >= 56)) {
@@ -1136,8 +1137,8 @@ void Gameplay_Draw(GlobalContext* globalCtx) {
TransitionFade_Draw(&globalCtx->transitionFade, &gfxP);
if (D_801614B0.a > 0) {
- D_80161498.primColor.rgba = D_801614B0.rgba;
- VisMono_Draw(&D_80161498, &gfxP);
+ gsDPSetGrayscaleColor(gfxP++, D_801614B0.r, D_801614B0.g, D_801614B0.b, D_801614B0.a);
+ gsSPGrayscale(gfxP++, true);
}
gSPEndDisplayList(gfxP++);
@@ -1171,7 +1172,7 @@ void Gameplay_Draw(GlobalContext* globalCtx) {
//goto Gameplay_Draw_DrawOverlayElements;
}
- //else
+ //else
{
s32 sp80;
@@ -1472,7 +1473,7 @@ void Gameplay_InitEnvironment(GlobalContext* globalCtx, s16 skyboxId) {
Environment_Init(globalCtx, &globalCtx->envCtx, 0);
}
-void Gameplay_InitScene(GlobalContext* globalCtx, s32 spawn)
+void Gameplay_InitScene(GlobalContext* globalCtx, s32 spawn)
{
globalCtx->curSpawn = spawn;
globalCtx->linkActorEntry = NULL;
@@ -1495,26 +1496,6 @@ void Gameplay_InitScene(GlobalContext* globalCtx, s32 spawn)
void Gameplay_SpawnScene(GlobalContext* globalCtx, s32 sceneNum, s32 spawn) {
OTRGameplay_SpawnScene(globalCtx, sceneNum, spawn);
- return;
-
- SceneTableEntry* scene = &gSceneTable[sceneNum];
-
- scene->unk_13 = 0;
- globalCtx->loadedScene = scene;
- globalCtx->sceneNum = sceneNum;
- globalCtx->sceneConfig = scene->config;
-
- osSyncPrintf("\nSCENE SIZE %fK\n", (scene->sceneFile.vromEnd - scene->sceneFile.vromStart) / 1024.0f);
-
- globalCtx->sceneSegment = Gameplay_LoadFile(globalCtx, &scene->sceneFile);
- scene->unk_13 = 0;
- ASSERT(globalCtx->sceneSegment != NULL, "this->sceneSegment != NULL", "../z_play.c", 4960);
-
- gSegments[2] = VIRTUAL_TO_PHYSICAL(globalCtx->sceneSegment);
-
- Gameplay_InitScene(globalCtx, spawn);
-
- osSyncPrintf("ROOM SIZE=%fK\n", func_80096FE8(globalCtx, &globalCtx->roomCtx) / 1024.0f);
}
void func_800C016C(GlobalContext* globalCtx, Vec3f* src, Vec3f* dest) {
diff --git a/soh/src/code/z_player_lib.c b/soh/src/code/z_player_lib.c
index 3f413c9c4..c83a0f537 100644
--- a/soh/src/code/z_player_lib.c
+++ b/soh/src/code/z_player_lib.c
@@ -631,9 +631,9 @@ s32 func_8008F2F8(GlobalContext* globalCtx) {
if (0) {}
if ((triggerEntry->flag != 0) && !(gSaveContext.textTriggerFlags & triggerEntry->flag) &&
- (((var == 0) && (this->currentTunic != PLAYER_TUNIC_GORON)) ||
+ (((var == 0) && (this->currentTunic != PLAYER_TUNIC_GORON && CVar_GetS32("gSuperTunic", 0) == 0)) ||
(((var == 1) || (var == 3)) && (this->currentBoots == PLAYER_BOOTS_IRON) &&
- (this->currentTunic != PLAYER_TUNIC_ZORA)))) {
+ (this->currentTunic != PLAYER_TUNIC_ZORA && CVar_GetS32("gSuperTunic", 0) == 0)))) {
Message_StartTextbox(globalCtx, triggerEntry->textId, NULL);
gSaveContext.textTriggerFlags |= triggerEntry->flag;
}
@@ -743,8 +743,27 @@ void func_8008F470(GlobalContext* globalCtx, void** skeleton, Vec3s* jointTable,
#else
gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(sMouthTextures[eyeIndex]));
#endif
-
- color = &sTunicColors[tunic];
+ if (tunic == PLAYER_TUNIC_KOKIRI) {
+ Color_RGB8 sTemp = { CVar_GetS32("gTunic_Kokiri_Red", &sTunicColors[PLAYER_TUNIC_KOKIRI].r),
+ CVar_GetS32("gTunic_Kokiri_Green", &sTunicColors[PLAYER_TUNIC_KOKIRI].g),
+ CVar_GetS32("gTunic_Kokiri_Blue", &sTunicColors[PLAYER_TUNIC_KOKIRI].b) };
+ color = &sTemp;
+ } else if (tunic == PLAYER_TUNIC_GORON) {
+ Color_RGB8 sTemp = { CVar_GetS32("gTunic_Goron_Red", &sTunicColors[PLAYER_TUNIC_GORON].r),
+ CVar_GetS32("gTunic_Goron_Green", &sTunicColors[PLAYER_TUNIC_GORON].g),
+ CVar_GetS32("gTunic_Goron_Blue", &sTunicColors[PLAYER_TUNIC_GORON].b) };
+ color = &sTemp;
+ } else if (tunic == PLAYER_TUNIC_ZORA) {
+ Color_RGB8 sTemp = { CVar_GetS32("gTunic_Zora_Red", &sTunicColors[PLAYER_TUNIC_ZORA].r),
+ CVar_GetS32("gTunic_Zora_Green", &sTunicColors[PLAYER_TUNIC_ZORA].g),
+ CVar_GetS32("gTunic_Zora_Blue", &sTunicColors[PLAYER_TUNIC_ZORA].b) };
+ color = &sTemp;
+ } else {
+ Color_RGB8 sTemp = { CVar_GetS32("gTunic_Kokiri_Red", &sTunicColors[PLAYER_TUNIC_KOKIRI].r),
+ CVar_GetS32("gTunic_Kokiri_Green", &sTunicColors[PLAYER_TUNIC_KOKIRI].g),
+ CVar_GetS32("gTunic_Kokiri_Blue", &sTunicColors[PLAYER_TUNIC_KOKIRI].b) };
+ color = &sTemp;
+ }
gDPSetEnvColor(POLY_OPA_DISP++, color->r, color->g, color->b, 0);
sDListsLodOffset = lod * 2;
@@ -1590,7 +1609,7 @@ void func_80091A24(GlobalContext* globalCtx, void* seg04, void* seg06, SkelAnime
sp12C[0] = sword;
sp12C[1] = shield;
- Matrix_SetTranslateRotateYXZ(pos->x - (LINK_AGE_IN_YEARS == YEARS_ADULT ? 25 : 0),
+ Matrix_SetTranslateRotateYXZ(pos->x - ((CVar_GetS32("gPauseLiveLink", 0) && LINK_AGE_IN_YEARS == YEARS_ADULT) ? 25 : 0),
pos->y - (CVar_GetS32("gPauseTriforce", 0) ? 16 : 0), pos->z, rot);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
@@ -1625,6 +1644,8 @@ void func_80091A24(GlobalContext* globalCtx, void* seg04, void* seg06, SkelAnime
POLY_XLU_DISP = ohNo;
}
+ POLY_OPA_DISP = Gameplay_SetFog(globalCtx, POLY_OPA_DISP++);
+
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player_lib.c", 3288);
}
diff --git a/soh/src/code/z_vr_box.c b/soh/src/code/z_vr_box.c
index 7925e5cb9..76753e096 100644
--- a/soh/src/code/z_vr_box.c
+++ b/soh/src/code/z_vr_box.c
@@ -248,7 +248,7 @@ s32 func_800ADBB0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3
for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 4; phi_ra++, phi_a2_4 += 0x1F) {
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x3F, phi_t2_4 += 4) {
- gDPLoadTextureTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012AC90[arg8],
+ gDPLoadTextureTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8],
G_IM_FMT_CI, G_IM_SIZ_8b, 256, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x3F,
phi_a2_4 + 0x1F, 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);
@@ -360,11 +360,11 @@ s32 func_800AE2C0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3
phi_a2_4 = 0;
for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 4; phi_ra++, phi_a2_4 += 0x1F) {
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) {
- gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012ADC0[arg8], 0,
+ gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], 0,
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
phi_a2_4 + 0x1F, 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);
- gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[1] + D_8012ADC0[arg8], 0x80, 1,
+ gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[1][arg8], 0x80, 1,
G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F,
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);
@@ -379,11 +379,11 @@ s32 func_800AE2C0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3
phi_a2_4 = 0;
for (phi_t2_4 = 0, phi_ra = 0; phi_ra < 2; phi_ra++, phi_a2_4 += 0x1F) {
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) {
- gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012ADC0[arg8], 0,
+ gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], 0,
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
phi_a2_4 + 0x1F, 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);
- gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[1] + D_8012ADC0[arg8], 0x80, 1,
+ gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[1][arg8], 0x80, 1,
G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F,
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);
@@ -394,11 +394,11 @@ s32 func_800AE2C0(SkyboxContext* skyboxCtx, Vtx* roomVtx, s32 arg2, s32 arg3, s3
phi_a2_4 -= 0x1F;
for (phi_ra = 0; phi_ra < 2; phi_ra++, phi_a2_4 -= 0x1F) {
for (phi_a0_4 = 0, phi_t1 = 0; phi_t1 < 4; phi_t1++, phi_a0_4 += 0x1F, phi_t2_4 += 4) {
- gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[0] + D_8012ADC0[arg8], 0,
+ gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[0][arg8], 0,
G_TX_RENDERTILE, G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F,
phi_a2_4 + 0x1F, 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);
- gDPLoadMultiTile(skyboxCtx->unk_138++, (uintptr_t)skyboxCtx->staticSegments[1] + D_8012ADC0[arg8], 0x80, 1,
+ gDPLoadMultiTile(skyboxCtx->unk_138++, skyboxCtx->textures[1][arg8], 0x80, 1,
G_IM_FMT_CI, G_IM_SIZ_8b, 128, 0, phi_a0_4, phi_a2_4, phi_a0_4 + 0x1F, phi_a2_4 + 0x1F,
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);
@@ -444,25 +444,20 @@ void func_800AF178(SkyboxContext* skyboxCtx, s32 arg1) {
}
}
-void LoadSkyboxTex(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, int segmentIndex, int imageIndex, char* tex, int width, int height, int offsetW, int offsetH)
+void LoadSkyboxTex(SkyboxContext* skyboxCtx, int segmentIndex, int imageIndex, char* tex, int width, int height, int offsetW, int offsetH)
{
- if (globalCtx != NULL && globalCtx->state.gfxCtx != NULL && globalCtx->state.gfxCtx != 0xABABABAB)
- gSPInvalidateTexCache(globalCtx->state.gfxCtx->polyOpa.p++, ((uintptr_t)skyboxCtx->staticSegments[segmentIndex] + (imageIndex * (offsetW * offsetH))));
-
- memcpy((uintptr_t)skyboxCtx->staticSegments[segmentIndex] + (imageIndex * (offsetW * offsetH)), ResourceMgr_LoadTexByName(tex), width * height);
+ skyboxCtx->textures[segmentIndex][imageIndex] = tex;
}
-void LoadSkyboxTexAtOffset(SkyboxContext* skyboxCtx, int segmentIndex, char* tex, int width, int height, int offset)
+void LoadSkyboxTexAtOffset(SkyboxContext* skyboxCtx, int segmentIndex, int imageIndex, char* tex, int width, int height, int offset)
{
- memcpy((uintptr_t)skyboxCtx->staticSegments[segmentIndex] + offset, ResourceMgr_LoadTexByName(tex), width * height);
+ skyboxCtx->textures[segmentIndex][imageIndex] = tex;
}
-void LoadSkyboxPalette(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, int paletteIndex, char* palTex, int width,
+void LoadSkyboxPalette(SkyboxContext* skyboxCtx, int paletteIndex, char* palTex, int width,
int height) {
- if (globalCtx != NULL && globalCtx->state.gfxCtx != NULL && globalCtx->state.gfxCtx != 0xABABABAB)
- gSPInvalidateTexCache(globalCtx->state.gfxCtx->polyOpa.p++, (uintptr_t)skyboxCtx->palettes + (paletteIndex * (width * height * 2)));
-
- memcpy((uintptr_t)skyboxCtx->palettes + (paletteIndex * (width * height * 2)), ResourceMgr_LoadTexByName(palTex), width * height * 2);
+ skyboxCtx->palettes[paletteIndex] = palTex;
+ skyboxCtx->palette_size = width * height;
}
static const char* sSBVRFine0Tex[] =
@@ -634,377 +629,316 @@ void Skybox_Setup(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, s16 skybox
}
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, (128 * 64 * 4) + (128 * 128), "../z_vr_box.c", 1054);
-
SkyboxTableEntry entryA = sSkyboxTable[sp41];
for (int i = 0; i < 5; i++)
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
+ LoadSkyboxTex(skyboxCtx, 0, i, entryA.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
SkyboxTableEntry entryB = sSkyboxTable[sp40];
- skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, (128 * 64 * 4) + (128 * 128), "../z_vr_box.c", 1060);
-
for (int i = 0; i < 5; i++)
- LoadSkyboxTex(globalCtx, skyboxCtx, 1, i, entryB.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
+ LoadSkyboxTex(skyboxCtx, 1, i, entryB.textures[i], 128, i == 4 ? 128 : 64, 128, 64);
if ((sp41 & 1) ^ ((sp41 & 4) >> 2))
{
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 256 * 2, "../z_vr_box.c", 1072);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryA.palettes[0], 16, 8);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryB.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 0, entryA.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 1, entryB.palettes[0], 16, 8);
}
else
{
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 256 * 2, "../z_vr_box.c", 1085);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, entryB.palettes[0], 16, 8);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, entryA.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 0, entryB.palettes[0], 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 1, entryA.palettes[0], 16, 8);
}
break;
case SKYBOX_BAZAAR:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gBazaarBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gBazaar2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gBazaarBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gBazaar2BgTex, 256, 256, 256, 256);
-
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
-
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gBazaarBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gBazaarBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gBazaarBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gBazaarBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_HOUSE_LINK:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gLinksHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gLinksHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gLinksHouse3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gLinksHouse4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gLinksHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gLinksHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gLinksHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gLinksHouse4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gLinksHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gLinksHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gLinksHouseBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gLinksHouseBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gLinksHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gLinksHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gLinksHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gLinksHouseBg4Tlut, 16, 16);
break;
case SKYBOX_OVERCAST_SUNSET:
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0xC000, "../z_vr_box.c", 1226);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox1Tex, 128, 64, 0x0);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox2Tex, 128, 64, 0x2000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox3Tex, 128, 64, 0x4000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox4Tex, 128, 64, 0x6000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gSunsetOvercastSkybox5Tex, 128, 128, 0x8000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 0, gSunsetOvercastSkybox1Tex, 128, 64, 0x0);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 1, gSunsetOvercastSkybox2Tex, 128, 64, 0x2000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 2, gSunsetOvercastSkybox3Tex, 128, 64, 0x4000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 3, gSunsetOvercastSkybox4Tex, 128, 64, 0x6000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 4, gSunsetOvercastSkybox5Tex, 128, 128, 0x8000);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x100, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gSunsetOvercastSkyboxTlut, 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 0, gSunsetOvercastSkyboxTlut, 16, 8);
break;
case SKYBOX_MARKET_ADULT:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketRuinsBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketRuins2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMarketRuins3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gMarketRuins4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gMarketRuinsBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gMarketRuins2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gMarketRuins3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gMarketRuins4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketRuinsBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketRuinsBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMarketRuinsBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gMarketRuinsBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gMarketRuinsBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gMarketRuinsBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gMarketRuinsBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gMarketRuinsBg4Tlut, 16, 16);
break;
case SKYBOX_CUTSCENE_MAP:
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000, "../z_vr_box.c", 1226);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox1Tex, 128, 64, 0x0);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox2Tex, 128, 64, 0x2000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox3Tex, 128, 64, 0x4000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox4Tex, 128, 64, 0x6000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox5Tex, 128, 128, 0x8000);
- LoadSkyboxTexAtOffset(skyboxCtx, 0, gHoly0Skybox6Tex, 128, 128, 0xC000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 0, gHoly0Skybox1Tex, 128, 64, 0x0);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 1, gHoly0Skybox2Tex, 128, 64, 0x2000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 2, gHoly0Skybox3Tex, 128, 64, 0x4000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 3, gHoly0Skybox4Tex, 128, 64, 0x6000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 4, gHoly0Skybox5Tex, 128, 128, 0x8000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 0, 5, gHoly0Skybox6Tex, 128, 128, 0xC000);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x100 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gHoly0SkyboxTlut, 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 0, gHoly0SkyboxTlut, 16, 8);
- skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, 0x10000, "../z_vr_box.c", 1226);
- LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox1Tex, 128, 64, 0x0);
- LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox2Tex, 128, 64, 0x2000);
- LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox3Tex, 128, 64, 0x4000);
- LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox4Tex, 128, 64, 0x6000);
- LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox5Tex, 128, 128, 0x8000);
- LoadSkyboxTexAtOffset(skyboxCtx, 1, gHoly1Skybox6Tex, 128, 128, 0xC000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 1, 0, gHoly1Skybox1Tex, 128, 64, 0x0);
+ LoadSkyboxTexAtOffset(skyboxCtx, 1, 1, gHoly1Skybox2Tex, 128, 64, 0x2000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 1, 2, gHoly1Skybox3Tex, 128, 64, 0x4000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 1, 3, gHoly1Skybox4Tex, 128, 64, 0x6000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 1, 4, gHoly1Skybox5Tex, 128, 128, 0x8000);
+ LoadSkyboxTexAtOffset(skyboxCtx, 1, 5, gHoly1Skybox6Tex, 128, 128, 0xC000);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gHoly1SkyboxTlut, 16, 8);
+ LoadSkyboxPalette(skyboxCtx, 1, gHoly1SkyboxTlut, 16, 8);
break;
case SKYBOX_MARKET_CHILD_DAY:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketDayBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketDay2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMarketDay3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gMarketDay4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gMarketDayBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gMarketDay2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gMarketDay3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gMarketDay4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketDayBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketDayBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMarketDayBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gMarketDayBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gMarketDayBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gMarketDayBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gMarketDayBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gMarketDayBg4Tlut, 16, 16);
break;
case SKYBOX_MARKET_CHILD_NIGHT:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketNightBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketNight2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMarketNight3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gMarketNight4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gMarketNightBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gMarketNight2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gMarketNight3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gMarketNight4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketNightBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketNightBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMarketNightBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gMarketNightBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gMarketNightBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gMarketNightBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gMarketNightBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gMarketNightBg4Tlut, 16, 16);
break;
case SKYBOX_HAPPY_MASK_SHOP:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMaskShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMaskShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gMaskShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gMaskShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMaskShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMaskShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gMaskShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gMaskShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_HOUSE_KNOW_IT_ALL_BROTHERS:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gKnowItAllBrosHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gKnowItAllBrosHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gKnowItAllBrosHouse3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gKnowItAllBrosHouse4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gKnowItAllBrosHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gKnowItAllBrosHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gKnowItAllBrosHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gKnowItAllBrosHouse4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gKnowItAllBrosHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gKnowItAllBrosHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gKnowItAllBrosHouseBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gKnowItAllBrosHouseBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gKnowItAllBrosHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gKnowItAllBrosHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gKnowItAllBrosHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gKnowItAllBrosHouseBg4Tlut, 16, 16);
break;
case SKYBOX_HOUSE_OF_TWINS:
skyboxCtx->unk_140 = 2;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gHouseOfTwinsBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gHouseOfTwins2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gHouseOfTwins3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gHouseOfTwinsBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gHouseOfTwins2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gHouseOfTwins3BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gHouseOfTwinsBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gHouseOfTwinsBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gHouseOfTwinsBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gHouseOfTwinsBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gHouseOfTwinsBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gHouseOfTwinsBg3Tlut, 16, 16);
break;
case SKYBOX_STABLES:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gStableBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gStable2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gStable3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gStable4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gStableBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gStable2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gStable3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gStable4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gStableBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gStableBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gStableBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gStableBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gStableBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gStableBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gStableBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gStableBg4Tlut, 16, 16);
break;
case SKYBOX_HOUSE_KAKARIKO:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gCarpentersHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gCarpentersHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gCarpentersHouse3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gCarpentersHouse4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gCarpentersHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gCarpentersHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gCarpentersHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gCarpentersHouse4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gCarpentersHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gCarpentersHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gCarpentersHouseBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gCarpentersHouseBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gCarpentersHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gCarpentersHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gCarpentersHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gCarpentersHouseBg4Tlut, 16, 16);
break;
case SKYBOX_KOKIRI_SHOP:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gKokiriShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gKokiriShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gKokiriShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gKokiriShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gKokiriShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gKokiriShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gKokiriShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gKokiriShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_GORON_SHOP:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gGoronShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gGoronShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gGoronShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gGoronShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gGoronShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gGoronShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gGoronShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gGoronShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_ZORA_SHOP:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gZoraShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gZoraShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gZoraShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gZoraShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gZoraShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gZoraShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gZoraShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gZoraShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_POTION_SHOP_KAKARIKO:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gKakPotionShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gKakPotionShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gKakPotionShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gKakPotionShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gKakPotionShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gKakPotionShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gKakPotionShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gKakPotionShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_POTION_SHOP_MARKET:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMarketPotionShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMarketPotionShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gMarketPotionShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gMarketPotionShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMarketPotionShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMarketPotionShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gMarketPotionShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gMarketPotionShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_BOMBCHU_SHOP:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 2, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gBombchuShopBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gBombchuShop2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gBombchuShopBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gBombchuShop2BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 2, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gBombchuShopBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gBombchuShopBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gBombchuShopBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gBombchuShopBg2Tlut, 16, 16);
skyboxCtx->rot.y = 0.8f;
break;
case SKYBOX_HOUSE_RICHARD:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gRichardsHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gRichardsHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gRichardsHouse3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gRichardsHouse4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gRichardsHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gRichardsHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gRichardsHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gRichardsHouse4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gRichardsHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gRichardsHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gRichardsHouseBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gRichardsHouseBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gRichardsHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gRichardsHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gRichardsHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gRichardsHouseBg4Tlut, 16, 16);
break;
case SKYBOX_HOUSE_IMPA:
skyboxCtx->unk_140 = 1;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 4, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gCowHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gCowHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gCowHouse3BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 3, gCowHouse4BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gCowHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gCowHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gCowHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 3, gCowHouse4BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 4, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gCowHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gCowHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gCowHouseBg3Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 3, gCowHouseBg4Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gCowHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gCowHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gCowHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 3, gCowHouseBg4Tlut, 16, 16);
break;
case SKYBOX_TENT:
skyboxCtx->unk_140 = 2;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gCarpentersTentBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gCarpentersTent2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gCarpentersTent3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gCarpentersTentBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gCarpentersTent2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gCarpentersTent3BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gCarpentersTentBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gCarpentersTentBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gCarpentersTentBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gCarpentersTentBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gCarpentersTentBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gCarpentersTentBg3Tlut, 16, 16);
break;
case SKYBOX_HOUSE_MIDO:
skyboxCtx->unk_140 = 2;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gMidosHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gMidosHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gMidosHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gMidosHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gMidosHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gMidosHouse3BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gMidosHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gMidosHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gMidosHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gMidosHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gMidosHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gMidosHouseBg3Tlut, 16, 16);
break;
case SKYBOX_HOUSE_SARIA:
skyboxCtx->unk_140 = 2;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gSariasHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gSariasHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gSariasHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gSariasHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gSariasHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gSariasHouse3BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gSariasHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gSariasHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gSariasHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gSariasHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gSariasHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gSariasHouseBg3Tlut, 16, 16);
break;
case SKYBOX_HOUSE_ALLEY:
skyboxCtx->unk_140 = 2;
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 3, "../z_vr_box.c", 1226);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 0, gBackAlleyHouseBgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 1, gBackAlleyHouse2BgTex, 256, 256, 256, 256);
- LoadSkyboxTex(globalCtx, skyboxCtx, 0, 2, gBackAlleyHouse3BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 0, gBackAlleyHouseBgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 1, gBackAlleyHouse2BgTex, 256, 256, 256, 256);
+ LoadSkyboxTex(skyboxCtx, 0, 2, gBackAlleyHouse3BgTex, 256, 256, 256, 256);
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x200 * 3, "../z_vr_box.c", 1231);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 0, gBackAlleyHouseBgTlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 1, gBackAlleyHouseBg2Tlut, 16, 16);
- LoadSkyboxPalette(globalCtx, skyboxCtx, 2, gBackAlleyHouseBg3Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 0, gBackAlleyHouseBgTlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 1, gBackAlleyHouseBg2Tlut, 16, 16);
+ LoadSkyboxPalette(skyboxCtx, 2, gBackAlleyHouseBg3Tlut, 16, 16);
break;
default:
- skyboxCtx->staticSegments[0] = GameState_Alloc(&globalCtx->state, 0x10000 * 8, "../z_vr_box.c", 1226);
- //skyboxCtx->staticSegments[1] = GameState_Alloc(&globalCtx->state, 0x10000 * 8, "../z_vr_box.c", 1226);
- skyboxCtx->staticSegments[1] = malloc(0x10000 * 8); // OTRTODO
- skyboxCtx->palettes = GameState_Alloc(&globalCtx->state, 0x1000, "../z_vr_box.c", 1226);
break;
}
}
@@ -1012,6 +946,7 @@ void Skybox_Setup(GlobalContext* globalCtx, SkyboxContext* skyboxCtx, s16 skybox
void Skybox_Init(GameState* state, SkyboxContext* skyboxCtx, s16 skyboxId) {
GlobalContext* globalCtx = (GlobalContext*)state;
+ skyboxCtx->skyboxId = skyboxId;
skyboxCtx->unk_140 = 0;
skyboxCtx->rot.x = skyboxCtx->rot.y = skyboxCtx->rot.z = 0.0f;
@@ -1051,3 +986,20 @@ void Skybox_Init(GameState* state, SkyboxContext* skyboxCtx, s16 skyboxId) {
osSyncPrintf(VT_RST);
}
}
+
+void Skybox_Update(SkyboxContext* skyboxCtx) {
+ if (skyboxCtx->skyboxId != SKYBOX_NONE) {
+ osSyncPrintf(VT_FGCOL(GREEN));
+
+ if (skyboxCtx->unk_140 != 0) {
+ func_800AEFC8(skyboxCtx, skyboxCtx->skyboxId);
+ } else {
+ if (skyboxCtx->skyboxId == SKYBOX_CUTSCENE_MAP) {
+ func_800AF178(skyboxCtx, 6);
+ } else {
+ func_800AF178(skyboxCtx, 5);
+ }
+ }
+ osSyncPrintf(VT_RST);
+ }
+}
diff --git a/soh/src/code/z_vr_box_draw.c b/soh/src/code/z_vr_box_draw.c
index a5c0610f7..292789333 100644
--- a/soh/src/code/z_vr_box_draw.c
+++ b/soh/src/code/z_vr_box_draw.c
@@ -17,22 +17,10 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb
func_800945A0(gfxCtx);
//gsSPShaderTest(POLY_OPA_DISP++);
- gSPInvalidateTexCache(POLY_OPA_DISP++, 0);
-
- // OTRTODO: Not working...
- /*for (int i = 0; i < 8; i++)
- {
- if (skyboxCtx->staticSegments[0] != NULL)
- gSPInvalidateTexCache(POLY_OPA_DISP++, (uintptr_t)skyboxCtx->staticSegments[0] + (0x10000 * i));
-
- if (skyboxCtx->staticSegments[1] != NULL)
- gSPInvalidateTexCache(POLY_OPA_DISP++, (uintptr_t)skyboxCtx->staticSegments[1] + (0x10000 * i));
- }*/
-
- gSPSegment(POLY_OPA_DISP++, 0x7, skyboxCtx->staticSegments[0]);
+ /*gSPSegment(POLY_OPA_DISP++, 0x7, skyboxCtx->staticSegments[0]);
gSPSegment(POLY_OPA_DISP++, 0x8, skyboxCtx->staticSegments[1]);
- gSPSegment(POLY_OPA_DISP++, 0x9, skyboxCtx->palettes);
+ gSPSegment(POLY_OPA_DISP++, 0x9, skyboxCtx->palettes);*/
gDPSetPrimColor(POLY_OPA_DISP++, 0x00, 0x00, 0, 0, 0, blend);
gSPTexture(POLY_OPA_DISP++, 0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON);
@@ -50,7 +38,12 @@ void SkyboxDraw_Draw(SkyboxContext* skyboxCtx, GraphicsContext* gfxCtx, s16 skyb
gDPSetColorDither(POLY_OPA_DISP++, G_CD_MAGICSQ);
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
- gDPLoadTLUT_pal256(POLY_OPA_DISP++, skyboxCtx->palettes[0]);
+ if (skyboxCtx->palette_size == 256) {
+ gDPLoadTLUT_pal256(POLY_OPA_DISP++, skyboxCtx->palettes[0]);
+ } else {
+ gDPLoadTLUT_pal128(POLY_OPA_DISP++, 0, skyboxCtx->palettes[0]);
+ gDPLoadTLUT_pal128(POLY_OPA_DISP++, 1, skyboxCtx->palettes[1]);
+ }
gDPSetTextureLUT(POLY_OPA_DISP++, G_TT_RGBA16);
gDPSetTextureConvert(POLY_OPA_DISP++, G_TC_FILT);
diff --git a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
index 66307d3ec..227e0d6f0 100644
--- a/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
+++ b/soh/src/overlays/actors/ovl_Boss_Ganondrof/z_boss_ganondrof.c
@@ -1274,7 +1274,7 @@ void BossGanondrof_CollisionCheck(BossGanondrof* this, GlobalContext* globalCtx)
this->actor.colChkInfo.health -= dmg;
}
- if ((s8)this->actor.colChkInfo.health <= 0 || 1) {
+ if ((s8)this->actor.colChkInfo.health <= 0) {
BossGanondrof_SetupDeath(this, globalCtx);
Enemy_StartFinishingBlow(globalCtx, &this->actor);
return;
diff --git a/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c b/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
index 2e8858a94..5e0a780fd 100644
--- a/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
+++ b/soh/src/overlays/actors/ovl_Elf_Msg/z_elf_msg.c
@@ -138,6 +138,10 @@ void ElfMsg_CallNaviCylinder(ElfMsg* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
EnElf* navi = (EnElf*)player->naviActor;
+ // This fixes a crash when using a grotto exit when you never properly entered
+ if (navi == NULL)
+ return;
+
if (ElfMsg_WithinXZDistance(&player->actor.world.pos, &this->actor.world.pos, this->actor.scale.x * 100.0f) &&
(this->actor.world.pos.y <= player->actor.world.pos.y) &&
((player->actor.world.pos.y - this->actor.world.pos.y) < (100.0f * this->actor.scale.y))) {
@@ -164,9 +168,13 @@ void ElfMsg_Update(Actor* thisx, GlobalContext* globalCtx) {
}
}
+#ifdef ZELDA_DEBUG
#include "overlays/ovl_Elf_Msg/ovl_Elf_Msg.h"
+#endif
-void ElfMsg_Draw(Actor* thisx, GlobalContext* globalCtx) {
+void ElfMsg_Draw(Actor* thisx, GlobalContext* globalCtx)
+{
+#ifdef ZELDA_DEBUG
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg.c", 436);
if (R_NAVI_MSG_REGION_ALPHA == 0) {
@@ -191,4 +199,5 @@ void ElfMsg_Draw(Actor* thisx, GlobalContext* globalCtx) {
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg.c", 457);
+ #endif
}
diff --git a/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c b/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
index f23f49e10..73b6785c8 100644
--- a/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
+++ b/soh/src/overlays/actors/ovl_Elf_Msg2/z_elf_msg2.c
@@ -148,9 +148,12 @@ void ElfMsg2_Update(Actor* thisx, GlobalContext* globalCtx) {
}
}
+#if ZELDA_DEBUG
#include "overlays/ovl_Elf_Msg2/ovl_Elf_Msg2.h"
+#endif
void ElfMsg2_Draw(Actor* thisx, GlobalContext* globalCtx) {
+#if ZELDA_DEBUG
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg2.c", 355);
if (R_NAVI_MSG_REGION_ALPHA == 0) {
@@ -165,4 +168,5 @@ void ElfMsg2_Draw(Actor* thisx, GlobalContext* globalCtx) {
gSPDisplayList(POLY_XLU_DISP++, sCubeDL);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_elf_msg2.c", 367);
+ #endif
}
diff --git a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c
index 91c059bee..54b93277c 100644
--- a/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c
+++ b/soh/src/overlays/actors/ovl_En_Ex_Item/z_en_ex_item.c
@@ -496,7 +496,7 @@ void EnExItem_DrawMagic(EnExItem* this, GlobalContext* globalCtx, s16 magicIndex
}
void EnExItem_DrawKey(EnExItem* this, GlobalContext* globalCtx, s32 index) {
- static s32 keySegments[] = { 0x0403F140 };
+ static void* keySegments[] = { gDropKeySmallTex };
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ex_item.c", 880);
diff --git a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
index 1b89b7b8d..620463b04 100644
--- a/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
+++ b/soh/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c
@@ -300,7 +300,7 @@ void EnKusa_Main(EnKusa* this, GlobalContext* globalCtx) {
if (Actor_HasParent(&this->actor, globalCtx)) {
EnKusa_SetupLiftedUp(this);
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 20, NA_SE_PL_PULL_UP_PLANT);
- } else if (this->collider.base.acFlags & AC_HIT) {
+ } else if (this->collider.base.acFlags & AC_HIT && gGlobalCtx->csCtx.state == 0) {
this->collider.base.acFlags &= ~AC_HIT;
EnKusa_SpawnFragments(this, globalCtx);
EnKusa_DropCollectible(this, globalCtx);
diff --git a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
index 04975d910..4d5fefec6 100644
--- a/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
+++ b/soh/src/overlays/actors/ovl_En_Ossan/z_en_ossan.c
@@ -948,7 +948,9 @@ s32 EnOssan_FacingShopkeeperDialogResult(EnOssan* this, GlobalContext* globalCtx
}
void EnOssan_State_FacingShopkeeper(EnOssan* this, GlobalContext* globalCtx, Player* player) {
+ Input* input = &globalCtx->state.input[0];
u8 nextIndex;
+ bool dpad = CVar_GetS32("gDpadShop", 0);
if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_CHOICE) &&
!EnOssan_TestEndInteraction(this, globalCtx, &globalCtx->state.input[0])) {
@@ -957,7 +959,7 @@ void EnOssan_State_FacingShopkeeper(EnOssan* this, GlobalContext* globalCtx, Pla
return;
}
// Stick Left
- if (this->stickAccumX < 0) {
+ if ((this->stickAccumX < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
nextIndex = EnOssan_SetCursorIndexFromNeutral(this, 4);
if (nextIndex != CURSOR_INVALID) {
this->cursorIndex = nextIndex;
@@ -966,7 +968,7 @@ void EnOssan_State_FacingShopkeeper(EnOssan* this, GlobalContext* globalCtx, Pla
this->stickLeftPrompt.isEnabled = false;
func_80078884(NA_SE_SY_CURSOR);
}
- } else if (this->stickAccumX > 0) {
+ } else if ((this->stickAccumX > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
nextIndex = EnOssan_SetCursorIndexFromNeutral(this, 0);
if (nextIndex != CURSOR_INVALID) {
this->cursorIndex = nextIndex;
@@ -1023,11 +1025,13 @@ void EnOssan_State_LookToRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla
}
}
-void EnOssan_CursorUpDown(EnOssan* this) {
+void EnOssan_CursorUpDown(EnOssan* this, GlobalContext* globalCtx) {
+ Input* input = &globalCtx->state.input[0];
u8 curTemp = this->cursorIndex;
u8 curScanTemp;
+ bool dpad = CVar_GetS32("gDpadShop", 0);
- if (this->stickAccumY < 0) {
+ if ((this->stickAccumY < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
curTemp &= 0xFE;
if (this->shelfSlots[curTemp] != NULL) {
this->cursorIndex = curTemp;
@@ -1066,7 +1070,7 @@ void EnOssan_CursorUpDown(EnOssan* this) {
}
}
}
- } else if (this->stickAccumY > 0) {
+ } else if ((this->stickAccumY > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
curTemp |= 1;
if (this->shelfSlots[curTemp] != NULL) {
this->cursorIndex = curTemp;
@@ -1172,11 +1176,13 @@ s32 EnOssan_HasPlayerSelectedItem(GlobalContext* globalCtx, EnOssan* this, Input
}
void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Player* player) {
+ Input* input = &globalCtx->state.input[0];
s32 a;
s32 b;
u8 prevIndex = this->cursorIndex;
s32 c;
s32 d;
+ bool dpad = CVar_GetS32("gDpadShop", 0);
if (!EnOssan_ReturnItemToShelf(this)) {
osSyncPrintf("%s[%d]:" VT_FGCOL(GREEN) "ズームä¸ï¼ï¼" VT_RST "\n", "../z_en_oB1.c", 2152);
@@ -1193,7 +1199,7 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play
if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_EVENT) &&
!EnOssan_HasPlayerSelectedItem(globalCtx, this, &globalCtx->state.input[0])) {
if (this->moveHorizontal) {
- if (this->stickAccumX > 0) {
+ if ((this->stickAccumX > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
a = EnOssan_CursorRight(this, this->cursorIndex, 4);
if (a != CURSOR_INVALID) {
this->cursorIndex = a;
@@ -1201,14 +1207,14 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play
EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this);
return;
}
- } else if (this->stickAccumX < 0) {
+ } else if ((this->stickAccumX < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
b = EnOssan_CursorLeft(this, this->cursorIndex, 8);
if (b != CURSOR_INVALID) {
this->cursorIndex = b;
}
}
} else {
- if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ if ((this->stickAccumX > 0 && this->stickAccumX > 500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
c = EnOssan_CursorRight(this, this->cursorIndex, 4);
if (c != CURSOR_INVALID) {
this->cursorIndex = c;
@@ -1216,14 +1222,14 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play
EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this);
return;
}
- } else if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ } else if ((this->stickAccumX < 0 && this->stickAccumX < -500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
d = EnOssan_CursorLeft(this, this->cursorIndex, 8);
if (d != CURSOR_INVALID) {
this->cursorIndex = d;
}
}
}
- EnOssan_CursorUpDown(this);
+ EnOssan_CursorUpDown(this, globalCtx);
if (this->cursorIndex != prevIndex) {
Message_ContinueTextbox(globalCtx, this->shelfSlots[this->cursorIndex]->actor.textId);
func_80078884(NA_SE_SY_CURSOR);
@@ -1232,9 +1238,11 @@ void EnOssan_State_BrowseLeftShelf(EnOssan* this, GlobalContext* globalCtx, Play
}
void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Player* player) {
+ Input* input = &globalCtx->state.input[0];
s32 pad[2];
u8 prevIndex;
u8 nextIndex;
+ bool dpad = CVar_GetS32("gDpadShop", 0);
prevIndex = this->cursorIndex;
if (!EnOssan_ReturnItemToShelf(this)) {
@@ -1252,7 +1260,7 @@ void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla
if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_EVENT) &&
!EnOssan_HasPlayerSelectedItem(globalCtx, this, &globalCtx->state.input[0])) {
if (this->moveHorizontal) {
- if (this->stickAccumX < 0) {
+ if ((this->stickAccumX < 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
nextIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
if (nextIndex != CURSOR_INVALID) {
this->cursorIndex = nextIndex;
@@ -1260,14 +1268,14 @@ void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla
EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this);
return;
}
- } else if (this->stickAccumX > 0) {
+ } else if ((this->stickAccumX > 0) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
nextIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
if (nextIndex != CURSOR_INVALID) {
this->cursorIndex = nextIndex;
}
}
} else {
- if (this->stickAccumX < 0 && this->stickAccumX < -500) {
+ if ((this->stickAccumX < 0 && this->stickAccumX < -500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
nextIndex = EnOssan_CursorRight(this, this->cursorIndex, 0);
if (nextIndex != CURSOR_INVALID) {
this->cursorIndex = nextIndex;
@@ -1275,14 +1283,14 @@ void EnOssan_State_BrowseRightShelf(EnOssan* this, GlobalContext* globalCtx, Pla
EnOssan_SetLookToShopkeeperFromShelf(globalCtx, this);
return;
}
- } else if (this->stickAccumX > 0 && this->stickAccumX > 500) {
+ } else if ((this->stickAccumX > 0 && this->stickAccumX > 500) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
nextIndex = EnOssan_CursorLeft(this, this->cursorIndex, 4);
if (nextIndex != CURSOR_INVALID) {
this->cursorIndex = nextIndex;
}
}
}
- EnOssan_CursorUpDown(this);
+ EnOssan_CursorUpDown(this, globalCtx);
if (this->cursorIndex != prevIndex) {
Message_ContinueTextbox(globalCtx, this->shelfSlots[this->cursorIndex]->actor.textId);
func_80078884(NA_SE_SY_CURSOR);
diff --git a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c
index ec4079887..bdf29aa52 100644
--- a/soh/src/overlays/actors/ovl_En_Part/z_en_part.c
+++ b/soh/src/overlays/actors/ovl_En_Part/z_en_part.c
@@ -298,13 +298,13 @@ void EnPart_Draw(Actor* thisx, GlobalContext* globalCtx) {
gSPSegment(POLY_OPA_DISP++, 0x09, func_80ACEAC0(globalCtx->state.gfxCtx, 225, 205, 115, 25, 20, 0));
gSPSegment(POLY_OPA_DISP++, 0x0A, func_80ACEAC0(globalCtx->state.gfxCtx, 225, 205, 115, 25, 20, 0));
} else if ((thisx->params == 9) && (this->displayList == ResourceMgr_LoadGfxByName(object_tite_DL_002FF0))) {
- gSPSegment(POLY_OPA_DISP++, 0x08, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001300)));
- gSPSegment(POLY_OPA_DISP++, 0x09, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001700)));
- gSPSegment(POLY_OPA_DISP++, 0x0A, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001900)));
+ gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001300);
+ gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001700);
+ gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_001900);
} else if ((thisx->params == 10) && (this->displayList == ResourceMgr_LoadGfxByName(object_tite_DL_002FF0))) {
- gSPSegment(POLY_OPA_DISP++, 0x08, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001B00)));
- gSPSegment(POLY_OPA_DISP++, 0x09, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_001F00)));
- gSPSegment(POLY_OPA_DISP++, 0x0A, ResourceMgr_LoadTexByName(SEGMENTED_TO_VIRTUAL(object_tite_Tex_002100)));
+ gSPSegment(POLY_OPA_DISP++, 0x08, object_tite_Tex_001B00);
+ gSPSegment(POLY_OPA_DISP++, 0x09, object_tite_Tex_001F00);
+ gSPSegment(POLY_OPA_DISP++, 0x0A, object_tite_Tex_002100);
}
if (this->displayList != NULL) {
diff --git a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c
index f76ac084d..0c903bb80 100644
--- a/soh/src/overlays/actors/ovl_End_Title/z_end_title.c
+++ b/soh/src/overlays/actors/ovl_End_Title/z_end_title.c
@@ -84,6 +84,8 @@ void EndTitle_DrawFull(Actor* thisx, GlobalContext* globalCtx) {
}
OVERLAY_DISP = func_80093F34(OVERLAY_DISP);
+ if (D_801614B0.a > 0)
+ gsSPGrayscale(OVERLAY_DISP++, false);
gDPSetTextureLUT(OVERLAY_DISP++, G_TT_NONE);
gDPSetEnvColor(OVERLAY_DISP++, 255, 120, 30, 0);
gDPSetRenderMode(OVERLAY_DISP++, G_RM_PASS, G_RM_XLU_SURF2);
@@ -108,7 +110,8 @@ void EndTitle_DrawFull(Actor* thisx, GlobalContext* globalCtx) {
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 0, 0, 0, 0);
gSPTextureRectangle(OVERLAY_DISP++, 104 << 2, 177 << 2, 216 << 2, 192 << 2, G_TX_RENDERTILE, 0, 0, 1 << 10,
1 << 10);
-
+ if (D_801614B0.a > 0)
+ gsSPGrayscale(OVERLAY_DISP++, true);
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_end_title.c", 515);
}
diff --git a/soh/src/overlays/actors/ovl_player_actor/z_player.c b/soh/src/overlays/actors/ovl_player_actor/z_player.c
index d02788a8e..aa11b6d7e 100644
--- a/soh/src/overlays/actors/ovl_player_actor/z_player.c
+++ b/soh/src/overlays/actors/ovl_player_actor/z_player.c
@@ -19,6 +19,7 @@
#include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#include "objects/object_link_child/object_link_child.h"
+#include "textures/icon_item_24_static/icon_item_24_static.h"
typedef struct {
/* 0x00 */ u8 itemId;
@@ -1875,10 +1876,20 @@ void func_80833DF8(Player* this, GlobalContext* globalCtx) {
s32 i;
if (this->currentMask != PLAYER_MASK_NONE) {
- maskActionParam = this->currentMask - 1 + PLAYER_AP_MASK_KEATON;
- if (!func_80833C98(C_BTN_ITEM(0), maskActionParam) && !func_80833C98(C_BTN_ITEM(1), maskActionParam) &&
- !func_80833C98(C_BTN_ITEM(2), maskActionParam)) {
- this->currentMask = PLAYER_MASK_NONE;
+ if (CVar_GetS32("gMMBunnyHood", 0) != 0) {
+ s32 maskItem = this->currentMask - PLAYER_MASK_KEATON + ITEM_MASK_KEATON;
+
+ if (gSaveContext.equips.buttonItems[0] != maskItem && gSaveContext.equips.buttonItems[1] != maskItem &&
+ gSaveContext.equips.buttonItems[2] != maskItem && gSaveContext.equips.buttonItems[3] != maskItem) {
+ this->currentMask = PLAYER_MASK_NONE;
+ func_808328EC(this, NA_SE_PL_CHANGE_ARMS);
+ }
+ } else {
+ maskActionParam = this->currentMask - 1 + PLAYER_AP_MASK_KEATON;
+ if (!func_80833C98(C_BTN_ITEM(0), maskActionParam) && !func_80833C98(C_BTN_ITEM(1), maskActionParam) &&
+ !func_80833C98(C_BTN_ITEM(2), maskActionParam)) {
+ this->currentMask = PLAYER_MASK_NONE;
+ }
}
}
@@ -2321,9 +2332,7 @@ s32 func_8083501C(Player* this, GlobalContext* globalCtx) {
if ((!Player_HoldsHookshot(this) || func_80834FBC(this)) && !func_80834758(globalCtx, this) &&
!func_80834F2C(this, globalCtx)) {
return 0;
- }
- else
- {
+ } else if (this->rideActor != NULL) {
this->unk_6AD = 2; // OTRTODO: THIS IS A BAD IDEA BUT IT FIXES THE HORSE FIRST PERSON?
}
@@ -3842,12 +3851,12 @@ s32 func_808382DC(Player* this, GlobalContext* globalCtx) {
s32 sp48 = func_80838144(D_808535E4);
if (((this->actor.wallPoly != NULL) &&
- SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.wallPoly, this->actor.wallBgId)) ||
+ SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.wallPoly, this->actor.wallBgId)) ||
((sp48 >= 0) &&
SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.floorPoly, this->actor.floorBgId) &&
(this->unk_A79 >= D_808544F4[sp48])) ||
((sp48 >= 0) &&
- ((this->currentTunic != PLAYER_TUNIC_GORON) || (this->unk_A79 >= D_808544F4[sp48])))) {
+ ((this->currentTunic != PLAYER_TUNIC_GORON && CVar_GetS32("gSuperTunic", 0) == 0) || (this->unk_A79 >= D_808544F4[sp48])))) {
this->unk_A79 = 0;
this->actor.colChkInfo.damage = 4;
func_80837C0C(globalCtx, this, 0, 4.0f, 5.0f, this->actor.shape.rot.y, 20);
@@ -4632,7 +4641,7 @@ s32 func_8083A6AC(Player* this, GlobalContext* globalCtx) {
if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp74, &sp68, &sp84, true, false, false,
true, &sp80) &&
- (ABS(sp84->normal.y) < 600)) {
+ ((ABS(sp84->normal.y) < 600) || (CVar_GetS32("gClimbEverything", 0) != 0))) {
f32 nx = COLPOLY_GET_NORMAL(sp84->normal.x);
f32 ny = COLPOLY_GET_NORMAL(sp84->normal.y);
f32 nz = COLPOLY_GET_NORMAL(sp84->normal.z);
@@ -5944,7 +5953,11 @@ void func_8083DFE0(Player* this, f32* arg1, s16* arg2) {
s16 yawDiff = this->currentYaw - *arg2;
if (this->swordState == 0) {
- this->linearVelocity = CLAMP(this->linearVelocity, -(R_RUN_SPEED_LIMIT / 100.0f), (R_RUN_SPEED_LIMIT / 100.0f));
+ float maxSpeed = R_RUN_SPEED_LIMIT / 100.0f;
+ if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) {
+ maxSpeed *= 1.5f;
+ }
+ this->linearVelocity = CLAMP(this->linearVelocity, -maxSpeed, maxSpeed);
}
if (ABS(yawDiff) > 0x6000) {
@@ -7525,6 +7538,9 @@ void func_80842180(Player* this, GlobalContext* globalCtx) {
func_80837268(this, &sp2C, &sp2A, 0.018f, globalCtx);
if (!func_8083C484(this, &sp2C, &sp2A)) {
+ if (CVar_GetS32("gMMBunnyHood", 0) != 0 && this->currentMask == PLAYER_MASK_BUNNY) {
+ sp2C *= 1.5f;
+ }
func_8083DF68(this, sp2C, sp2A);
func_8083DDC8(this, globalCtx);
@@ -8152,7 +8168,7 @@ static struct_80832924 D_808545F0[] = {
};
void func_80843CEC(Player* this, GlobalContext* globalCtx) {
- if (this->currentTunic != PLAYER_TUNIC_GORON) {
+ if (this->currentTunic != PLAYER_TUNIC_GORON && CVar_GetS32("gSuperTunic", 0) == 0) {
if ((globalCtx->roomCtx.curRoom.unk_02 == 3) || (D_808535E4 == 9) ||
((func_80838144(D_808535E4) >= 0) &&
!SurfaceType_IsWallDamage(&globalCtx->colCtx, this->actor.floorPoly, this->actor.floorBgId))) {
@@ -9436,7 +9452,7 @@ void Player_Init(Actor* thisx, GlobalContext* globalCtx2) {
if ((sp50 == 0) || (sp50 < -1)) {
titleFileSize = scene->titleFile.vromEnd - scene->titleFile.vromStart;
- if ((titleFileSize != 0) && gSaveContext.showTitleCard) {
+ if (gSaveContext.showTitleCard) {
if ((gSaveContext.sceneSetupIndex < 4) &&
(gEntranceTable[((void)0, gSaveContext.entranceIndex) + ((void)0, gSaveContext.sceneSetupIndex)].field &
0x4000) &&
@@ -9888,7 +9904,7 @@ void func_80847BA0(GlobalContext* globalCtx, Player* this) {
if ((this->actor.bgCheckFlags & 0x200) && (D_80853608 < 0x3000)) {
CollisionPoly* wallPoly = this->actor.wallPoly;
- if (ABS(wallPoly->normal.y) < 600) {
+ if ((ABS(wallPoly->normal.y) < 600) || (CVar_GetS32("gClimbEverything", 0) != 0)) {
f32 sp8C = COLPOLY_GET_NORMAL(wallPoly->normal.x);
f32 sp88 = COLPOLY_GET_NORMAL(wallPoly->normal.y);
f32 sp84 = COLPOLY_GET_NORMAL(wallPoly->normal.z);
@@ -10188,7 +10204,7 @@ void func_80848C74(GlobalContext* globalCtx, Player* this) {
s32 sp58;
s32 sp54;
- if (this->currentTunic == PLAYER_TUNIC_GORON) {
+ if (this->currentTunic == PLAYER_TUNIC_GORON || CVar_GetS32("gSuperTunic", 0) != 0) {
sp54 = 20;
}
else {
@@ -10250,7 +10266,7 @@ void func_80848C74(GlobalContext* globalCtx, Player* this) {
}
}
-void func_80848EF8(Player* this) {
+void func_80848EF8(Player* this, GlobalContext* globalCtx) {
if (CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) {
f32 temp = 200000.0f - (this->unk_6A4 * 5.0f);
@@ -10259,8 +10275,45 @@ void func_80848EF8(Player* this) {
}
this->unk_6A0 += temp;
+
+ /*Prevent it on horse, while jumping and on title screen.
+ If you fly around no stone of agony for you! */
+ if (CVar_GetS32("gVisualAgony", 0) !=0 && !this->stateFlags1) {
+ int rectLeft = OTRGetRectDimensionFromLeftEdge(26); //Left X Pos
+ int rectTop = 60; //Top Y Pos
+ int rectWidth = 24; //Texture Width
+ int rectHeight = 24; //Texture Heigh
+ int DefaultIconA= 50; //Default icon alphe (55 on 255)
+
+ OPEN_DISPS(globalCtx->state.gfxCtx, "../z_player.c", 2824);
+ gDPPipeSync(OVERLAY_DISP++);
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA);
+ gDPSetCombineLERP(OVERLAY_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
+ if (this->unk_6A0 > 4000000.0f) {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, 255);
+ } else {
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA);
+ }
+ if (temp == 0 || temp <= 0.1f) {
+ /*Fail check, it is used to draw off the icon when
+ link is standing out range but do not refresh unk_6A0.
+ Also used to make a default value in my case.*/
+ gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 255, 255, 255, DefaultIconA);
+ }
+ gDPSetEnvColor(OVERLAY_DISP++, 0, 0, 0, 255);
+ gDPSetOtherMode(OVERLAY_DISP++, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_IA16 | G_TL_TILE | 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);
+ gDPLoadTextureBlock(OVERLAY_DISP++, gStoneOfAgonyIconTex, G_IM_FMT_RGBA, G_IM_SIZ_32b, 24, 24, 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);
+ gDPSetOtherMode(OVERLAY_DISP++, G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_IA16 | G_TL_TILE | 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);
+ gSPWideTextureRectangle(OVERLAY_DISP++, rectLeft << 2, rectTop << 2, (rectLeft + rectWidth) << 2, (rectTop + rectHeight) << 2, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
+ CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_player.c", 3500);
+ }
+
if (this->unk_6A0 > 4000000.0f) {
this->unk_6A0 = 0.0f;
+ if (CVar_GetS32("gVisualAgony", 0) !=0 && !this->stateFlags1) {
+ //This audio is placed here and not in previous CVar check to prevent ears ra.. :)
+ Audio_PlaySoundGeneral(NA_SE_SY_MESSAGE_WOMAN, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E0);
+ }
func_8083264C(this, 120, 20, 10, 0);
}
}
@@ -10532,7 +10585,7 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) {
else {
this->fallStartHeight = this->actor.world.pos.y;
}
- func_80848EF8(this);
+ func_80848EF8(this, globalCtx);
}
}
@@ -14806,4 +14859,4 @@ void func_80853148(GlobalContext* globalCtx, Actor* actor) {
this->naviActor->flags |= ACTOR_FLAG_8;
func_80835EA4(globalCtx, 0xB);
}
-}
\ No newline at end of file
+}
diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c
index 4012b39c0..570eedd1f 100644
--- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c
+++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_choose.c
@@ -47,9 +47,6 @@ void FileChoose_SetView(FileChooseContext* this, f32 eyeX, f32 eyeY, f32 eyeZ) {
Gfx* FileChoose_QuadTextureIA8(Gfx* gfx, void* texture, s16 width, s16 height, s16 point)
{
- if (ResourceMgr_OTRSigCheck(texture))
- texture = ResourceMgr_LoadTexByName(texture);
-
gDPLoadTextureBlock(gfx++, 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);
@@ -179,6 +176,7 @@ void FileChoose_UpdateMainMenu(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (CHECK_BTN_ALL(input->press.button, BTN_START) || CHECK_BTN_ALL(input->press.button, BTN_A)) {
if (this->buttonIndex <= FS_BTN_MAIN_FILE_3) {
@@ -237,10 +235,10 @@ void FileChoose_UpdateMainMenu(GameState* thisx) {
}
}
} else {
- if (ABS(this->stickRelY) > 30) {
+ if ((ABS(this->stickRelY) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
- if (this->stickRelY > 30) {
+ if ((this->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
this->buttonIndex--;
if (this->buttonIndex < FS_BTN_MAIN_FILE_1) {
this->buttonIndex = FS_BTN_MAIN_OPTIONS;
@@ -1318,6 +1316,7 @@ void FileChoose_FadeInFileInfo(GameState* thisx) {
void FileChoose_ConfirmFile(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (CHECK_BTN_ALL(input->press.button, BTN_START) || (CHECK_BTN_ALL(input->press.button, BTN_A))) {
if (this->confirmButtonIndex == FS_BTN_CONFIRM_YES) {
@@ -1332,7 +1331,7 @@ void FileChoose_ConfirmFile(GameState* thisx) {
} else if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CLOSE, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->selectMode++;
- } else if (ABS(this->stickRelY) >= 30) {
+ } else if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->confirmButtonIndex ^= 1;
}
diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
index 5d13c408d..1f44abe95 100644
--- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
+++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c
@@ -62,6 +62,7 @@ void FileChoose_SelectCopySource(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
CHECK_BTN_ALL(input->press.button, BTN_B)) {
@@ -82,10 +83,10 @@ void FileChoose_SelectCopySource(GameState* thisx) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
}
} else {
- if (ABS(this->stickRelY) >= 30) {
+ if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
- if (this->stickRelY >= 30) {
+ if ((this->stickRelY >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
this->buttonIndex--;
if (this->buttonIndex < FS_BTN_COPY_FILE_1) {
@@ -174,6 +175,7 @@ void FileChoose_SelectCopyDest(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
CHECK_BTN_ALL(input->press.button, BTN_B)) {
@@ -194,10 +196,10 @@ void FileChoose_SelectCopyDest(GameState* thisx) {
}
} else {
- if (ABS(this->stickRelY) >= 30) {
+ if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
- if (this->stickRelY >= 30) {
+ if ((this->stickRelY >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
this->buttonIndex--;
if ((this->buttonIndex == this->selectedFileIndex)) {
@@ -360,6 +362,7 @@ void FileChoose_CopyConfirm(GameState* thisx) {
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];
u16 dayTime;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
CHECK_BTN_ALL(input->press.button, BTN_B)) {
@@ -377,7 +380,7 @@ void FileChoose_CopyConfirm(GameState* thisx) {
this->configMode = CM_COPY_ANIM_1;
func_800AA000(300.0f, 0xB4, 0x14, 0x64);
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
- } else if (ABS(this->stickRelY) >= 30) {
+ } else if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->buttonIndex ^= 1;
}
@@ -680,6 +683,7 @@ void FileChoose_EraseSelect(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (((this->buttonIndex == FS_BTN_COPY_QUIT) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
CHECK_BTN_ALL(input->press.button, BTN_B)) {
@@ -700,10 +704,10 @@ void FileChoose_EraseSelect(GameState* thisx) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_ERROR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
}
} else {
- if (ABS(this->stickRelY) >= 30) {
+ if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
- if (this->stickRelY >= 30) {
+ if ((this->stickRelY >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
this->buttonIndex--;
if (this->buttonIndex < FS_BTN_ERASE_FILE_1) {
this->buttonIndex = FS_BTN_ERASE_QUIT;
@@ -817,6 +821,7 @@ void FileChoose_SetupEraseConfirm2(GameState* thisx) {
void FileChoose_EraseConfirm(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (((this->buttonIndex != FS_BTN_CONFIRM_YES) && CHECK_BTN_ANY(input->press.button, BTN_A | BTN_START)) ||
CHECK_BTN_ALL(input->press.button, BTN_B)) {
@@ -833,7 +838,7 @@ void FileChoose_EraseConfirm(GameState* thisx) {
this->nextTitleLabel = FS_TITLE_ERASE_COMPLETE;
func_800AA000(200.0f, 0xFF, 0x14, 0x96);
sEraseDelayTimer = 15;
- } else if (ABS(this->stickRelY) >= 30) {
+ } else if ((ABS(this->stickRelY) >= 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->buttonIndex ^= 1;
}
diff --git a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c
index 73aa5e6d1..501986d2b 100644
--- a/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c
+++ b/soh/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c
@@ -509,12 +509,14 @@ void FileChoose_StartNameEntry(GameState* thisx) {
*/
void FileChoose_UpdateKeyboardCursor(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
+ Input* input = &this->state.input[0];
s16 prevKbdX;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
this->kbdButton = 99;
if (this->kbdY != 5) {
- if (this->stickRelX < -30) {
+ if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->charIndex--;
this->kbdX--;
@@ -522,7 +524,7 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) {
this->kbdX = 12;
this->charIndex = (this->kbdY * 13) + this->kbdX;
}
- } else if (this->stickRelX > 30) {
+ } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->charIndex++;
this->kbdX++;
@@ -532,13 +534,13 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) {
}
}
} else {
- if (this->stickRelX < -30) {
+ if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->kbdX--;
if (this->kbdX < 3) {
this->kbdX = 4;
}
- } else if (this->stickRelX > 30) {
+ } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->kbdX++;
if (this->kbdX > 4) {
@@ -547,7 +549,7 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) {
}
}
- if (this->stickRelY > 30) {
+ if ((this->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->kbdY--;
@@ -578,7 +580,7 @@ void FileChoose_UpdateKeyboardCursor(GameState* thisx) {
this->charIndex += this->kbdX;
}
}
- } else if (this->stickRelY < -30) {
+ } else if ((this->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
this->kbdY++;
@@ -655,6 +657,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx;
SramContext* sramCtx = &this->sramCtx;
Input* input = &this->state.input[0];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (CHECK_BTN_ALL(input->press.button, BTN_B)) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_DECIDE_L, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
@@ -675,7 +678,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) {
return;
}
- if (this->stickRelX < -30) {
+ if ((this->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
if (sSelectedSetting == FS_SETTING_AUDIO) {
@@ -688,7 +691,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) {
} else {
gSaveContext.zTargetSetting ^= 1;
}
- } else if (this->stickRelX > 30) {
+ } else if ((this->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
if (sSelectedSetting == FS_SETTING_AUDIO) {
@@ -702,7 +705,7 @@ void FileChoose_UpdateOptionsMenu(GameState* thisx) {
}
}
- if ((this->stickRelY < -30) || (this->stickRelY > 30)) {
+ if ((ABS(this->stickRelY) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
Audio_PlaySoundGeneral(NA_SE_SY_FSEL_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
sSelectedSetting ^= 1;
} else if (CHECK_BTN_ALL(input->press.button, BTN_A)) {
diff --git a/soh/src/overlays/gamestates/ovl_title/z_title.c b/soh/src/overlays/gamestates/ovl_title/z_title.c
index 78794e876..18996f15e 100644
--- a/soh/src/overlays/gamestates/ovl_title/z_title.c
+++ b/soh/src/overlays/gamestates/ovl_title/z_title.c
@@ -10,6 +10,9 @@
#include "alloca.h"
#include "textures/nintendo_rogo_static/nintendo_rogo_static.h"
#include
+#include "GameVersions.h"
+
+const char* GetGameVersionString();
char* quote;
@@ -18,6 +21,8 @@ void Title_PrintBuildInfo(Gfx** gfxp) {
//GfxPrint* printer;
GfxPrint printer;
+ const char* gameVersionStr = GetGameVersionString();
+
g = *gfxp;
g = func_8009411C(g);
//printer = alloca(sizeof(GfxPrint));
@@ -32,6 +37,9 @@ void Title_PrintBuildInfo(Gfx** gfxp) {
GfxPrint_Printf(&printer, "GCC SHIP");
#endif
+ GfxPrint_SetPos(&printer, 5, 4);
+ GfxPrint_Printf(&printer, "Game Version: %s", gameVersionStr);
+
GfxPrint_SetColor(&printer, 255, 255, 255, 255);
GfxPrint_SetPos(&printer, 2, 22);
GfxPrint_Printf(&printer, quote);
@@ -66,6 +74,36 @@ char* SetQuote() {
return quotes[randomQuote];
}
+const char* GetGameVersionString() {
+ uint32_t gameVersion = ResourceMgr_GetGameVersion();
+ switch (gameVersion) {
+ case OOT_NTSC_10:
+ return "N64 NTSC 1.0";
+ case OOT_NTSC_11:
+ return "N64 NTSC 1.1";
+ case OOT_NTSC_12:
+ return "N64 NTSC 1.2";
+ case OOT_PAL_10:
+ return "N64 PAL 1.0";
+ case OOT_PAL_11:
+ return "N64 PAL 1.1";
+ case OOT_PAL_GC:
+ return "GC PAL";
+ case OOT_PAL_MQ:
+ return "GC PAL MQ";
+ case OOT_PAL_GC_DBG1:
+ return "GC PAL DEBUG";
+ case OOT_PAL_GC_DBG2:
+ return "GC PAL DEBUG MQ";
+ case OOT_IQUE_CN:
+ return "IQUE CN";
+ case OOT_IQUE_TW:
+ return "IQUE TW";
+ default:
+ return "UNKNOWN";
+ }
+}
+
// Note: In other rom versions this function also updates unk_1D4, coverAlpha, addAlpha, visibleDuration to calculate
// the fade-in/fade-out + the duration of the n64 logo animation
void Title_Calc(TitleContext* this) {
@@ -161,7 +199,7 @@ void Title_Draw(TitleContext* this) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 170, 255, 255, 255);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 255, 128);
- gDPLoadMultiBlock(POLY_OPA_DISP++, ResourceMgr_LoadTexByName(nintendo_rogo_static_Tex_001800), 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
+ gDPLoadMultiBlock(POLY_OPA_DISP++, nintendo_rogo_static_Tex_001800, 0x100, 1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, 2, 11);
for (idx = 0, y = 94; idx < 16; idx++, y += 2)
@@ -233,6 +271,8 @@ void Title_Init(GameState* thisx) {
//ResourceMgr_CacheDirectory("nintendo_rogo_static*");
+ // Disable vismono
+ D_801614B0.a = 0;
R_UPDATE_RATE = 1;
Matrix_Init(&this->state);
View_Init(&this->view, this->state.gfxCtx);
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c
index 46be1154f..80ffe8d4a 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c
@@ -74,6 +74,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx
s16 pad2;
s16 phi_s0_2;
s16 sp208[3];
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
OPEN_DISPS(gfxCtx, "../z_kaleido_collect.c", 248);
@@ -83,96 +84,92 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx
if (pauseCtx->cursorSpecialPos == 0) {
pauseCtx->nameColorSet = 0;
+ sp216 = pauseCtx->cursorSlot[PAUSE_QUEST];
+ phi_s3 = pauseCtx->cursorPoint[PAUSE_QUEST];
- if ((pauseCtx->state != 6) || ((pauseCtx->stickRelX == 0) && (pauseCtx->stickRelY == 0))) {
- sp216 = pauseCtx->cursorSlot[PAUSE_QUEST];
- } else {
- phi_s3 = pauseCtx->cursorPoint[PAUSE_QUEST];
-
- if (pauseCtx->stickRelX < -30) {
- phi_s0 = D_8082A1AC[phi_s3][2];
- if (phi_s0 == -3) {
- KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_LEFT);
- pauseCtx->unk_1E4 = 0;
- } else {
- while (phi_s0 >= 0) {
- if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
- break;
- }
- phi_s0 = D_8082A1AC[phi_s0][2];
- }
- }
- } else if (pauseCtx->stickRelX > 30) {
- phi_s0 = D_8082A1AC[phi_s3][3];
- if (phi_s0 == -2) {
- KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_RIGHT);
- pauseCtx->unk_1E4 = 0;
- } else {
- while (phi_s0 >= 0) {
- if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
- break;
- }
- phi_s0 = D_8082A1AC[phi_s0][3];
- }
- }
- }
-
- if (pauseCtx->stickRelY < -30) {
- phi_s0 = D_8082A1AC[phi_s3][1];
- while (phi_s0 >= 0) {
- if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
- break;
- }
- phi_s0 = D_8082A1AC[phi_s0][1];
- }
- } else if (pauseCtx->stickRelY > 30) {
- phi_s0 = D_8082A1AC[phi_s3][0];
- while (phi_s0 >= 0) {
- if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
- break;
- }
- phi_s0 = D_8082A1AC[phi_s0][0];
- }
- }
-
- if (phi_s3 != pauseCtx->cursorPoint[PAUSE_QUEST]) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
+ phi_s0 = D_8082A1AC[phi_s3][2];
+ if (phi_s0 == -3) {
+ KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_LEFT);
pauseCtx->unk_1E4 = 0;
- Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
- }
-
- if (pauseCtx->cursorPoint[PAUSE_QUEST] != 0x18) {
- if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) {
- if (pauseCtx->cursorPoint[PAUSE_QUEST] < 6) {
- phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x66;
- osSyncPrintf("000 ccc=%d\n", phi_s0_2);
- } else if (pauseCtx->cursorPoint[PAUSE_QUEST] < 0x12) {
- phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x54;
- osSyncPrintf("111 ccc=%d\n", phi_s0_2);
- } else {
- phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x5A;
- osSyncPrintf("222 ccc=%d (%d, %d, %d)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST],
- 0x12, 0x6C);
+ } else {
+ while (phi_s0 >= 0) {
+ if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
+ break;
}
+ phi_s0 = D_8082A1AC[phi_s0][2];
+ }
+ }
+ } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
+ phi_s0 = D_8082A1AC[phi_s3][3];
+ if (phi_s0 == -2) {
+ KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_RIGHT);
+ pauseCtx->unk_1E4 = 0;
+ } else {
+ while (phi_s0 >= 0) {
+ if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
+ break;
+ }
+ phi_s0 = D_8082A1AC[phi_s0][3];
+ }
+ }
+ }
+
+ if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
+ phi_s0 = D_8082A1AC[phi_s3][1];
+ while (phi_s0 >= 0) {
+ if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
+ break;
+ }
+ phi_s0 = D_8082A1AC[phi_s0][1];
+ }
+ } else if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
+ phi_s0 = D_8082A1AC[phi_s3][0];
+ while (phi_s0 >= 0) {
+ if ((s16)KaleidoScope_UpdateQuestStatusPoint(pauseCtx, phi_s0) != 0) {
+ break;
+ }
+ phi_s0 = D_8082A1AC[phi_s0][0];
+ }
+ }
+
+ if (phi_s3 != pauseCtx->cursorPoint[PAUSE_QUEST]) {
+ pauseCtx->unk_1E4 = 0;
+ Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
+ }
+
+ if (pauseCtx->cursorPoint[PAUSE_QUEST] != 0x18) {
+ if (CHECK_QUEST_ITEM(pauseCtx->cursorPoint[PAUSE_QUEST])) {
+ if (pauseCtx->cursorPoint[PAUSE_QUEST] < 6) {
+ phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x66;
+ osSyncPrintf("000 ccc=%d\n", phi_s0_2);
+ } else if (pauseCtx->cursorPoint[PAUSE_QUEST] < 0x12) {
+ phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x54;
+ osSyncPrintf("111 ccc=%d\n", phi_s0_2);
} else {
- phi_s0_2 = PAUSE_ITEM_NONE;
- osSyncPrintf("999 ccc=%d (%d, %d)\n", PAUSE_ITEM_NONE, pauseCtx->cursorPoint[PAUSE_QUEST],
- 0x18);
+ phi_s0_2 = pauseCtx->cursorPoint[PAUSE_QUEST] + 0x5A;
+ osSyncPrintf("222 ccc=%d (%d, %d, %d)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST],
+ 0x12, 0x6C);
}
} else {
- if ((gSaveContext.inventory.questItems & 0xF0000000) != 0) {
- phi_s0_2 = 0x72;
- } else {
- phi_s0_2 = PAUSE_ITEM_NONE;
- }
- osSyncPrintf("888 ccc=%d (%d, %d, %x)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST], 0x72,
- gSaveContext.inventory.questItems & 0xF0000000);
+ phi_s0_2 = PAUSE_ITEM_NONE;
+ osSyncPrintf("999 ccc=%d (%d, %d)\n", PAUSE_ITEM_NONE, pauseCtx->cursorPoint[PAUSE_QUEST],
+ 0x18);
}
-
- sp216 = pauseCtx->cursorPoint[PAUSE_QUEST];
- pauseCtx->cursorItem[pauseCtx->pageIndex] = phi_s0_2;
- pauseCtx->cursorSlot[pauseCtx->pageIndex] = sp216;
+ } else {
+ if ((gSaveContext.inventory.questItems & 0xF0000000) != 0) {
+ phi_s0_2 = 0x72;
+ } else {
+ phi_s0_2 = PAUSE_ITEM_NONE;
+ }
+ osSyncPrintf("888 ccc=%d (%d, %d, %x)\n", phi_s0_2, pauseCtx->cursorPoint[PAUSE_QUEST], 0x72,
+ gSaveContext.inventory.questItems & 0xF0000000);
}
+ sp216 = pauseCtx->cursorPoint[PAUSE_QUEST];
+ pauseCtx->cursorItem[pauseCtx->pageIndex] = phi_s0_2;
+ pauseCtx->cursorSlot[pauseCtx->pageIndex] = sp216;
+
KaleidoScope_SetCursorVtx(pauseCtx, sp216 * 4, pauseCtx->questVtx);
if ((pauseCtx->state == 6) && (pauseCtx->unk_1E4 == 0) && (pauseCtx->cursorSpecialPos == 0)) {
@@ -215,7 +212,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx
}
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
pauseCtx->cursorPoint[PAUSE_QUEST] = 0x15;
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
@@ -232,7 +229,7 @@ void KaleidoScope_DrawQuestStatus(GlobalContext* globalCtx, GraphicsContext* gfx
pauseCtx->cursorSlot[pauseCtx->pageIndex] = sp216;
}
} else {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
pauseCtx->cursorPoint[PAUSE_QUEST] = 0;
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c
index 680233b0e..27575c3b6 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_equipment.c
@@ -64,7 +64,7 @@ void KaleidoScope_DrawEquipmentImage(GlobalContext* globalCtx, void* source, u32
gDPLoadSync(POLY_KAL_DISP++);
gDPLoadTile(POLY_KAL_DISP++, G_TX_LOADTILE, 0, 0, (width - 1) << 2, (textureHeight - 1) << 2);
-
+
gDPSetTextureImageFB(POLY_KAL_DISP++, G_IM_FMT_RGBA, G_IM_SIZ_16b, width, fbTest);
gSP1Quadrangle(POLY_KAL_DISP++, 0, 2, 3, 1, 0);
@@ -140,6 +140,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
s16 cursorX;
s16 cursorY;
volatile s16 oldCursorPoint;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_equipment.c", 219);
@@ -174,7 +175,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
cursorMoveResult = 0;
while (cursorMoveResult == 0) {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
if (pauseCtx->cursorX[PAUSE_EQUIP] != 0) {
pauseCtx->cursorX[PAUSE_EQUIP] -= 1;
pauseCtx->cursorPoint[PAUSE_EQUIP] -= 1;
@@ -216,7 +217,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
cursorMoveResult = 3;
}
}
- } else if (pauseCtx->stickRelX > 30) {
+ } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
if (pauseCtx->cursorX[PAUSE_EQUIP] < 3) {
pauseCtx->cursorX[PAUSE_EQUIP] += 1;
pauseCtx->cursorPoint[PAUSE_EQUIP] += 1;
@@ -264,7 +265,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
cursorMoveResult = 0;
while (cursorMoveResult == 0) {
- if (pauseCtx->stickRelY > 30) {
+ if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
if (pauseCtx->cursorY[PAUSE_EQUIP] != 0) {
pauseCtx->cursorY[PAUSE_EQUIP] -= 1;
pauseCtx->cursorPoint[PAUSE_EQUIP] -= 4;
@@ -286,7 +287,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
pauseCtx->cursorPoint[PAUSE_EQUIP] = cursorPoint;
cursorMoveResult = 3;
}
- } else if (pauseCtx->stickRelY < -30) {
+ } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
if (pauseCtx->cursorY[PAUSE_EQUIP] < 3) {
pauseCtx->cursorY[PAUSE_EQUIP] += 1;
pauseCtx->cursorPoint[PAUSE_EQUIP] += 4;
@@ -309,7 +310,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
}
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
@@ -356,7 +357,7 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
}
}
} else {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
@@ -574,7 +575,14 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
} else if ((i == 0) && (k == 2) && (gBitFlags[bit + 1] & gSaveContext.inventory.equipment)) {
KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gBrokenGiantsKnifeIconTex, 32, 32, point);
} else if (gBitFlags[bit] & gSaveContext.inventory.equipment) {
- KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[ITEM_SWORD_KOKIRI + temp], 32, 32, point);
+ int itemId = ITEM_SWORD_KOKIRI + temp;
+ bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge);
+ if (not_acquired) {
+ gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255);
+ gsSPGrayscale(POLY_KAL_DISP++, true);
+ }
+ KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32, 32, point);
+ gsSPGrayscale(POLY_KAL_DISP++, false);
}
}
}
@@ -594,7 +602,6 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItemSegment);
//gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItem24Segment);
gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->nameSegment);
- gSPInvalidateTexCache(POLY_KAL_DISP++, globalCtx->interfaceCtx.mapSegment);
//gSPSegment(POLY_KAL_DISP++, 0x07, pauseCtx->playerSegment);
gSPSegment(POLY_KAL_DISP++, 0x08, pauseCtx->iconItemSegment);
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c
index bb42ff711..52c04908f 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c
@@ -96,6 +96,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
s16 cursorY;
s16 oldCursorPoint;
s16 moveCursorResult;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_item.c", 234);
@@ -120,7 +121,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
pauseCtx->stickRelX = 40;
}
- if (ABS(pauseCtx->stickRelX) > 30) {
+ if ((ABS(pauseCtx->stickRelX) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DLEFT | BTN_DRIGHT))) {
cursorPoint = pauseCtx->cursorPoint[PAUSE_ITEM];
cursorX = pauseCtx->cursorX[PAUSE_ITEM];
cursorY = pauseCtx->cursorY[PAUSE_ITEM];
@@ -132,7 +133,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
if (gSaveContext.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]]) {}
while (moveCursorResult == 0) {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
if (pauseCtx->cursorX[PAUSE_ITEM] != 0) {
pauseCtx->cursorX[PAUSE_ITEM] -= 1;
pauseCtx->cursorPoint[PAUSE_ITEM] -= 1;
@@ -164,7 +165,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
moveCursorResult = 2;
}
}
- } else if (pauseCtx->stickRelX > 30) {
+ } else if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
if (pauseCtx->cursorX[PAUSE_ITEM] < 5) {
pauseCtx->cursorX[PAUSE_ITEM] += 1;
pauseCtx->cursorPoint[PAUSE_ITEM] += 1;
@@ -208,7 +209,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
cursorItem, pauseCtx->cursorSpecialPos);
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
@@ -242,7 +243,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
}
}
} else {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
@@ -280,13 +281,13 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
if (pauseCtx->cursorSpecialPos == 0) {
if (cursorItem != PAUSE_ITEM_NONE) {
- if (ABS(pauseCtx->stickRelY) > 30) {
+ if ((ABS(pauseCtx->stickRelY) > 30) || (dpad && CHECK_BTN_ANY(input->press.button, BTN_DDOWN | BTN_DUP))) {
moveCursorResult = 0;
cursorPoint = pauseCtx->cursorPoint[PAUSE_ITEM];
cursorY = pauseCtx->cursorY[PAUSE_ITEM];
while (moveCursorResult == 0) {
- if (pauseCtx->stickRelY > 30) {
+ if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
if (pauseCtx->cursorY[PAUSE_ITEM] != 0) {
pauseCtx->cursorY[PAUSE_ITEM] -= 1;
pauseCtx->cursorPoint[PAUSE_ITEM] -= 6;
@@ -300,7 +301,7 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
moveCursorResult = 2;
}
- } else if (pauseCtx->stickRelY < -30) {
+ } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
if (pauseCtx->cursorY[PAUSE_ITEM] < 3) {
pauseCtx->cursorY[PAUSE_ITEM] += 1;
pauseCtx->cursorPoint[PAUSE_ITEM] += 6;
@@ -466,8 +467,15 @@ void KaleidoScope_DrawItemSelect(GlobalContext* globalCtx) {
}
gSPVertex(POLY_KAL_DISP++, &pauseCtx->itemVtx[j + 0], 4, 0);
- KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[gSaveContext.inventory.items[i]], 32,
+ int itemId = gSaveContext.inventory.items[i];
+ bool not_acquired = (gItemAgeReqs[itemId] != 9) && (gItemAgeReqs[itemId] != gSaveContext.linkAge);
+ if (not_acquired) {
+ gsDPSetGrayscaleColor(POLY_KAL_DISP++, 109, 109, 109, 255);
+ gsSPGrayscale(POLY_KAL_DISP++, true);
+ }
+ KaleidoScope_DrawQuadTextureRGBA32(globalCtx->state.gfxCtx, gItemIcons[itemId], 32,
32, 0);
+ gsSPGrayscale(POLY_KAL_DISP++, false);
}
}
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c
index af5c2b424..bd5277286 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c
@@ -36,6 +36,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
static u16 mapBgPulseStage = 0;
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
PauseContext* pauseCtx = &globalCtx->pauseCtx;
+ Input* input = &globalCtx->state.input[0];
s16 i;
s16 j;
s16 oldCursorPoint;
@@ -43,6 +44,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
s16 stepG;
s16 stepB;
u16 rgba16;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
OPEN_DISPS(gfxCtx, "../z_kaleido_map_PAL.c", 123);
@@ -51,7 +53,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_MAP];
if (pauseCtx->cursorSpecialPos == 0) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
if (pauseCtx->cursorX[PAUSE_MAP] != 0) {
KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_RIGHT);
} else {
@@ -67,7 +69,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
}
}
}
- } else if (pauseCtx->stickRelX < -30) {
+ } else if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
if (pauseCtx->cursorX[PAUSE_MAP] == 0) {
KaleidoScope_MoveCursorToSpecialPos(globalCtx, PAUSE_CURSOR_PAGE_LEFT);
} else {
@@ -82,7 +84,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
}
if (pauseCtx->cursorPoint[PAUSE_MAP] < 3) {
- if (pauseCtx->stickRelY > 30) {
+ if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
if (pauseCtx->cursorPoint[PAUSE_MAP] != 0) {
for (i = pauseCtx->cursorPoint[PAUSE_MAP] - 1; i >= 0; i--) {
if (CHECK_DUNGEON_ITEM(i, gSaveContext.mapIndex)) {
@@ -92,7 +94,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
}
}
} else {
- if (pauseCtx->stickRelY < -30) {
+ if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
if (pauseCtx->cursorPoint[PAUSE_MAP] != 2) {
for (i = pauseCtx->cursorPoint[PAUSE_MAP] + 1; i < 3; i++) {
if (CHECK_DUNGEON_ITEM(i, gSaveContext.mapIndex)) {
@@ -104,7 +106,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
}
}
} else {
- if (pauseCtx->stickRelY > 30) {
+ if ((pauseCtx->stickRelY > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DUP))) {
if (pauseCtx->cursorPoint[PAUSE_MAP] >= 4) {
for (i = pauseCtx->cursorPoint[PAUSE_MAP] - 3 - 1; i >= 0; i--) {
if ((gSaveContext.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) ||
@@ -115,7 +117,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
}
}
}
- } else if (pauseCtx->stickRelY < -30) {
+ } else if ((pauseCtx->stickRelY < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DDOWN))) {
if (pauseCtx->cursorPoint[PAUSE_MAP] != 10) {
for (i = pauseCtx->cursorPoint[PAUSE_MAP] - 3 + 1; i < 11; i++) {
if ((gSaveContext.sceneFlags[gSaveContext.mapIndex].floors & gBitFlags[i]) ||
@@ -138,7 +140,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
}
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
pauseCtx->cursorSlot[PAUSE_MAP] = pauseCtx->cursorPoint[PAUSE_MAP] = pauseCtx->dungeonMapSlot;
@@ -148,7 +150,7 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
}
} else {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
pauseCtx->nameDisplayTimer = 0;
pauseCtx->cursorSpecialPos = 0;
pauseCtx->cursorX[PAUSE_MAP] = 1;
@@ -330,6 +332,10 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[60], 8, 0);
+ // The dungeon map textures are recreated each frame, so always invalidate them
+ gSPInvalidateTexCache(POLY_KAL_DISP++, interfaceCtx->mapSegment);
+ gSPInvalidateTexCache(POLY_KAL_DISP++, interfaceCtx->mapSegment + 0x800);
+
gDPLoadTextureBlock_4b(POLY_KAL_DISP++, interfaceCtx->mapSegment, G_IM_FMT_CI, 48, 85, 0, G_TX_WRAP | G_TX_NOMIRROR,
G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
@@ -396,6 +402,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
};
static u16 D_8082A6D4 = 0;
PauseContext* pauseCtx = &globalCtx->pauseCtx;
+ Input* input = &globalCtx->state.input[0];
s16 i;
s16 j;
s16 t;
@@ -404,6 +411,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
s16 stepR;
s16 stepG;
s16 stepB;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
OPEN_DISPS(gfxCtx, "../z_kaleido_map_PAL.c", 556);
@@ -412,7 +420,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
oldCursorPoint = pauseCtx->cursorPoint[PAUSE_WORLD_MAP];
if (pauseCtx->cursorSpecialPos == 0) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
D_8082A6D4 = 0;
do {
@@ -423,7 +431,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
break;
}
} while (pauseCtx->worldMapPoints[pauseCtx->cursorPoint[PAUSE_WORLD_MAP]] == 0);
- } else if (pauseCtx->stickRelX < -30) {
+ } else if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
D_8082A6D4 = 0;
do {
@@ -444,7 +452,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
} else {
pauseCtx->cursorItem[PAUSE_MAP] = gSaveContext.worldMapArea + 0x18;
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 0;
pauseCtx->cursorSpecialPos = 0;
@@ -459,7 +467,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
D_8082A6D4 = 0;
}
} else {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
pauseCtx->cursorPoint[PAUSE_WORLD_MAP] = 11;
pauseCtx->cursorSpecialPos = 0;
@@ -663,7 +671,7 @@ void KaleidoScope_DrawWorldMap(GlobalContext* globalCtx, GraphicsContext* gfxCtx
gDPLoadTextureBlock(POLY_KAL_DISP++, gWorldMapDotTex, G_IM_FMT_IA, G_IM_SIZ_8b, 8, 8, 0, G_TX_WRAP | G_TX_NOMIRROR,
G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
- for (j = i = 0; i < 12; i++, t++, j += 4) {
+ for (j = t = i = 0; i < 12; i++, t++, j += 4) {
if (pauseCtx->worldMapPoints[i] != 0) {
gDPPipeSync(POLY_KAL_DISP++);
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c
index c16404fb2..bfb4897d8 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c
@@ -7,12 +7,13 @@ void KaleidoScope_UpdatePrompt(GlobalContext* globalCtx) {
Input* input = &globalCtx->state.input[0];
s8 relStickX = input->rel.stick_x;
s16 step;
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (((pauseCtx->state == 7) && (pauseCtx->unk_1EC == 1)) || (pauseCtx->state == 0xE) || (pauseCtx->state == 0x10)) {
- if ((pauseCtx->promptChoice == 0) && (relStickX >= 30)) {
+ if ((pauseCtx->promptChoice == 0) && ((relStickX >= 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT)))) {
Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
pauseCtx->promptChoice = 4;
- } else if ((pauseCtx->promptChoice != 0) && (relStickX <= -30)) {
+ } else if ((pauseCtx->promptChoice != 0) && ((relStickX <= -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT)))) {
Audio_PlaySoundGeneral(NA_SE_SY_CURSOR, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
pauseCtx->promptChoice = 0;
}
diff --git a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c
index a5c160700..8732093ca 100644
--- a/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c
+++ b/soh/src/overlays/misc/ovl_kaleido_scope/z_kaleido_scope_PAL.c
@@ -789,40 +789,10 @@ static PreRender sPlayerPreRender;
static void* sPreRenderCvg;
extern int fbTest;
-// OTRTODO: This function is no longer used. We could probably remove it.
-void KaleidoScope_SetupPlayerPreRender(GlobalContext* globalCtx) {
- Gfx* gfx;
- Gfx* gfxRef;
- void* fbuf;
- static Gfx testBuffer[2048];
-
- //return;
-
- fbuf = globalCtx->state.gfxCtx->curFrameBuffer;
-
- OPEN_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_scope_PAL.c", 496);
-
- gfx = &testBuffer[0];
-
- PreRender_SetValues(&sPlayerPreRender, 64, 112, fbuf, NULL);
- func_800C1F20(&sPlayerPreRender, &gfx);
- func_800C20B4(&sPlayerPreRender, &gfx);
-
- gSPEndDisplayList(gfx++);
- gSPDisplayList(POLY_KAL_DISP++, &testBuffer[0]);
-
- SREG(33) |= 1;
-
- CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_kaleido_scope_PAL.c", 509);
-}
-//OTRTODO - Player on pause
-#if 1
void KaleidoScope_ProcessPlayerPreRender(void) {
- //Sleep_Msec(50);
PreRender_Calc(&sPlayerPreRender);
PreRender_Destroy(&sPlayerPreRender);
}
-#endif
Gfx* KaleidoScope_QuadTextureIA4(Gfx* gfx, void* texture, s16 width, s16 height, u16 point) {
gDPLoadTextureBlock_4b(gfx++, texture, G_IM_FMT_IA, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP,
@@ -966,8 +936,9 @@ void KaleidoScope_HandlePageToggles(PauseContext* pauseCtx, Input* input) {
return;
}
+ bool dpad = CVar_GetS32("gDpadPauseName", 0);
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
- if (pauseCtx->stickRelX < -30) {
+ if ((pauseCtx->stickRelX < -30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DLEFT))) {
pauseCtx->pageSwitchTimer++;
if ((pauseCtx->pageSwitchTimer >= 10) || (pauseCtx->pageSwitchTimer == 0)) {
KaleidoScope_SwitchPage(pauseCtx, 0);
@@ -976,7 +947,7 @@ void KaleidoScope_HandlePageToggles(PauseContext* pauseCtx, Input* input) {
pauseCtx->pageSwitchTimer = -1;
}
} else if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) {
- if (pauseCtx->stickRelX > 30) {
+ if ((pauseCtx->stickRelX > 30) || (dpad && CHECK_BTN_ALL(input->press.button, BTN_DRIGHT))) {
pauseCtx->pageSwitchTimer++;
if ((pauseCtx->pageSwitchTimer >= 10) || (pauseCtx->pageSwitchTimer == 0)) {
KaleidoScope_SwitchPage(pauseCtx, 2);
@@ -1643,14 +1614,24 @@ void KaleidoScope_DrawInfoPanel(GlobalContext* globalCtx) {
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->unk_1E4 == 0)) {
gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6);
+ } else {
+ if (CVar_GetS32("gUniformLR", 0) != 0) {
+ gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255);
+ }
}
gSPDisplayList(POLY_KAL_DISP++, gLButtonIconDL);
- gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 220);
+ if (CVar_GetS32("gUniformLR", 0) == 0) { //Restore the misplace gDPSetPrimColor
+ gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255);
+ }
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->unk_1E4 == 0)) {
gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, D_808321A0, D_808321A2, D_808321A4, D_808321A6);
+ } else {
+ if (CVar_GetS32("gUniformLR", 0) != 0) {
+ gDPSetPrimColor(POLY_KAL_DISP++, 0, 0, 180, 210, 255, 255);
+ }
}
gSPDisplayList(POLY_KAL_DISP++, gRButtonIconDL);
@@ -3110,14 +3091,6 @@ void KaleidoScope_Update(GlobalContext* globalCtx)
gSegments[8] = VIRTUAL_TO_PHYSICAL(pauseCtx->iconItemSegment);
- for (i = 0; i < ARRAY_COUNTU(gItemAgeReqs); i++) {
- if ((gItemAgeReqs[i] != 9) && (gItemAgeReqs[i] != ((void)0, gSaveContext.linkAge)))
- {
- gSPInvalidateTexCache(globalCtx->state.gfxCtx->polyKal.p++, ResourceMgr_LoadTexByName(gItemIcons[i]));
- KaleidoScope_GrayOutTextureRGBA32(SEGMENTED_TO_VIRTUAL(gItemIcons[i]), 0x400);
- }
- }
-
pauseCtx->iconItem24Segment = (void*)(((uintptr_t)pauseCtx->iconItemSegment + size0 + 0xF) & ~0xF);
#if 1
@@ -3206,15 +3179,9 @@ void KaleidoScope_Update(GlobalContext* globalCtx)
if (gSaveContext.language == LANGUAGE_ENG) {
memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[36 + gSaveContext.worldMapArea]), 0xA00);
} else if (gSaveContext.language == LANGUAGE_GER) {
- DmaMgr_SendRequest1(pauseCtx->nameSegment + 0x400,
- (uintptr_t)_map_name_staticSegmentRomStart +
- (((void)0, gSaveContext.worldMapArea) * 0xA00) + 0x16C00,
- 0xA00, "../z_kaleido_scope_PAL.c", 3780);
+ memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[59 + gSaveContext.worldMapArea]), 0xA00);
} else {
- DmaMgr_SendRequest1(pauseCtx->nameSegment + 0x400,
- (uintptr_t)_map_name_staticSegmentRomStart +
- (((void)0, gSaveContext.worldMapArea) * 0xA00) + 0x24800,
- 0xA00, "../z_kaleido_scope_PAL.c", 3784);
+ memcpy(pauseCtx->nameSegment + 0x400, ResourceMgr_LoadTexByName(mapNameTextures[81 + gSaveContext.worldMapArea]), 0xA00);
}
}
// OTRTODO - player on pause
@@ -4023,10 +3990,7 @@ void KaleidoScope_Update(GlobalContext* globalCtx)
R_UPDATE_RATE = 3;
R_PAUSE_MENU_MODE = 0;
- ResourceMgr_DirtyDirectory("textures/icon_item_24_static*");
- ResourceMgr_DirtyDirectory("textures/icon_item_static*");
CVar_SetS32("gPauseTriforce", 0);
- //ResourceMgr_InvalidateCache();
func_800981B8(&globalCtx->objectCtx);
func_800418D0(&globalCtx->colCtx, globalCtx);