mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-24 07:05:34 -07:00
Merge branch 'develop' into develop
This commit is contained in:
commit
bd97c81191
16 changed files with 736 additions and 65 deletions
402
.gitignore
vendored
Normal file
402
.gitignore
vendored
Normal file
|
@ -0,0 +1,402 @@
|
||||||
|
# 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/
|
||||||
|
ZAPDUtils/build/
|
||||||
|
ZAPD/BuildInfo.h
|
||||||
|
|
||||||
|
DebugObj/*
|
||||||
|
ReleaseObj/*
|
|
@ -667,7 +667,7 @@ void OTRExporter_DisplayList::Save(ZResource* res, const fs::path& outPath, Bina
|
||||||
{
|
{
|
||||||
int sss = (data & 0x00FFF00000000000) >> 44;
|
int sss = (data & 0x00FFF00000000000) >> 44;
|
||||||
int ttt = (data & 0x00000FFF00000000) >> 32;
|
int ttt = (data & 0x00000FFF00000000) >> 32;
|
||||||
int i = (data & 0x000000000F000000) >> 16;
|
int i = (data & 0x000000000F000000) >> 24;
|
||||||
int uuu = (data & 0x0000000000FFF000) >> 12;
|
int uuu = (data & 0x0000000000FFF000) >> 12;
|
||||||
int vvv= (data & 0x0000000000000FFF);
|
int vvv= (data & 0x0000000000000FFF);
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,51 @@
|
||||||
#!/usr/bin/env python3
|
#!/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 <number>
|
||||||
|
# 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 multiprocessing import Pool, cpu_count, Event, Manager, ProcessError
|
||||||
|
from enum import Enum
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
def BuildOTR(xmlPath):
|
romVer = "..\\soh\\baserom_non_mq.z64"
|
||||||
|
roms = [];
|
||||||
|
checksums = ["", "", ""];
|
||||||
|
|
||||||
|
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")
|
shutil.copytree("assets", "Extract/assets")
|
||||||
|
|
||||||
execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out"
|
execStr = "x64\\Release\\ZAPD.exe" if sys.platform == "win32" else "../ZAPD/ZAPD.out"
|
||||||
execStr += " ed -i %s -b baserom.z64 -fl CFG\\filelists -o placeholder -osf placeholder -gsf 1 -rconf CFG/Config.xml -se OTR" % (xmlPath)
|
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)
|
print(execStr)
|
||||||
exitValue = os.system(execStr)
|
exitValue = os.system(execStr)
|
||||||
|
@ -18,23 +55,95 @@ def BuildOTR(xmlPath):
|
||||||
print("Aborting...", file=os.sys.stderr)
|
print("Aborting...", file=os.sys.stderr)
|
||||||
print("\n")
|
print("\n")
|
||||||
|
|
||||||
def main():
|
def checkChecksum(rom):
|
||||||
parser = argparse.ArgumentParser(description="baserom asset extractor")
|
r = open(rom, "rb")
|
||||||
parser.add_argument("-v", "--version", help="Sets game version.")
|
r.seek(16)
|
||||||
args = parser.parse_args()
|
bytes = r.read(4).hex().upper()
|
||||||
|
r.close()
|
||||||
|
|
||||||
# TODO: Read from makerom file to automatically determine game version
|
for checksum in Checksums:
|
||||||
xmlVer = "GC_NMQ_D"
|
if (checksum.value == bytes):
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
if (args.version == "gc_pal_nmpq"):
|
def main():
|
||||||
xmlVer = "GC_NMQ_PAL_F"
|
|
||||||
elif (args.version == "dbg_mq"):
|
romToUse = "";
|
||||||
xmlVer = "GC_MQ_D"
|
|
||||||
|
for file in glob.glob("*.z64"):
|
||||||
|
roms.append(file)
|
||||||
|
|
||||||
|
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]
|
||||||
|
|
||||||
|
else:
|
||||||
|
romToUse = roms[0]
|
||||||
|
|
||||||
|
match checkChecksum(romToUse).name:
|
||||||
|
case Checksums.OOT_PAL_GC:
|
||||||
|
xmlVer = "GC_NMQ_PAL_F"
|
||||||
|
case Checksums.OOT_PAL_GC_DBG1:
|
||||||
|
xmlVer = "GC_MQ_D"
|
||||||
|
case _: # default case
|
||||||
|
xmlVer = "GC_NMQ_D"
|
||||||
|
|
||||||
if (os.path.exists("Extract")):
|
if (os.path.exists("Extract")):
|
||||||
shutil.rmtree("Extract")
|
shutil.rmtree("Extract")
|
||||||
|
|
||||||
BuildOTR("..\\soh\\assets\\xml\\" + xmlVer + "\\")
|
BuildOTR("..\\soh\\assets\\xml\\" + xmlVer + "\\", romToUse)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
28
README.md
28
README.md
|
@ -55,20 +55,22 @@ Official Discord: https://discord.com/invite/BtBmd55HVH
|
||||||
2. Install [Visual Studio 2022 Community Edition](https://visualstudio.microsoft.com/vs/community/)
|
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++`.
|
2b. In the Visual Studio Installer, install `MSVC v142 - VS 2019 C++`.
|
||||||
4. Clone the Ship of Harkinian repository.
|
4. Clone the Ship of Harkinian repository.
|
||||||
5. Place `oot debug` rom (not Master Quest) in the `soh` folder named `baserom_original_non_mq`.
|
5. Place one or more [compatible](#compatible-roms) roms in the `OTRExporter` directory with namings of your choice.
|
||||||
6. Launch `soh/fixbaserom.py`.
|
6. Run `OTRExporter/OTRExporter.sln`.
|
||||||
7. Launch `soh/extract_baserom.py`.
|
7. Switch the solution to `Release x64`.
|
||||||
8. Copy the `baserom` folder from the `soh` folder into the `OTRExporter` folder.
|
8. Build the solution.
|
||||||
9. Run `OTRExporter/OTRExporter.sln`.
|
9. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`.
|
||||||
10. Switch the solution to `Release x64`.
|
10. Run `soh/soh.sln`
|
||||||
11. Build the solution.
|
11. Switch the solution to `Release x86`.
|
||||||
12. Launching `OTRExporter/extract_assets.py` will generate an `oot.otr` archive file in `OTRExporter/oot.otr`.
|
12. Build the solution.
|
||||||
13. Run `soh/soh.sln`
|
13. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`.
|
||||||
14. Switch the solution to `Release x86`.
|
14. Launch `soh.exe`.
|
||||||
15. Build the solution.
|
|
||||||
16. Copy the `OTRExporter/oot.otr` archive file to `soh/Release`.
|
|
||||||
17. Launch `soh.exe`.
|
|
||||||
|
|
||||||
|
## Compatible Roms
|
||||||
|
```
|
||||||
|
OOT_PAL_GC checksum 0x09465AC3
|
||||||
|
OOT_PAL_GC_DBG1 checksum 0x871E1C92 (debug non-master quest)
|
||||||
|
```
|
||||||
## Troubleshooting The Exporter
|
## Troubleshooting The Exporter
|
||||||
- Affirm that you have an `/assets` folder filled with XMLs in the same directory as OTRGui.exe
|
- Affirm that you have an `/assets` folder filled with XMLs in the same directory as OTRGui.exe
|
||||||
- Affirm that `zapd.exe` exists in the `/assets/extractor` folder
|
- Affirm that `zapd.exe` exists in the `/assets/extractor` folder
|
||||||
|
|
|
@ -49,8 +49,11 @@ namespace Game {
|
||||||
Settings.debug.n64mode = stob(Conf[ConfSection]["n64_mode"]);
|
Settings.debug.n64mode = stob(Conf[ConfSection]["n64_mode"]);
|
||||||
|
|
||||||
// Enhancements
|
// Enhancements
|
||||||
Settings.enhancements.fast_text = stob(Conf[EnhancementSection]["fast_text"]);
|
Settings.enhancements.skip_text = stob(Conf[EnhancementSection]["skip_text"]);
|
||||||
CVar_SetS32("gFastText", Settings.enhancements.fast_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"]);
|
Settings.enhancements.disable_lod = stob(Conf[EnhancementSection]["disable_lod"]);
|
||||||
CVar_SetS32("gDisableLOD", Settings.enhancements.disable_lod);
|
CVar_SetS32("gDisableLOD", Settings.enhancements.disable_lod);
|
||||||
|
@ -58,9 +61,15 @@ namespace Game {
|
||||||
Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]);
|
Settings.enhancements.animated_pause_menu = stob(Conf[EnhancementSection]["animated_pause_menu"]);
|
||||||
CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu);
|
CVar_SetS32("gPauseLiveLink", Settings.enhancements.animated_pause_menu);
|
||||||
|
|
||||||
|
Settings.enhancements.dynamic_wallet_icon = stob(Conf[EnhancementSection]["dynamic_wallet_icon"]);
|
||||||
|
CVar_SetS32(const_cast<char*>("gDynamicWalletIcon"), Settings.enhancements.dynamic_wallet_icon);
|
||||||
|
|
||||||
Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]);
|
Settings.enhancements.minimal_ui = stob(Conf[EnhancementSection]["minimal_ui"]);
|
||||||
CVar_SetS32("gMinimalUI", Settings.enhancements.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"]);
|
Settings.enhancements.mm_bunny_hood = stob(Conf[EnhancementSection]["mm_bunny_hood"]);
|
||||||
CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood);
|
CVar_SetS32("gMMBunnyHood", Settings.enhancements.mm_bunny_hood);
|
||||||
|
|
||||||
|
@ -121,6 +130,9 @@ namespace Game {
|
||||||
Settings.cheats.infinite_magic = stob(Conf[CheatSection]["infinite_magic"]);
|
Settings.cheats.infinite_magic = stob(Conf[CheatSection]["infinite_magic"]);
|
||||||
CVar_SetS32("gInfiniteMagic", Settings.cheats.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"]);
|
Settings.cheats.no_clip = stob(Conf[CheatSection]["no_clip"]);
|
||||||
CVar_SetS32("gNoClip", Settings.cheats.no_clip);
|
CVar_SetS32("gNoClip", Settings.cheats.no_clip);
|
||||||
|
|
||||||
|
@ -133,6 +145,15 @@ namespace Game {
|
||||||
Settings.cheats.super_tunic = stob(Conf[CheatSection]["super_tunic"]);
|
Settings.cheats.super_tunic = stob(Conf[CheatSection]["super_tunic"]);
|
||||||
CVar_SetS32("gSuperTunic", Settings.cheats.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);
|
||||||
|
|
||||||
UpdateAudio();
|
UpdateAudio();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -154,11 +175,14 @@ namespace Game {
|
||||||
Conf[AudioSection]["fanfare"] = std::to_string(Settings.audio.fanfare);
|
Conf[AudioSection]["fanfare"] = std::to_string(Settings.audio.fanfare);
|
||||||
|
|
||||||
// Enhancements
|
// 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]["disable_lod"] = std::to_string(Settings.enhancements.disable_lod);
|
||||||
Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu);
|
Conf[EnhancementSection]["animated_pause_menu"] = std::to_string(Settings.enhancements.animated_pause_menu);
|
||||||
|
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]["minimal_ui"] = std::to_string(Settings.enhancements.minimal_ui);
|
||||||
Conf[EnhancementSection]["newdrops"] = std::to_string(Settings.enhancements.newdrops);
|
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]["mm_bunny_hood"] = std::to_string(Settings.enhancements.mm_bunny_hood);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,12 +20,16 @@ struct SoHConfigType {
|
||||||
|
|
||||||
// Enhancements
|
// Enhancements
|
||||||
struct {
|
struct {
|
||||||
bool fast_text = false;
|
int text_speed = 1;
|
||||||
|
bool skip_text = false;
|
||||||
bool disable_lod = false;
|
bool disable_lod = false;
|
||||||
bool animated_pause_menu = false;
|
bool animated_pause_menu = false;
|
||||||
|
bool dynamic_wallet_icon = false;
|
||||||
bool minimal_ui = false;
|
bool minimal_ui = false;
|
||||||
bool newdrops = false;
|
bool newdrops = false;
|
||||||
|
bool visualagony = false;
|
||||||
bool mm_bunny_hood = false;
|
bool mm_bunny_hood = false;
|
||||||
|
|
||||||
} enhancements;
|
} enhancements;
|
||||||
|
|
||||||
// Controller
|
// Controller
|
||||||
|
@ -48,10 +52,14 @@ struct SoHConfigType {
|
||||||
bool infinite_health = false;
|
bool infinite_health = false;
|
||||||
bool infinite_ammo = false;
|
bool infinite_ammo = false;
|
||||||
bool infinite_magic = false;
|
bool infinite_magic = false;
|
||||||
|
bool infinite_nayru = false;
|
||||||
bool no_clip = false;
|
bool no_clip = false;
|
||||||
bool climb_everything = false;
|
bool climb_everything = false;
|
||||||
bool moon_jump_on_l = false;
|
bool moon_jump_on_l = false;
|
||||||
bool super_tunic = false;
|
bool super_tunic = false;
|
||||||
|
bool ez_isg = false;
|
||||||
|
bool no_restrict_item = false;
|
||||||
|
bool freeze_time = false;
|
||||||
} cheats;
|
} cheats;
|
||||||
|
|
||||||
// Graphics
|
// Graphics
|
||||||
|
|
|
@ -646,7 +646,7 @@ static int gfx_opengl_create_framebuffer() {
|
||||||
framebuffers[i].clrbuf_msaa = clrbuf_msaa;
|
framebuffers[i].clrbuf_msaa = clrbuf_msaa;
|
||||||
framebuffers[i].rbo = rbo;
|
framebuffers[i].rbo = rbo;
|
||||||
|
|
||||||
return fbo;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
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) {
|
||||||
|
|
|
@ -395,8 +395,14 @@ namespace SohImGui {
|
||||||
ImGui::Text("Gameplay");
|
ImGui::Text("Gameplay");
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
|
|
||||||
if (ImGui::Checkbox("Fast Text", &Game::Settings.enhancements.fast_text)) {
|
ImGui::Text("Text Speed", Game::Settings.enhancements.text_speed);
|
||||||
CVar_SetS32("gFastText", Game::Settings.enhancements.fast_text);
|
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;
|
needs_save = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,6 +435,12 @@ namespace SohImGui {
|
||||||
CVar_SetS32("gNewDrops", Game::Settings.enhancements.newdrops);
|
CVar_SetS32("gNewDrops", Game::Settings.enhancements.newdrops);
|
||||||
needs_save = true;
|
needs_save = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::Checkbox("Dynamic Wallet Icon", &Game::Settings.enhancements.dynamic_wallet_icon)) {
|
||||||
|
CVar_SetS32(const_cast<char*>("gDynamicWalletIcon"), Game::Settings.enhancements.dynamic_wallet_icon);
|
||||||
|
|
||||||
|
needs_save = true;
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
@ -454,24 +466,33 @@ namespace SohImGui {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::BeginMenu("Cheats")) {
|
if (ImGui::BeginMenu("Cheats")) {
|
||||||
if (ImGui::Checkbox("Infinite Money", &Game::Settings.cheats.infinite_money)) {
|
if (ImGui::BeginMenu("Infinite...")) {
|
||||||
CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money);
|
if (ImGui::Checkbox("Money", &Game::Settings.cheats.infinite_money)) {
|
||||||
needs_save = true;
|
CVar_SetS32("gInfiniteMoney", Game::Settings.cheats.infinite_money);
|
||||||
}
|
needs_save = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (ImGui::Checkbox("Infinite Health", &Game::Settings.cheats.infinite_health)) {
|
if (ImGui::Checkbox("Health", &Game::Settings.cheats.infinite_health)) {
|
||||||
CVar_SetS32("gInfiniteHealth", Game::Settings.cheats.infinite_health);
|
CVar_SetS32("gInfiniteHealth", Game::Settings.cheats.infinite_health);
|
||||||
needs_save = true;
|
needs_save = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Checkbox("Infinite Ammo", &Game::Settings.cheats.infinite_ammo)) {
|
if (ImGui::Checkbox("Ammo", &Game::Settings.cheats.infinite_ammo)) {
|
||||||
CVar_SetS32("gInfiniteAmmo", Game::Settings.cheats.infinite_ammo);
|
CVar_SetS32("gInfiniteAmmo", Game::Settings.cheats.infinite_ammo);
|
||||||
needs_save = true;
|
needs_save = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Checkbox("Infinite Magic", &Game::Settings.cheats.infinite_magic)) {
|
if (ImGui::Checkbox("Magic", &Game::Settings.cheats.infinite_magic)) {
|
||||||
CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic);
|
CVar_SetS32("gInfiniteMagic", Game::Settings.cheats.infinite_magic);
|
||||||
needs_save = true;
|
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)) {
|
if (ImGui::Checkbox("No Clip", &Game::Settings.cheats.no_clip)) {
|
||||||
|
@ -494,6 +515,21 @@ namespace SohImGui {
|
||||||
needs_save = true;
|
needs_save = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,8 @@ void BootCommands_Init()
|
||||||
CVar_RegisterS32("gPauseLiveLink", 0);
|
CVar_RegisterS32("gPauseLiveLink", 0);
|
||||||
CVar_RegisterS32("gMinimalUI", 0);
|
CVar_RegisterS32("gMinimalUI", 0);
|
||||||
CVar_RegisterS32("gNewDrops", 0);
|
CVar_RegisterS32("gNewDrops", 0);
|
||||||
|
CVar_RegisterS32("gVisualAgony", 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//void BootCommands_ParseBootArgs(char* str)
|
//void BootCommands_ParseBootArgs(char* str)
|
||||||
|
|
|
@ -381,6 +381,11 @@ void GameState_Update(GameState* gameState) {
|
||||||
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
|
// Moon Jump On L
|
||||||
if (CVar_GetS32("gMoonJumpOnL", 0) != 0) {
|
if (CVar_GetS32("gMoonJumpOnL", 0) != 0) {
|
||||||
|
@ -393,6 +398,32 @@ void GameState_Update(GameState* gameState) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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++;
|
gameState->frames++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ void Message_UpdateOcarinaGame(GlobalContext* globalCtx) {
|
||||||
u8 Message_ShouldAdvance(GlobalContext* globalCtx) {
|
u8 Message_ShouldAdvance(GlobalContext* globalCtx) {
|
||||||
Input* input = &globalCtx->state.input[0];
|
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);
|
: 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)) {
|
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) {
|
u8 Message_ShouldAdvanceSilent(GlobalContext* globalCtx) {
|
||||||
Input* input = &globalCtx->state.input[0];
|
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);
|
: 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);
|
return CHECK_BTN_ALL(input->press.button, BTN_A) || isB_Held || CHECK_BTN_ALL(input->press.button, BTN_CUP);
|
||||||
|
@ -951,7 +951,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i = j - 1;
|
i = j - 1;
|
||||||
msgCtx->textDrawPos = i + 1;
|
msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1);
|
||||||
|
|
||||||
if (character) {}
|
if (character) {}
|
||||||
}
|
}
|
||||||
|
@ -1061,7 +1061,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
|
||||||
msgCtx->textDelay = msgCtx->msgBufDecoded[++i];
|
msgCtx->textDelay = msgCtx->msgBufDecoded[++i];
|
||||||
break;
|
break;
|
||||||
case MESSAGE_UNSKIPPABLE:
|
case MESSAGE_UNSKIPPABLE:
|
||||||
msgCtx->textUnskippable = CVar_GetS32("gFastText", 0) != 1;
|
msgCtx->textUnskippable = CVar_GetS32("gSkipText", 0) != 1;
|
||||||
break;
|
break;
|
||||||
case MESSAGE_TWO_CHOICE:
|
case MESSAGE_TWO_CHOICE:
|
||||||
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_2_CHOICE;
|
msgCtx->textboxEndType = TEXTBOX_ENDTYPE_2_CHOICE;
|
||||||
|
@ -1144,7 +1144,7 @@ void Message_DrawText(GlobalContext* globalCtx, Gfx** gfxP) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (msgCtx->textDelayTimer == 0) {
|
if (msgCtx->textDelayTimer == 0) {
|
||||||
msgCtx->textDrawPos = i + 1;
|
msgCtx->textDrawPos = i + CVar_GetS32("gTextSpeed", 1);
|
||||||
msgCtx->textDelayTimer = msgCtx->textDelay;
|
msgCtx->textDelayTimer = msgCtx->textDelay;
|
||||||
} else {
|
} else {
|
||||||
msgCtx->textDelayTimer--;
|
msgCtx->textDelayTimer--;
|
||||||
|
@ -2026,7 +2026,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,
|
gDPSetCombineLERP(gfx++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE,
|
||||||
0);
|
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);
|
: CHECK_BTN_ALL(globalCtx->state.input[0].press.button, BTN_B);
|
||||||
|
|
||||||
switch (msgCtx->msgMode) {
|
switch (msgCtx->msgMode) {
|
||||||
|
@ -3067,7 +3067,7 @@ void Message_Update(GlobalContext* globalCtx) {
|
||||||
return;
|
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);
|
: CHECK_BTN_ALL(input->press.button, BTN_B);
|
||||||
|
|
||||||
switch (msgCtx->msgMode) {
|
switch (msgCtx->msgMode) {
|
||||||
|
|
|
@ -3129,6 +3129,14 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
||||||
};
|
};
|
||||||
static s16 rupeeDigitsFirst[] = { 1, 0, 0 };
|
static s16 rupeeDigitsFirst[] = { 1, 0, 0 };
|
||||||
static s16 rupeeDigitsCount[] = { 2, 3, 3 };
|
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 s16 spoilingItemEntrances[] = { 0x01AD, 0x0153, 0x0153 };
|
||||||
static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused
|
static f32 D_80125B54[] = { -40.0f, -35.0f }; // unused
|
||||||
static s16 D_80125B5C[] = { 91, 91 }; // unused
|
static s16 D_80125B5C[] = { 91, 91 }; // unused
|
||||||
|
@ -3171,7 +3179,15 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
||||||
|
|
||||||
if (fullUi) {
|
if (fullUi) {
|
||||||
// Rupee Icon
|
// Rupee Icon
|
||||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 200, 255, 100, interfaceCtx->magicAlpha);
|
s16* rColor;
|
||||||
|
|
||||||
|
if (CVar_GetS32("gDynamicWalletIcon", 0)) {
|
||||||
|
rColor = &rupeeWalletColors[CUR_UPG_VALUE(UPG_WALLET)];
|
||||||
|
} else {
|
||||||
|
rColor = &rupeeWalletColors[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, rColor[0], rColor[1], rColor[2], interfaceCtx->magicAlpha);
|
||||||
gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255);
|
gDPSetEnvColor(OVERLAY_DISP++, 0, 80, 0, 255);
|
||||||
OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26),
|
OVERLAY_DISP = Gfx_TextureIA8(OVERLAY_DISP, gRupeeCounterIconTex, 16, 16, OTRGetRectDimensionFromLeftEdge(26),
|
||||||
206, 16, 16, 1 << 10, 1 << 10);
|
206, 16, 16, 1 << 10, 1 << 10);
|
||||||
|
@ -3269,7 +3285,7 @@ void Interface_Draw(GlobalContext* globalCtx) {
|
||||||
Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16,
|
Gfx_TextureI8(OVERLAY_DISP, ((u8*)digitTextures[interfaceCtx->counterDigits[svar2]]), 8, 16,
|
||||||
OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10);
|
OTRGetRectDimensionFromLeftEdge(svar3), 206, 8, 16, 1 << 10, 1 << 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Make sure item counts have black backgrounds
|
// Make sure item counts have black backgrounds
|
||||||
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->magicAlpha);
|
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 0, 0, 0, interfaceCtx->magicAlpha);
|
||||||
|
|
|
@ -496,7 +496,7 @@ void EnExItem_DrawMagic(EnExItem* this, GlobalContext* globalCtx, s16 magicIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnExItem_DrawKey(EnExItem* this, GlobalContext* globalCtx, s32 index) {
|
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);
|
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_ex_item.c", 880);
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h"
|
#include "overlays/effects/ovl_Effect_Ss_Fhg_Flash/z_eff_ss_fhg_flash.h"
|
||||||
#include "objects/gameplay_keep/gameplay_keep.h"
|
#include "objects/gameplay_keep/gameplay_keep.h"
|
||||||
#include "objects/object_link_child/object_link_child.h"
|
#include "objects/object_link_child/object_link_child.h"
|
||||||
|
#include "textures/icon_item_24_static/icon_item_24_static.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/* 0x00 */ u8 itemId;
|
/* 0x00 */ u8 itemId;
|
||||||
|
@ -10265,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)) {
|
if (CHECK_QUEST_ITEM(QUEST_STONE_OF_AGONY)) {
|
||||||
f32 temp = 200000.0f - (this->unk_6A4 * 5.0f);
|
f32 temp = 200000.0f - (this->unk_6A4 * 5.0f);
|
||||||
|
|
||||||
|
@ -10274,8 +10275,45 @@ void func_80848EF8(Player* this) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this->unk_6A0 += temp;
|
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) {
|
if (this->unk_6A0 > 4000000.0f) {
|
||||||
this->unk_6A0 = 0.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);
|
func_8083264C(this, 120, 20, 10, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10547,7 +10585,7 @@ void Player_UpdateCommon(Player* this, GlobalContext* globalCtx, Input* input) {
|
||||||
else {
|
else {
|
||||||
this->fallStartHeight = this->actor.world.pos.y;
|
this->fallStartHeight = this->actor.world.pos.y;
|
||||||
}
|
}
|
||||||
func_80848EF8(this);
|
func_80848EF8(this, globalCtx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -595,7 +595,6 @@ void KaleidoScope_DrawEquipment(GlobalContext* globalCtx) {
|
||||||
gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItemSegment);
|
gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItemSegment);
|
||||||
//gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItem24Segment);
|
//gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->iconItem24Segment);
|
||||||
gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->nameSegment);
|
gSPInvalidateTexCache(POLY_KAL_DISP++, pauseCtx->nameSegment);
|
||||||
gSPInvalidateTexCache(POLY_KAL_DISP++, globalCtx->interfaceCtx.mapSegment);
|
|
||||||
|
|
||||||
//gSPSegment(POLY_KAL_DISP++, 0x07, pauseCtx->playerSegment);
|
//gSPSegment(POLY_KAL_DISP++, 0x07, pauseCtx->playerSegment);
|
||||||
gSPSegment(POLY_KAL_DISP++, 0x08, pauseCtx->iconItemSegment);
|
gSPSegment(POLY_KAL_DISP++, 0x08, pauseCtx->iconItemSegment);
|
||||||
|
|
|
@ -332,6 +332,10 @@ void KaleidoScope_DrawDungeonMap(GlobalContext* globalCtx, GraphicsContext* gfxC
|
||||||
|
|
||||||
gSPVertex(POLY_KAL_DISP++, &pauseCtx->mapPageVtx[60], 8, 0);
|
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,
|
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);
|
G_TX_WRAP | G_TX_NOMIRROR, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue