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 +#include +#include +#include "ZFile.h" + +class FileWorker +{ +public: + std::vector files; + std::vector externalFiles; + std::vector segments; + std::map> segmentRefFiles; +}; \ No newline at end of file diff --git a/ZAPDTR/ZAPD/Globals.cpp b/ZAPDTR/ZAPD/Globals.cpp index 0902b2c9e..455205b2a 100644 --- a/ZAPDTR/ZAPD/Globals.cpp +++ b/ZAPDTR/ZAPD/Globals.cpp @@ -20,6 +20,7 @@ Globals::Globals() profile = false; useLegacyZDList = false; useExternalResources = true; + singleThreaded = true; verbosity = VerbosityLevel::VERBOSITY_SILENT; outputPath = Directory::GetCurrentDirectory(); } @@ -34,30 +35,88 @@ Globals::~Globals() } } -void Globals::AddSegment(int32_t segment, ZFile* file) +void Globals::AddSegment(int32_t segment, ZFile* file, int workerID) { - if (std::find(segments.begin(), segments.end(), segment) == segments.end()) - segments.push_back(segment); - if (cfg.segmentRefFiles.find(segment) == cfg.segmentRefFiles.end()) - cfg.segmentRefFiles[segment] = std::vector(); - - cfg.segmentRefFiles[segment].push_back(file); -} - -bool Globals::HasSegment(int32_t segment) -{ - return std::find(segments.begin(), segments.end(), segment) != segments.end(); -} - -ZFile* Globals::GetSegment(int32_t segment) -{ - if (HasSegment(segment)) + if (!Globals::Instance->singleThreaded) { - int idx = std::find(segments.begin(), segments.end(), segment) - segments.begin(); - return files[idx]; + auto worker = workerData[workerID]; + + if (std::find(worker->segments.begin(), worker->segments.end(), segment) == + worker->segments.end()) + worker->segments.push_back(segment); + if (worker->segmentRefFiles.find(segment) == worker->segmentRefFiles.end()) + worker->segmentRefFiles[segment] = std::vector(); + + worker->segmentRefFiles[segment].push_back(file); } else - return nullptr; + { + if (std::find(segments.begin(), segments.end(), segment) == segments.end()) + segments.push_back(segment); + if (cfg.segmentRefFiles.find(segment) == cfg.segmentRefFiles.end()) + cfg.segmentRefFiles[segment] = std::vector(); + + cfg.segmentRefFiles[segment].push_back(file); + } +} + +bool Globals::HasSegment(int32_t segment, int workerID) +{ + if (!Globals::Instance->singleThreaded) + return std::find(workerData[workerID]->segments.begin(), + workerData[workerID]->segments.end(), segment) != workerData[workerID]->segments.end(); + else + return std::find(segments.begin(), segments.end(), segment) != segments.end(); +} + +ZFile* Globals::GetSegment(int32_t segment, int workerID) +{ + if (!Globals::Instance->singleThreaded) + { + if (HasSegment(segment, workerID)) + { + int idx = std::find(workerData[workerID]->segments.begin(), + workerData[workerID]->segments.end(), segment) - + workerData[workerID]->segments.begin(); + return workerData[workerID]->files[idx]; + } + else + return nullptr; + } + else + { + if (HasSegment(segment, workerID)) + { + int idx = std::find(segments.begin(), segments.end(), segment) - segments.begin(); + return files[idx]; + } + else + return nullptr; + } +} + +std::map> Globals::GetSegmentRefFiles(int workerID) +{ + if (!Globals::Instance->singleThreaded) + return workerData[workerID]->segmentRefFiles; + else + return cfg.segmentRefFiles; +} + +void Globals::AddFile(ZFile* file, int workerID) +{ + if (singleThreaded) + files.push_back(file); + else + workerData[workerID]->files.push_back(file); +} + +void Globals::AddExternalFile(ZFile* file, int workerID) +{ + if (singleThreaded) + externalFiles.push_back(file); + else + workerData[workerID]->externalFiles.push_back(file); } std::map& Globals::GetExporterMap() @@ -93,8 +152,22 @@ ExporterSet* Globals::GetExporterSet() return nullptr; } +std::vector Globals::GetBaseromFile(std::string fileName) +{ + if (fileMode == ZFileMode::ExtractDirectory) + { + if (StringHelper::Contains(fileName, "baserom/")) + fileName = StringHelper::Split(fileName, "baserom/")[1]; + + return rom->GetFile(fileName); + + } + else + return File::ReadAllBytes(fileName); +} + bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, - const std::string& expectedType, std::string& declName) + const std::string& expectedType, std::string& declName, int workerID) { if (segAddress == 0) { @@ -130,9 +203,11 @@ bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, if (currentFile->GetDeclarationPtrName(segAddress, expectedType, declName)) return true; } - else if (HasSegment(segment)) + else if (HasSegment(segment, workerID)) { - for (auto file : cfg.segmentRefFiles[segment]) + // OTRTODO: Multithreading + auto segs = GetSegmentRefFiles(workerID); + for (auto file : segs[segment]) { offset = Seg2Filespace(segAddress, file->baseAddress); @@ -176,7 +251,7 @@ bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, bool Globals::GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSize, ZFile* currentFile, const std::string& expectedType, - std::string& declName) + std::string& declName, int workerID) { if (segAddress == 0) { @@ -193,9 +268,11 @@ bool Globals::GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSi if (addressFound) return true; } - else if (HasSegment(segment)) + else if (HasSegment(segment, workerID)) { - for (auto file : cfg.segmentRefFiles[segment]) + // OTRTODO: Multithreading + auto segs = GetSegmentRefFiles(workerID); + for (auto file : segs[segment]) { if (file->IsSegmentedInFilespaceRange(segAddress)) { diff --git a/ZAPDTR/ZAPD/Globals.h b/ZAPDTR/ZAPD/Globals.h index 140de1f24..683fd6fcd 100644 --- a/ZAPDTR/ZAPD/Globals.h +++ b/ZAPDTR/ZAPD/Globals.h @@ -5,6 +5,8 @@ #include #include "GameConfig.h" #include "ZFile.h" +#include +#include class ZRoom; @@ -36,6 +38,7 @@ public: ExporterSetFuncVoid3 beginXMLFunc = nullptr; ExporterSetFuncVoid3 endXMLFunc = nullptr; ExporterSetResSave resSaveFunc = nullptr; + ExporterSetFuncVoid3 endProgramFunc = nullptr; }; class Globals @@ -49,9 +52,10 @@ public: bool outputCrc = false; bool profile; // Measure performance of certain operations bool useLegacyZDList; + bool singleThreaded; VerbosityLevel verbosity; // ZAPD outputs additional information ZFileMode fileMode; - fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath; + fs::path baseRomPath, inputPath, outputPath, sourceOutputPath, cfgPath, fileListPath; TextureType texType; ZGame game; GameConfig cfg; @@ -61,10 +65,13 @@ public: bool forceUnaccountedStatic = false; bool otrMode = true; + ZRom* rom; std::vector files; std::vector externalFiles; std::vector segments; + std::map workerData; + std::string currentExporter; static std::map& GetExporterMap(); static void AddExporter(std::string exporterName, ExporterSet* exporterSet); @@ -72,13 +79,18 @@ public: Globals(); ~Globals(); - void AddSegment(int32_t segment, ZFile* file); - bool HasSegment(int32_t segment); - ZFile* GetSegment(int32_t segment); + void AddSegment(int32_t segment, ZFile* file, int workerID); + bool HasSegment(int32_t segment, int workerID); + ZFile* GetSegment(int32_t segment, int workerID); + std::map> GetSegmentRefFiles(int workerID); + void AddFile(ZFile* file, int workerID); + void AddExternalFile(ZFile* file, int workerID); ZResourceExporter* GetExporter(ZResourceType resType); ExporterSet* GetExporterSet(); + std::vector GetBaseromFile(std::string fileName); + /** * Search in every file (and the symbol map) for the `segAddress` passed as parameter. * If the segment of `currentFile` is the same segment of `segAddress`, then that file will be @@ -88,8 +100,8 @@ public: * in which case `declName` will be set to the address formatted as a pointer. */ bool GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile, - const std::string& expectedType, std::string& declName); + const std::string& expectedType, std::string& declName, int workerID); bool GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSize, ZFile* currentFile, - const std::string& expectedType, std::string& declName); + const std::string& expectedType, std::string& declName, int workerID); }; diff --git a/ZAPDTR/ZAPD/Main.cpp b/ZAPDTR/ZAPD/Main.cpp index a5e7c6a47..05e2a73fc 100644 --- a/ZAPDTR/ZAPD/Main.cpp +++ b/ZAPDTR/ZAPD/Main.cpp @@ -23,6 +23,7 @@ #include #include #include "tinyxml2.h" +#include //extern const char gBuildHash[]; const char gBuildHash[] = ""; @@ -43,11 +44,14 @@ extern "C" int ResourceMgr_OTRSigCheck(char* imgData) bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath, - ZFileMode fileMode); + ZFileMode fileMode, int workerID); void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const fs::path& outPath); void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath); void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath); +int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileMode fileMode); + +volatile int numWorkersLeft = 0; #if !defined(_MSC_VER) && !defined(__CYGWIN__) #define ARRAY_COUNT(arr) (sizeof(arr) / sizeof(arr[0])) @@ -197,20 +201,26 @@ int main(int argc, char* argv[]) { Globals::Instance->cfgPath = argv[++i]; } + else if (arg == "-fl") // Set baserom filelist path + { + Globals::Instance->fileListPath = argv[++i]; + } else if (arg == "-rconf") // Read Config File { Globals::Instance->cfg.ReadConfigFile(argv[++i]); } else if (arg == "-eh") // Enable Error Handler { -#if !defined(_MSC_VER) && !defined(__CYGWIN__) + #if !defined(_MSC_VER) && !defined(__CYGWIN__) signal(SIGSEGV, ErrorHandler); signal(SIGABRT, ErrorHandler); #else - HANDLE_WARNING(WarningType::Always, - "tried to set error handler, but this ZAPD build lacks support for one", - ""); + // HANDLE_WARNING(WarningType::Always, + // "tried to set error handler, but this ZAPD build lacks support for one", + // ""); #endif + + } else if (arg == "-v") // Verbose { @@ -255,6 +265,8 @@ int main(int argc, char* argv[]) fileMode = ZFileMode::BuildBlob; else if (buildMode == "e") fileMode = ZFileMode::Extract; + else if (buildMode == "ed") + fileMode = ZFileMode::ExtractDirectory; else if (exporterSet != nullptr && exporterSet->parseFileModeFunc != nullptr) exporterSet->parseFileModeFunc(buildMode, fileMode); @@ -264,6 +276,11 @@ int main(int argc, char* argv[]) return 1; } + Globals::Instance->fileMode = fileMode; + + if (fileMode == ZFileMode::ExtractDirectory) + Globals::Instance->rom = new ZRom(Globals::Instance->baseRomPath.string()); + // We've parsed through our commands once. If an exporter exists, it's been set by now. // Now we'll parse through them again but pass them on to our exporter if one is available. @@ -282,7 +299,7 @@ int main(int argc, char* argv[]) } // TODO: switch - if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile) + if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile || fileMode == ZFileMode::ExtractDirectory) { bool procFileModeSuccess = false; @@ -291,30 +308,85 @@ int main(int argc, char* argv[]) if (!procFileModeSuccess) { - bool parseSuccessful; - - for (auto& extFile : Globals::Instance->cfg.externalFiles) + if (fileMode == ZFileMode::ExtractDirectory) { - fs::path externalXmlFilePath = - Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath; + std::vector fileList = + Directory::ListFiles(Globals::Instance->inputPath.string()); - if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) + const int num_threads = std::thread::hardware_concurrency(); + ctpl::thread_pool pool(num_threads / 2); + + bool parseSuccessful; + + auto start = std::chrono::steady_clock::now(); + int fileListSize = fileList.size(); + Globals::Instance->singleThreaded = false; + + for (int i = 0; i < fileListSize; i++) + Globals::Instance->workerData[i] = new FileWorker(); + + numWorkersLeft = fileListSize; + + for (int i = 0; i < fileListSize; i++) { - printf("Parsing external file from config: '%s'\n", - externalXmlFilePath.c_str()); + if (Globals::Instance->singleThreaded) + { + ExtractFunc(i, fileList.size(), fileList[i], fileMode); + } + else + { + std::string fileListItem = fileList[i]; + pool.push([i, fileListSize, fileListItem, fileMode](int) { + ExtractFunc(i, fileListSize, fileListItem, fileMode); + }); + } } - parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath, - extFile.outPath, ZFileMode::ExternalFile); + if (!Globals::Instance->singleThreaded) + { + while (true) + { + if (numWorkersLeft <= 0) + break; + std::this_thread::sleep_for(std::chrono::milliseconds(250)); + } + } + + auto end = std::chrono::steady_clock::now(); + auto diff = + std::chrono::duration_cast(end - start).count(); + + printf("Generated OTR File Data in %i seconds\n", diff); + } + else + { + bool parseSuccessful; + + for (auto& extFile : Globals::Instance->cfg.externalFiles) + { + fs::path externalXmlFilePath = + Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath; + + if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) + { + printf("Parsing external file from config: '%s'\n", + externalXmlFilePath.c_str()); + } + + parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath, + extFile.outPath, ZFileMode::ExternalFile, 0); + + if (!parseSuccessful) + return 1; + } + + parseSuccessful = + Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, + Globals::Instance->outputPath, fileMode, 0); if (!parseSuccessful) return 1; } - - parseSuccessful = Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath, - Globals::Instance->outputPath, fileMode); - if (!parseSuccessful) - return 1; } } else if (fileMode == ZFileMode::BuildTexture) @@ -330,23 +402,77 @@ int main(int argc, char* argv[]) { BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath); } - else if (fileMode == ZFileMode::BuildOverlay) - { - ZOverlay* overlay = - ZOverlay::FromBuild(Path::GetDirectoryName(Globals::Instance->inputPath), - Path::GetDirectoryName(Globals::Instance->cfgPath)); - if (overlay != nullptr) - File::WriteAllText(Globals::Instance->outputPath.string(), - overlay->GetSourceOutputCode("")); - } + if (exporterSet != nullptr && exporterSet->endProgramFunc != nullptr) + exporterSet->endProgramFunc(); delete g; return 0; } +int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileMode fileMode) +{ + bool parseSuccessful; + + printf("(%i / %i): %s\n", (workerID + 1), fileListSize, fileListItem.c_str()); + + for (auto& extFile : Globals::Instance->cfg.externalFiles) + { + fs::path externalXmlFilePath = Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath; + + if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) + { + printf("Parsing external file from config: '%s'\n", externalXmlFilePath.c_str()); + } + + parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath, + extFile.outPath, ZFileMode::ExternalFile, workerID); + + if (!parseSuccessful) + return 1; + } + + parseSuccessful = Parse(fileListItem, Globals::Instance->baseRomPath, + Globals::Instance->outputPath, fileMode, workerID); + + if (!parseSuccessful) + return 1; + + if (Globals::Instance->singleThreaded) + { + for (int i = 0; i < Globals::Instance->files.size(); i++) + { + delete Globals::Instance->files[i]; + Globals::Instance->files.erase(Globals::Instance->files.begin() + i); + i--; + } + + Globals::Instance->externalFiles.clear(); + Globals::Instance->segments.clear(); + Globals::Instance->cfg.segmentRefFiles.clear(); + } + else + { + for (int i = 0; i < Globals::Instance->workerData[workerID]->files.size(); i++) + { + delete Globals::Instance->workerData[workerID]->files[i]; + Globals::Instance->workerData[workerID]->files.erase( + Globals::Instance->workerData[workerID]->files.begin() + + i); + i--; + } + + Globals::Instance->workerData[workerID]->externalFiles.clear(); + Globals::Instance->workerData[workerID]->segments.clear(); + Globals::Instance->workerData[workerID]->segmentRefFiles.clear(); + + numWorkersLeft--; + } + return 0; +} + bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath, - ZFileMode fileMode) + ZFileMode fileMode, int workerID) { tinyxml2::XMLDocument doc; tinyxml2::XMLError eResult = doc.LoadFile(xmlFilePath.string().c_str()); @@ -374,11 +500,11 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path { if (std::string_view(child->Name()) == "File") { - ZFile* file = new ZFile(fileMode, child, basePath, outPath, "", xmlFilePath); - Globals::Instance->files.push_back(file); + ZFile* file = new ZFile(fileMode, child, basePath, outPath, "", xmlFilePath, workerID); + Globals::Instance->AddFile(file, workerID); if (fileMode == ZFileMode::ExternalFile) { - Globals::Instance->externalFiles.push_back(file); + Globals::Instance->AddExternalFile(file, workerID); file->isExternalFile = true; } } @@ -411,7 +537,7 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path } // Recursion. What can go wrong? - Parse(externalXmlFilePath, basePath, externalOutFilePath, ZFileMode::ExternalFile); + Parse(externalXmlFilePath, basePath, externalOutFilePath, ZFileMode::ExternalFile, workerID); } else { @@ -430,7 +556,14 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path if (exporterSet != nullptr && exporterSet->beginXMLFunc != nullptr) exporterSet->beginXMLFunc(); - for (ZFile* file : Globals::Instance->files) + std::vector files; + + if (Globals::Instance->singleThreaded) + files = Globals::Instance->files; + else + files = Globals::Instance->workerData[workerID]->files; + + for (ZFile* file : files) { if (fileMode == ZFileMode::BuildSourceFile) file->BuildSourceFile(); diff --git a/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp b/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp index 8ce215c97..c9a537ced 100644 --- a/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp +++ b/ZAPDTR/ZAPD/OtherStructs/SkinLimbStructs.cpp @@ -199,8 +199,10 @@ std::string Struct_800A598C::GetBodySourceCode() const { std::string unk_8_Str; std::string unk_C_Str; - Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Struct_800A57C0", unk_8_Str); - Globals::Instance->GetSegmentedPtrName(unk_C, parent, "Struct_800A598C_2", unk_C_Str); + Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Struct_800A57C0", unk_8_Str, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(unk_C, parent, "Struct_800A598C_2", unk_C_Str, + parent->workerID); std::string entryStr = StringHelper::Sprintf("\n\t\tARRAY_COUNTU(%s), ARRAY_COUNTU(%s),\n", unk_8_Str.c_str(), unk_C_Str.c_str()); @@ -316,8 +318,9 @@ std::string Struct_800A5E28::GetBodySourceCode() const { std::string unk_4_Str; std::string unk_8_Str; - Globals::Instance->GetSegmentedPtrName(unk_4, parent, "Struct_800A598C", unk_4_Str); - Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Gfx", unk_8_Str); + Globals::Instance->GetSegmentedPtrName(unk_4, parent, "Struct_800A598C", unk_4_Str, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(unk_8, parent, "Gfx", unk_8_Str, parent->workerID); std::string entryStr = "\n"; entryStr += StringHelper::Sprintf("\t%i, ARRAY_COUNTU(%s),\n", unk_0, unk_4_Str.c_str()); diff --git a/ZAPDTR/ZAPD/OutputFormatter.cpp b/ZAPDTR/ZAPD/OutputFormatter.cpp index dbb8692c0..aed57d48f 100644 --- a/ZAPDTR/ZAPD/OutputFormatter.cpp +++ b/ZAPDTR/ZAPD/OutputFormatter.cpp @@ -3,7 +3,7 @@ void OutputFormatter::Flush() { - //if (!Globals::Instance->otrMode) + //if (!Globals::Instance->otrMode) // OTRTODO: MULTITHREADING { if (col > lineLimit && !Globals::Instance->otrMode) { @@ -31,6 +31,10 @@ void OutputFormatter::Flush() int OutputFormatter::Write(const char* buf, int count) { + // OTRTODO + //if (!Globals::Instance->singleThreaded) + //return 0; + for (int i = 0; i < count; i++) { char c = buf[i]; @@ -92,7 +96,7 @@ int OutputFormatter::Write(const std::string& buf) return Write(buf.data(), buf.size()); } -OutputFormatter* OutputFormatter::Instance; +__thread OutputFormatter* OutputFormatter::Instance; int OutputFormatter::WriteStatic(const char* buf, int count) { diff --git a/ZAPDTR/ZAPD/OutputFormatter.h b/ZAPDTR/ZAPD/OutputFormatter.h index 28955b1cd..2d05765fb 100644 --- a/ZAPDTR/ZAPD/OutputFormatter.h +++ b/ZAPDTR/ZAPD/OutputFormatter.h @@ -25,7 +25,7 @@ private: void Flush(); - static OutputFormatter* Instance; + static __thread OutputFormatter* Instance; static int WriteStatic(const char* buf, int count); public: diff --git a/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp b/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp index 113c4ef33..c3e7c68c7 100644 --- a/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp +++ b/ZAPDTR/ZAPD/Overlays/ZOverlay.cpp @@ -1,3 +1,4 @@ +#if 0 #include "ZOverlay.h" #include @@ -350,3 +351,4 @@ ELFIO::Elf_Half ZOverlay::FindSymbolInSection(const std::string& curSymName, } return SHN_UNDEF; } +#endif \ No newline at end of file diff --git a/ZAPDTR/ZAPD/Overlays/ZOverlay.h b/ZAPDTR/ZAPD/Overlays/ZOverlay.h index 98ead9013..c1fadddca 100644 --- a/ZAPDTR/ZAPD/Overlays/ZOverlay.h +++ b/ZAPDTR/ZAPD/Overlays/ZOverlay.h @@ -1,5 +1,7 @@ #pragma once +#if 0 + #include "Utils/Directory.h" #include "ZResource.h" #include "elfio/elfio.hpp" @@ -73,3 +75,4 @@ private: ELFIO::Elf_Half FindSymbolInSection(const std::string& curSymName, ELFIO::section* sectionData, ELFIO::elfio& reader, size_t readerId); }; +#endif \ No newline at end of file diff --git a/ZAPDTR/ZAPD/ZAPD.vcxproj b/ZAPDTR/ZAPD/ZAPD.vcxproj index 95e89d8ff..91ff515a2 100644 --- a/ZAPDTR/ZAPD/ZAPD.vcxproj +++ b/ZAPDTR/ZAPD/ZAPD.vcxproj @@ -74,15 +74,29 @@ $(OutDir);$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\..\OTRExporter\packages\libpng-v142.1.6.37.2\build\native\lib\x64\v142\Debug\;$(ProjectDir)..\..\libultraship\libultraship\;$(LibraryPath) $(ProjectDir)..\ZAPDUtils;$(ProjectDir)..\lib\tinyxml2;$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\lib\elfio;$(ProjectDir)..\lib\stb;$(ProjectDir);$(IncludePath) + MinimumRecommendedRules.ruleset + + $(ProjectDir)..\ZAPDUtils;$(ProjectDir)..\lib\tinyxml2;$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\lib\elfio;$(ProjectDir)..\lib\stb;$(ProjectDir);$(IncludePath) $(OutDir);$(ProjectDir)..\lib\libgfxd;$(ProjectDir)..\..\OTRExporter\packages\libpng-v142.1.6.37.2\build\native\lib\x64\v142\Debug\;$(ProjectDir)..\..\libultraship\libultraship\;$(LibraryPath) false + MinimumRecommendedRules.ruleset + + $(SolutionDir)ZAPD\lib\tinyxml2;$(SolutionDir)ZAPD\lib\libgfxd;$(SolutionDir)ZAPD\lib\elfio;$(SolutionDir)ZAPD\lib\stb;$(ProjectDir);$(IncludePath) $(SolutionDir)ZAPD\lib\libgfxd;$(SolutionDir)x64\Debug;$(SolutionDir)packages\libpng.1.6.28.1\build\native\lib\x64\v140\dynamic\Debug;$(LibraryPath) + MinimumRecommendedRules.ruleset + + + + + MinimumRecommendedRules.ruleset + + @@ -170,6 +184,7 @@ + @@ -178,6 +193,7 @@ + @@ -185,6 +201,7 @@ + @@ -257,7 +274,9 @@ + + @@ -265,6 +284,8 @@ + + @@ -278,6 +299,7 @@ + @@ -334,6 +356,12 @@ + + + {02d10590-9542-3f55-aaf8-6055677e2a2a} + false + + diff --git a/ZAPDTR/ZAPD/ZAPD.vcxproj.filters b/ZAPDTR/ZAPD/ZAPD.vcxproj.filters index 2a004bf9d..c122b7e56 100644 --- a/ZAPDTR/ZAPD/ZAPD.vcxproj.filters +++ b/ZAPDTR/ZAPD/ZAPD.vcxproj.filters @@ -58,6 +58,12 @@ {730beb67-6d59-4849-9d9b-702c4a565fc0} + + {b26457d2-cdb8-4c92-9ed7-a55bf6d3619e} + + + {9651a041-1019-4486-9e90-1dccfa9471e9} + @@ -282,6 +288,15 @@ Source Files\Z64 + + Source Files\Z64 + + + Source Files\Yaz0 + + + Source Files + @@ -539,6 +554,21 @@ Header Files\Z64 + + Header Files\Z64 + + + Header Files\Yaz0 + + + Header Files\Yaz0 + + + Header Files + + + Header Files\Libraries + diff --git a/ZAPDTR/ZAPD/ZAnimation.cpp b/ZAPDTR/ZAPD/ZAnimation.cpp index dced31aff..ef4735e09 100644 --- a/ZAPDTR/ZAPD/ZAnimation.cpp +++ b/ZAPDTR/ZAPD/ZAnimation.cpp @@ -112,12 +112,15 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix) const uint8_t lineLength = 14; const uint8_t offset = 0; - for (size_t i = 0; i < rotationValues.size(); i++) + if (!Globals::Instance->otrMode) { - valuesStr += StringHelper::Sprintf("0x%04X, ", rotationValues[i]); + for (size_t i = 0; i < rotationValues.size(); i++) + { + valuesStr += StringHelper::Sprintf("0x%04X, ", rotationValues[i]); - if ((i - offset + 1) % lineLength == 0) - valuesStr += "\n "; + if ((i - offset + 1) % lineLength == 0) + valuesStr += "\n "; + } } parent->AddDeclarationArray(rotationValuesOffset, DeclarationAlignment::Align4, @@ -125,13 +128,17 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix) StringHelper::Sprintf("%sFrameData", defaultPrefix.c_str()), rotationValues.size(), valuesStr); - for (size_t i = 0; i < rotationIndices.size(); i++) + if (!Globals::Instance->otrMode) { - indicesStr += StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X },", rotationIndices[i].x, - rotationIndices[i].y, rotationIndices[i].z); + for (size_t i = 0; i < rotationIndices.size(); i++) + { + indicesStr += + StringHelper::Sprintf(" { 0x%04X, 0x%04X, 0x%04X },", rotationIndices[i].x, + rotationIndices[i].y, rotationIndices[i].z); - if (i != (rotationIndices.size() - 1)) - indicesStr += "\n"; + if (i != (rotationIndices.size() - 1)) + indicesStr += "\n"; + } } parent->AddDeclarationArray(rotationIndicesOffset, DeclarationAlignment::Align4, @@ -143,10 +150,11 @@ void ZNormalAnimation::DeclareReferences(const std::string& prefix) std::string ZNormalAnimation::GetBodySourceCode() const { std::string frameDataName; - Globals::Instance->GetSegmentedPtrName(rotationValuesSeg, parent, "s16", frameDataName); + Globals::Instance->GetSegmentedPtrName(rotationValuesSeg, parent, "s16", frameDataName, + parent->workerID); std::string jointIndicesName; Globals::Instance->GetSegmentedPtrName(rotationIndicesSeg, parent, "JointIndex", - jointIndicesName); + jointIndicesName, parent->workerID); std::string headerStr = StringHelper::Sprintf("\n\t{ %i }, %s,\n", frameCount, frameDataName.c_str()); @@ -183,7 +191,7 @@ void ZLinkAnimation::ParseRawData() std::string ZLinkAnimation::GetBodySourceCode() const { std::string segSymbol; - Globals::Instance->GetSegmentedPtrName(segmentAddress, parent, "", segSymbol); + Globals::Instance->GetSegmentedPtrName(segmentAddress, parent, "", segSymbol, parent->workerID); return StringHelper::Sprintf("\n\t{ %i }, %s\n", frameCount, segSymbol.c_str()); } @@ -383,12 +391,13 @@ void ZCurveAnimation::DeclareReferences(const std::string& prefix) std::string ZCurveAnimation::GetBodySourceCode() const { std::string refIndexStr; - Globals::Instance->GetSegmentedPtrName(refIndex, parent, "u8", refIndexStr); + Globals::Instance->GetSegmentedPtrName(refIndex, parent, "u8", refIndexStr, parent->workerID); std::string transformDataStr; Globals::Instance->GetSegmentedPtrName(transformData, parent, "TransformData", - transformDataStr); + transformDataStr, parent->workerID); std::string copyValuesStr; - Globals::Instance->GetSegmentedPtrName(copyValues, parent, "s16", copyValuesStr); + Globals::Instance->GetSegmentedPtrName(copyValues, parent, "s16", copyValuesStr, + parent->workerID); return StringHelper::Sprintf("\n\t%s,\n\t%s,\n\t%s,\n\t%i, %i\n", refIndexStr.c_str(), transformDataStr.c_str(), copyValuesStr.c_str(), unk_0C, unk_10); @@ -510,8 +519,10 @@ std::string ZLegacyAnimation::GetBodySourceCode() const std::string frameDataName; std::string jointKeyName; - Globals::Instance->GetSegmentedPtrName(frameData, parent, "s16", frameDataName); - Globals::Instance->GetSegmentedPtrName(jointKey, parent, "JointKey", jointKeyName); + Globals::Instance->GetSegmentedPtrName(frameData, parent, "s16", frameDataName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(jointKey, parent, "JointKey", jointKeyName, + parent->workerID); body += StringHelper::Sprintf("\t%i, %i,\n", frameCount, limbCount); body += StringHelper::Sprintf("\t%s,\n", frameDataName.c_str()); diff --git a/ZAPDTR/ZAPD/ZArray.cpp b/ZAPDTR/ZAPD/ZArray.cpp index 341ade1cf..86d73e1e6 100644 --- a/ZAPDTR/ZAPD/ZArray.cpp +++ b/ZAPDTR/ZAPD/ZArray.cpp @@ -102,8 +102,7 @@ std::string ZArray::GetBodySourceCode() const const auto& res = resList[i]; output += "\t"; - if (res->GetResourceType() == ZResourceType::Scalar || - res->GetResourceType() == ZResourceType::Vertex) + if (res->GetResourceType() == ZResourceType::Scalar || res->GetResourceType() == ZResourceType::Vertex) output += resList.at(i)->GetBodySourceCode(); else output += StringHelper::Sprintf("{ %s }", resList.at(i)->GetBodySourceCode().c_str()); diff --git a/ZAPDTR/ZAPD/ZBackground.cpp b/ZAPDTR/ZAPD/ZBackground.cpp index 0ed1eb747..94efe06e9 100644 --- a/ZAPDTR/ZAPD/ZBackground.cpp +++ b/ZAPDTR/ZAPD/ZBackground.cpp @@ -150,8 +150,11 @@ std::string ZBackground::GetExternalExtension() const void ZBackground::Save(const fs::path& outFolder) { - fs::path filepath = outFolder / (outName + "." + GetExternalExtension()); - File::WriteAllBytes(filepath.string(), data); + if (!Globals::Instance->otrMode) + { + fs::path filepath = outFolder / (outName + "." + GetExternalExtension()); + File::WriteAllBytes(filepath.string(), data); + } } std::string ZBackground::GetBodySourceCode() const diff --git a/ZAPDTR/ZAPD/ZCollision.cpp b/ZAPDTR/ZAPD/ZCollision.cpp index 11efd47e8..2a282cf2f 100644 --- a/ZAPDTR/ZAPD/ZCollision.cpp +++ b/ZAPDTR/ZAPD/ZCollision.cpp @@ -97,12 +97,15 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) if (waterBoxes.size() > 0) { - for (size_t i = 0; i < waterBoxes.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += - StringHelper::Sprintf("\t{ %s },", waterBoxes[i].GetBodySourceCode().c_str()); - if (i + 1 < waterBoxes.size()) - declaration += "\n"; + for (size_t i = 0; i < waterBoxes.size(); i++) + { + declaration += + StringHelper::Sprintf("\t{ %s },", waterBoxes[i].GetBodySourceCode().c_str()); + if (i + 1 < waterBoxes.size()) + declaration += "\n"; + } } parent->AddDeclarationArray( @@ -115,14 +118,17 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) { declaration.clear(); - for (size_t i = 0; i < polygons.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += StringHelper::Sprintf( - "\t{ 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },", - polygons[i].type, polygons[i].vtxA, polygons[i].vtxB, polygons[i].vtxC, - polygons[i].a, polygons[i].b, polygons[i].c, polygons[i].d); - if (i + 1 < polygons.size()) - declaration += "\n"; + for (size_t i = 0; i < polygons.size(); i++) + { + declaration += StringHelper::Sprintf( + "\t{ 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X, 0x%04X },", + polygons[i].type, polygons[i].vtxA, polygons[i].vtxB, polygons[i].vtxC, + polygons[i].a, polygons[i].b, polygons[i].c, polygons[i].d); + if (i + 1 < polygons.size()) + declaration += "\n"; + } } parent->AddDeclarationArray( @@ -132,13 +138,16 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) } declaration.clear(); - for (size_t i = 0; i < polygonTypes.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += StringHelper::Sprintf("\t{ 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, - polygonTypes[i] & 0xFFFFFFFF); + for (size_t i = 0; i < polygonTypes.size(); i++) + { + declaration += StringHelper::Sprintf("\t{ 0x%08lX, 0x%08lX },", polygonTypes[i] >> 32, + polygonTypes[i] & 0xFFFFFFFF); - if (i < polygonTypes.size() - 1) - declaration += "\n"; + if (i < polygonTypes.size() - 1) + declaration += "\n"; + } } if (polyTypeDefAddress != 0) @@ -154,13 +163,16 @@ void ZCollisionHeader::DeclareReferences(const std::string& prefix) { declaration.clear(); - for (size_t i = 0; i < vertices.size(); i++) + if (!Globals::Instance->otrMode) { - declaration += - StringHelper::Sprintf("\t{ %s },", vertices[i].GetBodySourceCode().c_str()); + for (size_t i = 0; i < vertices.size(); i++) + { + declaration += + StringHelper::Sprintf("\t{ %s },", vertices[i].GetBodySourceCode().c_str()); - if (i < vertices.size() - 1) - declaration += "\n"; + if (i < vertices.size() - 1) + declaration += "\n"; + } } const auto& first = vertices.front(); @@ -177,29 +189,36 @@ std::string ZCollisionHeader::GetBodySourceCode() const { std::string declaration = ""; + if (Globals::Instance->otrMode) + return declaration; + declaration += "\n"; declaration += StringHelper::Sprintf("\t{ %i, %i, %i },\n", absMinX, absMinY, absMinZ); declaration += StringHelper::Sprintf("\t{ %i, %i, %i },\n", absMaxX, absMaxY, absMaxZ); std::string vtxName; - Globals::Instance->GetSegmentedPtrName(vtxAddress, parent, "Vec3s", vtxName); + Globals::Instance->GetSegmentedPtrName(vtxAddress, parent, "Vec3s", vtxName, parent->workerID); declaration += StringHelper::Sprintf("\t%i,\n\t%s,\n", numVerts, vtxName.c_str()); std::string polyName; - Globals::Instance->GetSegmentedPtrName(polyAddress, parent, "CollisionPoly", polyName); + Globals::Instance->GetSegmentedPtrName(polyAddress, parent, "CollisionPoly", polyName, + parent->workerID); declaration += StringHelper::Sprintf("\t%i,\n\t%s,\n", numPolygons, polyName.c_str()); std::string surfaceName; - Globals::Instance->GetSegmentedPtrName(polyTypeDefAddress, parent, "SurfaceType", surfaceName); + Globals::Instance->GetSegmentedPtrName(polyTypeDefAddress, parent, "SurfaceType", surfaceName, + parent->workerID); declaration += StringHelper::Sprintf("\t%s,\n", surfaceName.c_str()); std::string camName; - Globals::Instance->GetSegmentedPtrName(camDataAddress, parent, "CamData", camName); + Globals::Instance->GetSegmentedPtrName(camDataAddress, parent, "CamData", camName, + parent->workerID); declaration += StringHelper::Sprintf("\t%s,\n", camName.c_str()); std::string waterBoxName; - Globals::Instance->GetSegmentedPtrName(waterBoxAddress, parent, "WaterBox", waterBoxName); + Globals::Instance->GetSegmentedPtrName(waterBoxAddress, parent, "WaterBox", waterBoxName, + parent->workerID); declaration += StringHelper::Sprintf("\t%i,\n\t%s\n", numWaterBoxes, waterBoxName.c_str()); return declaration; diff --git a/ZAPDTR/ZAPD/ZDisplayList.cpp b/ZAPDTR/ZAPD/ZDisplayList.cpp index 11d36a240..406245b33 100644 --- a/ZAPDTR/ZAPD/ZDisplayList.cpp +++ b/ZAPDTR/ZAPD/ZDisplayList.cpp @@ -671,7 +671,8 @@ int32_t ZDisplayList::OptimizationCheck_LoadTextureBlock(int32_t startIndex, std lastTexSeg = segmentNumber; - Globals::Instance->GetSegmentedPtrName(data & 0xFFFFFFFF, parent, "", texStr); + Globals::Instance->GetSegmentedPtrName(data & 0xFFFFFFFF, parent, "", texStr, + parent->workerID); } // gsDPSetTile @@ -823,7 +824,7 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, const std::string& prefix, char* l if (pp != 0) { - if (!Globals::Instance->HasSegment(segNum)) + if (!Globals::Instance->HasSegment(segNum, parent->workerID)) sprintf(line, "gsSPBranchList(0x%08" PRIX64 "),", data & 0xFFFFFFFF); else if (dListDecl != nullptr) sprintf(line, "gsSPBranchList(%s),", dListDecl->varName.c_str()); @@ -833,7 +834,7 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, const std::string& prefix, char* l } else { - if (!Globals::Instance->HasSegment(segNum)) + if (!Globals::Instance->HasSegment(segNum, parent->workerID)) sprintf(line, "gsSPDisplayList(0x%08" PRIX64 "),", data & 0xFFFFFFFF); else if (dListDecl != nullptr) sprintf(line, "gsSPDisplayList(%s),", dListDecl->varName.c_str()); @@ -844,7 +845,7 @@ void ZDisplayList::Opcode_G_DL(uint64_t data, const std::string& prefix, char* l // if (segNum == 8 || segNum == 9 || segNum == 10 || segNum == 11 || segNum == 12 || segNum == // 13) // Used for runtime-generated display lists - if (!Globals::Instance->HasSegment(segNum)) + if (!Globals::Instance->HasSegment(segNum, parent->workerID)) { if (pp != 0) sprintf(line, "gsSPBranchList(0x%08" PRIX64 "),", data & 0xFFFFFFFF); @@ -965,7 +966,7 @@ void ZDisplayList::Opcode_G_VTX(uint64_t data, char* line) } // Hack: Don't extract vertices from a unknown segment. - if (!Globals::Instance->HasSegment(GETSEGNUM(data))) + if (!Globals::Instance->HasSegment(GETSEGNUM(data), parent->workerID)) { segptr_t segmented = data & 0xFFFFFFFF; references.push_back(segmented); @@ -1069,7 +1070,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, const std::string& prefix, ch if (parent != nullptr) { - if (Globals::Instance->HasSegment(segmentNumber)) + if (Globals::Instance->HasSegment(segmentNumber, parent->workerID)) texDecl = parent->GetDeclaration(texAddress); else texDecl = parent->GetDeclaration(data); @@ -1077,7 +1078,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, const std::string& prefix, ch if (texDecl != nullptr) sprintf(texStr, "%s", texDecl->varName.c_str()); - else if (data != 0 && Globals::Instance->HasSegment(segmentNumber)) + else if (data != 0 && Globals::Instance->HasSegment(segmentNumber, parent->workerID)) sprintf(texStr, "%sTex_%06X", prefix.c_str(), texAddress); else { @@ -1090,7 +1091,7 @@ void ZDisplayList::Opcode_G_SETTIMG(uint64_t data, const std::string& prefix, ch else { std::string texName; - Globals::Instance->GetSegmentedPtrName(data, parent, "", texName); + Globals::Instance->GetSegmentedPtrName(data, parent, "", texName, parent->workerID); sprintf(line, "gsDPSetTextureImage(%s, %s, %i, %s),", fmtTbl[fmt], sizTbl[siz], www + 1, texName.c_str()); } @@ -1765,7 +1766,9 @@ static int32_t GfxdCallback_Vtx(uint32_t seg, int32_t count) } self->references.push_back(seg); - gfxd_puts("@r"); + + if (!Globals::Instance->otrMode) + gfxd_puts("@r"); return 1; } @@ -1788,7 +1791,7 @@ static int32_t GfxdCallback_Texture(segptr_t seg, int32_t fmt, int32_t siz, int3 self->TextureGenCheck(); std::string texName; - Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", texName); + Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", texName, self->parent->workerID); gfxd_puts(texName.c_str()); @@ -1812,7 +1815,7 @@ static int32_t GfxdCallback_Palette(uint32_t seg, [[maybe_unused]] int32_t idx, self->TextureGenCheck(); std::string palName; - Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", palName); + Globals::Instance->GetSegmentedPtrName(seg, self->parent, "", palName, self->parent->workerID); gfxd_puts(palName.c_str()); @@ -1826,7 +1829,8 @@ static int32_t GfxdCallback_DisplayList(uint32_t seg) uint32_t dListSegNum = GETSEGNUM(seg); std::string dListName = ""; - bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Gfx", dListName); + bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Gfx", dListName, + self->parent->workerID); if (!addressFound && self->parent->segment == dListSegNum) { @@ -1849,7 +1853,8 @@ static int32_t GfxdCallback_Matrix(uint32_t seg) std::string mtxName; ZDisplayList* self = static_cast(gfxd_udata_get()); - bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Mtx", mtxName); + bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Mtx", mtxName, + self->parent->workerID); if (!addressFound && GETSEGNUM(seg) == self->parent->segment) { Declaration* decl = @@ -1923,6 +1928,23 @@ void ZDisplayList::DeclareReferences(const std::string& prefix) curAddr, firstVtx.GetDeclarationAlignment(), item.second.size() * firstVtx.GetRawDataSize(), firstVtx.GetSourceTypeName(), firstVtx.GetDefaultName(name), item.second.size(), declaration); + + /*for (auto vtx : item.second) + { + ZVtx* nVtx = new ZVtx(vtx.parent); + nVtx->x = vtx.x; + nVtx->y = vtx.y; + nVtx->z = vtx.z; + nVtx->flag = vtx.flag; + nVtx->s = vtx.s; + nVtx->t = vtx.t; + nVtx->r = vtx.r; + nVtx->g = vtx.g; + nVtx->b = vtx.b; + nVtx->a = vtx.a; + decl->vertexHack.push_back(nVtx); + }*/ + decl->isExternal = true; } } @@ -1968,15 +1990,15 @@ void ZDisplayList::DeclareReferences(const std::string& prefix) { auto& item = vertices[vtxKeys[i]]; - std::string declaration; + //std::string declaration; - for (auto& vtx : item) - declaration += StringHelper::Sprintf("\t%s,\n", vtx.GetBodySourceCode().c_str()); + //for (auto& vtx : item) + //declaration += StringHelper::Sprintf("\t%s,\n", vtx.GetBodySourceCode().c_str()); // Ensure there's always a trailing line feed to prevent dumb warnings. // Please don't remove this line, unless you somehow made a way to prevent // that warning when building the OoT repo. - declaration += "\n"; + //declaration += "\n"; if (parent != nullptr) { @@ -1988,12 +2010,6 @@ void ZDisplayList::DeclareReferences(const std::string& prefix) else vtxName = StringHelper::Sprintf("%sVtx_%06X", prefix.c_str(), vtxKeys[i]); - - if (StringHelper::Contains(vtxName, "4B18")) - { - int bp = 0; - } - auto filepath = Globals::Instance->outputPath / vtxName; std::string incStr = StringHelper::Sprintf("%s.%s.inc", filepath.string().c_str(), "vtx"); @@ -2109,7 +2125,7 @@ bool ZDisplayList::TextureGenCheck(int32_t texWidth, int32_t texHeight, uint32_t texWidth, texHeight, texIsPalette, texAddr); if ((texSeg != 0 || texAddr != 0) && texWidth > 0 && texHeight > 0 && texLoaded && - Globals::Instance->HasSegment(segmentNumber)) + Globals::Instance->HasSegment(segmentNumber, self->parent->workerID)) { ZFile* auxParent = nullptr; if (segmentNumber == self->parent->segment) @@ -2120,7 +2136,8 @@ bool ZDisplayList::TextureGenCheck(int32_t texWidth, int32_t texHeight, uint32_t { // Try to find a non-external file (i.e., one we are actually extracting) // which has the same segment number we are looking for. - for (auto& otherFile : Globals::Instance->cfg.segmentRefFiles[segmentNumber]) + auto segs = Globals::Instance->GetSegmentRefFiles(self->parent->workerID); + for (auto& otherFile : segs[segmentNumber]) { if (!otherFile->isExternalFile) { diff --git a/ZAPDTR/ZAPD/ZFile.cpp b/ZAPDTR/ZAPD/ZFile.cpp index 13ab961f8..9ff7a6823 100644 --- a/ZAPDTR/ZAPD/ZFile.cpp +++ b/ZAPDTR/ZAPD/ZFile.cpp @@ -41,6 +41,7 @@ ZFile::ZFile() baseAddress = 0; rangeStart = 0x000000000; rangeEnd = 0xFFFFFFFF; + workerID = 0; } ZFile::ZFile(const fs::path& nOutPath, const std::string& nName) : ZFile() @@ -51,7 +52,7 @@ ZFile::ZFile(const fs::path& nOutPath, const std::string& nName) : ZFile() } ZFile::ZFile(ZFileMode nMode, tinyxml2::XMLElement* reader, const fs::path& nBasePath, - const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath) + const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath, int nWorkerID) : ZFile() { xmlFilePath = nXmlFilePath; @@ -66,6 +67,7 @@ ZFile::ZFile(ZFileMode nMode, tinyxml2::XMLElement* reader, const fs::path& nBas outputPath = nOutPath; mode = nMode; + workerID = nWorkerID; ParseXML(reader, filename); if (mode != ZFileMode::ExternalFile) @@ -167,7 +169,7 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) } } } - Globals::Instance->AddSegment(segment, this); + Globals::Instance->AddSegment(segment, this, workerID); if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) { @@ -181,16 +183,22 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) } } - if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile) + if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile || mode == ZFileMode::ExtractDirectory) { - if (!File::Exists((basePath / name).string())) + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) { - std::string errorHeader = StringHelper::Sprintf("binary file '%s' does not exist.", - (basePath / name).c_str()); - HANDLE_ERROR_PROCESS(WarningType::Always, errorHeader, ""); + if (!File::Exists((basePath / name).string())) + { + std::string errorHeader = StringHelper::Sprintf("binary file '%s' does not exist.", + (basePath / name).c_str()); + HANDLE_ERROR_PROCESS(WarningType::Always, errorHeader, ""); + } } - rawData = File::ReadAllBytes((basePath / name).string()); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + rawData = Globals::Instance->GetBaseromFile(name); + else + rawData = Globals::Instance->GetBaseromFile((basePath / name).string()); if (reader->Attribute("RangeEnd") == nullptr) rangeEnd = rawData.size(); @@ -260,7 +268,7 @@ void ZFile::ParseXML(tinyxml2::XMLElement* reader, const std::string& filename) { ZResource* nRes = nodeMap[nodeName](this); - if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile) + if (mode == ZFileMode::Extract || mode == ZFileMode::ExternalFile || mode == ZFileMode::ExtractDirectory) nRes->ExtractFromXML(child, rawDataIndex); switch (nRes->GetResourceType()) @@ -813,7 +821,34 @@ void ZFile::GenerateSourceHeaderFiles() if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO) printf("Writing H file: %s\n", headerFilename.c_str()); - File::WriteAllText(headerFilename, formatter.GetOutput()); + if (Globals::Instance->fileMode != ZFileMode::ExtractDirectory) + File::WriteAllText(headerFilename, formatter.GetOutput()); + else if (Globals::Instance->sourceOutputPath != "") + { + std::string xmlPath = xmlFilePath.string(); + xmlPath = StringHelper::Replace(xmlPath, "\\", "/"); + auto pathList = StringHelper::Split(xmlPath, "/"); + std::string outPath = ""; + + for (int i = 0; i < 3; i++) + outPath += pathList[i] + "/"; + + for (int i = 5; i < pathList.size(); i++) + { + if (i == pathList.size() - 1) + { + outPath += Path::GetFileNameWithoutExtension(pathList[i]) + "/"; + outPath += outName.string() + ".h"; + } + else + outPath += pathList[i]; + + if (i < pathList.size() - 1) + outPath += "/"; + } + + File::WriteAllText(outPath, formatter.GetOutput()); + } } std::string ZFile::GetHeaderInclude() const @@ -999,6 +1034,10 @@ std::string ZFile::ProcessDeclarations() lastItem.second->size += curItem.second->size; lastItem.second->arrayItemCnt += curItem.second->arrayItemCnt; lastItem.second->text += "\n" + curItem.second->text; + + for (auto vtx : curItem.second->vertexHack) + lastItem.second->vertexHack.push_back(vtx); + declarations.erase(curItem.first); declarationKeys.erase(declarationKeys.begin() + i); delete curItem.second; @@ -1087,7 +1126,7 @@ void ZFile::ProcessDeclarationText(Declaration* decl) { std::string vtxName; Globals::Instance->GetSegmentedArrayIndexedName(decl->references[refIndex], 0x10, this, - "Vtx", vtxName); + "Vtx", vtxName, workerID); decl->text.replace(i, 2, vtxName); refIndex++; @@ -1190,6 +1229,9 @@ void ZFile::HandleUnaccountedData() uint32_t lastSize = 0; std::vector declsAddresses; + if (Globals::Instance->otrMode) + return; + for (const auto& item : declarations) { declsAddresses.push_back(item.first); diff --git a/ZAPDTR/ZAPD/ZFile.h b/ZAPDTR/ZAPD/ZFile.h index ac4062d5b..7860aa4d3 100644 --- a/ZAPDTR/ZAPD/ZFile.h +++ b/ZAPDTR/ZAPD/ZFile.h @@ -16,6 +16,7 @@ enum class ZFileMode BuildBackground, Extract, ExternalFile, + ExtractDirectory, Invalid, Custom = 1000, // Used for exporter file modes }; @@ -34,6 +35,8 @@ public: std::string defines; std::vector resources; + int workerID; + // Default to using virtual addresses uint32_t segment = 0x80; uint32_t baseAddress, rangeStart, rangeEnd; @@ -41,7 +44,7 @@ public: ZFile(const fs::path& nOutPath, const std::string& nName); ZFile(ZFileMode nMode, tinyxml2::XMLElement* reader, const fs::path& nBasePath, - const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath); + const fs::path& nOutPath, const std::string& filename, const fs::path& nXmlFilePath, int nWorkerID); ~ZFile(); std::string GetName() const; @@ -107,12 +110,12 @@ public: static void RegisterNode(std::string nodeName, ZResourceFactoryFunc* nodeFunc); protected: - std::vector rawData; std::string name; fs::path outName = ""; fs::path basePath; fs::path outputPath; fs::path xmlFilePath; + std::vector rawData; // Keep track of every texture of this ZFile. // The pointers declared here are "borrowed" (somebody else is the owner), diff --git a/ZAPDTR/ZAPD/ZLimb.cpp b/ZAPDTR/ZAPD/ZLimb.cpp index 330fbaf7c..9eb7eac8d 100644 --- a/ZAPDTR/ZAPD/ZLimb.cpp +++ b/ZAPDTR/ZAPD/ZLimb.cpp @@ -218,18 +218,25 @@ size_t ZLimb::GetRawDataSize() const std::string ZLimb::GetBodySourceCode() const { + if (Globals::Instance->otrMode) + return ""; + std::string dListStr; std::string dListStr2; - Globals::Instance->GetSegmentedArrayIndexedName(dListPtr, 8, parent, "Gfx", dListStr); - Globals::Instance->GetSegmentedArrayIndexedName(dList2Ptr, 8, parent, "Gfx", dListStr2); + Globals::Instance->GetSegmentedArrayIndexedName(dListPtr, 8, parent, "Gfx", dListStr, + parent->workerID); + Globals::Instance->GetSegmentedArrayIndexedName(dList2Ptr, 8, parent, "Gfx", dListStr2, + parent->workerID); std::string entryStr = "\n\t"; if (type == ZLimbType::Legacy) { std::string childName; std::string siblingName; - Globals::Instance->GetSegmentedPtrName(childPtr, parent, "LegacyLimb", childName); - Globals::Instance->GetSegmentedPtrName(siblingPtr, parent, "LegacyLimb", siblingName); + Globals::Instance->GetSegmentedPtrName(childPtr, parent, "LegacyLimb", childName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(siblingPtr, parent, "LegacyLimb", siblingName, + parent->workerID); entryStr += StringHelper::Sprintf("%s,\n", dListStr.c_str()); entryStr += @@ -261,7 +268,8 @@ std::string ZLimb::GetBodySourceCode() const case ZLimbType::Skin: { std::string skinSegmentStr; - Globals::Instance->GetSegmentedPtrName(skinSegment, parent, "", skinSegmentStr); + Globals::Instance->GetSegmentedPtrName(skinSegment, parent, "", skinSegmentStr, + parent->workerID); entryStr += StringHelper::Sprintf("\t0x%02X, %s\n", skinSegmentType, skinSegmentStr.c_str()); } @@ -367,7 +375,7 @@ void ZLimb::DeclareDList(segptr_t dListSegmentedPtr, const std::string& prefix, std::string dlistName; bool declFound = Globals::Instance->GetSegmentedArrayIndexedName(dListSegmentedPtr, 8, parent, - "Gfx", dlistName); + "Gfx", dlistName, parent->workerID); if (declFound) return; diff --git a/ZAPDTR/ZAPD/ZPath.cpp b/ZAPDTR/ZAPD/ZPath.cpp index e19513db3..660821ce8 100644 --- a/ZAPDTR/ZAPD/ZPath.cpp +++ b/ZAPDTR/ZAPD/ZPath.cpp @@ -142,8 +142,8 @@ void PathwayEntry::DeclareReferences(const std::string& prefix) return; std::string pointsName; - bool addressFound = - Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", pointsName); + bool addressFound = Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", + pointsName, parent->workerID); if (addressFound) return; @@ -177,7 +177,8 @@ std::string PathwayEntry::GetBodySourceCode() const { std::string declaration; std::string listName; - Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", listName); + Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", listName, + parent->workerID); if (Globals::Instance->game == ZGame::MM_RETAIL) declaration += diff --git a/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp b/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp index a96604fda..ab633c129 100644 --- a/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp +++ b/ZAPDTR/ZAPD/ZPlayerAnimationData.cpp @@ -3,6 +3,7 @@ #include "Utils/BitConverter.h" #include "Utils/StringHelper.h" #include "ZFile.h" +#include REGISTER_ZFILENODE(PlayerAnimationData, ZPlayerAnimationData); @@ -54,6 +55,9 @@ std::string ZPlayerAnimationData::GetBodySourceCode() const { std::string declaration = ""; + if (Globals::Instance->otrMode) + return ""; + size_t index = 0; for (const auto& entry : limbRotData) { diff --git a/ZAPDTR/ZAPD/ZResource.cpp b/ZAPDTR/ZAPD/ZResource.cpp index a5ad4cf21..c6efef073 100644 --- a/ZAPDTR/ZAPD/ZResource.cpp +++ b/ZAPDTR/ZAPD/ZResource.cpp @@ -8,6 +8,7 @@ #include "ZFile.h" #include #include +#include ZResource::ZResource(ZFile* nParent) { @@ -18,6 +19,7 @@ ZResource::ZResource(ZFile* nParent) sourceOutput = ""; rawDataIndex = 0; outputDeclaration = true; + hash = 0; RegisterRequiredAttribute("Name"); RegisterOptionalAttribute("OutName"); @@ -119,14 +121,21 @@ void ZResource::ParseXML(tinyxml2::XMLElement* reader) name = registeredAttributes.at("Name").value; - static std::regex r("[a-zA-Z_]+[a-zA-Z0-9_]*", std::regex::icase | std::regex::optimize); - if (!isInner || (isInner && name != "")) + // Disable this check for OTR file generation for now since it takes up a considerable amount of CPU time + if (!Globals::Instance->otrMode) { - if (!std::regex_match(name, r)) + static std::regex r("[a-zA-Z_]+[a-zA-Z0-9_]*", + std::regex::icase | std::regex::optimize); + + if (!isInner || (isInner && name != "")) { - HANDLE_ERROR_RESOURCE(WarningType::InvalidAttributeValue, parent, this, - rawDataIndex, "invalid value found for 'Name' attribute", ""); + if (!std::regex_match(name, r)) + { + HANDLE_ERROR_RESOURCE(WarningType::InvalidAttributeValue, parent, this, + rawDataIndex, "invalid value found for 'Name' attribute", + ""); + } } } @@ -273,6 +282,21 @@ void ZResource::GetSourceOutputCode([[maybe_unused]] const std::string& prefix) else decl->text = bodyStr; + // OTRTODO: This is a hack and we need something more elegant in the future... + if (GetResourceType() == ZResourceType::Array) + { + ZArray* arr = (ZArray*)this; + if (arr->resList[0]->GetResourceType() == ZResourceType::Vertex) + { + for (int i = 0; i < arr->resList.size(); i++) + { + ZVtx* vtx = (ZVtx*)arr->resList[i]; + decl->vertexHack.push_back(vtx); + + } + } + } + if (decl != nullptr) decl->staticConf = staticConf; } diff --git a/ZAPDTR/ZAPD/ZRom.cpp b/ZAPDTR/ZAPD/ZRom.cpp new file mode 100644 index 000000000..2a1d3c8a1 --- /dev/null +++ b/ZAPDTR/ZAPD/ZRom.cpp @@ -0,0 +1,202 @@ +#include "ZRom.h" +#include "Utils/BitConverter.h" +#include "Utils/File.h" +#include "Utils/Directory.h" +#include "yaz0/yaz0.h" + +#ifndef _MSC_VER +#include +#endif +#include + +namespace fs = std::filesystem; + +#define DMA_ENTRY_SIZE 16 + +#if defined(_MSC_VER) +#define __bswap_32 _byteswap_ulong +#define bswap_32 _byteswap_ulong +#endif + +// ROM DMA Table Start +#define OOT_OFF_NTSC_10_RC 0x7430 +#define OOT_OFF_NTSC_10 0x7430 +#define OOT_OFF_NTSC_11 0x7430 +#define OOT_OFF_PAL_10 0x7950 +#define OOT_OFF_NTSC_12 0x7960 +#define OOT_OFF_PAL_11 0x7950 +#define OOT_OFF_JP_GC 0x7170 +#define OOT_OFF_JP_MQ 0x7170 +#define OOT_OFF_US_GC 0x7170 +#define OOT_OFF_US_MQ 0x7170 +#define OOT_OFF_PAL_GC_DBG1 0x12F70 +#define OOT_OFF_PAL_MQ_DBG 0x12F70 +#define OOT_OFF_PAL_GC_DBG2 0x12F70 +#define OOT_OFF_PAL_GC 0x7170 +#define OOT_OFF_PAL_MQ 0x7170 +#define OOT_OFF_JP_GC_CE 007170 +#define OOT_OFF_CN_IQUE 0xB7A0 +#define OOT_OFF_TW_IQUE 0xB240 + +#define MM_OFF_US_10 0x1A500 +#define MM_OFF_JP_10 0x1C110 +#define MM_OFF_JP_11 0x1C050 +#define MM_OFF_DBG 0x24F60 + +#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 +#define OOT_UNKNOWN 0xFFFFFFFF + +ZRom::ZRom(std::string romPath) +{ + RomVersion version; + romData = File::ReadAllBytes(romPath); + + version.crc = BitConverter::ToInt32BE(romData, 0x10); + + switch (version.crc) + { + case OOT_NTSC_10: + version.version = "N64 NTSC 1.0"; + version.listPath = "ntsc_oot.txt"; + version.offset = OOT_OFF_NTSC_10; + break; + case OOT_NTSC_11: + version.version = "N64 NTSC 1.1"; + version.listPath = "ntsc_oot.txt"; + version.offset = OOT_OFF_NTSC_11; + break; + case OOT_NTSC_12: + version.version = "N64 NTSC 1.2"; + version.listPath = "ntsc_oot.txt"; + version.offset = OOT_OFF_NTSC_12; + break; + case OOT_PAL_10: + version.version = "N64 PAL 1.0"; + version.listPath = "pal_oot.txt"; + version.offset = OOT_OFF_PAL_10; + break; + case OOT_PAL_11: + version.version = "N64 PAL 1.1"; + version.listPath = "pal_oot.txt"; + version.offset = OOT_OFF_PAL_11; + break; + case OOT_NTSC_JP_GC: + version.version = "JP GameCube (MQ Disk)"; + 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.txt"; + version.offset = OOT_OFF_JP_GC_CE; + break; + case OOT_NTSC_JP_MQ: + version.version = "JP Master Quest"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_JP_MQ; + break; + case OOT_NTSC_US_MQ: + version.version = "NTSC Master Quest"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_JP_MQ; + break; + case OOT_NTSC_US_GC: + version.version = "NTSC GameCube"; + version.listPath = "gamecube.txt"; + version.offset = OOT_OFF_US_MQ; + break; + case OOT_PAL_GC: + version.version = "PAL GameCube"; + version.listPath = "gamecube_pal.txt"; + version.offset = OOT_OFF_PAL_GC; + break; + case OOT_PAL_MQ: + version.version = "PAL Master Quest"; + version.listPath = "gamecube_pal.txt"; + version.offset = OOT_OFF_PAL_MQ; + break; + case OOT_PAL_GC_DBG1: + version.version = "GameCube Debug 1.0"; + version.listPath = "dbg.txt"; + version.offset = OOT_OFF_PAL_GC_DBG1; + break; + case OOT_PAL_GC_DBG2: + version.version = "GameCube Debug 2.0"; + version.listPath = "dbg.txt"; + version.offset = OOT_OFF_PAL_GC_DBG2; + break; + case OOT_PAL_GC_MQ_DBG: + version.version = "GameCube MQ-Debug"; + version.listPath = "dbg.txt"; + version.offset = OOT_OFF_PAL_MQ_DBG; + break; + case OOT_IQUE_CN: + version.version = "OoT IQue"; + version.listPath = "ique.txt"; + version.offset = OOT_OFF_CN_IQUE; + break; + case OOT_IQUE_TW: + version.version = "TW IQue"; + version.listPath = "ique.txt"; + version.offset = OOT_OFF_TW_IQUE; + break; + } + + auto path = StringHelper::Sprintf("%s/%s", Globals::Instance->fileListPath.string().c_str(), version.listPath.c_str()); + auto txt = File::ReadAllText(path); + std::vector lines = StringHelper::Split(txt, "\n"); + + std::vector decompressedData(1); + + for (int i = 0; i < lines.size(); i++) + { + lines[i] = StringHelper::Strip(lines[i], "\r"); + const int romOffset = version.offset + (DMA_ENTRY_SIZE * i); + + const int virtStart = BitConverter::ToInt32BE(romData, romOffset + 0); + const int virtEnd = BitConverter::ToInt32BE(romData, romOffset + 4); + const int physStart = BitConverter::ToInt32BE(romData, romOffset + 8); + const int physEnd = BitConverter::ToInt32BE(romData, romOffset + 12); + + const bool compressed = physEnd != 0; + int size = compressed ? physEnd - physStart : virtEnd - virtStart; + + auto outData = std::vector(); + outData.resize(size); + memcpy(outData.data(), romData.data() + physStart, size); + + if (compressed) + { + int decSize = virtEnd - virtStart; + decompressedData = std::vector(); + decompressedData.resize(decSize); + yaz0_decode(outData.data(), decompressedData.data(), decSize); + files[lines[i]] = decompressedData; + } + else + files[lines[i]] = outData; + } + + int bp = 0; +} + +std::vector ZRom::GetFile(std::string fileName) +{ + return files[fileName]; +} diff --git a/ZAPDTR/ZAPD/ZRom.h b/ZAPDTR/ZAPD/ZRom.h new file mode 100644 index 000000000..ae3cac156 --- /dev/null +++ b/ZAPDTR/ZAPD/ZRom.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include +#include + +class ZRom +{ +public: + ZRom(std::string romPath); + + std::vector GetFile(std::string fileName); + +protected: + std::vector romData; + std::map> files; +}; + +struct RomVersion +{ + std::string version = "None"; + std::string error = "None"; + std::string listPath = "None"; + int offset; + uint32_t crc; +}; \ No newline at end of file diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp index 60391a9d1..4c9e8fb5f 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorCutsceneList.cpp @@ -54,7 +54,8 @@ void SetActorCutsceneList::DeclareReferences(const std::string& prefix) std::string SetActorCutsceneList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorCutscene", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorCutscene", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ACTOR_CUTSCENE_LIST(%i, %s)", cutscenes.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp index 919d86f57..1cda3c2c6 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetActorList.cpp @@ -81,7 +81,8 @@ void SetActorList::DeclareReferencesLate(const std::string& prefix) std::string SetActorList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName, + parent->workerID); if (numActors != actors.size()) { printf("%s: numActors(%i) ~ actors(%li)\n", parent->GetName().c_str(), numActors, diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp index 629d4a0b0..a89c2b74d 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetAlternateHeaders.cpp @@ -48,7 +48,8 @@ void SetAlternateHeaders::DeclareReferencesLate(const std::string& prefix) for (size_t i = 0; i < headers.size(); i++) { std::string altHeaderName; - Globals::Instance->GetSegmentedPtrName(headers.at(i), parent, "", altHeaderName); + Globals::Instance->GetSegmentedPtrName(headers.at(i), parent, "", altHeaderName, + parent->workerID); declaration += StringHelper::Sprintf("\t%s,", altHeaderName.c_str()); @@ -66,7 +67,8 @@ void SetAlternateHeaders::DeclareReferencesLate(const std::string& prefix) std::string SetAlternateHeaders::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "SceneCmd*", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "SceneCmd*", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ALTERNATE_HEADER_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp index 0b9a67e0e..73f72136c 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetAnimatedMaterialList.cpp @@ -33,7 +33,8 @@ void SetAnimatedMaterialList::DeclareReferences(const std::string& prefix) std::string SetAnimatedMaterialList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "AnimatedMaterial", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "AnimatedMaterial", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ANIMATED_MATERIAL_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp index 03aaa4bbb..4aafb7c70 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetCollisionHeader.cpp @@ -29,7 +29,8 @@ void SetCollisionHeader::DeclareReferences(const std::string& prefix) std::string SetCollisionHeader::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CollisionHeader", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CollisionHeader", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_COL_HEADER(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp index 5cf0a3d03..577a89cd1 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetCsCamera.cpp @@ -71,7 +71,7 @@ void SetCsCamera::DeclareReferences(const std::string& prefix) { std::string camPointsName; Globals::Instance->GetSegmentedPtrName(cameras.at(0).GetCamAddress(), parent, "Vec3s", - camPointsName); + camPointsName, parent->workerID); std::string declaration; size_t index = 0; @@ -103,7 +103,8 @@ void SetCsCamera::DeclareReferences(const std::string& prefix) std::string SetCsCamera::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CsCameraEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CsCameraEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ACTOR_CUTSCENE_CAM_LIST(%i, %s)", cameras.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp index e51e550b0..106f6f680 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetCutscenes.cpp @@ -86,7 +86,8 @@ void SetCutscenes::ParseRawData() std::string SetCutscenes::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneData", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "CutsceneData", listName, + parent->workerID); if (Globals::Instance->game == ZGame::MM_RETAIL) return StringHelper::Sprintf("SCENE_CMD_CUTSCENE_LIST(%i, %s)", numCutscenes, diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp index 8099bacf1..aa20102ff 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetEntranceList.cpp @@ -63,7 +63,8 @@ void SetEntranceList::DeclareReferencesLate([[maybe_unused]] const std::string& std::string SetEntranceList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "EntranceEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "EntranceEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ENTRANCE_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp index ddc4c5d43..34d2a6e56 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetExitList.cpp @@ -58,7 +58,7 @@ void SetExitList::DeclareReferencesLate([[maybe_unused]] const std::string& pref std::string SetExitList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "u16", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "u16", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_EXIT_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp index 2e023ff20..060fce0a2 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightList.cpp @@ -52,7 +52,8 @@ void SetLightList::DeclareReferences(const std::string& prefix) std::string SetLightList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightInfo", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightInfo", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_LIGHT_LIST(%i, %s)", numLights, listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp index 08cd83d14..4824f3f61 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetLightingSettings.cpp @@ -44,7 +44,8 @@ void SetLightingSettings::DeclareReferences(const std::string& prefix) std::string SetLightingSettings::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightSettings", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "LightSettings", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ENV_LIGHT_SETTINGS(%i, %s)", settings.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp index ba0bbe2c2..0723fcf14 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetMesh.cpp @@ -78,7 +78,7 @@ std::string SetMesh::GenDListExterns(ZDisplayList* dList) std::string SetMesh::GetBodySourceCode() const { std::string list; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "", list); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "", list, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_MESH(%s)", list.c_str()); } @@ -129,8 +129,8 @@ std::string PolygonDlist::GetBodySourceCode() const std::string bodyStr; std::string opaStr; std::string xluStr; - Globals::Instance->GetSegmentedPtrName(opa, parent, "Gfx", opaStr); - Globals::Instance->GetSegmentedPtrName(xlu, parent, "Gfx", xluStr); + Globals::Instance->GetSegmentedPtrName(opa, parent, "Gfx", opaStr, parent->workerID); + Globals::Instance->GetSegmentedPtrName(xlu, parent, "Gfx", xluStr, parent->workerID); if (polyType == 2) { @@ -294,7 +294,7 @@ std::string BgImage::GetBodySourceCode() const } std::string backgroundName; - Globals::Instance->GetSegmentedPtrName(source, parent, "", backgroundName); + Globals::Instance->GetSegmentedPtrName(source, parent, "", backgroundName, parent->workerID); bodyStr += StringHelper::Sprintf("%s, ", backgroundName.c_str()); bodyStr += "\n "; if (!isSubStruct) @@ -493,7 +493,7 @@ std::string PolygonType1::GetBodySourceCode() const bodyStr += StringHelper::Sprintf("%i, %i, ", type, format); std::string dlistStr; - Globals::Instance->GetSegmentedPtrName(dlist, parent, "", dlistStr); + Globals::Instance->GetSegmentedPtrName(dlist, parent, "", dlistStr, parent->workerID); bodyStr += StringHelper::Sprintf("%s, ", dlistStr.c_str()); bodyStr += "}, \n"; @@ -505,7 +505,7 @@ std::string PolygonType1::GetBodySourceCode() const bodyStr += single.GetBodySourceCode(); break; case 2: - Globals::Instance->GetSegmentedPtrName(list, parent, "BgImage", listStr); + Globals::Instance->GetSegmentedPtrName(list, parent, "BgImage", listStr, parent->workerID); bodyStr += StringHelper::Sprintf(" %i, %s, \n", count, listStr.c_str()); break; @@ -592,7 +592,7 @@ void PolygonType2::DeclareReferences(const std::string& prefix) std::string PolygonType2::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(start, parent, "", listName); + Globals::Instance->GetSegmentedPtrName(start, parent, "", listName, parent->workerID); std::string body = StringHelper::Sprintf("\n %i, %i,\n", type, polyDLists.size()); body += StringHelper::Sprintf(" %s,\n", listName.c_str()); diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp index ec432b7d9..3e6c72a11 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapChests.cpp @@ -50,7 +50,8 @@ void SetMinimapChests::DeclareReferences(const std::string& prefix) std::string SetMinimapChests::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapChest", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapChest", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_MINIMAP_COMPASS_ICON_INFO(0x%02X, %s)", chests.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp index be5d8f15d..255bd4e3a 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetMinimapList.cpp @@ -52,7 +52,8 @@ void SetMinimapList::DeclareReferences(const std::string& prefix) { std::string listName; - Globals::Instance->GetSegmentedPtrName(listSegmentAddr, parent, "MinimapEntry", listName); + Globals::Instance->GetSegmentedPtrName(listSegmentAddr, parent, "MinimapEntry", listName, + parent->workerID); std::string declaration = StringHelper::Sprintf("\n\t%s, 0x%08X\n", listName.c_str(), unk4); parent->AddDeclaration( @@ -65,7 +66,8 @@ void SetMinimapList::DeclareReferences(const std::string& prefix) std::string SetMinimapList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapList", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "MinimapList", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_MINIMAP_INFO(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp index fdd41e6cb..29519d3ce 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetObjectList.cpp @@ -51,7 +51,7 @@ void SetObjectList::DeclareReferences(const std::string& prefix) std::string SetObjectList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "s16", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "s16", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_OBJECT_LIST(%i, %s)", objects.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp index 468aad822..f3bdb0872 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetPathways.cpp @@ -50,7 +50,7 @@ void SetPathways::DeclareReferencesLate(const std::string& prefix) std::string SetPathways::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "Path", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "Path", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_PATH_LIST(%s)", listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp index 7027fa1f9..a63dd8772 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetRoomList.cpp @@ -34,7 +34,7 @@ void SetRoomList::DeclareReferences(const std::string& prefix) std::string SetRoomList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "RomFile", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "RomFile", listName, parent->workerID); return StringHelper::Sprintf("SCENE_CMD_ROOM_LIST(%i, %s)", romfile->rooms.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp index f75b5e0d5..32a2b7000 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetStartPositionList.cpp @@ -51,7 +51,8 @@ void SetStartPositionList::DeclareReferences(const std::string& prefix) std::string SetStartPositionList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "ActorEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_SPAWN_LIST(%i, %s)", actors.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp b/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp index a33d1c6e1..2414f0d2f 100644 --- a/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp +++ b/ZAPDTR/ZAPD/ZRoom/Commands/SetTransitionActorList.cpp @@ -52,7 +52,8 @@ void SetTransitionActorList::DeclareReferences(const std::string& prefix) std::string SetTransitionActorList::GetBodySourceCode() const { std::string listName; - Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "TransitionActorEntry", listName); + Globals::Instance->GetSegmentedPtrName(cmdArg2, parent, "TransitionActorEntry", listName, + parent->workerID); return StringHelper::Sprintf("SCENE_CMD_TRANSITION_ACTOR_LIST(%i, %s)", transitionActors.size(), listName.c_str()); } diff --git a/ZAPDTR/ZAPD/ZSkeleton.cpp b/ZAPDTR/ZAPD/ZSkeleton.cpp index bab1f9111..bff4b8263 100644 --- a/ZAPDTR/ZAPD/ZSkeleton.cpp +++ b/ZAPDTR/ZAPD/ZSkeleton.cpp @@ -89,7 +89,8 @@ void ZSkeleton::DeclareReferences(const std::string& prefix) std::string ZSkeleton::GetBodySourceCode() const { std::string limbArrayName; - Globals::Instance->GetSegmentedPtrName(limbsArrayAddress, parent, "", limbArrayName); + Globals::Instance->GetSegmentedPtrName(limbsArrayAddress, parent, "", limbArrayName, + parent->workerID); switch (type) { @@ -245,7 +246,8 @@ std::string ZLimbTable::GetBodySourceCode() const for (size_t i = 0; i < count; i++) { std::string limbName; - Globals::Instance->GetSegmentedPtrName(limbsAddresses[i], parent, "", limbName); + Globals::Instance->GetSegmentedPtrName(limbsAddresses[i], parent, "", limbName, + parent->workerID); body += StringHelper::Sprintf("\t%s,", limbName.c_str()); if (i + 1 < count) diff --git a/ZAPDTR/ZAPD/ZText.cpp b/ZAPDTR/ZAPD/ZText.cpp index 55cc371ea..58af61bc9 100644 --- a/ZAPDTR/ZAPD/ZText.cpp +++ b/ZAPDTR/ZAPD/ZText.cpp @@ -21,11 +21,12 @@ void ZText::ParseRawData() const auto& rawData = parent->GetRawData(); uint32_t currentPtr = StringHelper::StrToL(registeredAttributes.at("CodeOffset").value, 16); - std::vector codeData = File::ReadAllBytes((Globals::Instance->baseRomPath / "code").string()); + std::vector codeData; - // In some cases with the multi-process extractor it seems that it fails to read the code file if something else is reading from it at the same time. - while (codeData.size() == 0) - codeData = File::ReadAllBytes(Globals::Instance->baseRomPath.string() + "\\code"); + if (Globals::Instance->fileMode == ZFileMode::ExtractDirectory) + codeData = Globals::Instance->GetBaseromFile("code"); + else + codeData = Globals::Instance->GetBaseromFile(Globals::Instance->baseRomPath.string() + "code"); while (true) { diff --git a/ZAPDTR/ZAPD/ZTexture.cpp b/ZAPDTR/ZAPD/ZTexture.cpp index 46d7ce334..24f12702b 100644 --- a/ZAPDTR/ZAPD/ZTexture.cpp +++ b/ZAPDTR/ZAPD/ZTexture.cpp @@ -807,25 +807,30 @@ Declaration* ZTexture::DeclareVar(const std::string& prefix, std::string ZTexture::GetBodySourceCode() const { std::string sourceOutput; - size_t texSizeInc = (dWordAligned) ? 8 : 4; - for (size_t i = 0; i < textureDataRaw.size(); i += texSizeInc) - { - if (i % 32 == 0) - sourceOutput += " "; - if (dWordAligned) - sourceOutput += - StringHelper::Sprintf("0x%016llX, ", BitConverter::ToUInt64BE(textureDataRaw, i)); - else - sourceOutput += - StringHelper::Sprintf("0x%08llX, ", BitConverter::ToUInt32BE(textureDataRaw, i)); - if (i % 32 == 24) - sourceOutput += StringHelper::Sprintf(" // 0x%06X \n", rawDataIndex + ((i / 32) * 32)); - } - // Ensure there's always a trailing line feed to prevent dumb warnings. - // Please don't remove this line, unless you somehow made a way to prevent - // that warning when building the OoT repo. - sourceOutput += "\n"; + if (!Globals::Instance->otrMode) + { + size_t texSizeInc = (dWordAligned) ? 8 : 4; + for (size_t i = 0; i < textureDataRaw.size(); i += texSizeInc) + { + if (i % 32 == 0) + sourceOutput += " "; + if (dWordAligned) + sourceOutput += StringHelper::Sprintf("0x%016llX, ", + BitConverter::ToUInt64BE(textureDataRaw, i)); + else + sourceOutput += StringHelper::Sprintf("0x%08llX, ", + BitConverter::ToUInt32BE(textureDataRaw, i)); + if (i % 32 == 24) + sourceOutput += + StringHelper::Sprintf(" // 0x%06X \n", rawDataIndex + ((i / 32) * 32)); + } + + // Ensure there's always a trailing line feed to prevent dumb warnings. + // Please don't remove this line, unless you somehow made a way to prevent + // that warning when building the OoT repo. + sourceOutput += "\n"; + } return sourceOutput; } @@ -847,8 +852,11 @@ std::string ZTexture::GetSourceTypeName() const void ZTexture::CalcHash() { - auto parentRawData = parent->GetRawData(); - hash = CRC32B(parentRawData.data() + rawDataIndex, GetRawDataSize()); + //if (hash == 0) + { + const auto& parentRawData = parent->GetRawData(); + hash = CRC32B(parentRawData.data() + rawDataIndex, GetRawDataSize()); + } } std::string ZTexture::GetExternalExtension() const diff --git a/ZAPDTR/ZAPD/ZTextureAnimation.cpp b/ZAPDTR/ZAPD/ZTextureAnimation.cpp index 698054fa8..233a54dbb 100644 --- a/ZAPDTR/ZAPD/ZTextureAnimation.cpp +++ b/ZAPDTR/ZAPD/ZTextureAnimation.cpp @@ -349,9 +349,12 @@ std::string TextureColorChangingParams::GetBodySourceCode() const std::string envColorListName; std::string frameDataListName; - Globals::Instance->GetSegmentedPtrName(primColorListAddress, parent, "", primColorListName); - Globals::Instance->GetSegmentedPtrName(envColorListAddress, parent, "", envColorListName); - Globals::Instance->GetSegmentedPtrName(frameDataListAddress, parent, "", frameDataListName); + Globals::Instance->GetSegmentedPtrName(primColorListAddress, parent, "", primColorListName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(envColorListAddress, parent, "", envColorListName, + parent->workerID); + Globals::Instance->GetSegmentedPtrName(frameDataListAddress, parent, "", frameDataListName, + parent->workerID); std::string bodyStr = StringHelper::Sprintf( "\n %d, %d, %s, %s, %s,\n", animLength, colorListCount, primColorListName.c_str(), @@ -423,7 +426,8 @@ void TextureCyclingParams::DeclareReferences([[maybe_unused]] const std::string& for (const auto& tex : textureList) { - bool texFound = Globals::Instance->GetSegmentedPtrName(tex, parent, "", texName); + bool texFound = + Globals::Instance->GetSegmentedPtrName(tex, parent, "", texName, parent->workerID); // texName is a raw segmented pointer. This occurs if the texture is not declared // separately since we cannot read the format. In theory we could scan DLists for the @@ -477,9 +481,10 @@ std::string TextureCyclingParams::GetBodySourceCode() const std::string textureListName; std::string textureIndexListName; - Globals::Instance->GetSegmentedPtrName(textureListAddress, parent, "", textureListName); + Globals::Instance->GetSegmentedPtrName(textureListAddress, parent, "", textureListName, + parent->workerID); Globals::Instance->GetSegmentedPtrName(textureIndexListAddress, parent, "", - textureIndexListName); + textureIndexListName, parent->workerID); std::string bodyStr = StringHelper::Sprintf( "\n %d, %s, %s,\n", cycleLength, textureListName.c_str(), textureIndexListName.c_str()); @@ -652,7 +657,8 @@ std::string ZTextureAnimation::GetBodySourceCode() const for (const auto& entry : entries) { std::string paramName; - Globals::Instance->GetSegmentedPtrName(entry.paramsPtr, parent, "", paramName); + Globals::Instance->GetSegmentedPtrName(entry.paramsPtr, parent, "", paramName, + parent->workerID); bodyStr += StringHelper::Sprintf("\t{ %d, %d, %s },\n", entry.segment, entry.type, paramName.c_str()); diff --git a/ZAPDTR/ZAPD/ctpl_stl.h b/ZAPDTR/ZAPD/ctpl_stl.h new file mode 100644 index 000000000..8e2d9c908 --- /dev/null +++ b/ZAPDTR/ZAPD/ctpl_stl.h @@ -0,0 +1,251 @@ +/********************************************************* +* +* Copyright (C) 2014 by Vitaliy Vitsentiy +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* +*********************************************************/ + + +#ifndef __ctpl_stl_thread_pool_H__ +#define __ctpl_stl_thread_pool_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +// thread pool to run user's functors with signature +// ret func(int id, other_params) +// where id is the index of the thread that runs the functor +// ret is some return type + + +namespace ctpl { + + namespace detail { + template + class Queue { + public: + bool push(T const & value) { + std::unique_lock lock(this->mutex); + this->q.push(value); + return true; + } + // deletes the retrieved element, do not use for non integral types + bool pop(T & v) { + std::unique_lock lock(this->mutex); + if (this->q.empty()) + return false; + v = this->q.front(); + this->q.pop(); + return true; + } + bool empty() { + std::unique_lock lock(this->mutex); + return this->q.empty(); + } + private: + std::queue q; + std::mutex mutex; + }; + } + + class thread_pool { + + public: + + thread_pool() { this->init(); } + thread_pool(int nThreads) { this->init(); this->resize(nThreads); } + + // the destructor waits for all the functions in the queue to be finished + ~thread_pool() { + this->stop(true); + } + + // get the number of running threads in the pool + int size() { return static_cast(this->threads.size()); } + + // number of idle threads + int n_idle() { return this->nWaiting; } + std::thread & get_thread(int i) { return *this->threads[i]; } + + // change the number of threads in the pool + // should be called from one thread, otherwise be careful to not interleave, also with this->stop() + // nThreads must be >= 0 + void resize(int nThreads) { + if (!this->isStop && !this->isDone) { + int oldNThreads = static_cast(this->threads.size()); + if (oldNThreads <= nThreads) { // if the number of threads is increased + this->threads.resize(nThreads); + this->flags.resize(nThreads); + + for (int i = oldNThreads; i < nThreads; ++i) { + this->flags[i] = std::make_shared>(false); + this->set_thread(i); + } + } + else { // the number of threads is decreased + for (int i = oldNThreads - 1; i >= nThreads; --i) { + *this->flags[i] = true; // this thread will finish + this->threads[i]->detach(); + } + { + // stop the detached threads that were waiting + std::unique_lock lock(this->mutex); + this->cv.notify_all(); + } + this->threads.resize(nThreads); // safe to delete because the threads are detached + this->flags.resize(nThreads); // safe to delete because the threads have copies of shared_ptr of the flags, not originals + } + } + } + + // empty the queue + void clear_queue() { + std::function * _f; + while (this->q.pop(_f)) + delete _f; // empty the queue + } + + // pops a functional wrapper to the original function + std::function pop() { + std::function * _f = nullptr; + this->q.pop(_f); + std::unique_ptr> func(_f); // at return, delete the function even if an exception occurred + std::function f; + if (_f) + f = *_f; + return f; + } + + // wait for all computing threads to finish and stop all threads + // may be called asynchronously to not pause the calling thread while waiting + // if isWait == true, all the functions in the queue are run, otherwise the queue is cleared without running the functions + void stop(bool isWait = false) { + if (!isWait) { + if (this->isStop) + return; + this->isStop = true; + for (int i = 0, n = this->size(); i < n; ++i) { + *this->flags[i] = true; // command the threads to stop + } + this->clear_queue(); // empty the queue + } + else { + if (this->isDone || this->isStop) + return; + this->isDone = true; // give the waiting threads a command to finish + } + { + std::unique_lock lock(this->mutex); + this->cv.notify_all(); // stop all waiting threads + } + for (int i = 0; i < static_cast(this->threads.size()); ++i) { // wait for the computing threads to finish + if (this->threads[i]->joinable()) + this->threads[i]->join(); + } + // if there were no threads in the pool but some functors in the queue, the functors are not deleted by the threads + // therefore delete them here + this->clear_queue(); + this->threads.clear(); + this->flags.clear(); + } + + template + auto push(F && f, Rest&&... rest) ->std::future { + auto pck = std::make_shared>( + std::bind(std::forward(f), std::placeholders::_1, std::forward(rest)...) + ); + auto _f = new std::function([pck](int id) { + (*pck)(id); + }); + this->q.push(_f); + std::unique_lock lock(this->mutex); + this->cv.notify_one(); + return pck->get_future(); + } + + // run the user's function that excepts argument int - id of the running thread. returned value is templatized + // operator returns std::future, where the user can get the result and rethrow the catched exceptins + template + auto push(F && f) ->std::future { + auto pck = std::make_shared>(std::forward(f)); + auto _f = new std::function([pck](int id) { + (*pck)(id); + }); + this->q.push(_f); + std::unique_lock lock(this->mutex); + this->cv.notify_one(); + return pck->get_future(); + } + + + private: + + // deleted + thread_pool(const thread_pool &);// = delete; + thread_pool(thread_pool &&);// = delete; + thread_pool & operator=(const thread_pool &);// = delete; + thread_pool & operator=(thread_pool &&);// = delete; + + void set_thread(int i) { + std::shared_ptr> flag(this->flags[i]); // a copy of the shared ptr to the flag + auto f = [this, i, flag/* a copy of the shared ptr to the flag */]() { + std::atomic & _flag = *flag; + std::function * _f; + bool isPop = this->q.pop(_f); + while (true) { + while (isPop) { // if there is anything in the queue + std::unique_ptr> func(_f); // at return, delete the function even if an exception occurred + (*_f)(i); + if (_flag) + return; // the thread is wanted to stop, return even if the queue is not empty yet + else + isPop = this->q.pop(_f); + } + // the queue is empty here, wait for the next command + std::unique_lock lock(this->mutex); + ++this->nWaiting; + this->cv.wait(lock, [this, &_f, &isPop, &_flag](){ isPop = this->q.pop(_f); return isPop || this->isDone || _flag; }); + --this->nWaiting; + if (!isPop) + return; // if the queue is empty and this->isDone == true or *flag then return + } + }; + this->threads[i].reset(new std::thread(f)); // compiler may not support std::make_unique() + } + + void init() { this->nWaiting = 0; this->isStop = false; this->isDone = false; } + + std::vector> threads; + std::vector>> flags; + detail::Queue *> q; + std::atomic isDone; + std::atomic isStop; + std::atomic nWaiting; // how many threads are waiting + + std::mutex mutex; + std::condition_variable cv; + }; + +} + +#endif // __ctpl_stl_thread_pool_H__ \ No newline at end of file diff --git a/ZAPDTR/ZAPD/yaz0/readwrite.h b/ZAPDTR/ZAPD/yaz0/readwrite.h new file mode 100644 index 000000000..af3471590 --- /dev/null +++ b/ZAPDTR/ZAPD/yaz0/readwrite.h @@ -0,0 +1,29 @@ +#ifndef __READWRITE_H__ +#define __READWRITE_H__ + +#include + +/* variables */ +union { + uint32_t u; + float f; +} __u32_f32_union__; + +#define U32(x) \ + ((uint32_t)((((uint8_t*)(x))[0] << 24) | (((uint8_t*)(x))[1] << 16) | \ + (((uint8_t*)(x))[2] << 8) | ((uint8_t*)(x))[3])) +#define U16(x) ((uint16_t)(((*((uint8_t*)(x))) << 8) | ((uint8_t*)(x))[1])) +#define U8(x) ((uint8_t)((uint8_t*)(x))[0]) +#define S32(x) ((int32_t)(U32(x))) +#define S16(x) ((int16_t)(U16(x))) +#define F32(x) (((__u32_f32_union__.u = U32(x)) & 0) + __u32_f32_union__.f) + +#define W32(x, v) \ + { \ + *((uint8_t*)x + 3) = ((v)&0xFF); \ + *((uint8_t*)x + 2) = (((v) >> 8) & 0xFF); \ + *((uint8_t*)x + 1) = (((v) >> 16) & 0xFF); \ + *((uint8_t*)x + 0) = (((v) >> 24) & 0xFF); \ + } + +#endif \ No newline at end of file diff --git a/ZAPDTR/ZAPD/yaz0/yaz0.cpp b/ZAPDTR/ZAPD/yaz0/yaz0.cpp new file mode 100644 index 000000000..885f41d1d --- /dev/null +++ b/ZAPDTR/ZAPD/yaz0/yaz0.cpp @@ -0,0 +1,227 @@ +#include +#include +#include +#include +#include +#include "readwrite.h" + +#include "yaz0.h" + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; + +/* internal declarations */ +int yaz0_encode_internal(const u8* src, int srcSize, u8* Data); + +int yaz0_get_size(u8* src) { return U32(src + 0x4); } + +u32 toDWORD(u32 d) { + u8 w1 = d & 0xFF; + u8 w2 = (d >> 8) & 0xFF; + u8 w3 = (d >> 16) & 0xFF; + u8 w4 = d >> 24; + return (w1 << 24) | (w2 << 16) | (w3 << 8) | w4; +} + +// simple and straight encoding scheme for Yaz0 +u32 longest_match_brute(const u8* src, int size, int pos, u32* pMatchPos) { + int startPos = pos - 0x1000; + int max_match_size = size - pos; + u32 best_match_size = 0; + u32 best_match_pos = 0; + + if (max_match_size < 3) return 0; + + if (startPos < 0) startPos = 0; + + if (max_match_size > 0x111) max_match_size = 0x111; + + for (int i = startPos; i < pos; i++) { + int current_size; + for (current_size = 0; current_size < max_match_size; current_size++) { + if (src[i + current_size] != src[pos + current_size]) { + break; + } + } + if (current_size > best_match_size) { + best_match_size = current_size; + best_match_pos = i; + if (best_match_size == 0x111) break; + } + } + *pMatchPos = best_match_pos; + return best_match_size; +} + +u32 longest_match_rabinkarp(const u8* src, int size, int pos, u32* match_pos) { + int startPos = pos - 0x1000; + int max_match_size = size - pos; + u32 best_match_size = 0; + u32 best_match_pos = 0; + + if (max_match_size < 3) return 0; + + if (startPos < 0) startPos = 0; + + if (max_match_size > 0x111) max_match_size = 0x111; + + int find_hash = src[pos] << 16 | src[pos + 1] << 8 | src[pos + 2]; + int current_hash = src[startPos] << 16 | src[startPos + 1] << 8 | src[startPos + 2]; + + for (int i = startPos; i < pos; i++) { + if(current_hash == find_hash) { + int current_size; + for (current_size = 3; current_size < max_match_size; current_size++) { + if (src[i + current_size] != src[pos + current_size]) { + break; + } + } + if (current_size > best_match_size) { + best_match_size = current_size; + best_match_pos = i; + if (best_match_size == 0x111) break; + } + } + current_hash = (current_hash << 8 | src[i + 3]) & 0xFFFFFF; + } + *match_pos = best_match_pos; + + return best_match_size; +} + +int yaz0_encode_internal(const u8* src, int srcSize, u8* Data) { + int srcPos = 0; + + int bitmask = 0x80; + u8 currCodeByte = 0; + int currCodeBytePos = 0; + int pos = currCodeBytePos + 1; + + while (srcPos < srcSize) { + u32 numBytes; + u32 matchPos; + + numBytes = longest_match_rabinkarp(src, srcSize, srcPos, &matchPos); + //fprintf(stderr, "pos %x len %x pos %x\n", srcPos, (int)numBytes, (int)matchPos); + if (numBytes < 3) { + //fprintf(stderr, "single byte %02x\n", src[srcPos]); + Data[pos++] = src[srcPos++]; + currCodeByte |= bitmask; + } else { + // RLE part + u32 dist = srcPos - matchPos - 1; + + if (numBytes >= 0x12) // 3 byte encoding + { + Data[pos++] = dist >> 8; // 0R + Data[pos++] = dist & 0xFF; // FF + if (numBytes > 0xFF + 0x12) numBytes = 0xFF + 0x12; + Data[pos++] = numBytes - 0x12; + } else // 2 byte encoding + { + Data[pos++] = ((numBytes - 2) << 4) | (dist >> 8); + Data[pos++] = dist & 0xFF; + } + srcPos += numBytes; + } + bitmask >>= 1; + // write eight codes + if (!bitmask) { + Data[currCodeBytePos] = currCodeByte; + currCodeBytePos = pos++; + + currCodeByte = 0; + bitmask = 0x80; + } + } + if (bitmask) { + Data[currCodeBytePos] = currCodeByte; + } + + return pos; +} + +std::vector yaz0_encode_fast(const u8* src, int src_size) { + std::vector buffer; + std::vector> lut; + lut.resize(0x1000000); + + for (int i = 0; i < src_size - 3; ++i) { + lut[src[i + 0] << 16 | src[i + 1] << 8 | src[i + 2]].push_back(i); + } + + return buffer; +} + +std::vector yaz0_encode(const u8* src, int src_size) { + std::vector buffer(src_size * 10 / 8 + 16); + u8* dst = buffer.data(); + + // write 4 bytes yaz0 header + memcpy(dst, "Yaz0", 4); + + // write 4 bytes uncompressed size + W32(dst + 4, src_size); + + // encode + int dst_size = yaz0_encode_internal(src, src_size, dst + 16); + int aligned_size = (dst_size + 31) & -16; + buffer.resize(aligned_size); + +#if 0 + std::vector decompressed(src_size); + yaz0_decode(buffer.data(), decompressed.data(), src_size); + if(memcmp(src, decompressed.data(), src_size)) { + fprintf(stderr, "Decompressed buffer is different from original\n"); + } +#endif + + return buffer; +} + +void yaz0_decode(const uint8_t* source, uint8_t* decomp, int32_t decompSize) { + uint32_t srcPlace = 0, dstPlace = 0; + uint32_t i, dist, copyPlace, numBytes; + uint8_t codeByte, byte1, byte2; + uint8_t bitCount = 0; + + source += 0x10; + while (dstPlace < decompSize) { + /* If there are no more bits to test, get a new byte */ + if (!bitCount) { + codeByte = source[srcPlace++]; + bitCount = 8; + } + + /* If bit 7 is a 1, just copy 1 byte from source to destination */ + /* Else do some decoding */ + if (codeByte & 0x80) { + decomp[dstPlace++] = source[srcPlace++]; + } else { + /* Get 2 bytes from source */ + byte1 = source[srcPlace++]; + byte2 = source[srcPlace++]; + + /* Calculate distance to move in destination */ + /* And the number of bytes to copy */ + dist = ((byte1 & 0xF) << 8) | byte2; + copyPlace = dstPlace - (dist + 1); + numBytes = byte1 >> 4; + + /* Do more calculations on the number of bytes to copy */ + if (!numBytes) + numBytes = source[srcPlace++] + 0x12; + else + numBytes += 2; + + /* Copy data from a previous point in destination */ + /* to current point in destination */ + for (i = 0; i < numBytes; i++) decomp[dstPlace++] = decomp[copyPlace++]; + } + + /* Set up for the next read cycle */ + codeByte = codeByte << 1; + bitCount--; + } +} \ No newline at end of file diff --git a/ZAPDTR/ZAPD/yaz0/yaz0.h b/ZAPDTR/ZAPD/yaz0/yaz0.h new file mode 100644 index 000000000..0d5cc3cfd --- /dev/null +++ b/ZAPDTR/ZAPD/yaz0/yaz0.h @@ -0,0 +1,6 @@ +#pragma once + +#include + +void yaz0_decode(const uint8_t* src, uint8_t* dest, int32_t destsize); +std::vector yaz0_encode(const uint8_t* src, int src_size); \ No newline at end of file diff --git a/ZAPDTR/ZAPDUtils/Utils/BitConverter.h b/ZAPDTR/ZAPDUtils/Utils/BitConverter.h index e672b97c2..708d4b537 100644 --- a/ZAPDTR/ZAPDUtils/Utils/BitConverter.h +++ b/ZAPDTR/ZAPDUtils/Utils/BitConverter.h @@ -3,6 +3,7 @@ #include #include #include +#include class BitConverter { diff --git a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj index dd49779dc..b74fe75f9 100644 --- a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj +++ b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj @@ -72,15 +72,27 @@ true + MinimumRecommendedRules.ruleset + + false + MinimumRecommendedRules.ruleset + + true + MinimumRecommendedRules.ruleset + + false + MinimumRecommendedRules.ruleset + + @@ -174,6 +186,12 @@ + + + {02d10590-9542-3f55-aaf8-6055677e2a2a} + false + + diff --git a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters index 218084e6d..3c46d19fe 100644 --- a/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters +++ b/ZAPDTR/ZAPDUtils/ZAPDUtils.vcxproj.filters @@ -12,14 +12,14 @@ {d8c2c1e7-b065-4b0f-86a2-46ab46eedc0b} - + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - + {e047919d-7186-49ca-b115-e48fbb5c8743} - + {3de9dd46-0dfd-4d48-9f20-9f24e5b80fe0} @@ -69,19 +69,19 @@ - Header Files\Source Files\Utils + Source Files\Utils - Header Files\Source Files\Utils + Source Files\Utils - Header Files\Source Files\Utils + Source Files\Utils - Header Files\Source Files\Libraries + Source Files\Libraries - Header Files\Source Files\Utils + Source Files\Utils \ No newline at end of file diff --git a/ZAPDTR/lib/libgfxd/priv.h b/ZAPDTR/lib/libgfxd/priv.h index 37cb66b68..34d96f675 100644 --- a/ZAPDTR/lib/libgfxd/priv.h +++ b/ZAPDTR/lib/libgfxd/priv.h @@ -2,6 +2,8 @@ #define GFXD_PRIV_H #include "gfxd.h" +#define CONFIG_MT + #ifdef CONFIG_MT # ifdef _MSC_VER # define TLOCAL __declspec(thread) @@ -9,7 +11,7 @@ # define TLOCAL _Thread_local # endif #else -# define TLOCAL +#define TLOCAL #endif #define UCFUNC static inline diff --git a/libultraship/libultraship/ConfigFile.cpp b/libultraship/libultraship/ConfigFile.cpp index 1b4952139..2e9a8cc94 100644 --- a/libultraship/libultraship/ConfigFile.cpp +++ b/libultraship/libultraship/ConfigFile.cpp @@ -2,6 +2,7 @@ #include "spdlog/spdlog.h" #include "GlobalCtx2.h" #include "Window.h" +#include "GameSettings.h" namespace Ship { ConfigFile::ConfigFile(std::shared_ptr Context, const std::string& Path) : Context(Context), Path(Path), File(Path.c_str()) { @@ -149,6 +150,8 @@ namespace Ship { (*this)["KEYBOARD CONTROLLER BINDING 4"][STR(BTN_STICKDOWN)] = std::to_string(0x01F); (*this)["KEYBOARD CONTROLLER BINDING 4"][STR(BTN_STICKUP)] = std::to_string(0x011); + (*this)["ENHANCEMENT SETTINGS"]["TEXT_SPEED"] = "1"; + (*this)["SDL CONTROLLER 1"]["GUID"] = ""; (*this)["SDL CONTROLLER 2"]["GUID"] = ""; (*this)["SDL CONTROLLER 3"]["GUID"] = ""; diff --git a/libultraship/libultraship/Controller.h b/libultraship/libultraship/Controller.h index c78142af4..256b31fee 100644 --- a/libultraship/libultraship/Controller.h +++ b/libultraship/libultraship/Controller.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "stdint.h" #include "UltraController.h" #include "ControllerAttachment.h" @@ -19,12 +20,17 @@ namespace Ship { void Read(OSContPad* pad); virtual void ReadFromSource() = 0; virtual void WriteToSource(ControllerCallback* controller) = 0; + virtual bool Connected() const = 0; + virtual bool CanRumble() const = 0; bool isRumbling; void SetButtonMapping(const std::string& szButtonName, int32_t dwScancode); std::shared_ptr GetAttachment() { return Attachment; } int32_t GetControllerNumber() { return dwControllerNumber; } + virtual bool HasPadConf() const = 0; + virtual std::optional GetPadConfSection() = 0; + protected: int32_t dwPressedButtons; std::map ButtonMapping; diff --git a/libultraship/libultraship/Cvar.cpp b/libultraship/libultraship/Cvar.cpp index a8a1647f0..b895ac747 100644 --- a/libultraship/libultraship/Cvar.cpp +++ b/libultraship/libultraship/Cvar.cpp @@ -5,16 +5,16 @@ std::map cvars; -CVar* CVar_GetVar(char* name) { +CVar* CVar_GetVar(const char* name) { std::string key(name); return cvars.contains(key) ? cvars[key] : nullptr; } -extern "C" CVar* CVar_Get(char* name) { +extern "C" CVar* CVar_Get(const char* name) { return CVar_GetVar(name); } -extern "C" s32 CVar_GetS32(char* name, s32 defaultValue) { +extern "C" s32 CVar_GetS32(const char* name, s32 defaultValue) { CVar* cvar = CVar_Get(name); if (cvar != nullptr) { @@ -25,7 +25,7 @@ extern "C" s32 CVar_GetS32(char* name, s32 defaultValue) { return defaultValue; } -extern "C" float CVar_GetFloat(char* name, float defaultValue) { +extern "C" float CVar_GetFloat(const char* name, float defaultValue) { CVar* cvar = CVar_Get(name); if (cvar != nullptr) { @@ -36,7 +36,7 @@ extern "C" float CVar_GetFloat(char* name, float defaultValue) { return defaultValue; } -extern "C" char* CVar_GetString(char* name, char* defaultValue) { +extern "C" char* CVar_GetString(const char* name, char* defaultValue) { CVar* cvar = CVar_Get(name); if (cvar != nullptr) { @@ -47,7 +47,7 @@ extern "C" char* CVar_GetString(char* name, char* defaultValue) { return defaultValue; } -extern "C" void CVar_SetS32(char* name, s32 value) { +extern "C" void CVar_SetS32(const char* name, s32 value) { CVar* cvar = CVar_Get(name); if (!cvar) { cvar = new CVar; @@ -57,7 +57,7 @@ extern "C" void CVar_SetS32(char* name, s32 value) { cvar->value.valueS32 = value; } -void CVar_SetFloat(char* name, float value) { +void CVar_SetFloat(const char* name, float value) { CVar* cvar = CVar_Get(name); if (!cvar) { cvar = new CVar; @@ -67,7 +67,7 @@ void CVar_SetFloat(char* name, float value) { cvar->value.valueFloat = value; } -void CVar_SetString(char* name, char* value) { +void CVar_SetString(const char* name, char* value) { CVar* cvar = CVar_Get(name); if (!cvar) { cvar = new CVar; @@ -78,23 +78,23 @@ void CVar_SetString(char* name, char* value) { } -extern "C" void CVar_RegisterS32(char* name, s32 defaultValue) { +extern "C" void CVar_RegisterS32(const char* name, s32 defaultValue) { CVar* cvar = CVar_Get(name); if (cvar == nullptr) CVar_SetS32(name, defaultValue); } -extern "C" void CVar_RegisterFloat(char* name, float defaultValue) { +extern "C" void CVar_RegisterFloat(const char* name, float defaultValue) { CVar* cvar = CVar_Get(name); if (cvar == nullptr) CVar_SetFloat(name, defaultValue); } -extern "C" void CVar_RegisterString(char* name, char* defaultValue) { +extern "C" void CVar_RegisterString(const char* name, char* defaultValue) { CVar* cvar = CVar_Get(name); if (cvar == nullptr) CVar_SetString(name, defaultValue); -} \ No newline at end of file +} diff --git a/libultraship/libultraship/Cvar.h b/libultraship/libultraship/Cvar.h index 7bac8f20b..a85bb8fd3 100644 --- a/libultraship/libultraship/Cvar.h +++ b/libultraship/libultraship/Cvar.h @@ -23,15 +23,15 @@ extern "C" //#include -CVar* CVar_Get(char* name); -s32 CVar_GetS32(char* name, s32 defaultValue); -float CVar_GetFloat(char* name, float defaultValue); -char* CVar_GetString(char* name, char* defaultValue); -void CVar_SetS32(char* name, s32 value); +CVar* CVar_Get(const char* name); +s32 CVar_GetS32(const char* name, s32 defaultValue); +float CVar_GetFloat(const char* name, float defaultValue); +char* CVar_GetString(const char* name, char* defaultValue); +void CVar_SetS32(const char* name, s32 value); -void CVar_RegisterS32(char* name, s32 defaultValue); -void CVar_RegisterFloat(char* name, float defaultValue); -void CVar_RegisterString(char* name, char* defaultValue); +void CVar_RegisterS32(const char* name, s32 defaultValue); +void CVar_RegisterFloat(const char* name, float defaultValue); +void CVar_RegisterString(const char* name, char* defaultValue); #ifdef __cplusplus }; @@ -42,8 +42,8 @@ void CVar_RegisterString(char* name, char* defaultValue); #include extern std::map cvars; -CVar* CVar_GetVar(char* name); -void CVar_SetFloat(char* name, float value); -void CVar_SetString(char* name, char* value); +CVar* CVar_GetVar(const char* name); +void CVar_SetFloat(const char* name, float value); +void CVar_SetString(const char* name, char* value); +#endif #endif -#endif \ No newline at end of file diff --git a/libultraship/libultraship/GameSettings.cpp b/libultraship/libultraship/GameSettings.cpp index 85ad13afd..b22277302 100644 --- a/libultraship/libultraship/GameSettings.cpp +++ b/libultraship/libultraship/GameSettings.cpp @@ -16,6 +16,8 @@ #include #include "SohHooks.h" +#include "Window.h" + #define ABS(var) var < 0 ? -(var) : var using namespace Ship; @@ -28,6 +30,9 @@ namespace Game { const std::string AudioSection = AUDIO_SECTION; const std::string ControllerSection = CONTROLLER_SECTION; const std::string EnhancementSection = ENHANCEMENTS_SECTION; + const std::string CosmeticsSection = COSMETICS_SECTION; + const std::string CheatSection = CHEATS_SECTION; + void UpdateAudio() { Audio_SetGameVolume(SEQ_BGM_MAIN, Settings.audio.music_main); @@ -49,48 +54,212 @@ namespace Game { Settings.debug.n64mode = stob(Conf[ConfSection]["n64_mode"]); // Enhancements - Settings.enhancements.fast_text = stob(Conf[EnhancementSection]["fast_text"]); - CVar_SetS32(const_cast("gFastText"), Settings.enhancements.fast_text); + Settings.enhancements.skip_text = stob(Conf[EnhancementSection]["skip_text"]); + CVar_SetS32("gSkipText", Settings.enhancements.skip_text); + + Settings.enhancements.text_speed = Ship::stoi(Conf[EnhancementSection]["text_speed"]); + CVar_SetS32("gTextSpeed", Settings.enhancements.text_speed); Settings.enhancements.disable_lod = stob(Conf[EnhancementSection]["disable_lod"]); - CVar_SetS32(const_cast("gDisableLOD"), Settings.enhancements.disable_lod); + CVar_SetS32("gDisableLOD", Settings.enhancements.disable_lod); Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]); - CVar_SetS32(const_cast("gPauseLiveLink"), Settings.enhancements.animated_pause_menu); + CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu); - Settings.enhancements.debug_mode = stob(Conf[EnhancementSection]["debug_mode"]); - CVar_SetS32(const_cast("gDebugEnabled"), Settings.enhancements.debug_mode); + Settings.enhancements.dynamic_wallet_icon = stob(Conf[EnhancementSection]["dynamic_wallet_icon"]); + CVar_SetS32("gDynamicWalletIcon", Settings.enhancements.dynamic_wallet_icon); + Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]); + CVar_SetS32("gMinimalUI", Settings.enhancements.minimal_ui); + + Settings.enhancements.visualagony = stob(Conf[EnhancementSection]["visualagony"]); + CVar_SetS32("gVisualAgony", Settings.enhancements.visualagony); + + Settings.enhancements.mm_bunny_hood = stob(Conf[EnhancementSection]["mm_bunny_hood"]); + CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood); + + Settings.enhancements.uniform_lr = stob(Conf[EnhancementSection]["uniform_lr"]); + //CVar_SetS32("gUniformLR", Settings.enhancements.uniform_lr); + CVar_SetS32("gUniformLR", 1); + + Settings.enhancements.newdrops = stob(Conf[EnhancementSection]["newdrops"]); + CVar_SetS32("gNewDrops", Settings.enhancements.newdrops); + + // Audio Settings.audio.master = Ship::stof(Conf[AudioSection]["master"]); - CVar_SetFloat(const_cast("gGameMasterVolume"), Settings.audio.master); + CVar_SetFloat("gGameMasterVolume", Settings.audio.master); Settings.audio.music_main = Ship::stof(Conf[AudioSection]["music_main"]); - CVar_SetFloat(const_cast("gMainMusicVolume"), Settings.audio.music_main); + CVar_SetFloat("gMainMusicVolume", Settings.audio.music_main); Settings.audio.music_sub = Ship::stof(Conf[AudioSection]["music_sub"]); - CVar_SetFloat(const_cast("gSubMusicVolume"), Settings.audio.music_sub); + CVar_SetFloat("gSubMusicVolume", Settings.audio.music_sub); Settings.audio.sfx = Ship::stof(Conf[AudioSection]["sfx"]); - CVar_SetFloat(const_cast("gSFXMusicVolume"), Settings.audio.sfx); + CVar_SetFloat("gSFXMusicVolume", Settings.audio.sfx); Settings.audio.fanfare = Ship::stof(Conf[AudioSection]["fanfare"]); - CVar_SetFloat(const_cast("gFanfareVolume"), Settings.audio.fanfare); + CVar_SetFloat("gFanfareVolume", Settings.audio.fanfare); - Settings.controller.gyro_sensitivity = Ship::stof(Conf[ControllerSection]["gyro_sensitivity"]); - CVar_SetFloat(const_cast("gGyroSensitivity"), Settings.controller.gyro_sensitivity); - - Settings.controller.rumble_strength = Ship::stof(Conf[ControllerSection]["rumble_strength"]); - CVar_SetFloat(const_cast("gRumbleStrength"), Settings.controller.rumble_strength); + // Controllers + Settings.controller.rumble_enabled = Ship::stof(Conf[ControllerSection]["rumble_enabled"]); + CVar_SetS32("gRumbleEnabled", Settings.controller.rumble_enabled); Settings.controller.input_scale = Ship::stof(Conf[ControllerSection]["input_scale"]); - CVar_SetFloat(const_cast("gInputScale"), Settings.controller.input_scale); + CVar_SetFloat("gInputScale", Settings.controller.input_scale); Settings.controller.input_enabled = stob(Conf[ControllerSection]["input_enabled"]); - CVar_SetS32(const_cast("gInputEnabled"), Settings.controller.input_enabled); + + CVar_SetS32("gInputEnabled", Settings.controller.input_enabled); + //Tunics + Settings.cosmetic.tunic_kokiri_red = (Conf[CosmeticsSection]["tunic_kokiri_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_red"]) : Settings.cosmetic.tunic_kokiri_red; + CVar_SetS32("gTunic_Kokiri_Red", Settings.cosmetic.tunic_kokiri_red); + Settings.cosmetic.tunic_kokiri_green = (Conf[CosmeticsSection]["tunic_kokiri_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_green"]) : Settings.cosmetic.tunic_kokiri_green; + CVar_SetS32("gTunic_Kokiri_Green", Settings.cosmetic.tunic_kokiri_green); + Settings.cosmetic.tunic_kokiri_blue = (Conf[CosmeticsSection]["tunic_kokiri_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_kokiri_blue"]) : Settings.cosmetic.tunic_kokiri_blue; + CVar_SetS32("gTunic_Kokiri_Blue", Settings.cosmetic.tunic_kokiri_blue); + + Settings.cosmetic.tunic_goron_red = (Conf[CosmeticsSection]["tunic_goron_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_red"]) : Settings.cosmetic.tunic_goron_red; + CVar_SetS32("gTunic_Goron_Red", Settings.cosmetic.tunic_goron_red); + Settings.cosmetic.tunic_goron_green = (Conf[CosmeticsSection]["tunic_goron_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_green"]) : Settings.cosmetic.tunic_goron_green; + CVar_SetS32("gTunic_Goron_Green", Settings.cosmetic.tunic_goron_green); + Settings.cosmetic.tunic_goron_blue = (Conf[CosmeticsSection]["tunic_goron_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_goron_blue"]) : Settings.cosmetic.tunic_goron_blue; + CVar_SetS32("gTunic_Goron_Blue", Settings.cosmetic.tunic_goron_blue); + + Settings.cosmetic.tunic_zora_red = (Conf[CosmeticsSection]["tunic_zora_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_red"]) : Settings.cosmetic.tunic_zora_red; + CVar_SetS32("gTunic_Zora_Red", Settings.cosmetic.tunic_zora_red); + Settings.cosmetic.tunic_zora_green = (Conf[CosmeticsSection]["tunic_zora_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_green"]) : Settings.cosmetic.tunic_zora_green; + CVar_SetS32("gTunic_Zora_Green", Settings.cosmetic.tunic_zora_green); + Settings.cosmetic.tunic_zora_blue = (Conf[CosmeticsSection]["tunic_zora_blue"] != "" ) ? Ship::stoi(Conf[CosmeticsSection]["tunic_zora_blue"]) : Settings.cosmetic.tunic_zora_blue; + CVar_SetS32("gTunic_Zora_Blue", Settings.cosmetic.tunic_zora_blue); + //Navi + Settings.cosmetic.navi_idle_inner_red = (Conf[CosmeticsSection]["navi_idle_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_red"]) : Settings.cosmetic.navi_idle_inner_red; + CVar_SetS32("gNavi_Idle_Inner_Red", Settings.cosmetic.navi_idle_inner_red); + Settings.cosmetic.navi_idle_inner_green = (Conf[CosmeticsSection]["navi_idle_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_green"]) : Settings.cosmetic.navi_idle_inner_green; + CVar_SetS32("gNavi_Idle_Inner_Green", Settings.cosmetic.navi_idle_inner_green); + Settings.cosmetic.navi_idle_inner_blue = (Conf[CosmeticsSection]["navi_idle_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_inner_blue"]) : Settings.cosmetic.navi_idle_inner_blue; + CVar_SetS32("gNavi_Idle_Inner_Blue", Settings.cosmetic.navi_idle_inner_blue); + Settings.cosmetic.navi_idle_outer_red = (Conf[CosmeticsSection]["navi_idle_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_red"]) : Settings.cosmetic.navi_idle_outer_red; + CVar_SetS32("gNavi_Idle_Outer_Red", Settings.cosmetic.navi_idle_outer_red); + Settings.cosmetic.navi_idle_outer_green = (Conf[CosmeticsSection]["navi_idle_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_green"]) : Settings.cosmetic.navi_idle_outer_green; + CVar_SetS32("gNavi_Idle_Outer_Green", Settings.cosmetic.navi_idle_outer_green); + Settings.cosmetic.navi_idle_outer_blue = (Conf[CosmeticsSection]["navi_idle_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_idle_outer_blue"]) : Settings.cosmetic.navi_idle_outer_blue; + CVar_SetS32("gNavi_Idle_Outer_Blue", Settings.cosmetic.navi_idle_outer_blue); + + Settings.cosmetic.navi_npc_inner_red = (Conf[CosmeticsSection]["navi_npc_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_red"]) : Settings.cosmetic.navi_npc_inner_red; + CVar_SetS32("gNavi_NPC_Inner_Red", Settings.cosmetic.navi_npc_inner_red); + Settings.cosmetic.navi_npc_inner_green = (Conf[CosmeticsSection]["navi_npc_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_green"]) : Settings.cosmetic.navi_npc_inner_green; + CVar_SetS32("gNavi_NPC_Inner_Green", Settings.cosmetic.navi_npc_inner_green); + Settings.cosmetic.navi_npc_inner_blue = (Conf[CosmeticsSection]["navi_npc_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_inner_blue"]) : Settings.cosmetic.navi_npc_inner_blue; + CVar_SetS32("gNavi_NPC_Inner_Blue", Settings.cosmetic.navi_npc_inner_blue); + Settings.cosmetic.navi_npc_outer_red = (Conf[CosmeticsSection]["navi_npc_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_red"]) : Settings.cosmetic.navi_npc_outer_red; + CVar_SetS32("gNavi_NPC_Outer_Red", Settings.cosmetic.navi_npc_outer_red); + Settings.cosmetic.navi_npc_outer_green = (Conf[CosmeticsSection]["navi_npc_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_green"]) : Settings.cosmetic.navi_npc_outer_green; + CVar_SetS32("gNavi_NPC_Outer_Green", Settings.cosmetic.navi_npc_outer_green); + Settings.cosmetic.navi_npc_outer_blue = (Conf[CosmeticsSection]["navi_npc_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_npc_outer_blue"]) : Settings.cosmetic.navi_npc_outer_blue; + CVar_SetS32("gNavi_NPC_Outer_Blue", Settings.cosmetic.navi_npc_outer_blue); + + Settings.cosmetic.navi_enemy_inner_red = (Conf[CosmeticsSection]["navi_enemy_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_red"]) : Settings.cosmetic.navi_enemy_inner_red; + CVar_SetS32("gNavi_Enemy_Inner_Red", Settings.cosmetic.navi_enemy_inner_red); + Settings.cosmetic.navi_enemy_inner_green = (Conf[CosmeticsSection]["navi_enemy_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_green"]) : Settings.cosmetic.navi_enemy_inner_green; + CVar_SetS32("gNavi_Enemy_Inner_Green", Settings.cosmetic.navi_enemy_inner_green); + Settings.cosmetic.navi_enemy_inner_blue = (Conf[CosmeticsSection]["navi_enemy_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_inner_blue"]) : Settings.cosmetic.navi_enemy_inner_blue; + CVar_SetS32("gNavi_Enemy_Inner_Blue", Settings.cosmetic.navi_enemy_inner_blue); + Settings.cosmetic.navi_enemy_outer_red = (Conf[CosmeticsSection]["navi_enemy_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_red"]) : Settings.cosmetic.navi_enemy_outer_red; + CVar_SetS32("gNavi_Enemy_Outer_Red", Settings.cosmetic.navi_enemy_outer_red); + Settings.cosmetic.navi_enemy_outer_green = (Conf[CosmeticsSection]["navi_enemy_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_green"]) : Settings.cosmetic.navi_enemy_outer_green; + CVar_SetS32("gNavi_Enemy_Outer_Green", Settings.cosmetic.navi_enemy_outer_green); + Settings.cosmetic.navi_enemy_outer_blue = (Conf[CosmeticsSection]["navi_enemy_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_enemy_outer_blue"]) : Settings.cosmetic.navi_enemy_outer_blue; + CVar_SetS32("gNavi_Enemy_Outer_Blue", Settings.cosmetic.navi_enemy_outer_blue); + + Settings.cosmetic.navi_prop_inner_red = (Conf[CosmeticsSection]["navi_prop_inner_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_red"]) : Settings.cosmetic.navi_prop_inner_red; + CVar_SetS32("gNavi_Prop_Inner_Red", Settings.cosmetic.navi_prop_inner_red); + Settings.cosmetic.navi_prop_inner_green = (Conf[CosmeticsSection]["navi_prop_inner_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_green"]) : Settings.cosmetic.navi_prop_inner_green; + CVar_SetS32("gNavi_Prop_Inner_Green", Settings.cosmetic.navi_prop_inner_green); + Settings.cosmetic.navi_prop_inner_blue = (Conf[CosmeticsSection]["navi_prop_inner_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_inner_blue"]) : Settings.cosmetic.navi_prop_inner_blue; + CVar_SetS32("gNavi_Prop_Inner_Blue", Settings.cosmetic.navi_prop_inner_blue); + Settings.cosmetic.navi_prop_outer_red = (Conf[CosmeticsSection]["navi_prop_outer_red"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_red"]) : Settings.cosmetic.navi_prop_outer_red; + CVar_SetS32("gNavi_Prop_Outer_Red", Settings.cosmetic.navi_prop_outer_red); + Settings.cosmetic.navi_prop_outer_green = (Conf[CosmeticsSection]["navi_prop_outer_green"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_green"]) : Settings.cosmetic.navi_prop_outer_green; + CVar_SetS32("gNavi_Prop_Outer_Green", Settings.cosmetic.navi_prop_outer_green); + Settings.cosmetic.navi_prop_outer_blue = (Conf[CosmeticsSection]["navi_prop_outer_blue"] != "") ? Ship::stoi(Conf[CosmeticsSection]["navi_prop_outer_blue"]) : Settings.cosmetic.navi_prop_outer_blue; + CVar_SetS32("gNavi_Prop_Outer_Blue", Settings.cosmetic.navi_prop_outer_blue); + + + + CVar_SetS32("gInputEnabled", Settings.controller.input_enabled); + + Settings.controller.dpad_pause_name = stob(Conf[ControllerSection]["dpad_pause_name"]); + CVar_SetS32("gDpadPauseName", Settings.controller.dpad_pause_name); + + Settings.controller.dpad_ocarina_text = stob(Conf[ControllerSection]["dpad_ocarina_text"]); + CVar_SetS32("gDpadOcarinaText", Settings.controller.dpad_ocarina_text); + + Settings.controller.dpad_shop = stob(Conf[ControllerSection]["dpad_shop"]); + CVar_SetS32("gDpadShop", Settings.controller.dpad_shop); + + // Cheats + Settings.cheats.debug_mode = stob(Conf[CheatSection]["debug_mode"]); + CVar_SetS32("gDebugEnabled", Settings.cheats.debug_mode); + + Settings.cheats.infinite_money = stob(Conf[CheatSection]["infinite_money"]); + CVar_SetS32("gInfiniteMoney", Settings.cheats.infinite_money); + + Settings.cheats.infinite_health = stob(Conf[CheatSection]["infinite_health"]); + CVar_SetS32("gInfiniteHealth", Settings.cheats.infinite_health); + + Settings.cheats.infinite_ammo = stob(Conf[CheatSection]["infinite_ammo"]); + CVar_SetS32("gInfiniteAmmo", Settings.cheats.infinite_ammo); + + Settings.cheats.infinite_magic = stob(Conf[CheatSection]["infinite_magic"]); + CVar_SetS32("gInfiniteMagic", Settings.cheats.infinite_magic); + + Settings.cheats.infinite_nayru = stob(Conf[CheatSection]["infinite_nayru"]); + CVar_SetS32("gInfiniteNayru", Settings.cheats.infinite_nayru); + + Settings.cheats.no_clip = stob(Conf[CheatSection]["no_clip"]); + CVar_SetS32("gNoClip", Settings.cheats.no_clip); + + Settings.cheats.climb_everything = stob(Conf[CheatSection]["climb_everything"]); + CVar_SetS32("gClimbEverything", Settings.cheats.climb_everything); + + Settings.cheats.moon_jump_on_l = stob(Conf[CheatSection]["moon_jump_on_l"]); + CVar_SetS32("gMoonJumpOnL", Settings.cheats.moon_jump_on_l); + + Settings.cheats.super_tunic = stob(Conf[CheatSection]["super_tunic"]); + CVar_SetS32("gSuperTunic", Settings.cheats.super_tunic); + + Settings.cheats.ez_isg = stob(Conf[CheatSection]["ez_isg"]); + CVar_SetS32("gEzISG", Settings.cheats.ez_isg); + + Settings.cheats.no_restrict_item = stob(Conf[CheatSection]["no_restrict_item"]); + CVar_SetS32("gNoRestrictItems", Settings.cheats.no_restrict_item); + + Settings.cheats.freeze_time = stob(Conf[CheatSection]["freeze_time"]); + CVar_SetS32("gFreezeTime", Settings.cheats.freeze_time); + + // Per-Controller + LoadPadSettings(); UpdateAudio(); } + void LoadPadSettings() { + const std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); + ConfigFile& Conf = *pConf; + + for (const auto& [i, controllers] : Ship::Window::Controllers) { + for (const auto& controller : controllers) { + if (auto padConfSection = controller->GetPadConfSection()) { + Settings.controller.extra[i].gyro_sensitivity = Ship::stof(Conf[*padConfSection]["gyro_sensitivity"]); + Settings.controller.extra[i].rumble_strength = Ship::stof(Conf[*padConfSection]["rumble_strength"]); + Settings.controller.extra[i].gyro_drift_x = Ship::stof(Conf[*padConfSection]["gyro_drift_x"], 0.0f); + Settings.controller.extra[i].gyro_drift_y = Ship::stof(Conf[*padConfSection]["gyro_drift_y"], 0.0f); + } + } + } + } + void SaveSettings() { const std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); ConfigFile& Conf = *pConf; @@ -109,15 +278,90 @@ namespace Game { Conf[AudioSection]["fanfare"] = std::to_string(Settings.audio.fanfare); // Enhancements - Conf[EnhancementSection]["fast_text"] = std::to_string(Settings.enhancements.fast_text); + Conf[EnhancementSection]["skip_text"] = std::to_string(Settings.enhancements.skip_text); + Conf[EnhancementSection]["text_speed"] = std::to_string(Settings.enhancements.text_speed); Conf[EnhancementSection]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod); Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu); - Conf[EnhancementSection]["debug_mode"] = std::to_string(Settings.enhancements.debug_mode); + Conf[EnhancementSection]["dynamic_wallet_icon"] = std::to_string(Settings.enhancements.dynamic_wallet_icon); + Conf[EnhancementSection]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui); + Conf[EnhancementSection]["newdrops"] = std::to_string(Settings.enhancements.newdrops); + Conf[EnhancementSection]["visualagony"] = std::to_string(Settings.enhancements.visualagony); + Conf[EnhancementSection]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood); + Conf[EnhancementSection]["uniform_lr"] = std::to_string(Settings.enhancements.uniform_lr); - Conf[ControllerSection]["gyro_sensitivity"] = std::to_string(Settings.controller.gyro_sensitivity); - Conf[ControllerSection]["rumble_strength"] = std::to_string(Settings.controller.rumble_strength); + + // Controllers + Conf[ControllerSection]["rumble_enabled"] = std::to_string(Settings.controller.rumble_enabled); Conf[ControllerSection]["input_scale"] = std::to_string(Settings.controller.input_scale); Conf[ControllerSection]["input_enabled"] = std::to_string(Settings.controller.input_enabled); + Conf[ControllerSection]["dpad_pause_name"] = std::to_string(Settings.controller.dpad_pause_name); + Conf[ControllerSection]["dpad_ocarina_text"] = std::to_string(Settings.controller.dpad_ocarina_text); + Conf[ControllerSection]["dpad_shop"] = std::to_string(Settings.controller.dpad_shop); + + + // Cosmetics + Conf[CosmeticsSection]["tunic_kokiri_red"] = std::to_string(Settings.cosmetic.tunic_kokiri_red); + Conf[CosmeticsSection]["tunic_kokiri_green"] = std::to_string(Settings.cosmetic.tunic_kokiri_green); + Conf[CosmeticsSection]["tunic_kokiri_blue"] = std::to_string(Settings.cosmetic.tunic_kokiri_blue); + + Conf[CosmeticsSection]["tunic_goron_red"] = std::to_string(Settings.cosmetic.tunic_goron_red); + Conf[CosmeticsSection]["tunic_goron_green"] = std::to_string(Settings.cosmetic.tunic_goron_green); + Conf[CosmeticsSection]["tunic_goron_blue"] = std::to_string(Settings.cosmetic.tunic_goron_blue); + + Conf[CosmeticsSection]["tunic_zora_red"] = std::to_string(Settings.cosmetic.tunic_zora_red); + Conf[CosmeticsSection]["tunic_zora_green"] = std::to_string(Settings.cosmetic.tunic_zora_green); + Conf[CosmeticsSection]["tunic_zora_blue"] = std::to_string(Settings.cosmetic.tunic_zora_blue); + + Conf[CosmeticsSection]["navi_idle_inner_red"] = std::to_string(Settings.cosmetic.navi_idle_inner_red); + Conf[CosmeticsSection]["navi_idle_inner_green"] = std::to_string(Settings.cosmetic.navi_idle_inner_green); + Conf[CosmeticsSection]["navi_idle_inner_blue"] = std::to_string(Settings.cosmetic.navi_idle_inner_blue); + Conf[CosmeticsSection]["navi_idle_outer_red"] = std::to_string(Settings.cosmetic.navi_idle_outer_red); + Conf[CosmeticsSection]["navi_idle_outer_green"] = std::to_string(Settings.cosmetic.navi_idle_outer_green); + Conf[CosmeticsSection]["navi_idle_outer_blue"] = std::to_string(Settings.cosmetic.navi_idle_outer_blue); + + Conf[CosmeticsSection]["navi_npc_inner_red"] = std::to_string(Settings.cosmetic.navi_npc_inner_red); + Conf[CosmeticsSection]["navi_npc_inner_green"] = std::to_string(Settings.cosmetic.navi_npc_inner_green); + Conf[CosmeticsSection]["navi_npc_inner_blue"] = std::to_string(Settings.cosmetic.navi_npc_inner_blue); + Conf[CosmeticsSection]["navi_npc_outer_red"] = std::to_string(Settings.cosmetic.navi_npc_outer_red); + Conf[CosmeticsSection]["navi_npc_outer_green"] = std::to_string(Settings.cosmetic.navi_npc_outer_green); + Conf[CosmeticsSection]["navi_npc_outer_blue"] = std::to_string(Settings.cosmetic.navi_npc_outer_blue); + + Conf[CosmeticsSection]["navi_enemy_inner_red"] = std::to_string(Settings.cosmetic.navi_enemy_inner_red); + Conf[CosmeticsSection]["navi_enemy_inner_green"] = std::to_string(Settings.cosmetic.navi_enemy_inner_green); + Conf[CosmeticsSection]["navi_enemy_inner_blue"] = std::to_string(Settings.cosmetic.navi_enemy_inner_blue); + Conf[CosmeticsSection]["navi_enemy_outer_red"] = std::to_string(Settings.cosmetic.navi_enemy_outer_red); + Conf[CosmeticsSection]["navi_enemy_outer_green"] = std::to_string(Settings.cosmetic.navi_enemy_outer_green); + Conf[CosmeticsSection]["navi_enemy_outer_blue"] = std::to_string(Settings.cosmetic.navi_enemy_outer_blue); + + Conf[CosmeticsSection]["navi_prop_inner_red"] = std::to_string(Settings.cosmetic.navi_prop_inner_red); + Conf[CosmeticsSection]["navi_prop_inner_green"] = std::to_string(Settings.cosmetic.navi_prop_inner_green); + Conf[CosmeticsSection]["navi_prop_inner_blue"] = std::to_string(Settings.cosmetic.navi_prop_inner_blue); + Conf[CosmeticsSection]["navi_prop_outer_red"] = std::to_string(Settings.cosmetic.navi_prop_outer_red); + Conf[CosmeticsSection]["navi_prop_outer_green"] = std::to_string(Settings.cosmetic.navi_prop_outer_green); + Conf[CosmeticsSection]["navi_prop_outer_blue"] = std::to_string(Settings.cosmetic.navi_prop_outer_blue); + + // Cheats + Conf[CheatSection]["debug_mode"] = std::to_string(Settings.cheats.debug_mode); + Conf[CheatSection]["infinite_money"] = std::to_string(Settings.cheats.infinite_money); + Conf[CheatSection]["infinite_health"] = std::to_string(Settings.cheats.infinite_health); + Conf[CheatSection]["infinite_ammo"] = std::to_string(Settings.cheats.infinite_ammo); + Conf[CheatSection]["infinite_magic"] = std::to_string(Settings.cheats.infinite_magic); + Conf[CheatSection]["no_clip"] = std::to_string(Settings.cheats.no_clip); + Conf[CheatSection]["climb_everything"] = std::to_string(Settings.cheats.climb_everything); + Conf[CheatSection]["moon_jump_on_l"] = std::to_string(Settings.cheats.moon_jump_on_l); + Conf[CheatSection]["super_tunic"] = std::to_string(Settings.cheats.super_tunic); + + // Per-Controller + for (const auto& [i, controllers] : Ship::Window::Controllers) { + for (const auto& controller : controllers) { + if (auto padConfSection = controller->GetPadConfSection()) { + Conf[*padConfSection]["gyro_sensitivity"] = std::to_string(Settings.controller.extra[i].gyro_sensitivity); + Conf[*padConfSection]["rumble_strength"] = std::to_string(Settings.controller.extra[i].rumble_strength); + Conf[*padConfSection]["gyro_drift_x"] = std::to_string(Settings.controller.extra[i].gyro_drift_x); + Conf[*padConfSection]["gyro_drift_y"] = std::to_string(Settings.controller.extra[i].gyro_drift_y); + } + } + } Conf.Save(); } @@ -131,4 +375,4 @@ namespace Game { void SetSeqPlayerVolume(SeqPlayers playerId, float volume) { Audio_SetGameVolume(playerId, volume); } -} \ No newline at end of file +} diff --git a/libultraship/libultraship/GameSettings.h b/libultraship/libultraship/GameSettings.h index 35d948d89..2feea8dcb 100644 --- a/libultraship/libultraship/GameSettings.h +++ b/libultraship/libultraship/GameSettings.h @@ -20,18 +20,96 @@ struct SoHConfigType { // Enhancements struct { - bool fast_text = false; + int text_speed = 1; + bool skip_text = false; bool disable_lod = false; bool animated_pause_menu = false; - bool debug_mode = false; + bool dynamic_wallet_icon = false; + bool minimal_ui = false; + bool newdrops = false; + bool visualagony = false; + bool mm_bunny_hood = false; + bool uniform_lr = true; } enhancements; + // Controller struct { - float gyro_sensitivity = 1.0f; - float rumble_strength = 1.0f; + struct { + float gyro_sensitivity = 1.0f; + float rumble_strength = 1.0f; + float gyro_drift_x = 0.0f; + float gyro_drift_y = 0.0f; + } extra[4]; + bool rumble_enabled = true; float input_scale = 1.0f; - bool input_enabled = false; + bool input_enabled = false; + bool dpad_pause_name = false; + bool dpad_ocarina_text = false; + bool dpad_shop = false; } controller; + + struct { + int tunic_kokiri_red = 30; + int tunic_kokiri_green = 105; + int tunic_kokiri_blue = 27; + int tunic_goron_red = 100; + int tunic_goron_green = 20; + int tunic_goron_blue = 0; + int tunic_zora_red = 0; + int tunic_zora_green = 60; + int tunic_zora_blue = 100; + + int navi_idle_inner_red = 255; + int navi_idle_inner_green = 255; + int navi_idle_inner_blue = 255; + int navi_idle_outer_red = 0; + int navi_idle_outer_green = 0; + int navi_idle_outer_blue = 255; + + int navi_enemy_inner_red = 255; + int navi_enemy_inner_green = 255; + int navi_enemy_inner_blue = 0; + int navi_enemy_outer_red = 200; + int navi_enemy_outer_green = 155; + int navi_enemy_outer_blue = 0; + + int navi_npc_inner_red = 150; + int navi_npc_inner_green = 150; + int navi_npc_inner_blue = 255; + int navi_npc_outer_red = 150; + int navi_npc_outer_green = 150; + int navi_npc_outer_blue = 255; + + int navi_prop_inner_red = 0; + int navi_prop_inner_green = 250; + int navi_prop_inner_blue = 0; + int navi_prop_outer_red = 0; + int navi_prop_outer_green = 250; + int navi_prop_outer_blue = 0; + + } cosmetic; + + // Cheats + struct { + bool debug_mode = false; + bool infinite_money = false; + bool infinite_health = false; + bool infinite_ammo = false; + bool infinite_magic = false; + bool infinite_nayru = false; + bool no_clip = false; + bool climb_everything = false; + bool moon_jump_on_l = false; + bool super_tunic = false; + bool ez_isg = false; + bool no_restrict_item = false; + bool freeze_time = false; + } cheats; + + // Graphics + struct { + bool show = false; + } graphics; }; enum SeqPlayers { @@ -46,11 +124,14 @@ enum SeqPlayers { #define AUDIO_SECTION "AUDIO SETTINGS" #define CONTROLLER_SECTION "CONTROLLER SECTION" #define ENHANCEMENTS_SECTION "ENHANCEMENT SETTINGS" +#define COSMETICS_SECTION "COSMETIC SETTINGS" +#define CHEATS_SECTION "CHEATS SETTINGS" namespace Game { extern SoHConfigType Settings; void InitSettings(); void LoadSettings(); + void LoadPadSettings(); void SaveSettings(); void SetSeqPlayerVolume(SeqPlayers playerId, float volume); } diff --git a/libultraship/libultraship/GameVersions.h b/libultraship/libultraship/GameVersions.h new file mode 100644 index 000000000..a25463bf4 --- /dev/null +++ b/libultraship/libultraship/GameVersions.h @@ -0,0 +1,20 @@ +#pragma once + +#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 +#define OOT_UNKNOWN 0xFFFFFFFF \ No newline at end of file diff --git a/libultraship/libultraship/KeyboardController.cpp b/libultraship/libultraship/KeyboardController.cpp index 6f78a1678..13014c6a7 100644 --- a/libultraship/libultraship/KeyboardController.cpp +++ b/libultraship/libultraship/KeyboardController.cpp @@ -53,4 +53,4 @@ namespace Ship { std::string KeyboardController::GetBindingConfSection() { return GetControllerType() + " CONTROLLER BINDING " + std::to_string(GetControllerNumber() + 1); } -} \ No newline at end of file +} diff --git a/libultraship/libultraship/KeyboardController.h b/libultraship/libultraship/KeyboardController.h index ab0f98e64..f6c109ca7 100644 --- a/libultraship/libultraship/KeyboardController.h +++ b/libultraship/libultraship/KeyboardController.h @@ -10,11 +10,16 @@ namespace Ship { void ReadFromSource(); void WriteToSource(ControllerCallback* controller); + bool Connected() const { return true; } + bool CanRumble() const { return false; } bool PressButton(int32_t dwScancode); bool ReleaseButton(int32_t dwScancode); void ReleaseAllButtons(); + bool HasPadConf() const { return false; } + std::optional GetPadConfSection() { return {}; } + protected: std::string GetControllerType(); std::string GetConfSection(); diff --git a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h index dce245066..b996f66c3 100644 --- a/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h +++ b/libultraship/libultraship/Lib/Fast3D/U64/PR/ultra64/gbi.h @@ -170,6 +170,12 @@ #define G_TEXRECT_WIDE 0x37 #define G_FILLWIDERECT 0x38 +/* GFX Effects */ + +// RDP Cmd +#define G_SETGRAYSCALE 0x39 +#define G_SETINTENSITY 0x40 + /* * The following commands are the "generated" RDP commands; the user * never sees them, the RSP microcode generates them. @@ -2821,6 +2827,14 @@ _DW({ \ _g->words.w1 = 0; \ } +#define gsSPGrayscale(pkt, state) \ +{ \ + Gfx *_g = (Gfx *)(pkt); \ + \ + _g->words.w0 = _SHIFTL(G_SETGRAYSCALE, 24, 8); \ + _g->words.w1 = state; \ +} + #ifdef F3DEX_GBI_2 /* * One gSPGeometryMode(pkt,c,s) GBI is equal to these two GBIs. @@ -3161,6 +3175,8 @@ _DW({ \ (_SHIFTL(r, 24, 8) | _SHIFTL(g, 16, 8) | \ _SHIFTL(b, 8, 8) | _SHIFTL(a, 0, 8))) +#define gsDPSetGrayscaleColor(pkt, r, g, b, lerp) \ + DPRGBColor(pkt, G_SETINTENSITY, r, g, b, lerp) #define gDPSetEnvColor(pkt, r, g, b, a) \ DPRGBColor(pkt, G_SETENVCOLOR, r,g,b,a) #define gsDPSetEnvColor(r, g, b, a) \ @@ -3177,7 +3193,6 @@ _DW({ \ gDPSetColor(pkt, G_SETFILLCOLOR, (d)) #define gsDPSetFillColor(d) \ gsDPSetColor(G_SETFILLCOLOR, (d)) - #define gDPSetPrimDepth(pkt, z, dz) \ gDPSetColor(pkt, G_SETPRIMDEPTH, \ _SHIFTL(z, 16, 16) | _SHIFTL(dz, 0, 16)) @@ -4223,6 +4238,17 @@ _DW({ \ gDPPipeSync(pkt); \ }) +#define gDPLoadTLUT_pal128(pkt, pal, dram) \ +_DW({ \ + gDPSetTextureImage(pkt, G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, dram); \ + gDPTileSync(pkt); \ + gDPSetTile(pkt, 0, 0, 0, 256 + ((pal)&1)*128, \ + G_TX_LOADTILE, 0 , 0, 0, 0, 0, 0, 0); \ + gDPLoadSync(pkt); \ + gDPLoadTLUTCmd(pkt, G_TX_LOADTILE, 127); \ + gDPPipeSync(pkt); \ +}) + #else /* **** WORKAROUND hardware 1 load_tlut bug ****** */ #define gDPLoadTLUT_pal256(pkt, dram) \ diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp index 25ae8b324..c92a05b8b 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_cc.cpp @@ -16,6 +16,7 @@ void gfx_cc_get_features(uint64_t shader_id0, uint32_t shader_id1, struct CCFeat cc_features->opt_2cyc = (shader_id1 & SHADER_OPT_2CYC) != 0; cc_features->opt_alpha_threshold = (shader_id1 & SHADER_OPT_ALPHA_THRESHOLD) != 0; cc_features->opt_invisible = (shader_id1 & SHADER_OPT_INVISIBLE) != 0; + cc_features->opt_grayscale = (shader_id1 & SHADER_OPT_GRAYSCALE) != 0; cc_features->clamp[0][0] = (shader_id1 & SHADER_OPT_TEXEL0_CLAMP_S); cc_features->clamp[0][1] = (shader_id1 & SHADER_OPT_TEXEL0_CLAMP_T); diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_cc.h b/libultraship/libultraship/Lib/Fast3D/gfx_cc.h index 7bf415f84..f0a9f2eca 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_cc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_cc.h @@ -39,10 +39,11 @@ enum { #define SHADER_OPT_2CYC (1 << 4) #define SHADER_OPT_ALPHA_THRESHOLD (1 << 5) #define SHADER_OPT_INVISIBLE (1 << 6) -#define SHADER_OPT_TEXEL0_CLAMP_S (1 << 7) -#define SHADER_OPT_TEXEL0_CLAMP_T (1 << 8) -#define SHADER_OPT_TEXEL1_CLAMP_S (1 << 9) -#define SHADER_OPT_TEXEL1_CLAMP_T (1 << 10) +#define SHADER_OPT_GRAYSCALE (1 << 7) +#define SHADER_OPT_TEXEL0_CLAMP_S (1 << 8) +#define SHADER_OPT_TEXEL0_CLAMP_T (1 << 9) +#define SHADER_OPT_TEXEL1_CLAMP_S (1 << 10) +#define SHADER_OPT_TEXEL1_CLAMP_T (1 << 11) #define CC_SHADER_OPT_POS 56 struct CCFeatures { @@ -54,6 +55,7 @@ struct CCFeatures { bool opt_2cyc; bool opt_alpha_threshold; bool opt_invisible; + bool opt_grayscale; bool used_textures[2]; bool clamp[2][2]; int num_inputs; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp index 243ff727b..a3f818820 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d11.cpp @@ -37,9 +37,8 @@ namespace { struct PerFrameCB { uint32_t noise_frame; - float noise_scale_x; - float noise_scale_y; - uint32_t padding; + float noise_scale; + uint32_t padding[2]; // constant buffers must be multiples of 16 bytes in size }; struct PerDrawCB { @@ -51,12 +50,12 @@ struct PerDrawCB { } textures[2]; }; -struct CoordCB { - float x, y; - float padding[2]; // structure size must be multiple of 16 +struct Coord { + int x, y; }; struct TextureData { + ComPtr texture; ComPtr resource_view; ComPtr sampler_state; uint32_t width; @@ -64,10 +63,13 @@ struct TextureData { bool linear_filtering; }; -struct FramebufferData { +struct Framebuffer { ComPtr render_target_view; ComPtr depth_stencil_view; + ComPtr depth_stencil_srv; uint32_t texture_id; + bool has_depth_buffer; + uint32_t msaa_level; }; struct ShaderProgramD3D11 { @@ -91,34 +93,30 @@ static struct { pD3DCompile D3DCompile; D3D_FEATURE_LEVEL feature_level; + uint32_t msaa_num_quality_levels[D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT]; ComPtr device; ComPtr swap_chain; ComPtr context; - ComPtr backbuffer_view; - ComPtr depth_stencil_view; - ComPtr depth_stencil_srv; ComPtr rasterizer_state; ComPtr depth_stencil_state; ComPtr vertex_buffer; ComPtr per_frame_cb; ComPtr per_draw_cb; - ComPtr depth_stencil_texture; - ComPtr depth_stencil_copy_texture; ComPtr coord_buffer; + ComPtr coord_buffer_srv; ComPtr depth_value_output_buffer; ComPtr depth_value_output_buffer_copy; ComPtr depth_value_output_uav; - ComPtr depth_value_sampler; ComPtr compute_shader; - bool copied_depth_buffer; + ComPtr compute_shader_msaa; + ComPtr compute_shader_msaa_blob; + size_t coord_buffer_size; #if DEBUG_D3D ComPtr debug; #endif - DXGI_SAMPLE_DESC sample_description; - PerFrameCB per_frame_cb_data; PerDrawCB per_draw_cb_data; @@ -128,14 +126,15 @@ static struct { int current_tile; uint32_t current_texture_ids[2]; - std::vector framebuffers; + std::vector framebuffers; // Current state struct ShaderProgramD3D11 *shader_program; - uint32_t current_width, current_height; + //uint32_t current_width, current_height; uint32_t render_target_height; + int current_framebuffer; int8_t depth_test; int8_t depth_mask; @@ -156,7 +155,9 @@ static struct { static LARGE_INTEGER last_time, accumulated_time, frequency; -void create_depth_stencil_objects(uint32_t width, uint32_t height, ID3D11Texture2D **texture, ID3D11DepthStencilView **view, ID3D11ShaderResourceView **srv) { +int gfx_d3d11_create_framebuffer(void); + +static void create_depth_stencil_objects(uint32_t width, uint32_t height, uint32_t msaa_count, ID3D11DepthStencilView **view, ID3D11ShaderResourceView **srv) { D3D11_TEXTURE2D_DESC texture_desc; texture_desc.Width = width; texture_desc.Height = height; @@ -164,93 +165,42 @@ void create_depth_stencil_objects(uint32_t width, uint32_t height, ID3D11Texture texture_desc.ArraySize = 1; texture_desc.Format = d3d.feature_level >= D3D_FEATURE_LEVEL_10_0 ? DXGI_FORMAT_R32_TYPELESS : DXGI_FORMAT_R24G8_TYPELESS; - texture_desc.SampleDesc.Count = 1; + texture_desc.SampleDesc.Count = msaa_count; texture_desc.SampleDesc.Quality = 0; texture_desc.Usage = D3D11_USAGE_DEFAULT; texture_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | (srv != nullptr ? D3D11_BIND_SHADER_RESOURCE : 0); texture_desc.CPUAccessFlags = 0; texture_desc.MiscFlags = 0; - ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, texture)); + ComPtr texture; + ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, texture.GetAddressOf())); D3D11_DEPTH_STENCIL_VIEW_DESC view_desc; view_desc.Format = d3d.feature_level >= D3D_FEATURE_LEVEL_10_0 ? DXGI_FORMAT_D32_FLOAT : DXGI_FORMAT_D24_UNORM_S8_UINT; - view_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; view_desc.Flags = 0; - view_desc.Texture2D.MipSlice = 0; + if (msaa_count > 1) { + view_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DMS; + view_desc.Texture2DMS.UnusedField_NothingToDefine = 0; + } else { + view_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + view_desc.Texture2D.MipSlice = 0; + } - ThrowIfFailed(d3d.device->CreateDepthStencilView(*texture, &view_desc, view)); + ThrowIfFailed(d3d.device->CreateDepthStencilView(texture.Get(), &view_desc, view)); if (srv != nullptr) { D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; srv_desc.Format = d3d.feature_level >= D3D_FEATURE_LEVEL_10_0 ? DXGI_FORMAT_R32_FLOAT : DXGI_FORMAT_R24_UNORM_X8_TYPELESS; - srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv_desc.ViewDimension = msaa_count > 1 ? D3D11_SRV_DIMENSION_TEXTURE2DMS : D3D11_SRV_DIMENSION_TEXTURE2D; srv_desc.Texture2D.MostDetailedMip = 0; srv_desc.Texture2D.MipLevels = -1; - ThrowIfFailed(d3d.device->CreateShaderResourceView(*texture, &srv_desc, srv)); + ThrowIfFailed(d3d.device->CreateShaderResourceView(texture.Get(), &srv_desc, srv)); } } -static void create_render_target_views(bool is_resize) { - DXGI_SWAP_CHAIN_DESC1 desc1; - - if (is_resize) { - // Release previous stuff (if any) - - d3d.backbuffer_view.Reset(); - d3d.depth_stencil_texture.Reset(); - d3d.depth_stencil_view.Reset(); - d3d.depth_stencil_srv.Reset(); - d3d.depth_stencil_copy_texture.Reset(); - - // Resize swap chain buffers - - ThrowIfFailed(d3d.swap_chain->GetDesc1(&desc1)); - ThrowIfFailed(d3d.swap_chain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, desc1.Flags), - gfx_dxgi_get_h_wnd(), "Failed to resize IDXGISwapChain buffers."); - } - - // Get new size - - ThrowIfFailed(d3d.swap_chain->GetDesc1(&desc1)); - - // Create back buffer - - ComPtr backbuffer_texture; - ThrowIfFailed(d3d.swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *) backbuffer_texture.GetAddressOf()), - gfx_dxgi_get_h_wnd(), "Failed to get backbuffer from IDXGISwapChain."); - - ThrowIfFailed(d3d.device->CreateRenderTargetView(backbuffer_texture.Get(), nullptr, d3d.backbuffer_view.GetAddressOf()), - gfx_dxgi_get_h_wnd(), "Failed to create render target view."); - - // Create depth buffer - create_depth_stencil_objects(desc1.Width, desc1.Height, d3d.depth_stencil_texture.GetAddressOf(), d3d.depth_stencil_view.GetAddressOf(), d3d.depth_stencil_srv.GetAddressOf()); - - // Create texture that can be used to retrieve depth value - - D3D11_TEXTURE2D_DESC depth_texture = {}; - depth_texture.Width = desc1.Width; - depth_texture.Height = desc1.Height; - depth_texture.MipLevels = 1; - depth_texture.ArraySize = 1; - depth_texture.Format = DXGI_FORMAT_D32_FLOAT; - depth_texture.SampleDesc.Count = 1; - depth_texture.SampleDesc.Quality = 0; - depth_texture.Usage = D3D11_USAGE_STAGING; - depth_texture.BindFlags = 0; - depth_texture.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - depth_texture.MiscFlags = 0; - ThrowIfFailed(d3d.device->CreateTexture2D(&depth_texture, nullptr, d3d.depth_stencil_copy_texture.GetAddressOf())); - - // Save resolution - - d3d.current_width = desc1.Width; - d3d.current_height = desc1.Height; -} - static void gfx_d3d11_init(void) { // Load d3d11.dll d3d.d3d11_module = LoadLibraryW(L"d3d11.dll"); @@ -300,11 +250,6 @@ static void gfx_d3d11_init(void) { } }); - // Sample description to be used in back buffer and depth buffer - - d3d.sample_description.Count = 1; - d3d.sample_description.Quality = 0; - // Create the swap chain d3d.swap_chain = gfx_dxgi_create_swap_chain(d3d.device.Get()); @@ -315,9 +260,19 @@ static void gfx_d3d11_init(void) { gfx_dxgi_get_h_wnd(), "Failed to get ID3D11Debug device."); #endif - // Create views + // Create the default framebuffer which represents the window + Framebuffer& fb = d3d.framebuffers[gfx_d3d11_create_framebuffer()]; - create_render_target_views(false); + // Check the size of the window + DXGI_SWAP_CHAIN_DESC1 swap_chain_desc; + ThrowIfFailed(d3d.swap_chain->GetDesc1(&swap_chain_desc)); + d3d.textures[fb.texture_id].width = swap_chain_desc.Width; + d3d.textures[fb.texture_id].height = swap_chain_desc.Height; + fb.msaa_level = 1; + + for (uint32_t sample_count = 1; sample_count <= D3D11_MAX_MULTISAMPLE_SAMPLE_COUNT; sample_count++) { + ThrowIfFailed(d3d.device->CheckMultisampleQualityLevels(DXGI_FORMAT_R8G8B8A8_UNORM, sample_count, &d3d.msaa_num_quality_levels[sample_count - 1])); + } // Create main vertex buffer @@ -364,61 +319,30 @@ static void gfx_d3d11_init(void) { // Create compute shader that can be used to retrieve depth buffer values - D3D11_BUFFER_DESC coord_cb_desc; - coord_cb_desc.Usage = D3D11_USAGE_DYNAMIC; - coord_cb_desc.ByteWidth = sizeof(CoordCB); - coord_cb_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - coord_cb_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - coord_cb_desc.MiscFlags = 0; - coord_cb_desc.StructureByteStride = 0; - - ThrowIfFailed(d3d.device->CreateBuffer(&coord_cb_desc, nullptr, d3d.coord_buffer.GetAddressOf())); - - D3D11_SAMPLER_DESC sampler_desc = {}; - sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - sampler_desc.MinLOD = 0; - sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; - ThrowIfFailed(d3d.device->CreateSamplerState(&sampler_desc, d3d.depth_value_sampler.GetAddressOf())); - - D3D11_BUFFER_DESC output_buffer_desc; - output_buffer_desc.Usage = D3D11_USAGE_DEFAULT; - output_buffer_desc.ByteWidth = sizeof(float); - output_buffer_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; - output_buffer_desc.CPUAccessFlags = 0; - output_buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; - output_buffer_desc.StructureByteStride = sizeof(float); - ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer.GetAddressOf())); - - D3D11_UNORDERED_ACCESS_VIEW_DESC output_buffer_uav_desc; - output_buffer_uav_desc.Format = DXGI_FORMAT_UNKNOWN; - output_buffer_uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; - output_buffer_uav_desc.Buffer.FirstElement = 0; - output_buffer_uav_desc.Buffer.NumElements = 1; - output_buffer_uav_desc.Buffer.Flags = 0; - ThrowIfFailed(d3d.device->CreateUnorderedAccessView(d3d.depth_value_output_buffer.Get(), &output_buffer_uav_desc, d3d.depth_value_output_uav.GetAddressOf())); - - output_buffer_desc.Usage = D3D11_USAGE_STAGING; - output_buffer_desc.BindFlags = 0; - output_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer_copy.GetAddressOf())); - const char* shader_source = R"( sampler my_sampler : register(s0); Texture2D tex : register(t0); -cbuffer coordCB : register(b0) { - float2 coord; -} - +StructuredBuffer coord : register(t1); RWStructuredBuffer output : register(u0); [numthreads(1, 1, 1)] void CSMain(uint3 DTid : SV_DispatchThreadID) { - output[0] = tex.SampleLevel(my_sampler, coord, 0); + output[DTid.x] = tex.Load(int3(coord[DTid.x], 0)); } )"; + + const char* shader_source_msaa = R"( +sampler my_sampler : register(s0); +Texture2DMS tex : register(t0); +StructuredBuffer coord : register(t1); +RWStructuredBuffer output : register(u0); + +[numthreads(1, 1, 1)] +void CSMain(uint3 DTid : SV_DispatchThreadID) { + output[DTid.x] = tex.Load(coord[DTid.x], 0); +} +)"; + #if DEBUG_D3D UINT compile_flags = D3DCOMPILE_DEBUG; #else @@ -426,7 +350,9 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { #endif ComPtr cs, error_blob; - HRESULT hr = d3d.D3DCompile(shader_source, strlen(shader_source), nullptr, nullptr, nullptr, "CSMain", "cs_4_0", compile_flags, 0, cs.GetAddressOf(), error_blob.GetAddressOf()); + HRESULT hr; + + hr = d3d.D3DCompile(shader_source, strlen(shader_source), nullptr, nullptr, nullptr, "CSMain", "cs_4_0", compile_flags, 0, cs.GetAddressOf(), error_blob.GetAddressOf()); if (FAILED(hr)) { char* err = (char*)error_blob->GetBufferPointer(); @@ -436,6 +362,14 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { ThrowIfFailed(d3d.device->CreateComputeShader(cs->GetBufferPointer(), cs->GetBufferSize(), nullptr, d3d.compute_shader.GetAddressOf())); + hr = d3d.D3DCompile(shader_source_msaa, strlen(shader_source_msaa), nullptr, nullptr, nullptr, "CSMain", "cs_4_1", compile_flags, 0, d3d.compute_shader_msaa_blob.GetAddressOf(), error_blob.ReleaseAndGetAddressOf()); + + if (FAILED(hr)) { + char* err = (char*)error_blob->GetBufferPointer(); + MessageBoxA(gfx_dxgi_get_h_wnd(), err, "Error", MB_OK | MB_ICONERROR); + throw hr; + } + // Create ImGui SohImGui::WindowImpl window_impl; @@ -445,8 +379,8 @@ void CSMain(uint3 DTid : SV_DispatchThreadID) { } -static bool gfx_d3d11_z_is_from_0_to_1(void) { - return true; +static struct GfxClipParameters gfx_d3d11_get_clip_parameters(void) { + return { true, false }; } static void gfx_d3d11_unload_shader(struct ShaderProgram *old_prg) { @@ -514,6 +448,9 @@ static struct ShaderProgram *gfx_d3d11_create_and_load_new_shader(uint64_t shade if (cc_features.opt_fog) { ied[ied_index++] = { "FOG", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }; } + if (cc_features.opt_grayscale) { + ied[ied_index++] = { "GRAYSCALE", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }; + } for (unsigned int i = 0; i < cc_features.num_inputs; i++) { DXGI_FORMAT format = cc_features.opt_alpha ? DXGI_FORMAT_R32G32B32A32_FLOAT : DXGI_FORMAT_R32G32B32_FLOAT; ied[ied_index++] = { "INPUT", i, format, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }; @@ -531,8 +468,8 @@ static struct ShaderProgram *gfx_d3d11_create_and_load_new_shader(uint64_t shade blend_desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; blend_desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; blend_desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; - blend_desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; - blend_desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; + blend_desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ZERO; + blend_desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ONE; // We initially clear alpha to 1.0f and want to keep it at 1.0f blend_desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; blend_desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; } else { @@ -592,6 +529,10 @@ static D3D11_TEXTURE_ADDRESS_MODE gfx_cm_to_d3d11(uint32_t val) { static void gfx_d3d11_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) { // Create texture + TextureData *texture_data = &d3d.textures[d3d.current_texture_ids[d3d.current_tile]]; + texture_data->width = width; + texture_data->height = height; + D3D11_TEXTURE2D_DESC texture_desc; ZeroMemory(&texture_desc, sizeof(D3D11_TEXTURE2D_DESC)); @@ -612,21 +553,11 @@ static void gfx_d3d11_upload_texture(const uint8_t *rgba32_buf, uint32_t width, resource_data.SysMemPitch = width * 4; resource_data.SysMemSlicePitch = resource_data.SysMemPitch * height; - ComPtr texture; - ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, &resource_data, texture.GetAddressOf())); - - TextureData *texture_data = &d3d.textures[d3d.current_texture_ids[d3d.current_tile]]; - texture_data->width = width; - texture_data->height = height; + ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, &resource_data, texture_data->texture.ReleaseAndGetAddressOf())); // Create shader resource view from texture - if (texture_data->resource_view.Get() != nullptr) { - // Free the previous texture in this slot - texture_data->resource_view.Reset(); - } - - ThrowIfFailed(d3d.device->CreateShaderResourceView(texture.Get(), nullptr, texture_data->resource_view.GetAddressOf())); + ThrowIfFailed(d3d.device->CreateShaderResourceView(texture_data->texture.Get(), nullptr, texture_data->resource_view.ReleaseAndGetAddressOf())); } static void gfx_d3d11_set_sampler_parameters(int tile, bool linear_filter, uint32_t cms, uint32_t cmt) { @@ -803,20 +734,10 @@ static void gfx_d3d11_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_t } static void gfx_d3d11_on_resize(void) { - create_render_target_views(true); + //create_render_target_views(true); } static void gfx_d3d11_start_frame(void) { - // Set render targets - - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), d3d.depth_stencil_view.Get()); - - // Clear render targets - - const float clearColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - d3d.context->ClearRenderTargetView(d3d.backbuffer_view.Get(), clearColor); - d3d.context->ClearDepthStencilView(d3d.depth_stencil_view.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); - // Set per-frame constant buffer d3d.per_frame_cb_data.noise_frame++; @@ -824,22 +745,9 @@ static void gfx_d3d11_start_frame(void) { // No high values, as noise starts to look ugly d3d.per_frame_cb_data.noise_frame = 0; } - float aspect_ratio = (float) d3d.current_width / (float) d3d.current_height; - d3d.render_target_height = d3d.current_height; - d3d.per_frame_cb_data.noise_scale_x = 120 * aspect_ratio; // 120 = N64 height resolution (240) / 2 - d3d.per_frame_cb_data.noise_scale_y = 120; - - D3D11_MAPPED_SUBRESOURCE ms; - ZeroMemory(&ms, sizeof(D3D11_MAPPED_SUBRESOURCE)); - d3d.context->Map(d3d.per_frame_cb.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); - memcpy(ms.pData, &d3d.per_frame_cb_data, sizeof(PerFrameCB)); - d3d.context->Unmap(d3d.per_frame_cb.Get(), 0); - - d3d.copied_depth_buffer = false; } static void gfx_d3d11_end_frame(void) { - SohImGui::Draw(); d3d.context->Flush(); } @@ -847,43 +755,13 @@ static void gfx_d3d11_finish_render(void) { d3d.context->Flush(); } -void gfx_d3d11_resize_framebuffer(int fb, uint32_t width, uint32_t height) { - FramebufferData& fd = d3d.framebuffers[fb]; - TextureData& td = d3d.textures[fd.texture_id]; - - ComPtr texture, depth_stencil_texture; - - D3D11_TEXTURE2D_DESC texture_desc; - texture_desc.Width = width; - texture_desc.Height = height; - texture_desc.Usage = D3D11_USAGE_DEFAULT; - texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; - texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - texture_desc.CPUAccessFlags = 0; - texture_desc.MiscFlags = 0; - texture_desc.ArraySize = 1; - texture_desc.MipLevels = 1; - texture_desc.SampleDesc.Count = 1; - texture_desc.SampleDesc.Quality = 0; - - ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, texture.GetAddressOf())); - create_depth_stencil_objects(width, height, depth_stencil_texture.GetAddressOf(), fd.depth_stencil_view.ReleaseAndGetAddressOf(), nullptr); - ThrowIfFailed(d3d.device->CreateRenderTargetView(texture.Get(), nullptr, fd.render_target_view.ReleaseAndGetAddressOf())); - ThrowIfFailed(d3d.device->CreateShaderResourceView(texture.Get(), nullptr, td.resource_view.ReleaseAndGetAddressOf())); - - td.width = width; - td.height = height; -} - -int gfx_d3d11_create_framebuffer(uint32_t width, uint32_t height) { +int gfx_d3d11_create_framebuffer(void) { uint32_t texture_id = gfx_d3d11_new_texture(); TextureData& t = d3d.textures[texture_id]; - t.width = width; - t.height = height; size_t index = d3d.framebuffers.size(); d3d.framebuffers.resize(d3d.framebuffers.size() + 1); - FramebufferData& data = d3d.framebuffers.back(); + Framebuffer& data = d3d.framebuffers.back(); data.texture_id = texture_id; uint32_t tile = 0; @@ -892,24 +770,109 @@ int gfx_d3d11_create_framebuffer(uint32_t width, uint32_t height) { gfx_d3d11_set_sampler_parameters(0, true, G_TX_WRAP, G_TX_WRAP); d3d.current_texture_ids[tile] = saved; - gfx_d3d11_resize_framebuffer(index, width, height); - return (int)index; } -void gfx_d3d11_set_framebuffer(int fb) { - d3d.render_target_height = d3d.textures[d3d.framebuffers[fb].texture_id].height; +static void gfx_d3d11_update_framebuffer_parameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth) { + Framebuffer& fb = d3d.framebuffers[fb_id]; + TextureData& tex = d3d.textures[fb.texture_id]; - d3d.context->OMSetRenderTargets(1, d3d.framebuffers[fb].render_target_view.GetAddressOf(), d3d.framebuffers[fb].depth_stencil_view.Get()); + width = max(width, 1U); + height = max(height, 1U); + while (msaa_level > 1 && d3d.msaa_num_quality_levels[msaa_level - 1] == 0) { + --msaa_level; + } - const float clearColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; - d3d.context->ClearRenderTargetView(d3d.framebuffers[fb].render_target_view.Get(), clearColor); - d3d.context->ClearDepthStencilView(d3d.framebuffers[fb].depth_stencil_view.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); + bool diff = tex.width != width || tex.height != height || fb.msaa_level != msaa_level; + + if (diff || (fb.render_target_view.Get() != nullptr) != render_target) { + if (fb_id != 0) { + D3D11_TEXTURE2D_DESC texture_desc; + texture_desc.Width = width; + texture_desc.Height = height; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = (msaa_level <= 1 ? D3D11_BIND_SHADER_RESOURCE : 0) | (render_target ? D3D11_BIND_RENDER_TARGET : 0); + texture_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + texture_desc.CPUAccessFlags = 0; + texture_desc.MiscFlags = 0; + texture_desc.ArraySize = 1; + texture_desc.MipLevels = 1; + texture_desc.SampleDesc.Count = msaa_level; + texture_desc.SampleDesc.Quality = 0; + + ThrowIfFailed(d3d.device->CreateTexture2D(&texture_desc, nullptr, tex.texture.ReleaseAndGetAddressOf())); + + if (msaa_level <= 1) { + ThrowIfFailed(d3d.device->CreateShaderResourceView(tex.texture.Get(), nullptr, tex.resource_view.ReleaseAndGetAddressOf())); + } + } else if (diff) { + DXGI_SWAP_CHAIN_DESC1 desc1; + ThrowIfFailed(d3d.swap_chain->GetDesc1(&desc1)); + if (desc1.Width != width || desc1.Height != height) { + fb.render_target_view.Reset(); + tex.texture.Reset(); + ThrowIfFailed(d3d.swap_chain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, desc1.Flags)); + } + ThrowIfFailed(d3d.swap_chain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID *)tex.texture.ReleaseAndGetAddressOf())); + } + if (render_target) { + ThrowIfFailed(d3d.device->CreateRenderTargetView(tex.texture.Get(), nullptr, fb.render_target_view.ReleaseAndGetAddressOf())); + } + + tex.width = width; + tex.height = height; + } + + if (has_depth_buffer && (diff || !fb.has_depth_buffer || (fb.depth_stencil_srv.Get() != nullptr) != can_extract_depth)) { + fb.depth_stencil_srv.Reset(); + create_depth_stencil_objects(width, height, msaa_level, fb.depth_stencil_view.ReleaseAndGetAddressOf(), can_extract_depth ? fb.depth_stencil_srv.GetAddressOf() : nullptr); + } + if (!has_depth_buffer) { + fb.depth_stencil_view.Reset(); + fb.depth_stencil_srv.Reset(); + } + + fb.has_depth_buffer = has_depth_buffer; + fb.msaa_level = msaa_level; } -void gfx_d3d11_reset_framebuffer(void) { - d3d.render_target_height = d3d.current_height; - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), d3d.depth_stencil_view.Get()); +void gfx_d3d11_start_draw_to_framebuffer(int fb_id, float noise_scale) { + Framebuffer& fb = d3d.framebuffers[fb_id]; + d3d.render_target_height = d3d.textures[fb.texture_id].height; + + d3d.context->OMSetRenderTargets(1, fb.render_target_view.GetAddressOf(), fb.has_depth_buffer ? fb.depth_stencil_view.Get() : nullptr); + + d3d.current_framebuffer = fb_id; + + if (noise_scale != 0.0f) { + d3d.per_frame_cb_data.noise_scale = 1.0f / noise_scale; + } + + D3D11_MAPPED_SUBRESOURCE ms; + ZeroMemory(&ms, sizeof(D3D11_MAPPED_SUBRESOURCE)); + d3d.context->Map(d3d.per_frame_cb.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms); + memcpy(ms.pData, &d3d.per_frame_cb_data, sizeof(PerFrameCB)); + d3d.context->Unmap(d3d.per_frame_cb.Get(), 0); +} + +void gfx_d3d11_clear_framebuffer(void) { + Framebuffer& fb = d3d.framebuffers[d3d.current_framebuffer]; + const float clearColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; + d3d.context->ClearRenderTargetView(fb.render_target_view.Get(), clearColor); + if (fb.has_depth_buffer) { + d3d.context->ClearDepthStencilView(fb.depth_stencil_view.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); + } +} + +void gfx_d3d11_resolve_msaa_color_buffer(int fb_id_target, int fb_id_source) { + Framebuffer& fb_dst = d3d.framebuffers[fb_id_target]; + Framebuffer& fb_src = d3d.framebuffers[fb_id_source]; + + d3d.context->ResolveSubresource(d3d.textures[fb_dst.texture_id].texture.Get(), 0, d3d.textures[fb_src.texture_id].texture.Get(), 0, DXGI_FORMAT_R8G8B8A8_UNORM); +} + +void *gfx_d3d11_get_framebuffer_texture_id(int fb_id) { + return (void *)d3d.textures[d3d.framebuffers[fb_id].texture_id].resource_view.Get(); } void gfx_d3d11_select_texture_fb(int fbID) { @@ -917,72 +880,117 @@ void gfx_d3d11_select_texture_fb(int fbID) { gfx_d3d11_select_texture(tile, d3d.framebuffers[fbID].texture_id); } -uint16_t gfx_d3d11_get_pixel_depth(float x, float y) { +std::map, uint16_t> gfx_d3d11_get_pixel_depth(int fb_id, const std::set>& coordinates) { + Framebuffer& fb = d3d.framebuffers[fb_id]; + TextureData& td = d3d.textures[fb.texture_id]; + + if (coordinates.size() > d3d.coord_buffer_size) { + d3d.coord_buffer.Reset(); + d3d.coord_buffer_srv.Reset(); + d3d.depth_value_output_buffer.Reset(); + d3d.depth_value_output_uav.Reset(); + d3d.depth_value_output_buffer_copy.Reset(); + + D3D11_BUFFER_DESC coord_buf_desc; + coord_buf_desc.Usage = D3D11_USAGE_DYNAMIC; + coord_buf_desc.ByteWidth = sizeof(Coord) * coordinates.size(); + coord_buf_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + coord_buf_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + coord_buf_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + coord_buf_desc.StructureByteStride = sizeof(Coord); + + ThrowIfFailed(d3d.device->CreateBuffer(&coord_buf_desc, nullptr, d3d.coord_buffer.GetAddressOf())); + + D3D11_SHADER_RESOURCE_VIEW_DESC coord_buf_srv_desc; + coord_buf_srv_desc.Format = DXGI_FORMAT_UNKNOWN; + coord_buf_srv_desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; + coord_buf_srv_desc.Buffer.FirstElement = 0; + coord_buf_srv_desc.Buffer.NumElements = coordinates.size(); + + ThrowIfFailed(d3d.device->CreateShaderResourceView(d3d.coord_buffer.Get(), &coord_buf_srv_desc, d3d.coord_buffer_srv.GetAddressOf())); + + D3D11_BUFFER_DESC output_buffer_desc; + output_buffer_desc.Usage = D3D11_USAGE_DEFAULT; + output_buffer_desc.ByteWidth = sizeof(float) * coordinates.size(); + output_buffer_desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS; + output_buffer_desc.CPUAccessFlags = 0; + output_buffer_desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + output_buffer_desc.StructureByteStride = sizeof(float); + ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer.GetAddressOf())); + + D3D11_UNORDERED_ACCESS_VIEW_DESC output_buffer_uav_desc; + output_buffer_uav_desc.Format = DXGI_FORMAT_UNKNOWN; + output_buffer_uav_desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + output_buffer_uav_desc.Buffer.FirstElement = 0; + output_buffer_uav_desc.Buffer.NumElements = coordinates.size(); + output_buffer_uav_desc.Buffer.Flags = 0; + ThrowIfFailed(d3d.device->CreateUnorderedAccessView(d3d.depth_value_output_buffer.Get(), &output_buffer_uav_desc, d3d.depth_value_output_uav.GetAddressOf())); + + output_buffer_desc.Usage = D3D11_USAGE_STAGING; + output_buffer_desc.BindFlags = 0; + output_buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + ThrowIfFailed(d3d.device->CreateBuffer(&output_buffer_desc, nullptr, d3d.depth_value_output_buffer_copy.GetAddressOf())); + + d3d.coord_buffer_size = coordinates.size(); + } + D3D11_MAPPED_SUBRESOURCE ms; + if (fb.msaa_level > 1 && d3d.compute_shader_msaa.Get() == nullptr) { + ThrowIfFailed(d3d.device->CreateComputeShader(d3d.compute_shader_msaa_blob->GetBufferPointer(), d3d.compute_shader_msaa_blob->GetBufferSize(), nullptr, d3d.compute_shader_msaa.GetAddressOf())); + } + // ImGui overwrites these values, so we cannot set them once at init - d3d.context->CSSetShader(d3d.compute_shader.Get(), nullptr, 0); - d3d.context->CSSetConstantBuffers(0, 1, d3d.coord_buffer.GetAddressOf()); - d3d.context->CSSetSamplers(0, 1, d3d.depth_value_sampler.GetAddressOf()); + d3d.context->CSSetShader(fb.msaa_level > 1 ? d3d.compute_shader_msaa.Get() : d3d.compute_shader.Get(), nullptr, 0); d3d.context->CSSetUnorderedAccessViews(0, 1, d3d.depth_value_output_uav.GetAddressOf(), nullptr); ThrowIfFailed(d3d.context->Map(d3d.coord_buffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &ms)); - CoordCB* coord_cb = (CoordCB*)ms.pData; - coord_cb->x = x / d3d.current_width; - // We invert y because the game assumes OpenGL coordinates (bottom-left corner is origin), while DX's origin is top-left corner - coord_cb->y = 1 - y / d3d.current_height; + Coord *coord_cb = (Coord *)ms.pData; + { + size_t i = 0; + for (const auto& coord : coordinates) { + coord_cb[i].x = coord.first; + // We invert y because the gfx_pc assumes OpenGL coordinates (bottom-left corner is origin), while DX's origin is top-left corner + coord_cb[i].y = td.height - 1 - coord.second; + ++i; + } + } d3d.context->Unmap(d3d.coord_buffer.Get(), 0); - // The depth stencil texture can only have one mapping at a time, so temporarily unbind from the OM - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), nullptr); - d3d.context->CSSetShaderResources(0, 1, d3d.depth_stencil_srv.GetAddressOf()); + // The depth stencil texture can only have one mapping at a time, so unbind from the OM + ID3D11RenderTargetView* null_arr1[1] = { nullptr }; + d3d.context->OMSetRenderTargets(1, null_arr1, nullptr); - d3d.context->Dispatch(1, 1, 1); + ID3D11ShaderResourceView *srvs[] = { fb.depth_stencil_srv.Get(), d3d.coord_buffer_srv.Get() }; + d3d.context->CSSetShaderResources(0, 2, srvs); + + d3d.context->Dispatch(coordinates.size(), 1, 1); d3d.context->CopyResource(d3d.depth_value_output_buffer_copy.Get(), d3d.depth_value_output_buffer.Get()); ThrowIfFailed(d3d.context->Map(d3d.depth_value_output_buffer_copy.Get(), 0, D3D11_MAP_READ, 0, &ms)); - float res = *(float *)ms.pData; - d3d.context->Unmap(d3d.depth_value_output_buffer_copy.Get(), 0); - - ID3D11ShaderResourceView *null_arr[1] = { nullptr }; - d3d.context->CSSetShaderResources(0, 1, null_arr); - d3d.context->OMSetRenderTargets(1, d3d.backbuffer_view.GetAddressOf(), d3d.depth_stencil_view.Get()); - - return res * 65532.0f; -} - -uint16_t gfx_d3d11_get_pixel_depth_old(float x, float y) { - // This approach, compared to using a compute shader, might have better performance on nvidia cards - - if (!d3d.copied_depth_buffer) { - d3d.context->CopyResource(d3d.depth_stencil_copy_texture.Get(), d3d.depth_stencil_texture.Get()); - d3d.copied_depth_buffer = true; - } - - D3D11_MAPPED_SUBRESOURCE mapping_desc; - d3d.context->Map(d3d.depth_stencil_copy_texture.Get(), 0, D3D11_MAP_READ, 0, &mapping_desc); - float res = 0; - if (mapping_desc.pData != nullptr) { - float *addr = (float *)mapping_desc.pData; - uint32_t num_pixels = mapping_desc.DepthPitch / sizeof(float); - uint32_t width = mapping_desc.RowPitch / sizeof(float); - uint32_t height = width == 0 ? 0 : num_pixels / width; - if (x >= 0 && x < width && y >= 0 && y < height) { - res = addr[width * (height - 1 - (int)y) + (int)x]; + std::map, uint16_t> res; + { + size_t i = 0; + for (const auto& coord : coordinates) { + res.emplace(coord, ((float *)ms.pData)[i++] * 65532.0f); } } - d3d.context->Unmap(d3d.depth_stencil_copy_texture.Get(), 0); - return res * 65532.0f; + d3d.context->Unmap(d3d.depth_value_output_buffer_copy.Get(), 0); + + ID3D11ShaderResourceView *null_arr[2] = { nullptr, nullptr }; + d3d.context->CSSetShaderResources(0, 2, null_arr); + + return res; } } // namespace -void* SohImGui::GetTextureByID(int id) { - return d3d.textures[id].resource_view.Get(); +ImTextureID gfx_d3d11_get_texture_by_id(int id) { + return impl.backend == Backend::DX11 ? d3d.textures[id].resource_view.Get() : reinterpret_cast(id); } struct GfxRenderingAPI gfx_direct3d11_api = { - gfx_d3d11_z_is_from_0_to_1, + gfx_d3d11_get_clip_parameters, gfx_d3d11_unload_shader, gfx_d3d11_load_shader, gfx_d3d11_create_and_load_new_shader, @@ -993,7 +1001,6 @@ struct GfxRenderingAPI gfx_direct3d11_api = { gfx_d3d11_upload_texture, gfx_d3d11_set_sampler_parameters, gfx_d3d11_set_depth_test_and_mask, - gfx_d3d11_get_pixel_depth, gfx_d3d11_set_zmode_decal, gfx_d3d11_set_viewport, gfx_d3d11_set_scissor, @@ -1005,9 +1012,12 @@ struct GfxRenderingAPI gfx_direct3d11_api = { gfx_d3d11_end_frame, gfx_d3d11_finish_render, gfx_d3d11_create_framebuffer, - gfx_d3d11_resize_framebuffer, - gfx_d3d11_set_framebuffer, - gfx_d3d11_reset_framebuffer, + gfx_d3d11_update_framebuffer_parameters, + gfx_d3d11_start_draw_to_framebuffer, + gfx_d3d11_clear_framebuffer, + gfx_d3d11_resolve_msaa_color_buffer, + gfx_d3d11_get_pixel_depth, + gfx_d3d11_get_framebuffer_texture_id, gfx_d3d11_select_texture_fb, gfx_d3d11_delete_texture }; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp index ca60aef8b..2c10e6605 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_direct3d_common.cpp @@ -134,13 +134,14 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f } } } - if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(buf, &len, " float4 screenPos : TEXCOORD2;"); - } if (cc_features.opt_fog) { append_line(buf, &len, " float4 fog : FOG;"); num_floats += 4; } + if (cc_features.opt_grayscale) { + append_line(buf, &len, " float4 grayscale : GRAYSCALE;"); + num_floats += 4; + } for (int i = 0; i < cc_features.num_inputs; i++) { len += sprintf(buf + len, " float%d input%d : INPUT%d;\r\n", cc_features.opt_alpha ? 4 : 3, i + 1, i); num_floats += cc_features.opt_alpha ? 4 : 3; @@ -163,7 +164,7 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_alpha && cc_features.opt_noise) { append_line(buf, &len, "cbuffer PerFrameCB : register(b0) {"); append_line(buf, &len, " uint noise_frame;"); - append_line(buf, &len, " float2 noise_scale;"); + append_line(buf, &len, " float noise_scale;"); append_line(buf, &len, "}"); append_line(buf, &len, "float random(in float3 value) {"); @@ -211,15 +212,15 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_fog) { append_str(buf, &len, ", float4 fog : FOG"); } + if (cc_features.opt_grayscale) { + append_str(buf, &len, ", float4 grayscale : GRAYSCALE"); + } for (int i = 0; i < cc_features.num_inputs; i++) { len += sprintf(buf + len, ", float%d input%d : INPUT%d", cc_features.opt_alpha ? 4 : 3, i + 1, i); } append_line(buf, &len, ") {"); append_line(buf, &len, " PSInput result;"); append_line(buf, &len, " result.position = position;"); - if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(buf, &len, " result.screenPos = position;"); - } for (int i = 0; i < 2; i++) { if (cc_features.used_textures[i]) { len += sprintf(buf + len, " result.uv%d = uv%d;\r\n", i, i); @@ -234,6 +235,9 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (cc_features.opt_fog) { append_line(buf, &len, " result.fog = fog;"); } + if (cc_features.opt_grayscale) { + append_line(buf, &len, " result.grayscale = grayscale;"); + } for (int i = 0; i < cc_features.num_inputs; i++) { len += sprintf(buf + len, " result.input%d = input%d;\r\n", i + 1, i + 1); } @@ -244,7 +248,11 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f if (include_root_signature) { append_line(buf, &len, "[RootSignature(RS)]"); } - append_line(buf, &len, "float4 PSMain(PSInput input) : SV_TARGET {"); + if (cc_features.opt_alpha && cc_features.opt_noise) { + append_line(buf, &len, "float4 PSMain(PSInput input, float4 screenSpace : SV_Position) : SV_TARGET {"); + } else { + append_line(buf, &len, "float4 PSMain(PSInput input) : SV_TARGET {"); + } for (int i = 0; i < 2; i++) { if (cc_features.used_textures[i]) { len += sprintf(buf + len, " float2 tc%d = input.uv%d;\r\n", i, i); @@ -300,8 +308,14 @@ void gfx_direct3d_common_build_shader(char buf[4096], size_t& len, size_t& num_f } } + if (cc_features.opt_grayscale) { + append_line(buf, &len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); + append_line(buf, &len, "float3 new_texel = input.grayscale.rgb * intensity;"); + append_line(buf, &len, "texel.rgb = lerp(texel.rgb, new_texel, input.grayscale.a);"); + } + if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(buf, &len, " float2 coords = (input.screenPos.xy / input.screenPos.w) * noise_scale;"); + append_line(buf, &len, " float2 coords = screenSpace.xy * noise_scale;"); append_line(buf, &len, " texel.a *= round(saturate(random(float3(floor(coords), noise_frame)) + texel.a - 0.5));"); } diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp index 6cfc3cf32..49abe0b28 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_dxgi.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -61,6 +62,7 @@ static struct { RECT last_window_rect; bool is_full_screen, last_maximized_state; + bool dxgi1_4; ComPtr factory; ComPtr swap_chain; HANDLE waitable_object; @@ -197,17 +199,6 @@ static void toggle_borderless_window_full_screen(bool enable, bool call_callback } } -static void gfx_dxgi_on_resize(void) { - if (dxgi.swap_chain.Get() != nullptr) { - gfx_get_current_rendering_api()->on_resize(); - - DXGI_SWAP_CHAIN_DESC1 desc1; - ThrowIfFailed(dxgi.swap_chain->GetDesc1(&desc1)); - dxgi.current_width = desc1.Width; - dxgi.current_height = desc1.Height; - } -} - static void onkeydown(WPARAM w_param, LPARAM l_param) { int key = ((l_param >> 16) & 0x1ff); if (dxgi.on_key_down != nullptr) { @@ -227,7 +218,8 @@ static LRESULT CALLBACK gfx_dxgi_wnd_proc(HWND h_wnd, UINT message, WPARAM w_par SohImGui::Update(event_impl); switch (message) { case WM_SIZE: - gfx_dxgi_on_resize(); + dxgi.current_width = (uint32_t)(l_param & 0xffff); + dxgi.current_height = (uint32_t)(l_param >> 16); break; case WM_DESTROY: exit(0); @@ -573,6 +565,13 @@ void gfx_dxgi_create_factory_and_device(bool debug, int d3d_version, bool (*crea ThrowIfFailed(dxgi.CreateDXGIFactory1(__uuidof(IDXGIFactory2), &dxgi.factory)); } + { + ComPtr factory4; + if (dxgi.factory->QueryInterface(__uuidof(IDXGIFactory4), &factory4) == S_OK) { + dxgi.dxgi1_4 = true; + } + } + ComPtr adapter; for (UINT i = 0; dxgi.factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND; i++) { DXGI_ADAPTER_DESC1 desc; @@ -604,7 +603,9 @@ ComPtr gfx_dxgi_create_swap_chain(IUnknown *device) { swap_chain_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swap_chain_desc.Scaling = win8 ? DXGI_SCALING_NONE : DXGI_SCALING_STRETCH; - swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // Apparently this was backported to Win 7 Platform Update + swap_chain_desc.SwapEffect = dxgi.dxgi1_4 ? + DXGI_SWAP_EFFECT_FLIP_DISCARD : // Introduced in DXGI 1.4 and Windows 10 + DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // Apparently flip sequential was also backported to Win 7 Platform Update swap_chain_desc.Flags = dxgi_13 ? DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT : 0; swap_chain_desc.SampleDesc.Count = 1; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp index 629fd9fd7..42597f025 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_opengl.cpp @@ -53,19 +53,33 @@ struct ShaderProgram { uint8_t num_attribs; bool used_noise; GLint frame_count_location; - GLint window_height_location; + GLint noise_scale_location; +}; + +struct Framebuffer { + uint32_t width, height; + bool has_depth_buffer; + uint32_t msaa_level; + bool invert_y; + + GLuint fbo, clrbuf, clrbuf_msaa, rbo; }; static map, struct ShaderProgram> shader_program_pool; static GLuint opengl_vbo; - -static uint32_t frame_count; -static uint32_t current_height; -static map> fb2tex; static bool current_depth_mask; -static bool gfx_opengl_z_is_from_0_to_1(void) { - return false; +static uint32_t frame_count; + +static vector framebuffers; +static size_t current_framebuffer; +static float current_noise_scale; + +GLuint pixel_depth_rb, pixel_depth_fb; +size_t pixel_depth_rb_size; + +static struct GfxClipParameters gfx_opengl_get_clip_parameters(void) { + return { false, framebuffers[current_framebuffer].invert_y }; } static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) { @@ -82,7 +96,7 @@ static void gfx_opengl_vertex_array_set_attribs(struct ShaderProgram *prg) { static void gfx_opengl_set_uniforms(struct ShaderProgram *prg) { if (prg->used_noise) { glUniform1i(prg->frame_count_location, frame_count); - glUniform1i(prg->window_height_location, current_height); + glUniform1f(prg->noise_scale_location, current_noise_scale); } } @@ -226,6 +240,13 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad append_line(vs_buf, &vs_len, "varying vec4 vFog;"); num_floats += 4; } + + if (cc_features.opt_grayscale) { + append_line(vs_buf, &vs_len, "attribute vec4 aGrayscaleColor;"); + append_line(vs_buf, &vs_len, "varying vec4 vGrayscaleColor;"); + num_floats += 4; + } + for (int i = 0; i < cc_features.num_inputs; i++) { vs_len += sprintf(vs_buf + vs_len, "attribute vec%d aInput%d;\n", cc_features.opt_alpha ? 4 : 3, i + 1); vs_len += sprintf(vs_buf + vs_len, "varying vec%d vInput%d;\n", cc_features.opt_alpha ? 4 : 3, i + 1); @@ -245,6 +266,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_fog) { append_line(vs_buf, &vs_len, "vFog = aFog;"); } + if (cc_features.opt_grayscale) { + append_line(vs_buf, &vs_len, "vGrayscaleColor = aGrayscaleColor;"); + } for (int i = 0; i < cc_features.num_inputs; i++) { vs_len += sprintf(vs_buf + vs_len, "vInput%d = aInput%d;\n", i + 1, i + 1); } @@ -267,6 +291,9 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_fog) { append_line(fs_buf, &fs_len, "varying vec4 vFog;"); } + if (cc_features.opt_grayscale) { + append_line(fs_buf, &fs_len, "varying vec4 vGrayscaleColor;"); + } for (int i = 0; i < cc_features.num_inputs; i++) { fs_len += sprintf(fs_buf + fs_len, "varying vec%d vInput%d;\n", cc_features.opt_alpha ? 4 : 3, i + 1); } @@ -279,7 +306,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_alpha && cc_features.opt_noise) { append_line(fs_buf, &fs_len, "uniform int frame_count;"); - append_line(fs_buf, &fs_len, "uniform int window_height;"); + append_line(fs_buf, &fs_len, "uniform float noise_scale;"); append_line(fs_buf, &fs_len, "float random(in vec3 value) {"); append_line(fs_buf, &fs_len, " float random = dot(sin(value), vec3(12.9898, 78.233, 37.719));"); @@ -340,7 +367,13 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad } if (cc_features.opt_alpha && cc_features.opt_noise) { - append_line(fs_buf, &fs_len, "texel.a *= floor(clamp(random(vec3(floor(gl_FragCoord.xy * (240.0 / float(window_height))), float(frame_count))) + texel.a, 0.0, 1.0));"); + append_line(fs_buf, &fs_len, "texel.a *= floor(clamp(random(vec3(floor(gl_FragCoord.xy * noise_scale), float(frame_count))) + texel.a, 0.0, 1.0));"); + } + + if (cc_features.opt_grayscale) { + append_line(fs_buf, &fs_len, "float intensity = (texel.r + texel.g + texel.b) / 3.0;"); + append_line(fs_buf, &fs_len, "vec3 new_texel = vGrayscaleColor.rgb * intensity;"); + append_line(fs_buf, &fs_len, "texel.rgb = mix(texel.rgb, new_texel, vGrayscaleColor.a);"); } if (cc_features.opt_alpha) { @@ -434,6 +467,12 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad ++cnt; } + if (cc_features.opt_grayscale) { + prg->attrib_locations[cnt] = glGetAttribLocation(shader_program, "aGrayscaleColor"); + prg->attrib_sizes[cnt] = 4; + ++cnt; + } + for (int i = 0; i < cc_features.num_inputs; i++) { char name[16]; sprintf(name, "aInput%d", i + 1); @@ -462,7 +501,7 @@ static struct ShaderProgram* gfx_opengl_create_and_load_new_shader(uint64_t shad if (cc_features.opt_alpha && cc_features.opt_noise) { prg->frame_count_location = glGetUniformLocation(shader_program, "frame_count"); - prg->window_height_location = glGetUniformLocation(shader_program, "window_height"); + prg->noise_scale_location = glGetUniformLocation(shader_program, "noise_scale"); prg->used_noise = true; } else { prg->used_noise = false; @@ -498,7 +537,7 @@ static void gfx_opengl_select_texture(int tile, GLuint texture_id) { } static void gfx_opengl_upload_texture(const uint8_t *rgba32_buf, uint32_t width, uint32_t height) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgba32_buf); } static uint32_t gfx_cm_to_opengl(uint32_t val) { @@ -546,7 +585,6 @@ static void gfx_opengl_set_zmode_decal(bool zmode_decal) { static void gfx_opengl_set_viewport(int x, int y, int width, int height) { glViewport(x, y, width, height); - current_height = height; } static void gfx_opengl_set_scissor(int x, int y, int width, int height) { @@ -567,10 +605,6 @@ static void gfx_opengl_draw_triangles(float buf_vbo[], size_t buf_vbo_len, size_ glDrawArrays(GL_TRIANGLES, 0, 3 * buf_vbo_num_tris); } -static unsigned int framebuffer; -static unsigned int textureColorbuffer; -static unsigned int rbo; - static void gfx_opengl_init(void) { //#if FOR_WINDOWS glewInit(); @@ -579,137 +613,214 @@ static void gfx_opengl_init(void) { glGenBuffers(1, &opengl_vbo); glBindBuffer(GL_ARRAY_BUFFER, opengl_vbo); - glGenFramebuffers(1, &framebuffer); - glGenTextures(1, &textureColorbuffer); - glGenRenderbuffers(1, &rbo); - - SohUtils::saveEnvironmentVar("framebuffer", std::to_string(textureColorbuffer)); glDepthFunc(GL_LEQUAL); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + framebuffers.resize(1); // for the default screen buffer + + glGenRenderbuffers(1, &pixel_depth_rb); + glBindRenderbuffer(GL_RENDERBUFFER, pixel_depth_rb); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1, 1); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + glGenFramebuffers(1, &pixel_depth_fb); + glBindFramebuffer(GL_FRAMEBUFFER, pixel_depth_fb); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, pixel_depth_rb); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + pixel_depth_rb_size = 1; } static void gfx_opengl_on_resize(void) { } static void gfx_opengl_start_frame(void) { - GLsizei framebuffer_width = gfx_current_dimensions.width; - GLsizei framebuffer_height = gfx_current_dimensions.height; - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - std::shared_ptr wnd = Ship::GlobalCtx2::GetInstance()->GetWindow(); - glBindTexture(GL_TEXTURE_2D, textureColorbuffer); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, framebuffer_width, framebuffer_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); - glBindRenderbuffer(GL_RENDERBUFFER, rbo); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, framebuffer_width, framebuffer_height); // use a single renderbuffer object for both a depth AND stencil buffer. - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); // now actually attach it - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - frame_count++; - - glDisable(GL_SCISSOR_TEST); - glDepthMask(GL_TRUE); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glEnable(GL_SCISSOR_TEST); - glEnable(GL_DEPTH_CLAMP); - current_depth_mask = true; } static void gfx_opengl_end_frame(void) { - - glBindFramebuffer(GL_FRAMEBUFFER, 0); - glClearColor(1.0f, 1.0f, 1.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - GLint last_program; - glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); - glUseProgram(0); - SohImGui::Draw(); - glUseProgram(last_program); + glFlush(); } static void gfx_opengl_finish_render(void) { } -static int gfx_opengl_create_framebuffer(uint32_t width, uint32_t height) { - GLuint textureColorbuffer; - - glGenTextures(1, &textureColorbuffer); - glBindTexture(GL_TEXTURE_2D, textureColorbuffer); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); +static int gfx_opengl_create_framebuffer() { + GLuint clrbuf; + glGenTextures(1, &clrbuf); + glBindTexture(GL_TEXTURE_2D, clrbuf); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, 0); + GLuint clrbuf_msaa; + glGenRenderbuffers(1, &clrbuf_msaa); + GLuint rbo; glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 1, 1); glBindRenderbuffer(GL_RENDERBUFFER, 0); GLuint fbo; glGenFramebuffers(1, &fbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureColorbuffer, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo); - glBindFramebuffer(GL_FRAMEBUFFER, fbo); + size_t i = framebuffers.size(); + framebuffers.resize(i + 1); - fb2tex[fbo] = make_pair(textureColorbuffer, rbo); + framebuffers[i].fbo = fbo; + framebuffers[i].clrbuf = clrbuf; + framebuffers[i].clrbuf_msaa = clrbuf_msaa; + framebuffers[i].rbo = rbo; - //glBindFramebuffer(GL_FRAMEBUFFER, 0); - - return fbo; + return i; } -static void gfx_opengl_resize_framebuffer(int fb, uint32_t width, uint32_t height) { - glBindTexture(GL_TEXTURE_2D, fb2tex[fb].first); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); - glBindTexture(GL_TEXTURE_2D, 0); +static void gfx_opengl_update_framebuffer_parameters(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth) { + Framebuffer& fb = framebuffers[fb_id]; - glBindRenderbuffer(GL_RENDERBUFFER, fb2tex[fb].second); - glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); - glBindRenderbuffer(GL_RENDERBUFFER, 0); + width = max(width, 1U); + height = max(height, 1U); + + glBindFramebuffer(GL_FRAMEBUFFER, fb.fbo); + + if (fb_id != 0) { + if (fb.width != width || fb.height != height || fb.msaa_level != msaa_level) { + if (msaa_level <= 1) { + glBindTexture(GL_TEXTURE_2D, fb.clrbuf); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); + glBindTexture(GL_TEXTURE_2D, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fb.clrbuf, 0); + } else { + glBindRenderbuffer(GL_RENDERBUFFER, fb.clrbuf_msaa); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa_level, GL_RGB8, width, height); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, fb.clrbuf_msaa); + } + } + + if (has_depth_buffer && (fb.width != width || fb.height != height || fb.msaa_level != msaa_level || !fb.has_depth_buffer)) { + glBindRenderbuffer(GL_RENDERBUFFER, fb.rbo); + if (msaa_level <= 1) { + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height); + } else { + glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa_level, GL_DEPTH24_STENCIL8, width, height); + } + glBindRenderbuffer(GL_RENDERBUFFER, 0); + } + + if (!fb.has_depth_buffer && has_depth_buffer) { + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, fb.rbo); + } else if (fb.has_depth_buffer && !has_depth_buffer) { + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); + } + } + + fb.width = width; + fb.height = height; + fb.has_depth_buffer = has_depth_buffer; + fb.msaa_level = msaa_level; + fb.invert_y = opengl_invert_y; } -void gfx_opengl_set_framebuffer(int fb) -{ - glClipControl(GL_UPPER_LEFT, GL_NEGATIVE_ONE_TO_ONE); // Set origin to upper left corner, to match N64 and DX11 - glBindFramebuffer(GL_FRAMEBUFFER_EXT, fb); +void gfx_opengl_start_draw_to_framebuffer(int fb_id, float noise_scale) { + Framebuffer& fb = framebuffers[fb_id]; + if (noise_scale != 0.0f) { + current_noise_scale = 1.0f / noise_scale; + } + + glBindFramebuffer(GL_FRAMEBUFFER, fb.fbo); + + current_framebuffer = fb_id; +} + +void gfx_opengl_clear_framebuffer() { + glDisable(GL_SCISSOR_TEST); glDepthMask(GL_TRUE); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthMask(current_depth_mask ? GL_TRUE : GL_FALSE); + glEnable(GL_SCISSOR_TEST); } -void gfx_opengl_reset_framebuffer(void) -{ - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glBindFramebuffer(GL_FRAMEBUFFER_EXT, framebuffer); - glClipControl(GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE); +void gfx_opengl_resolve_msaa_color_buffer(int fb_id_target, int fb_id_source) { + Framebuffer& fb_dst = framebuffers[fb_id_target]; + Framebuffer& fb_src = framebuffers[fb_id_source]; + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fb_dst.fbo); + glBindFramebuffer(GL_READ_FRAMEBUFFER, fb_src.fbo); + glBlitFramebuffer(0, 0, fb_src.width, fb_src.height, 0, 0, fb_dst.width, fb_dst.height, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBindFramebuffer(GL_FRAMEBUFFER, current_framebuffer); } -void gfx_opengl_select_texture_fb(int fbID) -{ +void *gfx_opengl_get_framebuffer_texture_id(int fb_id) { + return (void *)(uintptr_t)framebuffers[fb_id].clrbuf; +} + +void gfx_opengl_select_texture_fb(int fb_id) { //glDisable(GL_DEPTH_TEST); glActiveTexture(GL_TEXTURE0 + 0); - glBindTexture(GL_TEXTURE_2D, fb2tex[fbID].first); + glBindTexture(GL_TEXTURE_2D, framebuffers[fb_id].clrbuf); } -static uint16_t gfx_opengl_get_pixel_depth(float x, float y) { - float depth; - glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); - glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - return depth * 65532.0f; +static std::map, uint16_t> gfx_opengl_get_pixel_depth(int fb_id, const std::set>& coordinates) { + std::map, uint16_t> res; + + Framebuffer& fb = framebuffers[fb_id]; + + if (coordinates.size() == 1) { + uint32_t depth_stencil_value; + glBindFramebuffer(GL_FRAMEBUFFER, fb.fbo); + int x = coordinates.begin()->first; + int y = coordinates.begin()->second; + glReadPixels(x, fb.invert_y ? fb.height - y : y, 1, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, &depth_stencil_value); + res.emplace(*coordinates.begin(), (depth_stencil_value >> 18) << 2); + } else { + if (pixel_depth_rb_size < coordinates.size()) { + glBindRenderbuffer(GL_RENDERBUFFER, pixel_depth_rb); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, coordinates.size(), 1); + glBindRenderbuffer(GL_RENDERBUFFER, 0); + + pixel_depth_rb_size = coordinates.size(); + } + + glBindFramebuffer(GL_READ_FRAMEBUFFER, fb.fbo); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, pixel_depth_fb); + + glDisable(GL_SCISSOR_TEST); // needed for the blit operation + + { + size_t i = 0; + for (const auto& coord : coordinates) { + int x = coord.first; + int y = coord.second; + if (fb.invert_y) { + y = fb.height - y; + } + glBlitFramebuffer(x, y, x + 1, y + 1, i, 0, i + 1, 1, GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); + ++i; + } + } + + glBindFramebuffer(GL_READ_FRAMEBUFFER, pixel_depth_fb); + vector depth_stencil_values(coordinates.size()); + glReadPixels(0, 0, coordinates.size(), 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, depth_stencil_values.data()); + + { + size_t i = 0; + for (const auto& coord : coordinates) { + res.emplace(coord, (depth_stencil_values[i++] >> 18) << 2); + } + } + } + + glBindFramebuffer(GL_FRAMEBUFFER, current_framebuffer); + return res; } struct GfxRenderingAPI gfx_opengl_api = { - gfx_opengl_z_is_from_0_to_1, + gfx_opengl_get_clip_parameters, gfx_opengl_unload_shader, gfx_opengl_load_shader, gfx_opengl_create_and_load_new_shader, @@ -720,7 +831,6 @@ struct GfxRenderingAPI gfx_opengl_api = { gfx_opengl_upload_texture, gfx_opengl_set_sampler_parameters, gfx_opengl_set_depth_test_and_mask, - gfx_opengl_get_pixel_depth, gfx_opengl_set_zmode_decal, gfx_opengl_set_viewport, gfx_opengl_set_scissor, @@ -732,9 +842,12 @@ struct GfxRenderingAPI gfx_opengl_api = { gfx_opengl_end_frame, gfx_opengl_finish_render, gfx_opengl_create_framebuffer, - gfx_opengl_resize_framebuffer, - gfx_opengl_set_framebuffer, - gfx_opengl_reset_framebuffer, + gfx_opengl_update_framebuffer_parameters, + gfx_opengl_start_draw_to_framebuffer, + gfx_opengl_clear_framebuffer, + gfx_opengl_resolve_msaa_color_buffer, + gfx_opengl_get_pixel_depth, + gfx_opengl_get_framebuffer_texture_id, gfx_opengl_select_texture_fb, gfx_opengl_delete_texture }; diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp index 1b9be7937..53d778e21 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -28,6 +29,8 @@ #include "../../luslog.h" #include "../StrHash64.h" +#include "../../SohImGuiImpl.h" +#include "../../Environment.h" // OTRTODO: fix header files for these extern "C" { @@ -72,10 +75,6 @@ struct RGBA { uint8_t r, g, b, a; }; -struct XYWidthHeight { - uint16_t x, y, width, height; -}; - struct LoadedVertex { float x, y, z, w; float u, v; @@ -126,7 +125,7 @@ static struct RSP { } rsp; static struct RDP { - const uint8_t *palette; + const uint8_t *palettes[2]; struct { const uint8_t *addr; uint8_t siz; @@ -146,6 +145,7 @@ static struct RDP { uint8_t cms, cmt; uint8_t shifts, shiftt; uint16_t uls, ult, lrs, lrt; // U10.2 + uint16_t tmem; // 0-511, in 64-bit word units uint32_t line_size_bytes; uint8_t palette; uint8_t tmem_index; // 0 or 1 for offset 0 kB or offset 2 kB, respectively @@ -156,9 +156,10 @@ static struct RDP { uint32_t other_mode_l, other_mode_h; uint64_t combine_mode; + bool grayscale; uint8_t prim_lod_fraction; - struct RGBA env_color, prim_color, fog_color, fill_color; + struct RGBA env_color, prim_color, fog_color, fill_color, grayscale_color; struct XYWidthHeight viewport, scissor; bool viewport_or_scissor_changed; void *z_buf_address; @@ -174,8 +175,16 @@ static struct RenderingState { TextureCacheNode *textures[2]; } rendering_state; +struct GfxDimensions gfx_current_window_dimensions; struct GfxDimensions gfx_current_dimensions; static struct GfxDimensions gfx_prev_dimensions; +struct XYWidthHeight gfx_current_game_window_viewport; + +static bool game_renders_to_framebuffer; +static int game_framebuffer; +static int game_framebuffer_msaa_resolved; + +uint32_t gfx_msaa_level = 1; static bool dropped_frame; @@ -198,6 +207,9 @@ static bool fbActive = 0; static map::iterator active_fb; static map framebuffers; +static set> get_pixel_depth_pending; +static map, uint16_t> get_pixel_depth_cached; + #ifdef _MSC_VER // TODO: Properly implement for MSVC static unsigned long get_time(void) @@ -491,8 +503,22 @@ void gfx_texture_cache_clear() gfx_texture_cache.lru.clear(); } -static bool gfx_texture_cache_lookup(int i, TextureCacheNode **n, const uint8_t *orig_addr, uint32_t fmt, uint32_t siz, uint32_t palette_index) { - TextureCacheKey key = { orig_addr, fmt, siz, palette_index }; +static bool gfx_texture_cache_lookup(int i, int tile) { + uint8_t fmt = rdp.texture_tile[tile].fmt; + uint8_t siz = rdp.texture_tile[tile].siz; + uint32_t tmem_index = rdp.texture_tile[tile].tmem_index; + + TextureCacheNode** n = &rendering_state.textures[i]; + const uint8_t* orig_addr = rdp.loaded_texture[tmem_index].addr; + uint8_t palette_index = rdp.texture_tile[tile].palette; + + TextureCacheKey key; + if (fmt == G_IM_FMT_CI) { + key = { orig_addr, { rdp.palettes[0], rdp.palettes[1] }, fmt, siz, palette_index }; + } else { + key = { orig_addr, { }, fmt, siz, palette_index }; + } + auto it = gfx_texture_cache.map.find(key); if (it != gfx_texture_cache.map.end()) { @@ -736,7 +762,8 @@ static void import_texture_ci4(int tile) { uint32_t size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].size_bytes; uint32_t full_image_line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].full_image_line_size_bytes; uint32_t line_size_bytes = rdp.loaded_texture[rdp.texture_tile[tile].tmem_index].line_size_bytes; - const uint8_t *palette = rdp.palette + rdp.texture_tile[tile].palette * 16 * 2; // 16 pixel entries, 16 bits each + uint32_t pal_idx = rdp.texture_tile[tile].palette; // 0-15 + const uint8_t *palette = rdp.palettes[pal_idx / 8] + (pal_idx % 8) * 16 * 2; // 16 pixel entries, 16 bits each SUPPORT_CHECK(full_image_line_size_bytes == line_size_bytes); for (uint32_t i = 0; i < size_bytes * 2; i++) { @@ -771,7 +798,7 @@ static void import_texture_ci8(int tile) { { for (uint32_t k = 0; k < line_size_bytes; i++, k++, j++) { uint8_t idx = addr[j]; - uint16_t col16 = (rdp.palette[idx * 2] << 8) | rdp.palette[idx * 2 + 1]; // Big endian load + uint16_t col16 = (rdp.palettes[idx / 128][(idx % 128) * 2] << 8) | rdp.palettes[idx / 128][(idx % 128) * 2 + 1]; // Big endian load uint8_t a = col16 & 1; uint8_t r = col16 >> 11; uint8_t g = (col16 >> 6) & 0x1f; @@ -800,23 +827,7 @@ static void import_texture(int i, int tile) { uint8_t siz = rdp.texture_tile[tile].siz; uint32_t tmem_index = rdp.texture_tile[tile].tmem_index; - // OTRTODO: Move it to a function to be faster - // ModInternal::bindHook(LOOKUP_TEXTURE); - // ModInternal::initBindHook(8, - // HOOK_PARAMETER("gfx_api", gfx_get_current_rendering_api()), - // HOOK_PARAMETER("path", rdp.loaded_texture[tmem_index].otr_path), - // HOOK_PARAMETER("node", &rendering_state.textures[i]), - // HOOK_PARAMETER("fmt", &fmt), - // HOOK_PARAMETER("siz", &siz), - // HOOK_PARAMETER("tile", &i), - // HOOK_PARAMETER("palette", &rdp.texture_tile[tile].palette), - // HOOK_PARAMETER("addr", const_cast(rdp.loaded_texture[tmem_index].addr)) - // ); - // - // if (ModInternal::callBindHook(0)) - // return; - - if (gfx_texture_cache_lookup(i, &rendering_state.textures[i], rdp.loaded_texture[tmem_index].addr, fmt, siz, rdp.texture_tile[tile].palette)) + if (gfx_texture_cache_lookup(i, tile)) { return; } @@ -1195,7 +1206,6 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo uint64_t cc_id = rdp.combine_mode; - //bool use_alpha = (rdp.other_mode_l & (3 << 18)) == G_BL_1MA || (rdp.other_mode_l & (3 << 16)) == G_BL_1MA; bool use_alpha = (rdp.other_mode_l & (3 << 20)) == (G_BL_CLR_MEM << 20) && (rdp.other_mode_l & (3 << 16)) == (G_BL_1MA << 16); bool use_fog = (rdp.other_mode_l >> 30) == G_BL_CLR_FOG; bool texture_edge = (rdp.other_mode_l & CVG_X_ALPHA) == CVG_X_ALPHA; @@ -1203,6 +1213,7 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo bool use_2cyc = (rdp.other_mode_h & (3U << G_MDSFT_CYCLETYPE)) == G_CYC_2CYCLE; bool alpha_threshold = (rdp.other_mode_l & (3U << G_MDSFT_ALPHACOMPARE)) == G_AC_THRESHOLD; bool invisible = (rdp.other_mode_l & (3 << 24)) == (G_BL_0 << 24) && (rdp.other_mode_l & (3 << 20)) == (G_BL_CLR_MEM << 20); + bool use_grayscale = rdp.grayscale; if (texture_edge) { use_alpha = true; @@ -1215,12 +1226,13 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo if (use_2cyc) cc_id |= (uint64_t)SHADER_OPT_2CYC << CC_SHADER_OPT_POS; if (alpha_threshold) cc_id |= (uint64_t)SHADER_OPT_ALPHA_THRESHOLD << CC_SHADER_OPT_POS; if (invisible) cc_id |= (uint64_t)SHADER_OPT_INVISIBLE << CC_SHADER_OPT_POS; + if (use_grayscale) cc_id |= (uint64_t)SHADER_OPT_GRAYSCALE << CC_SHADER_OPT_POS; if (!use_alpha) { cc_id &= ~((0xfff << 16) | ((uint64_t)0xfff << 44)); } - struct ColorCombiner* comb = gfx_lookup_or_create_color_combiner(cc_id); + ColorCombiner* comb = gfx_lookup_or_create_color_combiner(cc_id); uint32_t tm = 0; uint32_t tex_width[2], tex_height[2], tex_width2[2], tex_height2[2]; @@ -1311,11 +1323,11 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo gfx_rapi->shader_get_info(prg, &num_inputs, used_textures); - bool z_is_from_0_to_1 = gfx_rapi->z_is_from_0_to_1(); + struct GfxClipParameters clip_parameters = gfx_rapi->get_clip_parameters(); for (int i = 0; i < 3; i++) { float z = v_arr[i]->z, w = v_arr[i]->w; - if (z_is_from_0_to_1) { + if (clip_parameters.z_is_from_0_to_1) { z = (z + w) / 2.0f; } @@ -1325,7 +1337,7 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo } buf_vbo[buf_vbo_len++] = v_arr[i]->x; - buf_vbo[buf_vbo_len++] = v_arr[i]->y; + buf_vbo[buf_vbo_len++] = clip_parameters.invert_y ? -v_arr[i]->y : v_arr[i]->y; buf_vbo[buf_vbo_len++] = z; buf_vbo[buf_vbo_len++] = w; @@ -1382,6 +1394,13 @@ static void gfx_sp_tri1(uint8_t vtx1_idx, uint8_t vtx2_idx, uint8_t vtx3_idx, bo buf_vbo[buf_vbo_len++] = v_arr[i]->color.a / 255.0f; // fog factor (not alpha) } + if (use_grayscale) { + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.r / 255.0f; + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.g / 255.0f; + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.b / 255.0f; + buf_vbo[buf_vbo_len++] = rdp.grayscale_color.a / 255.0f; // lerp interpolation factor (not alpha) + } + for (int j = 0; j < num_inputs; j++) { struct RGBA* color = 0; struct RGBA tmp; @@ -1476,6 +1495,27 @@ static void gfx_sp_geometry_mode(uint32_t clear, uint32_t set) { rsp.geometry_mode |= set; } +static void gfx_adjust_viewport_or_scissor(XYWidthHeight *area) { + if (!fbActive) { + area->width *= RATIO_X; + area->height *= RATIO_Y; + area->x *= RATIO_X; + area->y = SCREEN_HEIGHT - area->y; + area->y *= RATIO_Y; + + if (!game_renders_to_framebuffer || (gfx_msaa_level > 1 && gfx_current_dimensions.width == gfx_current_game_window_viewport.width && gfx_current_dimensions.height == gfx_current_game_window_viewport.height)) { + area->x += gfx_current_game_window_viewport.x; + area->y += gfx_current_window_dimensions.height - (gfx_current_game_window_viewport.y + gfx_current_game_window_viewport.height); + } + } else { + area->width *= RATIO_Y; + area->height *= RATIO_Y; + area->x *= RATIO_Y; + area->y = active_fb->second.orig_height - area->y; + area->y *= RATIO_Y; + } +} + static void gfx_calc_and_set_viewport(const Vp_t *viewport) { // 2 bits fraction float width = 2.0f * viewport->vscale[0] / 4.0f; @@ -1483,25 +1523,13 @@ static void gfx_calc_and_set_viewport(const Vp_t *viewport) { float x = (viewport->vtrans[0] / 4.0f) - width / 2.0f; float y = ((viewport->vtrans[1] / 4.0f) + height / 2.0f); - if (!fbActive) { - width *= RATIO_X; - height *= RATIO_Y; - x *= RATIO_X; - y = SCREEN_HEIGHT - y; - y *= RATIO_Y; - } else { - width *= RATIO_Y; - height *= RATIO_Y; - x *= RATIO_Y; - y = active_fb->second.orig_height - y; - y *= RATIO_Y; - } - rdp.viewport.x = x; rdp.viewport.y = y; rdp.viewport.width = width; rdp.viewport.height = height; + gfx_adjust_viewport_or_scissor(&rdp.viewport); + rdp.viewport_or_scissor_changed = true; } @@ -1570,11 +1598,6 @@ static void gfx_sp_texture(uint16_t sc, uint16_t tc, uint8_t level, uint8_t tile rdp.textures_changed[1] = true; } - if (tile > 8) - { - int bp = 0; - } - rdp.first_tile_index = tile; } @@ -1584,25 +1607,13 @@ static void gfx_dp_set_scissor(uint32_t mode, uint32_t ulx, uint32_t uly, uint32 float width = (lrx - ulx) / 4.0f; float height = (lry - uly) / 4.0f; - if (!fbActive) { - x *= RATIO_X; - y = SCREEN_HEIGHT - y; - y *= RATIO_Y; - width *= RATIO_X; - height *= RATIO_Y; - } else { - width *= RATIO_Y; - height *= RATIO_Y; - x *= RATIO_Y; - y = active_fb->second.orig_height - y; - y *= RATIO_Y; - } - rdp.scissor.x = x; rdp.scissor.y = y; rdp.scissor.width = width; rdp.scissor.height = height; + gfx_adjust_viewport_or_scissor(&rdp.scissor); + rdp.viewport_or_scissor_changed = true; } @@ -1639,6 +1650,7 @@ static void gfx_dp_set_tile(uint8_t fmt, uint32_t siz, uint32_t line, uint32_t t int bp = 0; } + rdp.texture_tile[tile].tmem = tmem; //rdp.texture_tile[tile].tmem_index = tmem / 256; // tmem is the 64-bit word offset, so 256 words means 2 kB rdp.texture_tile[tile].tmem_index = tmem != 0; // assume one texture is loaded at address 0 and another texture at any other address rdp.textures_changed[0] = true; @@ -1655,10 +1667,19 @@ static void gfx_dp_set_tile_size(uint8_t tile, uint16_t uls, uint16_t ult, uint1 } static void gfx_dp_load_tlut(uint8_t tile, uint32_t high_index) { - //SUPPORT_CHECK(tile == G_TX_LOADTILE); - //SUPPORT_CHECK(rdp.texture_to_load.siz == G_IM_SIZ_16b); + SUPPORT_CHECK(tile == G_TX_LOADTILE); + SUPPORT_CHECK(rdp.texture_to_load.siz == G_IM_SIZ_16b); - rdp.palette = rdp.texture_to_load.addr; + SUPPORT_CHECK((rdp.texture_tile[tile].tmem == 256 && (high_index <= 127 || high_index == 255)) || (rdp.texture_tile[tile].tmem == 384 && high_index == 127)); + + if (rdp.texture_tile[tile].tmem == 256) { + rdp.palettes[0] = rdp.texture_to_load.addr; + if (high_index == 255) { + rdp.palettes[1] = rdp.texture_to_load.addr + 2 * 128; + } + } else { + rdp.palettes[1] = rdp.texture_to_load.addr; + } } static void gfx_dp_load_block(uint8_t tile, uint32_t uls, uint32_t ult, uint32_t lrs, uint32_t dxt) { @@ -1780,6 +1801,13 @@ static inline uint32_t alpha_comb(uint32_t a, uint32_t b, uint32_t c, uint32_t d return (a & 7) | ((b & 7) << 3) | ((c & 7) << 6) | ((d & 7) << 9); } +static void gfx_dp_set_grayscale_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { + rdp.grayscale_color.r = r; + rdp.grayscale_color.g = g; + rdp.grayscale_color.b = b; + rdp.grayscale_color.a = a; +} + static void gfx_dp_set_env_color(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { rdp.env_color.r = r; rdp.env_color.g = g; @@ -1862,10 +1890,12 @@ static void gfx_draw_rectangle(int32_t ulx, int32_t uly, int32_t lrx, int32_t lr ur->w = 1.0f; // The coordinates for texture rectangle shall bypass the viewport setting - struct XYWidthHeight default_viewport = { 0, 0, gfx_current_dimensions.width, gfx_current_dimensions.height }; + struct XYWidthHeight default_viewport = { 0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT }; struct XYWidthHeight viewport_saved = rdp.viewport; uint32_t geometry_mode_saved = rsp.geometry_mode; + gfx_adjust_viewport_or_scissor(&default_viewport); + rdp.viewport = default_viewport; rdp.viewport_or_scissor_changed = true; rsp.geometry_mode = 0; @@ -2381,12 +2411,12 @@ static void gfx_run_dl(Gfx* cmd) { cmd++; uint64_t hash = ((uint64_t)cmd->words.w0 << 32) + (uint64_t)cmd->words.w1; ResourceMgr_GetNameByCRC(hash, fileName); +#if _DEBUG && 0 char* tex = ResourceMgr_LoadTexByCRC(hash); - - -#if _DEBUG - //ResourceMgr_GetNameByCRC(hash, fileName); - //printf("G_SETTIMG_OTR: %s, %08X\n", fileName, hash); + ResourceMgr_GetNameByCRC(hash, fileName); + printf("G_SETTIMG_OTR: %s, %08X\n", fileName, hash); +#else + char* tex = NULL; #endif if (addr != 0) @@ -2421,24 +2451,24 @@ static void gfx_run_dl(Gfx* cmd) { gfx_dp_set_texture_image(fmt, size, width, tex, fileName); cmd++; - } break; + } case G_SETFB: { gfx_flush(); fbActive = 1; active_fb = framebuffers.find(cmd->words.w1); - gfx_rapi->set_framebuffer(active_fb->first); - } + gfx_rapi->start_draw_to_framebuffer(active_fb->first, (float)active_fb->second.applied_height / active_fb->second.orig_height); + gfx_rapi->clear_framebuffer(); break; + } case G_RESETFB: { gfx_flush(); fbActive = 0; - gfx_rapi->reset_framebuffer(); + gfx_rapi->start_draw_to_framebuffer(game_renders_to_framebuffer ? game_framebuffer : 0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); break; } - break; case G_SETTIMG_FB: { gfx_flush(); @@ -2448,8 +2478,13 @@ static void gfx_run_dl(Gfx* cmd) { //if (texPtr != NULL) //gfx_dp_set_texture_image(C0(21, 3), C0(19, 2), C0(0, 10), texPtr); + break; + } + case G_SETGRAYSCALE: + { + rdp.grayscale = cmd->words.w1; + break; } - break; case G_LOADBLOCK: gfx_dp_load_block(C1(24, 3), C0(12, 12), C0(0, 12), C1(12, 12), C1(0, 12)); break; @@ -2477,6 +2512,9 @@ static void gfx_run_dl(Gfx* cmd) { case G_SETFILLCOLOR: gfx_dp_set_fill_color(cmd->words.w1); break; + case G_SETINTENSITY: + gfx_dp_set_grayscale_color(C1(24, 8), C1(16, 8), C1(8, 8), C1(0, 8)); + break; case G_SETCOMBINE: gfx_dp_set_combine_mode( color_comb(C0(20, 4), C1(28, 4), C0(15, 5), C1(15, 3)), @@ -2519,7 +2557,7 @@ static void gfx_run_dl(Gfx* cmd) { gfx_dp_texture_rectangle(ulx, uly, lrx, lry, tile, uls, ult, dsdx, dtdy, opcode == G_TEXRECTFLIP); break; } - case G_TEXRECT_WIDE: + case G_TEXRECT_WIDE: { int32_t lrx, lry, tile, ulx, uly; uint32_t uls, ult, dsdx, dtdy; @@ -2602,9 +2640,12 @@ void gfx_init(struct GfxWindowManagerAPI *wapi, struct GfxRenderingAPI *rapi, co gfx_rapi = rapi; gfx_wapi->init(game_name, start_in_fullscreen); gfx_rapi->init(); + gfx_rapi->update_framebuffer_parameters(0, SCREEN_WIDTH, SCREEN_HEIGHT, 1, false, true, true, true); gfx_current_dimensions.internal_mul = 1; gfx_current_dimensions.width = SCREEN_WIDTH; gfx_current_dimensions.height = SCREEN_HEIGHT; + game_framebuffer = gfx_rapi->create_framebuffer(); + game_framebuffer_msaa_resolved = gfx_rapi->create_framebuffer(); for (int i = 0; i < 16; i++) segmentPointers[i] = 0; @@ -2653,7 +2694,8 @@ struct GfxRenderingAPI *gfx_get_current_rendering_api(void) { void gfx_start_frame(void) { gfx_wapi->handle_events(); - // gfx_wapi->get_dimensions(&gfx_current_dimensions.width, &gfx_current_dimensions.height); + gfx_wapi->get_dimensions(&gfx_current_window_dimensions.width, &gfx_current_window_dimensions.height); + SohImGui::DrawMainMenuAndCalculateGameSize(); if (gfx_current_dimensions.height == 0) { // Avoid division by zero gfx_current_dimensions.height = 1; @@ -2665,7 +2707,7 @@ void gfx_start_frame(void) { uint32_t width = fb.second.orig_width, height = fb.second.orig_height; gfx_adjust_width_height_for_scale(width, height); if (width != fb.second.applied_width || height != fb.second.applied_height) { - gfx_rapi->resize_framebuffer(fb.first, width, height); + gfx_rapi->update_framebuffer_parameters(fb.first, width, height, 1, true, true, true, true); fb.second.applied_width = width; fb.second.applied_height = height; } @@ -2673,6 +2715,22 @@ void gfx_start_frame(void) { } gfx_prev_dimensions = gfx_current_dimensions; + bool different_size = gfx_current_dimensions.width != gfx_current_game_window_viewport.width || gfx_current_dimensions.height != gfx_current_game_window_viewport.height; + if (different_size || gfx_msaa_level > 1) { + game_renders_to_framebuffer = true; + if (different_size) { + gfx_rapi->update_framebuffer_parameters(game_framebuffer, gfx_current_dimensions.width, gfx_current_dimensions.height, gfx_msaa_level, true, true, true, true); + } else { + // MSAA framebuffer needs to be resolved to an equally sized target when complete, which must therefore match the window size + gfx_rapi->update_framebuffer_parameters(game_framebuffer, gfx_current_window_dimensions.width, gfx_current_window_dimensions.height, gfx_msaa_level, false, true, true, true); + } + if (gfx_msaa_level > 1 && different_size) { + gfx_rapi->update_framebuffer_parameters(game_framebuffer_msaa_resolved, gfx_current_dimensions.width, gfx_current_dimensions.height, 1, false, false, false, false); + } + } else { + game_renders_to_framebuffer = false; + } + fbActive = 0; } @@ -2680,17 +2738,44 @@ void gfx_run(Gfx *commands) { gfx_sp_reset(); //puts("New frame"); + get_pixel_depth_pending.clear(); + get_pixel_depth_cached.clear(); if (!gfx_wapi->start_frame()) { dropped_frame = true; + SohImGui::DrawFramebufferAndGameInput(); + SohImGui::CancelFrame(); return; } dropped_frame = false; double t0 = gfx_wapi->get_time(); + gfx_rapi->update_framebuffer_parameters(0, gfx_current_window_dimensions.width, gfx_current_window_dimensions.height, 1, false, true, true, !game_renders_to_framebuffer); gfx_rapi->start_frame(); + gfx_rapi->start_draw_to_framebuffer(game_renders_to_framebuffer ? game_framebuffer : 0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); + gfx_rapi->clear_framebuffer(); gfx_run_dl(commands); gfx_flush(); + SohUtils::saveEnvironmentVar("framebuffer", string()); + if (game_renders_to_framebuffer) { + gfx_rapi->start_draw_to_framebuffer(0, 1); + gfx_rapi->clear_framebuffer(); + + if (gfx_msaa_level > 1) { + bool different_size = gfx_current_dimensions.width != gfx_current_game_window_viewport.width || gfx_current_dimensions.height != gfx_current_game_window_viewport.height; + + if (different_size) { + gfx_rapi->resolve_msaa_color_buffer(game_framebuffer_msaa_resolved, game_framebuffer); + SohUtils::saveEnvironmentVar("framebuffer", std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer_msaa_resolved))); + } else { + gfx_rapi->resolve_msaa_color_buffer(0, game_framebuffer); + } + } else { + SohUtils::saveEnvironmentVar("framebuffer", std::to_string((uintptr_t)gfx_rapi->get_framebuffer_texture_id(game_framebuffer))); + } + } + SohImGui::DrawFramebufferAndGameInput(); + SohImGui::Render(); double t1 = gfx_wapi->get_time(); //printf("Process %f %f\n", t1, t1 - t0); gfx_rapi->end_frame(); @@ -2711,21 +2796,47 @@ void gfx_set_framedivisor(int divisor) { int gfx_create_framebuffer(uint32_t width, uint32_t height) { uint32_t orig_width = width, orig_height = height; gfx_adjust_width_height_for_scale(width, height); - int fb = gfx_rapi->create_framebuffer(width, height); + int fb = gfx_rapi->create_framebuffer(); + gfx_rapi->update_framebuffer_parameters(fb, width, height, 1, true, true, true, true); framebuffers[fb] = { orig_width, orig_height, width, height }; return fb; } -void gfx_set_framebuffer(int fb) -{ - gfx_rapi->set_framebuffer(fb); +void gfx_set_framebuffer(int fb, float noise_scale) { + gfx_rapi->start_draw_to_framebuffer(fb, noise_scale); + gfx_rapi->clear_framebuffer(); } -void gfx_reset_framebuffer() -{ - gfx_rapi->reset_framebuffer(); +void gfx_reset_framebuffer() { + gfx_rapi->start_draw_to_framebuffer(0, (float)gfx_current_dimensions.height / SCREEN_HEIGHT); +} + +static void adjust_pixel_depth_coordinates(float& x, float& y) { + x = x * RATIO_Y - (SCREEN_WIDTH * RATIO_Y - gfx_current_dimensions.width) / 2; + y *= RATIO_Y; + if (!game_renders_to_framebuffer || (gfx_msaa_level > 1 && gfx_current_dimensions.width == gfx_current_game_window_viewport.width && gfx_current_dimensions.height == gfx_current_game_window_viewport.height)) { + x += gfx_current_game_window_viewport.x; + y += gfx_current_window_dimensions.height - (gfx_current_game_window_viewport.y + gfx_current_game_window_viewport.height); + } +} + +void gfx_get_pixel_depth_prepare(float x, float y) { + adjust_pixel_depth_coordinates(x, y); + get_pixel_depth_pending.emplace(x, y); } uint16_t gfx_get_pixel_depth(float x, float y) { - return gfx_rapi->get_pixel_depth(x * RATIO_Y - (SCREEN_WIDTH * RATIO_Y - gfx_current_dimensions.width) / 2, y * RATIO_Y); + adjust_pixel_depth_coordinates(x, y); + + if (auto it = get_pixel_depth_cached.find(make_pair(x, y)); it != get_pixel_depth_cached.end()) { + return it->second; + } + + get_pixel_depth_pending.emplace(x, y); + + map, uint16_t> res = gfx_rapi->get_pixel_depth(game_renders_to_framebuffer ? game_framebuffer : 0, get_pixel_depth_pending); + get_pixel_depth_cached.merge(res); + get_pixel_depth_pending.clear(); + + return get_pixel_depth_cached.find(make_pair(x, y))->second; } \ No newline at end of file diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h index e6f0dae71..d9cd9be8d 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_pc.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_pc.h @@ -9,8 +9,12 @@ struct GfxRenderingAPI; struct GfxWindowManagerAPI; -struct GfxDimensions -{ +struct XYWidthHeight { + int16_t x, y; + uint32_t width, height; +}; + +struct GfxDimensions { uint32_t internal_mul; uint32_t width, height; float aspect_ratio; @@ -18,6 +22,7 @@ struct GfxDimensions struct TextureCacheKey { const uint8_t* texture_addr; + const uint8_t* palette_addrs[2]; uint8_t fmt, siz; uint8_t palette_index; @@ -50,7 +55,10 @@ struct TextureCacheValue { #ifdef __cplusplus extern "C" { #endif -extern struct GfxDimensions gfx_current_dimensions; +extern struct GfxDimensions gfx_current_window_dimensions; // The dimensions of the window +extern struct GfxDimensions gfx_current_dimensions; // The dimensions of the draw area the game draws to, before scaling (if applicable) +extern struct XYWidthHeight gfx_current_game_window_viewport; // The area of the window the game is drawn to, (0, 0) is top-left corner +extern uint32_t gfx_msaa_level; void gfx_init(struct GfxWindowManagerAPI* wapi, struct GfxRenderingAPI* rapi, const char* game_name, bool start_in_fullscreen); struct GfxRenderingAPI* gfx_get_current_rendering_api(void); @@ -60,6 +68,7 @@ void gfx_end_frame(void); void gfx_set_framedivisor(int); void gfx_texture_cache_clear(); int gfx_create_framebuffer(uint32_t width, uint32_t height); +void gfx_get_pixel_depth_prepare(float x, float y); uint16_t gfx_get_pixel_depth(float x, float y); #ifdef __cplusplus diff --git a/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h b/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h index 9283ee236..84247fe60 100644 --- a/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h +++ b/libultraship/libultraship/Lib/Fast3D/gfx_rendering_api.h @@ -5,10 +5,18 @@ #include #include +#include +#include + struct ShaderProgram; +struct GfxClipParameters { + bool z_is_from_0_to_1; + bool invert_y; +}; + struct GfxRenderingAPI { - bool (*z_is_from_0_to_1)(void); + struct GfxClipParameters (*get_clip_parameters)(void); void (*unload_shader)(struct ShaderProgram *old_prg); void (*load_shader)(struct ShaderProgram *new_prg); struct ShaderProgram *(*create_and_load_new_shader)(uint64_t shader_id0, uint32_t shader_id1); @@ -19,7 +27,6 @@ struct GfxRenderingAPI { void (*upload_texture)(const uint8_t *rgba32_buf, uint32_t width, uint32_t height); void (*set_sampler_parameters)(int sampler, bool linear_filter, uint32_t cms, uint32_t cmt); void (*set_depth_test_and_mask)(bool depth_test, bool z_upd); - uint16_t (*get_pixel_depth)(float x, float y); void (*set_zmode_decal)(bool zmode_decal); void (*set_viewport)(int x, int y, int width, int height); void (*set_scissor)(int x, int y, int width, int height); @@ -30,11 +37,14 @@ struct GfxRenderingAPI { void (*start_frame)(void); void (*end_frame)(void); void (*finish_render)(void); - int (*create_framebuffer)(uint32_t width, uint32_t height); - void (*resize_framebuffer)(int fb, uint32_t width, uint32_t height); - void (*set_framebuffer)(int fb); - void (*reset_framebuffer)(); - void (*select_texture_fb)(int fbID); + int (*create_framebuffer)(); + void (*update_framebuffer_parameters)(int fb_id, uint32_t width, uint32_t height, uint32_t msaa_level, bool opengl_invert_y, bool render_target, bool has_depth_buffer, bool can_extract_depth); + void (*start_draw_to_framebuffer)(int fb_id, float noise_scale); + void (*clear_framebuffer)(void); + void (*resolve_msaa_color_buffer)(int fb_id_target, int fb_id_source); + std::map, uint16_t> (*get_pixel_depth)(int fb_id, const std::set>& coordinates); + void *(*get_framebuffer_texture_id)(int fb_id); + void (*select_texture_fb)(int fb_id); void (*delete_texture)(uint32_t texID); }; diff --git a/libultraship/libultraship/Lib/ImGui/imgui.h b/libultraship/libultraship/Lib/ImGui/imgui.h index fa2dadcda..323832071 100644 --- a/libultraship/libultraship/Lib/ImGui/imgui.h +++ b/libultraship/libultraship/Lib/ImGui/imgui.h @@ -502,7 +502,6 @@ namespace ImGui IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape - IMGUI_API void ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle); IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0)); IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding IMGUI_API bool Checkbox(const char* label, bool* v); diff --git a/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp b/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp index 3d165580b..8e4210002 100644 --- a/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp +++ b/libultraship/libultraship/Lib/ImGui/imgui_widgets.cpp @@ -1007,33 +1007,6 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS6 return held; } -void ImGui::ImageRotated(ImTextureID tex_id, ImVec2 center, ImVec2 size, float angle) { - - ImGuiWindow* window = GetCurrentWindow(); - if (window->SkipItems) - return; - - ImDrawList* draw_list = ImGui::GetWindowDrawList(); - ImRect bb(window->DC.CursorPos + ImVec2(size.x / 2, size.y / 2), window->DC.CursorPos + size); - - ImVec2 pos[4] = - { - center + bb.Min + ImVec2(-size.x * 0.5f, -size.y * 0.5f), - center + bb.Min + ImVec2(+size.x * 0.5f, -size.y * 0.5f), - center + bb.Min + ImVec2(+size.x * 0.5f, +size.y * 0.5f), - center + bb.Min + ImVec2(-size.x * 0.5f, +size.y * 0.5f) - }; - ImVec2 uvs[4] = - { - ImVec2(0.0f, 1.0f), - ImVec2(1.0f, 1.0f), - ImVec2(1.0f, 0.0f), - ImVec2(0.0f, 0.0f) - }; - - draw_list->AddImageQuad(tex_id, pos[0], pos[1], pos[2], pos[3], uvs[0], uvs[1], uvs[2], uvs[3], IM_COL32_WHITE); -} - void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) { ImGuiWindow* window = GetCurrentWindow(); diff --git a/libultraship/libultraship/ResourceMgr.cpp b/libultraship/libultraship/ResourceMgr.cpp index d78be97a6..7bad99143 100644 --- a/libultraship/libultraship/ResourceMgr.cpp +++ b/libultraship/libultraship/ResourceMgr.cpp @@ -3,6 +3,7 @@ #include "spdlog/spdlog.h" #include "File.h" #include "Archive.h" +#include "GameVersions.h" #include #include "Lib/StormLib/StormLib.h" @@ -11,6 +12,8 @@ namespace Ship { ResourceMgr::ResourceMgr(std::shared_ptr Context, std::string MainPath, std::string PatchesPath) : Context(Context), bIsRunning(false), FileLoadThread(nullptr) { OTR = std::make_shared(MainPath, PatchesPath, false); + gameVersion = OOT_UNKNOWN; + if (OTR->IsMainMPQValid()) Start(); } @@ -86,7 +89,10 @@ namespace Ship { OTR->LoadFile(ToLoad->path, true, ToLoad); //Lock.lock(); - FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr; + + if (!ToLoad->bHasLoadError) + FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr; + //Lock.unlock(); SPDLOG_DEBUG("Loaded File {} on ResourceMgr thread", ToLoad->path); @@ -124,44 +130,62 @@ namespace Ship { } } - auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->file); - - if (UnmanagedRes != nullptr) + if (!ToLoad->file->bHasLoadError) { - UnmanagedRes->resMgr = this; - auto Res = std::shared_ptr(UnmanagedRes); + auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->file); - if (Res != nullptr) { - std::unique_lock Lock(ToLoad->resourceLoadMutex); + if (UnmanagedRes != nullptr) + { + UnmanagedRes->resMgr = this; + auto Res = std::shared_ptr(UnmanagedRes); - ToLoad->bHasResourceLoaded = true; - ToLoad->resource = Res; - ResourceCache[Res->file->path] = Res; + if (Res != nullptr) { + std::unique_lock Lock(ToLoad->resourceLoadMutex); - SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->file->path); + ToLoad->bHasResourceLoaded = true; + ToLoad->resource = Res; + ResourceCache[Res->file->path] = Res; - // Disabled for now because it can cause random crashes - //FileCache[Res->File->path] = nullptr; - //FileCache.erase(FileCache.find(Res->File->path)); - Res->file = nullptr; + SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->File->path); + + // Disabled for now because it can cause random crashes + //FileCache[Res->File->path] = nullptr; + //FileCache.erase(FileCache.find(Res->File->path)); + Res->file = nullptr; + } + else { + ToLoad->bHasResourceLoaded = false; + ToLoad->resource = nullptr; + + SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->file->path); + } + + //ResLock.lock(); + //ResLock.unlock(); } - else { - ToLoad->bHasResourceLoaded = false; - ToLoad->resource = nullptr; - - SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->file->path); - } - - //ResLock.lock(); - //ResLock.unlock(); - - ToLoad->resourceLoadNotifier.notify_all(); } + else + { + ToLoad->bHasResourceLoaded = false; + ToLoad->resource = nullptr; + } + + ToLoad->resourceLoadNotifier.notify_all(); } SPDLOG_INFO("Resource Manager LoadResourceThread ended"); } + uint32_t ResourceMgr::GetGameVersion() + { + return gameVersion; + } + + void ResourceMgr::SetGameVersion(uint32_t newGameVersion) + { + gameVersion = newGameVersion; + } + std::shared_ptr ResourceMgr::LoadFileAsync(std::string FilePath) { const std::lock_guard Lock(FileLoadMutex); // File NOT already loaded...? @@ -194,8 +218,11 @@ namespace Ship { std::shared_ptr ResourceMgr::GetCachedFile(std::string FilePath) { auto resCacheFind = ResourceCache.find(FilePath); - if (resCacheFind != ResourceCache.end()) + if (resCacheFind != ResourceCache.end() && + resCacheFind->second.use_count() > 0) + { return resCacheFind->second; + } else return nullptr; } @@ -237,9 +264,16 @@ namespace Ship { std::shared_ptr FileData = LoadFile(FilePath); Promise->file = FileData; - Promise->bHasResourceLoaded = false; - ResourceLoadQueue.push(Promise); - ResourceLoadNotifier.notify_all(); + if (Promise->file->bHasLoadError) + { + Promise->bHasResourceLoaded = true; + } + else + { + Promise->bHasResourceLoaded = false; + ResourceLoadQueue.push(Promise); + ResourceLoadNotifier.notify_all(); + } } else { Promise->bHasResourceLoaded = true; Promise->resource = resCacheFind->second; diff --git a/libultraship/libultraship/ResourceMgr.h b/libultraship/libultraship/ResourceMgr.h index 7f918e7af..28e77e537 100644 --- a/libultraship/libultraship/ResourceMgr.h +++ b/libultraship/libultraship/ResourceMgr.h @@ -28,7 +28,9 @@ namespace Ship std::string HashToString(uint64_t Hash); void InvalidateResourceCache(); - + + uint32_t GetGameVersion(); + void SetGameVersion(uint32_t newGameVersion); std::shared_ptr LoadFileAsync(std::string FilePath); std::shared_ptr LoadFile(std::string FilePath); std::shared_ptr GetCachedFile(std::string FilePath); @@ -58,5 +60,6 @@ namespace Ship std::mutex ResourceLoadMutex; std::condition_variable FileLoadNotifier; std::condition_variable ResourceLoadNotifier; + uint32_t gameVersion; }; } \ No newline at end of file diff --git a/libultraship/libultraship/SDLController.cpp b/libultraship/libultraship/SDLController.cpp index f2083e340..f6e5fa346 100644 --- a/libultraship/libultraship/SDLController.cpp +++ b/libultraship/libultraship/SDLController.cpp @@ -7,12 +7,8 @@ #include "Window.h" extern "C" uint8_t __osMaxControllers; -float gyroDriftX; -float gyroDriftY; namespace Ship { - - SDLController::SDLController(int32_t dwControllerNumber) : Controller(dwControllerNumber), Cont(nullptr), guid(INVALID_SDL_CONTROLLER_GUID) { } @@ -78,15 +74,21 @@ namespace Ship { Cont = NewCont; std::string BindingConfSection = GetBindingConfSection(); - std::shared_ptr pBindingConf = GlobalCtx2::GetInstance()->GetConfig(); - ConfigFile& BindingConf = *pBindingConf.get(); + std::string PadConfSection = *GetPadConfSection(); + std::shared_ptr config = GlobalCtx2::GetInstance()->GetConfig(); - if (!BindingConf.has(BindingConfSection)) { + if (!config->has(BindingConfSection)) { CreateDefaultBinding(); } + if (!config->has(PadConfSection)) { + CreateDefaultPadConf(); + } + LoadBinding(); LoadAxisThresholds(); + // Update per-controller settings in ImGui menu after opening controller. + Game::LoadPadSettings(); break; } @@ -97,6 +99,10 @@ namespace Ship { } bool SDLController::Close() { + // LINUX_TODO: + // if (SDL_GameControllerHasRumble(Cont)) { + // SDL_GameControllerRumble(Cont, 0, 0, 0); + // } if (Cont != nullptr) { SDL_GameControllerClose(Cont); } @@ -147,8 +153,8 @@ namespace Ship { //bound diagonals to an octagonal range {-68 ... +68} if (ax != 0.0 && ay != 0.0) { auto slope = ay / ax; - auto edgex = copysign(85.0 / (abs(slope) + wAxisThreshold / 69.0), ax); - auto edgey = copysign(std::min(abs(edgex * slope), 85.0 / (1.0 / abs(slope) + wAxisThreshold / 69.0)), ay); + auto edgex = copysign(85.0 / (abs(slope) + 16.0 / 69.0), ax); + auto edgey = copysign(std::min(abs(edgex * slope), 85.0 / (1.0 / abs(slope) + 16.0 / 69.0)), ay); edgex = edgey / slope; auto scale = sqrt(edgex * edgex + edgey * edgey) / 85.0; @@ -182,37 +188,41 @@ namespace Ship { if (SDL_GameControllerHasSensor(Cont, SDL_SENSOR_GYRO)) { + size_t contNumber = GetControllerNumber(); + float& gyro_drift_x = Game::Settings.controller.extra[contNumber].gyro_drift_x; + float& gyro_drift_y = Game::Settings.controller.extra[contNumber].gyro_drift_y; + const float gyro_sensitivity = Game::Settings.controller.extra[contNumber].gyro_sensitivity; + float gyroData[3]; SDL_GameControllerGetSensorData(Cont, SDL_SENSOR_GYRO, gyroData, 3); const char* contName = SDL_GameControllerName(Cont); - const int isSpecialController = strcmp("PS5 Controller", contName); - const float gyroSensitivity = Game::Settings.controller.gyro_sensitivity; + const int isSpecialController = !strcmp("PS5 Controller", contName); - if (gyroDriftX == 0) { - if (isSpecialController == 0) { - gyroDriftX = gyroData[2]; + if (gyro_drift_x == 0) { + gyro_drift_x = gyroData[0]; + } + + if (gyro_drift_y == 0) { + if (isSpecialController == 1) { + gyro_drift_y = gyroData[2]; } else { - gyroDriftX = gyroData[0]; + gyro_drift_y = gyroData[1]; } } - if (gyroDriftY == 0) { - gyroDriftY = gyroData[1]; - } - - if (isSpecialController == 0) { - wGyroX = gyroData[2] - gyroDriftX; + if (isSpecialController == 1) { + wGyroX = gyroData[0] - gyro_drift_x; + wGyroY = -gyroData[2] - gyro_drift_y; } else { - wGyroX = gyroData[0] - gyroDriftX; + wGyroX = gyroData[0] - gyro_drift_x; + wGyroY = gyroData[1] - gyro_drift_y; } - wGyroY = gyroData[1] - gyroDriftY; - - wGyroX *= gyroSensitivity; - wGyroY *= gyroSensitivity; + wGyroX *= gyro_sensitivity; + wGyroY *= gyro_sensitivity; } for (int32_t i = SDL_CONTROLLER_BUTTON_A; i < SDL_CONTROLLER_BUTTON_MAX; i++) { @@ -333,19 +343,30 @@ namespace Ship { void SDLController::WriteToSource(ControllerCallback* controller) { - // MERGETODO + // LINUX_TODO: // if (SDL_GameControllerHasRumble(Cont)) { // if (controller->rumble > 0) { - // SDL_GameControllerRumble(Cont, 0xFFFF * Game::Settings.controller.rumble_strength, 0xFFFF * Game::Settings.controller.rumble_strength, 1); + // float rumble_strength = Game::Settings.controller.extra[GetControllerNumber()].rumble_strength; + // SDL_GameControllerRumble(Cont, 0xFFFF * rumble_strength, 0xFFFF * rumble_strength, 0); + // } else { + // SDL_GameControllerRumble(Cont, 0, 0, 0); // } // } if (SDL_GameControllerHasLED(Cont)) { - if (controller->ledColor == 1) { + switch (controller->ledColor) { + case 0: SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 255, 0, 0); - } - else { - SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0, 255, 0); + break; + case 1: + SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0x1E, 0x69, 0x1B); + break; + case 2: + SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0x64, 0x14, 0x00); + break; + case 3: + SDL_JoystickSetLED(SDL_GameControllerGetJoystick(Cont), 0x00, 0x3C, 0x64); + break; } } } @@ -388,6 +409,19 @@ namespace Ship { Conf.Save(); } + void SDLController::CreateDefaultPadConf() { + std::string ConfSection = *GetPadConfSection(); + std::shared_ptr pConf = GlobalCtx2::GetInstance()->GetConfig(); + ConfigFile& Conf = *pConf.get(); + + Conf[ConfSection]["gyro_sensitivity"] = std::to_string(1.0f); + Conf[ConfSection]["rumble_strength"] = std::to_string(1.0f); + Conf[ConfSection]["gyro_drift_x"] = std::to_string(0.0f); + Conf[ConfSection]["gyro_drift_y"] = std::to_string(0.0f); + + Conf.Save(); + } + void SDLController::SetButtonMapping(const std::string& szButtonName, int32_t dwScancode) { if (guid.compare(INVALID_SDL_CONTROLLER_GUID)) { return; @@ -407,4 +441,8 @@ namespace Ship { std::string SDLController::GetBindingConfSection() { return GetControllerType() + " CONTROLLER BINDING " + guid; } -} \ No newline at end of file + + std::optional SDLController::GetPadConfSection() { + return GetControllerType() + " CONTROLLER PAD " + guid; + } +} diff --git a/libultraship/libultraship/SDLController.h b/libultraship/libultraship/SDLController.h index 2f7e18220..e150bf0ab 100644 --- a/libultraship/libultraship/SDLController.h +++ b/libultraship/libultraship/SDLController.h @@ -12,15 +12,22 @@ namespace Ship { void ReadFromSource(); void WriteToSource(ControllerCallback* controller); + bool Connected() const { return Cont != nullptr; } + // LINUX_TODO: + bool CanRumble() const { return false; /* return SDL_GameControllerHasRumble(Cont); */ } std::string GetGuid() { return guid; }; + bool HasPadConf() const { return true; } + std::optional GetPadConfSection(); + protected: std::string GetControllerType(); void SetButtonMapping(const std::string& szButtonName, int32_t dwScancode); std::string GetConfSection(); std::string GetBindingConfSection(); void CreateDefaultBinding(); + void CreateDefaultPadConf(); static bool IsGuidInUse(const std::string& guid); private: diff --git a/libultraship/libultraship/SohConsole.cpp b/libultraship/libultraship/SohConsole.cpp index d35bcbeef..a1ad66588 100644 --- a/libultraship/libultraship/SohConsole.cpp +++ b/libultraship/libultraship/SohConsole.cpp @@ -92,7 +92,7 @@ void Console::Update() { } for (auto [key, var] : BindingToggle) { if (ImGui::IsKeyPressed(key)) { - CVar* cvar = CVar_GetVar(const_cast(var.c_str())); + CVar* cvar = CVar_GetVar(var.c_str()); Dispatch("set " + var + " " + std::to_string(cvar == nullptr ? 0 : !static_cast(cvar->value.valueS32))); } } diff --git a/libultraship/libultraship/SohImGuiImpl.cpp b/libultraship/libultraship/SohImGuiImpl.cpp index 4dceff23e..868074cd4 100644 --- a/libultraship/libultraship/SohImGuiImpl.cpp +++ b/libultraship/libultraship/SohImGuiImpl.cpp @@ -1,7 +1,11 @@ #include "SohImGuiImpl.h" #include +#include #include +#include +#include +#include #include "Archive.h" #include "Environment.h" @@ -14,9 +18,11 @@ #include "TextureMod.h" #include "Window.h" #include "Cvar.h" +#include "Texture.h" #include "../Fast3D/gfx_pc.h" #include "Lib/stb/stb_image.h" #include "Lib/Fast3D/gfx_rendering_api.h" +#include "Lib/spdlog/include/spdlog/common.h" #include "Utils/StringHelper.h" #ifdef ENABLE_OPENGL @@ -50,6 +56,24 @@ namespace SohImGui { Console* console = new Console; bool p_open = false; bool needs_save = false; + float kokiri_col[3] = { 0.118f, 0.41f, 0.106f }; + float goron_col[3] = { 0.392f, 0.078f, 0.0f }; + float zora_col[3] = { 0.0f, 0.235f, 0.392f }; + + float navi_idle_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_idle_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + float navi_npc_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_npc_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + float navi_enemy_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_enemy_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + float navi_prop_i_col[3] = { 0.0f, 0.0f, 0.0f }; + float navi_prop_o_col[3] = { 0.0f, 0.0f, 0.0f }; + + std::map> windowCategories; + std::map customWindows; void ImGuiWMInit() { switch (impl.backend) { @@ -64,6 +88,49 @@ namespace SohImGui { default: break; } + kokiri_col[0] = std::clamp((float) CVar_GetS32("gTunic_Kokiri_Red", 30)/255, 0.0f, 1.0f); + kokiri_col[1] = std::clamp((float)CVar_GetS32("gTunic_Kokiri_Green", 105) / 255, 0.0f, 1.0f); + kokiri_col[2] = std::clamp((float)CVar_GetS32("gTunic_Kokiri_Blue", 27) / 255, 0.0f, 1.0f); + + goron_col[0] = std::clamp((float)CVar_GetS32("gTunic_Goron_Red", 100) / 255, 0.0f, 1.0f); + goron_col[1] = std::clamp((float)CVar_GetS32("gTunic_Goron_Green", 20) / 255, 0.0f, 1.0f); + goron_col[2] = std::clamp((float)CVar_GetS32("gTunic_Goron_Blue", 0) / 255, 0.0f, 1.0f); + + zora_col[0] = std::clamp((float)CVar_GetS32("gTunic_Zora_Red", 0) / 255, 0.0f, 1.0f); + zora_col[1] = std::clamp((float)CVar_GetS32("gTunic_Zora_Green", 60) / 255, 0.0f, 1.0f); + zora_col[2] = std::clamp((float)CVar_GetS32("gTunic_Zora_Blue", 100) / 255, 0.0f, 1.0f); + + navi_idle_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_Idle_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_Idle_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_idle_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_Idle_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_idle_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_Idle_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_Idle_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_idle_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_Idle_Outer_Blue", 0) / 255, 0.0f, 1.0f); + + navi_npc_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_NPC_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_NPC_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_npc_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_NPC_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_npc_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_NPC_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_NPC_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_npc_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_NPC_Outer_Blue", 0) / 255, 0.0f, 1.0f); + + navi_enemy_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_enemy_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_enemy_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_enemy_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_Enemy_Outer_Blue", 0) / 255, 0.0f, 1.0f); + + navi_prop_i_col[0] = std::clamp((float)CVar_GetS32("gNavi_Prop_Inner_Red", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[1] = std::clamp((float)CVar_GetS32("gNavi_Prop_Inner_Green", 0) / 255, 0.0f, 1.0f); + navi_prop_i_col[2] = std::clamp((float)CVar_GetS32("gNavi_Prop_Inner_Blue", 0) / 255, 0.0f, 1.0f); + + navi_prop_o_col[0] = std::clamp((float)CVar_GetS32("gNavi_Prop_Outer_Red", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[1] = std::clamp((float)CVar_GetS32("gNavi_Prop_Outer_Green", 0) / 255, 0.0f, 1.0f); + navi_prop_o_col[2] = std::clamp((float)CVar_GetS32("gNavi_Prop_Outer_Blue", 0) / 255, 0.0f, 1.0f); } void ImGuiBackendInit() { @@ -142,15 +209,6 @@ namespace SohImGui { } } - bool UseInternalRes() { - switch (impl.backend) { - case Backend::SDL: - return true; - default: - return false; - } - } - bool UseViewports() { switch (impl.backend) { case Backend::DX11: @@ -180,7 +238,7 @@ namespace SohImGui { } } - void LoadTexture(std::string name, std::string path) { + void LoadTexture(const std::string& name, const std::string& path) { GfxRenderingAPI* api = gfx_get_current_rendering_api(); const auto res = GlobalCtx2::GetInstance()->GetResourceManager()->LoadFile(normalize(path)); @@ -200,6 +258,50 @@ namespace SohImGui { stbi_image_free(img_data); } + void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint) { + GfxRenderingAPI* api = gfx_get_current_rendering_api(); + const auto res = static_cast(GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(normalize(path)).get()); + + std::vector texBuffer; + texBuffer.reserve(res->width * res->height * 4); + + switch (res->texType) { + case Ship::TextureType::RGBA32bpp: + texBuffer.assign(res->imageData, res->imageData + (res->width * res->height * 4)); + break; + case Ship::TextureType::GrayscaleAlpha8bpp: + for (int32_t i = 0; i < res->width * res->height; i++) { + uint8_t ia = res->imageData[i]; + uint8_t color = ((ia >> 4) & 0xF) * 255 / 15; + uint8_t alpha = (ia & 0xF) * 255 / 15; + texBuffer.push_back(color); + texBuffer.push_back(color); + texBuffer.push_back(color); + texBuffer.push_back(alpha); + } + break; + default: + // TODO convert other image types + SPDLOG_WARN("SohImGui::LoadResource: Attempting to load unsupporting image type %s", path.c_str()); + return; + } + + for (size_t pixel = 0; pixel < texBuffer.size() / 4; pixel++) { + texBuffer[pixel * 4 + 0] *= tint.x; + texBuffer[pixel * 4 + 1] *= tint.y; + texBuffer[pixel * 4 + 2] *= tint.z; + texBuffer[pixel * 4 + 3] *= tint.w; + } + + const auto asset = new GameAsset{ api->new_texture() }; + + api->select_texture(0, asset->textureId); + api->set_sampler_parameters(0, false, 0, 0); + api->upload_texture(texBuffer.data(), res->width, res->height); + + DefaultAssets[name] = asset; + } + void Init(WindowImpl window_impl) { impl = window_impl; Game::LoadSettings(); @@ -246,35 +348,28 @@ namespace SohImGui { ImGuiProcessEvent(event); } -#ifdef ENABLE_DX11 -#define BindButton(btn, status) ImGui::Image(impl.backend == Backend::DX11 ? GetTextureByID(DefaultAssets[btn]->textureId) : (ImTextureID)(DefaultAssets[btn]->textureId), ImVec2(16.0f * scale, 16.0f * scale), ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, (status) ? 255 : 0)); -#else -#define BindButton(btn, status) ImGui::Image((ImTextureID)(DefaultAssets[btn]->textureId), ImVec2(16.0f * scale, 16.0f * scale), ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, (status) ? 255 : 0)); -#endif +#define BindButton(btn, status) ImGui::Image(GetTextureByID(DefaultAssets[btn]->textureId), ImVec2(16.0f * scale, 16.0f * scale), ImVec2(0, 0), ImVec2(1.0f, 1.0f), ImVec4(255, 255, 255, (status) ? 255 : 0)); + void BindAudioSlider(const char* name, const char* key, float* value, SeqPlayers playerId) { ImGui::Text(name, static_cast(100 * *(value))); if (ImGui::SliderFloat((std::string("##") + key).c_str(), value, 0.0f, 1.0f, "")) { const float volume = floorf(*(value) * 100) / 100; - CVar_SetFloat(const_cast(key), volume); + CVar_SetFloat(key, volume); needs_save = true; Game::SetSeqPlayerVolume(playerId, volume); } } - void Draw() { - + void DrawMainMenuAndCalculateGameSize() { console->Update(); ImGuiBackendNewFrame(); ImGuiWMNewFrame(); ImGui::NewFrame(); const std::shared_ptr wnd = GlobalCtx2::GetInstance()->GetWindow(); - ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus | ImGuiWindowFlags_NoResize; - if (UseViewports()) { - window_flags |= ImGuiWindowFlags_NoBackground; - } if (Game::Settings.debug.menu_bar) window_flags |= ImGuiWindowFlags_MenuBar; const ImGuiViewport* viewport = ImGui::GetMainViewport(); @@ -282,8 +377,12 @@ namespace SohImGui { ImGui::SetNextWindowSize(ImVec2(wnd->GetCurrentWidth(), wnd->GetCurrentHeight())); ImGui::SetNextWindowViewport(viewport->ID); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 0.0f); ImGui::Begin("Main - Deck", nullptr, window_flags); - ImGui::PopStyleVar(); + ImGui::PopStyleVar(3); + + ImVec2 top_left_pos = ImGui::GetWindowPos(); const ImGuiID dockId = ImGui::GetID("main_dock"); @@ -308,11 +407,7 @@ namespace SohImGui { if (ImGui::BeginMenuBar()) { if (DefaultAssets.contains("Game_Icon")) { ImGui::SetCursorPos(ImVec2(5, 2.5f)); -#ifdef ENABLE_DX11 - ImGui::Image(impl.backend == Backend::DX11 ? GetTextureByID(DefaultAssets["Game_Icon"]->textureId) : reinterpret_cast(DefaultAssets["Game_Icon"]->textureId), ImVec2(16.0f, 16.0f)); -#else - ImGui::Image(reinterpret_cast(DefaultAssets["Game_Icon"]->textureId), ImVec2(16.0f, 16.0f)); -#endif + ImGui::Image(GetTextureByID(DefaultAssets["Game_Icon"]->textureId), ImVec2(16.0f, 16.0f)); ImGui::SameLine(); ImGui::SetCursorPos(ImVec2(25, 0)); } @@ -322,8 +417,8 @@ namespace SohImGui { if (ImGui::BeginMenu("Audio")) { const float volume = Game::Settings.audio.master; ImGui::Text("Master Volume: %d %%", static_cast(100 * volume)); - if (ImGui::SliderFloat("##Master_Vol", &Game::Settings.audio.master, 0.0f, 1.0f, "")) { - CVar_SetFloat(const_cast("gGameMasterVolume"), volume); + if (ImGui::SliderFloat("##Master_Vol", &Game::Settings.audio.master, 0.0f, 1.0f, "", ImGuiSliderFlags_AlwaysClamp)) { + CVar_SetFloat("gGameMasterVolume", Game::Settings.audio.master); needs_save = true; } @@ -336,12 +431,41 @@ namespace SohImGui { } if (ImGui::BeginMenu("Controller")) { - ImGui::Text("Gyro Sensitivity: %d %%", static_cast(100 * Game::Settings.controller.gyro_sensitivity)); - if (ImGui::SliderFloat("##GYROSCOPE", &Game::Settings.controller.gyro_sensitivity, 0.0f, 1.0f, "")) { - needs_save = true; + for (const auto& [i, controllers] : Ship::Window::Controllers) { + bool hasPad = std::find_if(controllers.begin(), controllers.end(), [](const auto& c) { + return c->HasPadConf() && c->Connected(); + }) != controllers.end(); + + if (!hasPad) continue; + + auto menuLabel = "Controller " + std::to_string(i + 1); + if (ImGui::BeginMenu(menuLabel.c_str())) { + ImGui::Text("Gyro Sensitivity: %d %%", static_cast(100 * Game::Settings.controller.extra[i].gyro_sensitivity)); + if (ImGui::SliderFloat("##GYROSCOPE", &Game::Settings.controller.extra[i].gyro_sensitivity, 0.0f, 1.0f, "")) { + needs_save = true; + } + + if (ImGui::Button("Recalibrate Gyro")) { + Game::Settings.controller.extra[i].gyro_drift_x = 0; + Game::Settings.controller.extra[i].gyro_drift_y = 0; + needs_save = true; + } + + ImGui::Separator(); + + ImGui::Text("Rumble Strength: %d %%", static_cast(100 * Game::Settings.controller.extra[i].rumble_strength)); + if (ImGui::SliderFloat("##RUMBLE", &Game::Settings.controller.extra[i].rumble_strength, 0.0f, 1.0f, "")) { + needs_save = true; + } + + ImGui::EndMenu(); + } } - ImGui::Text("Rumble Strength: %d %%", static_cast(100 * Game::Settings.controller.rumble_strength)); - if (ImGui::SliderFloat("##RUMBLE", &Game::Settings.controller.rumble_strength, 0.0f, 1.0f, "")) { + + ImGui::Separator(); + + if (ImGui::Checkbox("Rumble Enabled", &Game::Settings.controller.rumble_enabled)) { + CVar_SetS32("gRumbleEnabled", Game::Settings.controller.rumble_enabled); needs_save = true; } @@ -354,6 +478,23 @@ namespace SohImGui { needs_save = true; } + ImGui::Separator(); + + if (ImGui::Checkbox("Dpad Support on Pause and File Select", &Game::Settings.controller.dpad_pause_name)) { + CVar_SetS32("gDpadPauseName", Game::Settings.controller.dpad_pause_name); + needs_save = true; + } + + if (ImGui::Checkbox("DPad Support in Ocarina and Text Choice", &Game::Settings.controller.dpad_ocarina_text)) { + CVar_SetS32("gDpadOcarinaText", Game::Settings.controller.dpad_ocarina_text); + needs_save = true; + } + + if (ImGui::Checkbox("DPad Support for Browsing Shop Items", &Game::Settings.controller.dpad_shop)) { + CVar_SetS32("gDpadShop", Game::Settings.controller.dpad_shop); + needs_save = true; + } + ImGui::EndMenu(); } @@ -362,33 +503,60 @@ namespace SohImGui { ImGui::Text("Gameplay"); ImGui::Separator(); - if (ImGui::Checkbox("Fast Text", &Game::Settings.enhancements.fast_text)) { - CVar_SetS32(const_cast("gFastText"), Game::Settings.enhancements.fast_text); + ImGui::Text("Text Speed: %dx", Game::Settings.enhancements.text_speed); + if (ImGui::SliderInt("##TEXTSPEED", &Game::Settings.enhancements.text_speed, 1, 5, "")) { + CVar_SetS32("gTextSpeed", Game::Settings.enhancements.text_speed); + needs_save = true; + } + + if (ImGui::Checkbox("Skip Text", &Game::Settings.enhancements.skip_text)) { + CVar_SetS32("gSkipText", Game::Settings.enhancements.skip_text); + needs_save = true; + } + + if (ImGui::Checkbox("Minimal UI", &Game::Settings.enhancements.minimal_ui)) { + CVar_SetS32("gMinimalUI", Game::Settings.enhancements.minimal_ui); + needs_save = true; + } + + if (ImGui::Checkbox("MM Bunny Hood", &Game::Settings.enhancements.mm_bunny_hood)) { + CVar_SetS32("gMMBunnyHood", Game::Settings.enhancements.mm_bunny_hood); + needs_save = true; + } + + /*if (ImGui::Checkbox("Fix L&R Pause menu", &Game::Settings.enhancements.uniform_lr)) { + CVar_SetS32("gUniformLR", Game::Settings.enhancements.uniform_lr); + needs_save = true; + }*/ + + if (ImGui::Checkbox("Visual Stone of Agony", &Game::Settings.enhancements.visualagony)) { + CVar_SetS32("gVisualAgony", Game::Settings.enhancements.visualagony); needs_save = true; } ImGui::Text("Graphics"); ImGui::Separator(); - if (UseInternalRes()) { - HOOK(ImGui::Checkbox("N64 Mode", &Game::Settings.debug.n64mode)); - } + HOOK(ImGui::Checkbox("N64 Mode", &Game::Settings.debug.n64mode)); if (ImGui::Checkbox("Animated Link in Pause Menu", &Game::Settings.enhancements.animated_pause_menu)) { - CVar_SetS32(const_cast("gPauseLiveLink"), Game::Settings.enhancements.animated_pause_menu); + CVar_SetS32("gPauseLiveLink", Game::Settings.enhancements.animated_pause_menu); needs_save = true; } if (ImGui::Checkbox("Disable LOD", &Game::Settings.enhancements.disable_lod)) { - CVar_SetS32(const_cast("gDisableLOD"), Game::Settings.enhancements.disable_lod); + CVar_SetS32("gDisableLOD", Game::Settings.enhancements.disable_lod); needs_save = true; } - ImGui::Text("Debugging"); - ImGui::Separator(); + if (ImGui::Checkbox("Enable 3D Dropped items", &Game::Settings.enhancements.newdrops)) { + CVar_SetS32("gNewDrops", Game::Settings.enhancements.newdrops); + needs_save = true; + } + + if (ImGui::Checkbox("Dynamic Wallet Icon", &Game::Settings.enhancements.dynamic_wallet_icon)) { + CVar_SetS32("gDynamicWalletIcon", Game::Settings.enhancements.dynamic_wallet_icon); - if (ImGui::Checkbox("Debug Mode", &Game::Settings.enhancements.debug_mode)) { - CVar_SetS32(const_cast("gDebugEnabled"), Game::Settings.enhancements.debug_mode); needs_save = true; } @@ -398,42 +566,223 @@ namespace SohImGui { if (ImGui::BeginMenu("Developer Tools")) { HOOK(ImGui::MenuItem("Stats", nullptr, &Game::Settings.debug.soh)); HOOK(ImGui::MenuItem("Console", nullptr, &console->opened)); + + ImGui::Text("Debug"); + ImGui::Separator(); + + if (ImGui::Checkbox("Debug Mode", &Game::Settings.cheats.debug_mode)) { + CVar_SetS32("gDebugEnabled", Game::Settings.cheats.debug_mode); + needs_save = true; + } + ImGui::EndMenu(); } + if (ImGui::BeginMenu("Graphics")) { + HOOK(ImGui::MenuItem("Anti-aliasing", nullptr, &Game::Settings.graphics.show)); + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Cheats")) { + if (ImGui::BeginMenu("Infinite...")) { + if (ImGui::Checkbox("Money", &Game::Settings.cheats.infinite_money)) { + CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money); + needs_save = true; + } + + if (ImGui::Checkbox("Health", &Game::Settings.cheats.infinite_health)) { + CVar_SetS32("gInfiniteHealth", Game::Settings.cheats.infinite_health); + needs_save = true; + } + + if (ImGui::Checkbox("Ammo", &Game::Settings.cheats.infinite_ammo)) { + CVar_SetS32("gInfiniteAmmo", Game::Settings.cheats.infinite_ammo); + needs_save = true; + } + + if (ImGui::Checkbox("Magic", &Game::Settings.cheats.infinite_magic)) { + CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic); + needs_save = true; + } + + if (ImGui::Checkbox("Nayru's Love", &Game::Settings.cheats.infinite_nayru)) { + CVar_SetS32("gInfiniteNayru", Game::Settings.cheats.infinite_nayru); + needs_save = true; + } + ImGui::EndMenu(); + } + + if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) { + CVar_SetS32("gNoClip", Game::Settings.cheats.no_clip); + needs_save = true; + } + + if (ImGui::Checkbox("Climb Everything", &Game::Settings.cheats.climb_everything)) { + CVar_SetS32("gClimbEverything", Game::Settings.cheats.climb_everything); + needs_save = true; + } + + if (ImGui::Checkbox("Moon Jump on L", &Game::Settings.cheats.moon_jump_on_l)) { + CVar_SetS32("gMoonJumpOnL", Game::Settings.cheats.moon_jump_on_l); + needs_save = true; + } + + if (ImGui::Checkbox("Super Tunic", &Game::Settings.cheats.super_tunic)) { + CVar_SetS32("gSuperTunic", Game::Settings.cheats.super_tunic); + needs_save = true; + } + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Cosmetics")) { + ImGui::Text("Tunics"); + ImGui::Separator(); + if (ImGui::ColorEdit3("Kokiri Tunic", kokiri_col)) { + Game::Settings.cosmetic.tunic_kokiri_red = (int)(kokiri_col[0] * 255); + Game::Settings.cosmetic.tunic_kokiri_green = (int)(kokiri_col[1] * 255); + Game::Settings.cosmetic.tunic_kokiri_blue = (int)(kokiri_col[2] * 255); + CVar_SetS32("gTunic_Kokiri_Red", Game::Settings.cosmetic.tunic_kokiri_red); + CVar_SetS32("gTunic_Kokiri_Green", Game::Settings.cosmetic.tunic_kokiri_green); + CVar_SetS32("gTunic_Kokiri_Blue", Game::Settings.cosmetic.tunic_kokiri_blue); + needs_save = true; + } + if (ImGui::ColorEdit3("Goron Tunic", goron_col)) { + Game::Settings.cosmetic.tunic_goron_red = (int)(goron_col[0] * 255); + Game::Settings.cosmetic.tunic_goron_green = (int)(goron_col[1] * 255); + Game::Settings.cosmetic.tunic_goron_blue = (int)(goron_col[2] * 255); + CVar_SetS32("gTunic_Goron_Red", Game::Settings.cosmetic.tunic_goron_red); + CVar_SetS32("gTunic_Goron_Green", Game::Settings.cosmetic.tunic_goron_green); + CVar_SetS32("gTunic_Goron_Blue", Game::Settings.cosmetic.tunic_goron_blue); + needs_save = true; + } + if (ImGui::ColorEdit3("Zora Tunic", zora_col)) { + Game::Settings.cosmetic.tunic_zora_red = (int)(zora_col[0] * 255); + Game::Settings.cosmetic.tunic_zora_green = (int)(zora_col[1] * 255); + Game::Settings.cosmetic.tunic_zora_blue = (int)(zora_col[2] * 255); + CVar_SetS32("gTunic_Zora_Red", Game::Settings.cosmetic.tunic_zora_red); + CVar_SetS32("gTunic_Zora_Green", Game::Settings.cosmetic.tunic_zora_green); + CVar_SetS32("gTunic_Zora_Blue", Game::Settings.cosmetic.tunic_zora_blue); + needs_save = true; + } + ImGui::Text("Navi"); + ImGui::Separator(); + if (ImGui::ColorEdit3("Navi Idle Inner", navi_idle_i_col)) { + Game::Settings.cosmetic.navi_idle_inner_red = (int)(navi_idle_i_col[0] * 255); + Game::Settings.cosmetic.navi_idle_inner_green = (int)(navi_idle_i_col[1] * 255); + Game::Settings.cosmetic.navi_idle_inner_blue = (int)(navi_idle_i_col[2] * 255); + CVar_SetS32("gNavi_Idle_Inner_Red", Game::Settings.cosmetic.navi_idle_inner_red); + CVar_SetS32("gNavi_Idle_Inner_Green", Game::Settings.cosmetic.navi_idle_inner_green); + CVar_SetS32("gNavi_Idle_Inner_Blue", Game::Settings.cosmetic.navi_idle_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Idle Outer", navi_idle_o_col)) { + Game::Settings.cosmetic.navi_idle_outer_red = (int)(navi_idle_o_col[0] * 255); + Game::Settings.cosmetic.navi_idle_outer_green = (int)(navi_idle_o_col[1] * 255); + Game::Settings.cosmetic.navi_idle_outer_blue = (int)(navi_idle_o_col[2] * 255); + CVar_SetS32("gNavi_Idle_Outer_Red", Game::Settings.cosmetic.navi_idle_outer_red); + CVar_SetS32("gNavi_Idle_Outer_Green", Game::Settings.cosmetic.navi_idle_outer_green); + CVar_SetS32("gNavi_Idle_Outer_Blue", Game::Settings.cosmetic.navi_idle_outer_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi NPC Inner", navi_npc_i_col)) { + Game::Settings.cosmetic.navi_npc_inner_red = (int)(navi_npc_i_col[0] * 255); + Game::Settings.cosmetic.navi_npc_inner_green = (int)(navi_npc_i_col[1] * 255); + Game::Settings.cosmetic.navi_npc_inner_blue = (int)(navi_npc_i_col[2] * 255); + CVar_SetS32("gNavi_NPC_Inner_Red", Game::Settings.cosmetic.navi_npc_inner_red); + CVar_SetS32("gNavi_NPC_Inner_Green", Game::Settings.cosmetic.navi_npc_inner_green); + CVar_SetS32("gNavi_NPC_Inner_Blue", Game::Settings.cosmetic.navi_npc_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi NPC Outer", navi_npc_o_col)) { + Game::Settings.cosmetic.navi_npc_outer_red = (int)(navi_npc_o_col[0] * 255); + Game::Settings.cosmetic.navi_npc_outer_green = (int)(navi_npc_o_col[1] * 255); + Game::Settings.cosmetic.navi_npc_outer_blue = (int)(navi_npc_o_col[2] * 255); + CVar_SetS32("gNavi_NPC_Outer_Red", Game::Settings.cosmetic.navi_npc_outer_red); + CVar_SetS32("gNavi_NPC_Outer_Green", Game::Settings.cosmetic.navi_npc_outer_green); + CVar_SetS32("gNavi_NPC_Outer_Blue", Game::Settings.cosmetic.navi_npc_outer_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Enemy Inner", navi_enemy_i_col)) { + Game::Settings.cosmetic.navi_enemy_inner_red = (int)(navi_enemy_i_col[0] * 255); + Game::Settings.cosmetic.navi_enemy_inner_green = (int)(navi_enemy_i_col[1] * 255); + Game::Settings.cosmetic.navi_enemy_inner_blue = (int)(navi_enemy_i_col[2] * 255); + CVar_SetS32("gNavi_Enemy_Inner_Red", Game::Settings.cosmetic.navi_enemy_inner_red); + CVar_SetS32("gNavi_Enemy_Inner_Green", Game::Settings.cosmetic.navi_enemy_inner_green); + CVar_SetS32("gNavi_Enemy_Inner_Blue", Game::Settings.cosmetic.navi_enemy_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Enemy Outer", navi_enemy_o_col)) { + Game::Settings.cosmetic.navi_enemy_outer_red = (int)(navi_enemy_o_col[0] * 255); + Game::Settings.cosmetic.navi_enemy_outer_green = (int)(navi_enemy_o_col[1] * 255); + Game::Settings.cosmetic.navi_enemy_outer_blue = (int)(navi_enemy_o_col[2] * 255); + CVar_SetS32("gNavi_Enemy_Outer_Red", Game::Settings.cosmetic.navi_enemy_outer_red); + CVar_SetS32("gNavi_Enemy_Outer_Green", Game::Settings.cosmetic.navi_enemy_outer_green); + CVar_SetS32("gNavi_Enemy_Outer_Blue", Game::Settings.cosmetic.navi_enemy_outer_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Prop Inner", navi_prop_i_col)) { + Game::Settings.cosmetic.navi_prop_inner_red = (int)(navi_prop_i_col[0] * 255); + Game::Settings.cosmetic.navi_prop_inner_green = (int)(navi_prop_i_col[1] * 255); + Game::Settings.cosmetic.navi_prop_inner_blue = (int)(navi_prop_i_col[2] * 255); + CVar_SetS32("gNavi_Prop_Inner_Red", Game::Settings.cosmetic.navi_prop_inner_red); + CVar_SetS32("gNavi_Prop_Inner_Green", Game::Settings.cosmetic.navi_prop_inner_green); + CVar_SetS32("gNavi_Prop_Inner_Blue", Game::Settings.cosmetic.navi_prop_inner_blue); + needs_save = true; + } + + if (ImGui::ColorEdit3("Navi Prop Outer", navi_prop_o_col)) { + Game::Settings.cosmetic.navi_prop_outer_red = (int)(navi_prop_o_col[0] * 255); + Game::Settings.cosmetic.navi_prop_outer_green = (int)(navi_prop_o_col[1] * 255); + Game::Settings.cosmetic.navi_prop_outer_blue = (int)(navi_prop_o_col[2] * 255); + CVar_SetS32("gNavi_Prop_Outer_Red", Game::Settings.cosmetic.navi_prop_outer_red); + CVar_SetS32("gNavi_Prop_Outer_Green", Game::Settings.cosmetic.navi_prop_outer_green); + CVar_SetS32("gNavi_Prop_Outer_Blue", Game::Settings.cosmetic.navi_prop_outer_blue); + needs_save = true; + } + + ImGui::EndMenu(); + } + + + if (ImGui::BeginMenu("Developer Tools")) { + HOOK(ImGui::MenuItem("Stats", nullptr, &Game::Settings.debug.soh)); + HOOK(ImGui::MenuItem("Console", nullptr, &console->opened)); + if (ImGui::Checkbox("Easy ISG", &Game::Settings.cheats.ez_isg)) { + CVar_SetS32("gEzISG", Game::Settings.cheats.ez_isg); + needs_save = true; + } + + if (ImGui::Checkbox("Unrestricted Items", &Game::Settings.cheats.no_restrict_item)) { + CVar_SetS32("gNoRestrictItems", Game::Settings.cheats.no_restrict_item); + needs_save = true; + } + + if (ImGui::Checkbox("Freeze Time", &Game::Settings.cheats.freeze_time)) { + CVar_SetS32("gFreezeTime", Game::Settings.cheats.freeze_time); + needs_save = true; + } + + ImGui::EndMenu(); + } + + for (const auto& category : windowCategories) { + if (ImGui::BeginMenu(category.first.c_str())) { + for (const std::string& name : category.second) { + HOOK(ImGui::MenuItem(name.c_str(), nullptr, &customWindows[name].enabled)); + } + ImGui::EndMenu(); + } + } + ImGui::EndMenuBar(); } - ImGui::End(); - ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); - ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); - ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; - if (UseViewports()) { - flags |= ImGuiWindowFlags_NoBackground; - } - ImGui::Begin("OoT Master Quest", nullptr, flags); - ImGui::PopStyleVar(); - ImGui::PopStyleColor(); - - ImVec2 main_pos = ImGui::GetWindowPos(); - ImVec2 size = ImGui::GetContentRegionAvail(); - ImVec2 pos = ImVec2(0, 0); - gfx_current_dimensions.width = size.x * gfx_current_dimensions.internal_mul; - gfx_current_dimensions.height = size.y * gfx_current_dimensions.internal_mul; - if (UseInternalRes()) { - if (Game::Settings.debug.n64mode) { - gfx_current_dimensions.width = 320; - gfx_current_dimensions.height = 240; - const int sw = size.y * 320 / 240; - pos = ImVec2(size.x / 2 - sw / 2, 0); - size = ImVec2(sw, size.y); - } - } - - if (UseInternalRes()) { - int fbuf = std::stoi(SohUtils::getEnvironmentVar("framebuffer")); - ImGui::ImageRotated(reinterpret_cast(fbuf), pos, size, 0.0f); - } ImGui::End(); if (Game::Settings.debug.soh) { @@ -447,18 +796,84 @@ namespace SohImGui { ImGui::Text("Platform: Linux"); #endif ImGui::Text("Status: %.3f ms/frame (%.1f FPS)", 1000.0f / framerate, framerate); - if (UseInternalRes()) { - ImGui::Text("Internal Resolution:"); - ImGui::SliderInt("Mul", reinterpret_cast(&gfx_current_dimensions.internal_mul), 1, 8); - } ImGui::End(); ImGui::PopStyleColor(); } + if (Game::Settings.graphics.show) { + ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0)); + ImGui::Begin("Anti-aliasing settings", nullptr, ImGuiWindowFlags_None); + ImGui::Text("Internal Resolution:"); + ImGui::SliderInt("Mul", reinterpret_cast(&gfx_current_dimensions.internal_mul), 1, 8); + ImGui::Text("MSAA:"); + ImGui::SliderInt("MSAA", reinterpret_cast(&gfx_msaa_level), 1, 8); + ImGui::End(); + ImGui::PopStyleColor(); + } + + console->Draw(); + + for (auto& windowIter : customWindows) { + CustomWindow& window = windowIter.second; + if (window.drawFunc != nullptr) { + window.drawFunc(window.enabled); + } + } + + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f); + ImGui::PushStyleVar(ImGuiStyleVar_ChildBorderSize, 0.0f); + ImGui::PushStyleColor(ImGuiCol_ChildBg, ImVec4(0.0f, 0.0f, 0.0f, 0.0f)); + ImGuiWindowFlags flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground; + ImGui::Begin("OoT Master Quest", nullptr, flags); + ImGui::PopStyleVar(3); + ImGui::PopStyleColor(); + + ImVec2 main_pos = ImGui::GetWindowPos(); + main_pos.x -= top_left_pos.x; + main_pos.y -= top_left_pos.y; + ImVec2 size = ImGui::GetContentRegionAvail(); + ImVec2 pos = ImVec2(0, 0); + gfx_current_dimensions.width = size.x * gfx_current_dimensions.internal_mul; + gfx_current_dimensions.height = size.y * gfx_current_dimensions.internal_mul; + gfx_current_game_window_viewport.x = main_pos.x; + gfx_current_game_window_viewport.y = main_pos.y; + gfx_current_game_window_viewport.width = size.x; + gfx_current_game_window_viewport.height = size.y; + if (Game::Settings.debug.n64mode) { + gfx_current_dimensions.width = 320; + gfx_current_dimensions.height = 240; + const int sw = size.y * 320 / 240; + gfx_current_game_window_viewport.x += (size.x - sw) / 2; + gfx_current_game_window_viewport.width = sw; + pos = ImVec2(size.x / 2 - sw / 2, 0); + size = ImVec2(sw, size.y); + } + } + + void DrawFramebufferAndGameInput() { + ImVec2 main_pos = ImGui::GetWindowPos(); + ImVec2 size = ImGui::GetContentRegionAvail(); + ImVec2 pos = ImVec2(0, 0); + if (Game::Settings.debug.n64mode) { + const int sw = size.y * 320 / 240; + pos = ImVec2(size.x / 2 - sw / 2, 0); + size = ImVec2(sw, size.y); + } + std::string fb_str = SohUtils::getEnvironmentVar("framebuffer"); + if (!fb_str.empty()) { + uintptr_t fbuf = (uintptr_t)std::stoull(fb_str); + //ImGui::ImageSimple(reinterpret_cast(fbuf), pos, size); + ImGui::SetCursorPos(pos); + ImGui::Image(reinterpret_cast(fbuf), size); + } + + ImGui::End(); + const float scale = Game::Settings.controller.input_scale; ImVec2 BtnPos = ImVec2(160 * scale, 85 * scale); - if(Game::Settings.controller.input_enabled) { + if (Game::Settings.controller.input_enabled) { ImGui::SetNextWindowSize(BtnPos); ImGui::SetNextWindowPos(ImVec2(main_pos.x + size.x - BtnPos.x - 20, main_pos.y + size.y - BtnPos.y - 20)); @@ -504,9 +919,9 @@ namespace SohImGui { ImGui::End(); } } + } - console->Draw(); - + void Render() { ImGui::Render(); ImGuiRenderDrawData(ImGui::GetDrawData()); if (UseViewports()) { @@ -515,7 +930,41 @@ namespace SohImGui { } } + void CancelFrame() { + ImGui::EndFrame(); + if (UseViewports()) { + ImGui::UpdatePlatformWindows(); + } + } + void BindCmd(const std::string& cmd, CommandEntry entry) { console->Commands[cmd] = std::move(entry); } -} \ No newline at end of file + + void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc) { + if (customWindows.contains(name)) { + SPDLOG_ERROR("SohImGui::AddWindow: Attempting to add duplicate window name %s", name.c_str()); + return; + } + + customWindows[name] = { + .enabled = false, + .drawFunc = drawFunc + }; + + windowCategories[category].emplace_back(name); + } + + ImTextureID GetTextureByName(const std::string& name) { + return GetTextureByID(DefaultAssets[name]->textureId); + } + + ImTextureID GetTextureByID(int id) { +#ifdef ENABLE_DX11 + ImTextureID gfx_d3d11_get_texture_by_id(int id); + return gfx_d3d11_get_texture_by_id(id); +#else + return reinterpret_cast(id); +#endif + } +} diff --git a/libultraship/libultraship/SohImGuiImpl.h b/libultraship/libultraship/SohImGuiImpl.h index b7c946eff..dc6e24ee1 100644 --- a/libultraship/libultraship/SohImGuiImpl.h +++ b/libultraship/libultraship/SohImGuiImpl.h @@ -1,5 +1,6 @@ #pragma once +#include "Lib/ImGui/imgui.h" #include "SohConsole.h" struct GameAsset { @@ -47,11 +48,26 @@ namespace SohImGui { } sdl; } EventImpl; + extern WindowImpl impl; + + using WindowDrawFunc = void(*)(bool& enabled); + + typedef struct { + bool enabled; + WindowDrawFunc drawFunc; + } CustomWindow; + extern Console* console; void Init(WindowImpl window_impl); void Update(EventImpl event); - void Draw(void); + void DrawMainMenuAndCalculateGameSize(void); + void DrawFramebufferAndGameInput(void); + void Render(void); + void CancelFrame(void); void ShowCursor(bool hide, Dialogues w); void BindCmd(const std::string& cmd, CommandEntry entry); - void* GetTextureByID(int id); + void AddWindow(const std::string& category, const std::string& name, WindowDrawFunc drawFunc); + void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint = ImVec4(1, 1, 1, 1)); + ImTextureID GetTextureByID(int id); + ImTextureID GetTextureByName(const std::string& name); } diff --git a/libultraship/libultraship/TextureMod.cpp b/libultraship/libultraship/TextureMod.cpp index dd2d6fc3a..2a7e39511 100644 --- a/libultraship/libultraship/TextureMod.cpp +++ b/libultraship/libultraship/TextureMod.cpp @@ -80,7 +80,7 @@ namespace Ship { if (!this->TextureCache.contains(path)) this->TextureCache[path].resize(10); - TextureCacheKey key = { orig_addr, static_cast(fmt), static_cast(siz), static_cast(palette) }; + TextureCacheKey key = { orig_addr, { }, static_cast(fmt), static_cast(siz), static_cast(palette) }; TextureCacheValue value = { api->new_texture(), 0, 0, false }; const auto entry = new TextureCacheNode(key, value); api->select_texture(tile, entry->second.texture_id); diff --git a/libultraship/libultraship/Window.cpp b/libultraship/libultraship/Window.cpp index fe194f38b..74397954f 100644 --- a/libultraship/libultraship/Window.cpp +++ b/libultraship/libultraship/Window.cpp @@ -43,6 +43,14 @@ extern "C" { exit(EXIT_FAILURE); } + const char* controllerDb = "gamecontrollerdb.txt"; + int mappingsAdded = SDL_GameControllerAddMappingsFromFile(controllerDb); + if (mappingsAdded >= 0) { + SPDLOG_INFO("Added SDL game controllers from \"{}\" ({})", controllerDb, mappingsAdded); + } else { + SPDLOG_ERROR("Failed add SDL game controller mappings from \"{}\" ({})", controllerDb, SDL_GetError()); + } + // TODO: This for loop is debug. Burn it with fire. for (int i = 0; i < SDL_NumJoysticks(); i++) { if (SDL_IsGameController(i)) { @@ -282,6 +290,10 @@ namespace Ship { //gfx_set_framedivisor(0); } + void Window::GetPixelDepthPrepare(float x, float y) { + gfx_get_pixel_depth_prepare(x, y); + } + uint16_t Window::GetPixelDepth(float x, float y) { return gfx_get_pixel_depth(x, y); } diff --git a/libultraship/libultraship/Window.h b/libultraship/libultraship/Window.h index 6046ca4ae..0d12211b0 100644 --- a/libultraship/libultraship/Window.h +++ b/libultraship/libultraship/Window.h @@ -20,6 +20,7 @@ namespace Ship { void Init(); void RunCommands(Gfx* Commands); void SetFrameDivisor(int divisor); + void GetPixelDepthPrepare(float x, float y); uint16_t GetPixelDepth(float x, float y); void ToggleFullscreen(); void SetFullscreen(bool bIsFullscreen); diff --git a/libultraship/libultraship/libultraship.vcxproj b/libultraship/libultraship/libultraship.vcxproj index 8443b6b11..3bf81a67d 100644 --- a/libultraship/libultraship/libultraship.vcxproj +++ b/libultraship/libultraship/libultraship.vcxproj @@ -101,31 +101,49 @@ 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 + + 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);