Remove decomp elf dependency and automate patch relocations (#419)

* Changed patch recompilation to use new reference symbol functionality and removed all manual relocations

* Moved symbol tomls to submodule, switched from objcopy to recompiler output binary mechanism for patch recompilation

* Update N64Recomp commit in CI to symbol_reference_file branch

* Remove option in patches toml that doesn't exist

* Update N64Recomp to fix issue with pause screen cursor, fix some issues caused by patches and overlay function-local statics

* Disable unpaired lo16 warnings and update N64Recomp in CI

* Update build instructions to reflect that the decomp elf is no longer needed
This commit is contained in:
Wiseguy 2024-07-05 16:33:34 -04:00 committed by GitHub
parent 5e3aac4b45
commit 79fc56f1fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 259 additions and 69465 deletions

View File

@ -9,7 +9,7 @@ on:
N64RECOMP_COMMIT:
type: string
required: false
default: '2a2df89349ff25a3afb3a09617deb3a166efe2f3'
default: 'ba4aede49c9a5302ecfc1fa599f7acc3925042f9'
DXC_CHECKSUM:
type: string
required: false

3
.gitmodules vendored
View File

@ -19,3 +19,6 @@
[submodule "lib/N64ModernRuntime"]
path = lib/N64ModernRuntime
url = https://github.com/N64Recomp/N64ModernRuntime.git
[submodule "Zelda64RecompSyms"]
path = Zelda64RecompSyms
url = https://github.com/Zelda64Recomp/Zelda64RecompSyms

View File

@ -1,13 +1,8 @@
# Building Guide
> [!NOTE]
> The need for an elf file from the Majora's Mask decompilation is temporary and will be removed in the future.
This guide will help you build the project on your local machine. The process will require you to provide a decompressed ROM of the US version of the game.
This guide will help you build the project on your local machine. The process will require you to provide two items:
- A decompressed ROM of the US version of the game.
- An elf file created from [this commit](https://github.com/zeldaret/mm/tree/23beee0717364de43ca9a82957cc910cf818de90) of the Majora's Mask decompilation.
These steps cover: acquiring these, running the required processes and finally building the project.
These steps cover: decompressing the ROM, running the recompiler and finally building the project.
## 1. Clone the Zelda64Recomp Repository
This project makes use of submodules so you will need to clone the repository with the `--recurse-submodules` flag.
@ -40,20 +35,14 @@ The other tool necessary will be `make` which can be installe via [Chocolatey](h
choco install make
```
## 3. Creating the ELF file & decompressed ROM
You will need to build [this commit](https://github.com/zeldaret/mm/tree/23beee0717364de43ca9a82957cc910cf818de90) of the Majora's Mask decompilation. Follow their build instructions to generate the ELF file and decompressed ROM. However, while building you may get the following build error:
```bash
RuntimeError: 'jr' instruction does not have an 'jump label' field
```
## 3. Decompressing the target ROM
You will need to decompress the NTSC-U N64 Majora's Mask ROM (sha1: d6133ace5afaa0882cf214cf88daba39e266c078) before running the recompiler.
To fix this you will have to modify the problematic file `tools/disasm/disasm.py` at line 1115. This issue is due to a bug in this specific commit of the decomp project and will be resolved once Zelda64Recomp is updated to a more recent commit. To fix it, replace the line:
```diff
- elif insn.isJump():
+ elif insn.isJumpWithAddress():
```
There are a few tools that can do it:
* This python script from the Majora's Mask decompilation project: https://github.com/zeldaret/mm/blob/main/tools/buildtools/decompress_baserom.py
* https://github.com/z64tools/z64decompress
Upon successful build it will generate the two required files. Copy them to the root of the Zelda64Recomp repository:
- `mm.us.rev1.rom_uncompressed.elf`
Regardless of which method you use, copy the decompressed ROM to the root of the Zelda64Recomp repository with this filename:
- `mm.us.rev1.rom_uncompressed.z64`
## 4. Generating the C code
@ -71,7 +60,9 @@ After that, go back to the repository root, and run the following commands:
Finally, you can build the project! :rocket:
On Windows, you can open the repository folder with Visual Studio, and you'll be able to `[build / run / debug]` the project from there. If you prefer the commandline or you're on a Unix platform you can build the project using CMake:
On Windows, you can open the repository folder with Visual Studio, and you'll be able to `[build / run / debug]` the project from there.
If you prefer the command line or you're on a Unix platform you can build the project using CMake:
```bash
cmake -S . -B build-cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -G Ninja -DCMAKE_BUILD_TYPE=Release # or Debug if you want to debug
@ -80,7 +71,7 @@ cmake --build build-cmake --target Zelda64Recompiled -j$(nproc) --config Release
## 6. Success
Voilà! You should now have a `Zelda64Recompiled` file in the `build-cmake` directory!
Voilà! You should now have a `Zelda64Recompiled` executable in the build directory! If you used Visual Studio this will be `out/build/x64-[Configuration]` and if you used the provided CMake commands then this will be `build-cmake`. You will need to run the executable out of the root folder of this project or copy the assets folder to the build folder to run it.
> [!IMPORTANT]
> In the game itself, you should be using a standard ROM, not the decompressed one.

View File

@ -95,7 +95,7 @@ endif()
add_custom_target(PatchesBin
COMMAND ${CMAKE_COMMAND} -E env CC=${PATCHES_C_COMPILER} LD=${PATCHES_LD} OBJCOPY=${PATCHES_OBJCOPY} make
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/patches
BYPRODUCTS ${CMAKE_SOURCE_DIR}/patches/patches.bin
BYPRODUCTS ${CMAKE_SOURCE_DIR}/patches/patches.elf
)
# Generate patches_bin.c from patches.bin
@ -104,15 +104,16 @@ add_custom_command(OUTPUT ${CMAKE_SOURCE_DIR}/RecompiledPatches/patches_bin.c
DEPENDS ${CMAKE_SOURCE_DIR}/patches/patches.bin
)
# Recompile patches elf into patches.c
# Recompile patches elf into patches.c and patches.bin
add_custom_command(OUTPUT
${CMAKE_SOURCE_DIR}/patches/patches.bin
${CMAKE_SOURCE_DIR}/RecompiledPatches/patches.c
${CMAKE_SOURCE_DIR}/RecompiledPatches/recomp_overlays.inl
${CMAKE_SOURCE_DIR}/RecompiledPatches/funcs.h
# TODO: Look into why modifying patches requires two builds to take
COMMAND ./N64Recomp patches.toml
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
DEPENDS ${CMAKE_SOURCE_DIR}/patches/patches.bin
DEPENDS ${CMAKE_SOURCE_DIR}/patches/patches.elf
)
# Download controller db file for controller support via SDL2

1
Zelda64RecompSyms Submodule

@ -0,0 +1 @@
Subproject commit 50d63debd58ce9f01957142ea91b67b6c7018c96

View File

@ -5,5 +5,12 @@
elf_path = "patches/patches.elf"
output_func_path = "RecompiledPatches"
single_file_output = true
# Allow absolute symbols to be used as jump targets
# Allow absolute symbols to be used as jump targets.
use_absolute_symbols = true
# Point the recompiler at the symbol files so that it can resolve relocations during recompilation.
func_reference_syms_file = "Zelda64RecompSyms/mm.us.rev1.syms.toml"
data_reference_syms_files = [ "Zelda64RecompSyms/mm.us.rev1.datasyms.toml", "Zelda64RecompSyms/mm.us.rev1.datasyms_static.toml" ]
# Tell the recompiler to write the output binary. Doing this instead of using objcopy allows the recompiler to patch MIPS32 relocs.
output_binary_path = "patches/patches.bin"
# Do not emit warnings for unpaired LO16 values, as clang produces many of them.
unpaired_lo16_warnings = false

View File

@ -2,24 +2,17 @@ TARGET = patches.elf
CC ?= clang
LD ?= ld.lld
OBJCOPY ?= llvm-objcopy
CFLAGS := -target mips -mips2 -mabi=32 -O2 -G0 -mno-abicalls -mno-odd-spreg -mno-check-zero-division \
-fomit-frame-pointer -ffast-math -fno-unsafe-math-optimizations -fno-builtin-memset \
-Wall -Wextra -Wno-incompatible-library-redeclaration -Wno-unused-parameter -Wno-unknown-pragmas -Wno-unused-variable -Wno-missing-braces -Wno-unsupported-floating-point-opt
CPPFLAGS := -nostdinc -D_LANGUAGE_C -DMIPS -I dummy_headers -I ../lib/mm-decomp/include -I ../lib/mm-decomp/src -I ../lib/mm-decomp/assets -I../lib/rt64/include
LDFLAGS := -nostdlib -T patches.ld -T syms.ld --just-symbols=../mm.us.rev1.rom_uncompressed.elf --allow-multiple-definition -Map patches.map
BINFLAGS := -O binary --remove-section=.bss --remove-section=.pad --remove-section=.text
LDFLAGS := -nostdlib -T patches.ld -T syms.ld -Map patches.map --unresolved-symbols=ignore-all --emit-relocs
C_SRCS := $(wildcard *.c)
C_OBJS := $(C_SRCS:.c=.o)
C_DEPS := $(C_SRCS:.c=.d)
DATABIN := $(TARGET:.elf=.bin)
$(DATABIN): $(TARGET)
$(OBJCOPY) $(BINFLAGS) $(TARGET) $@
$(TARGET): $(C_OBJS) patches.ld syms.ld
$(LD) $(C_OBJS) $(LDFLAGS) -o $@
@ -27,7 +20,7 @@ $(C_OBJS): %.o : %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $< -MMD -MF $(@:.o=.d) -c -o $@
clean:
rm -rf $(C_OBJS) $(TARGET) $(DATABIN) $(C_DEPS)
rm -rf $(C_OBJS) $(TARGET) $(C_DEPS)
-include $(C_DEPS)

View File

@ -1911,8 +1911,6 @@ void func_809EC568(Boss04* this, PlayState* play) {
f32 y;
f32 z;
s32 pad;
// @recomp Manual relocation, TODO remove when automated.
u8* D_809EE4D0_relocated = (u8*)actor_relocate(&this->actor, &D_809EE4D0);
u16 maxProjectedPosToStartFight;
// @recomp Change the maximun projected position to start the fight depending on whether analog camera is enabled or not.
@ -2059,7 +2057,7 @@ void func_809EC568(Boss04* this, PlayState* play) {
this->unk_2C8 = 300;
this->unk_2D0 = 0.0f;
*D_809EE4D0_relocated = 1;
D_809EE4D0 = 1;
this->unk_2E2 = 60;
this->unk_2E0 = 93;
}

View File

@ -63,17 +63,13 @@ void func_80884718(EnHorse* this, PlayState* play) {
}
this->cueId = cue->id;
// @recomp Manual relocation, TODO remove when automated.
EnHorseCsFunc* D_808890F0_reloc = actor_relocate(&this->actor, D_808890F0);
if (D_808890F0_reloc[this->cueId] != NULL) {
D_808890F0_reloc[this->cueId](this, play, cue);
if (D_808890F0[this->cueId] != NULL) {
D_808890F0[this->cueId](this, play, cue);
}
}
// @recomp Manual relocation, TODO remove when automated.
EnHorseCsFunc* D_8088911C_reloc = actor_relocate(&this->actor, D_8088911C);
if (D_8088911C_reloc[this->cueId] != NULL) {
D_8088911C_reloc[this->cueId](this, play, cue);
if (D_8088911C[this->cueId] != NULL) {
D_8088911C[this->cueId](this, play, cue);
}
}
}

View File

@ -34,12 +34,7 @@ void TransitionWipe3_Draw(void* thisx, Gfx** gfxP) {
guScale(modelView, scale, scale, 1.0f);
gSPMatrix(gfx++, modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
}
// sTransWipe3DL is an overlay symbol, so its addresses need to be offset to get the actual loaded vram address.
// TODO remove this once the recompiler is able to handle overlay symbols automatically for patch functions.
ptrdiff_t reloc_offset;
TransitionOverlay* overlay_entry = &gTransitionOverlayTable[FBDEMO_WIPE3];
reloc_offset = (uintptr_t)Lib_PhysicalToVirtual(overlay_entry->loadInfo.addr) - (uintptr_t)overlay_entry->vramStart;
gSPDisplayList(gfx++, (Gfx*)((u8*)sTransWipe3DL + reloc_offset));
gSPDisplayList(gfx++, sTransWipe3DL);
gDPPipeSync(gfx++);
*gfxP = gfx;
}

View File

@ -178,15 +178,12 @@ void func_808DD3C8(Actor* thisx, PlayState* play2) {
spB4 = false;
if (this->actor.params == 3) {
// @recomp Manual relocation, TODO remove when the recompiler handles this automatically.
f32* D_808DE5B0_ptr = actor_relocate(thisx, &D_808DE5B0);
temp_f0 = func_80173B48(&play->state) / 1.4e7f;
temp_f0 = CLAMP(temp_f0, 0.0f, 1.0f);
Math_SmoothStepToF(D_808DE5B0_ptr, temp_f0, 0.2f, 0.1f, 0.001f);
Math_SmoothStepToF(&D_808DE5B0, temp_f0, 0.2f, 0.1f, 0.001f);
sp68 = play->envCtx.precipitation[PRECIP_SNOW_CUR];
sp68 *= *D_808DE5B0_ptr;
sp68 *= D_808DE5B0;
if ((play->envCtx.precipitation[PRECIP_SNOW_CUR] >= 32) && (sp68 < 32)) {
sp68 = 32;
@ -469,8 +466,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
// Apply the debris effect material if it has not already been applied.
if (!isMaterialApplied) {
isMaterialApplied++;
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_OPA_DISP++, actor_relocate(thisx, gClearTagDebrisEffectMaterialDL));
gSPDisplayList(POLY_OPA_DISP++, gClearTagDebrisEffectMaterialDL);
}
// Draw the debris effect.
@ -481,8 +477,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix.
gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_OPA_DISP++, actor_relocate(thisx, gClearTagDebrisEffectDL));
gSPDisplayList(POLY_OPA_DISP++, gClearTagDebrisEffectDL);
// @recomp Pop the matrix tag.
gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW);
}
@ -531,8 +526,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix.
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagFlashEffectGroundDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagFlashEffectGroundDL);
// @recomp Pop the matrix tag.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
}
@ -546,8 +540,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
if ((effect->type == CLEAR_TAG_EFFECT_SMOKE) || (effect->type == CLEAR_TAG_EFFECT_ISOLATED_SMOKE)) {
// Apply the smoke effect material if it has not already been applied.
if (!isMaterialApplied) {
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagFireEffectMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagFireEffectMaterialDL);
isMaterialApplied++;
}
@ -566,8 +559,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix.
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagFireEffectDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagFireEffectDL);
// @recomp Pop the matrix tag.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
}
@ -580,8 +572,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
if (effect->type == CLEAR_TAG_EFFECT_FIRE) {
// Apply the fire effect material if it has not already been applied.
if (!isMaterialApplied) {
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagFireEffectMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagFireEffectMaterialDL);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 215, 255, 128);
isMaterialApplied++;
}
@ -596,8 +587,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix.
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagFireEffectDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagFireEffectDL);
// @recomp Pop the matrix tag.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
}
@ -623,8 +613,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix.
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagFlashEffectDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagFlashEffectDL);
// @recomp Pop the matrix tag.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
}
@ -640,8 +629,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, (u8)effect->envColor.r, (u8)effect->envColor.g, (u8)effect->envColor.b,
0);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagLightRayEffectMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagLightRayEffectMaterialDL);
isMaterialApplied++;
}
@ -657,8 +645,7 @@ void EnClearTag_DrawEffects(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix.
gEXMatrixGroupDecomposedNormal(POLY_XLU_DISP++, actor_transform_id(thisx) + i, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_NONE);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, actor_relocate(thisx, gClearTagLightRayEffectDL));
gSPDisplayList(POLY_XLU_DISP++, gClearTagLightRayEffectDL);
// @recomp Pop the matrix tag.
gEXPopMatrixGroup(POLY_XLU_DISP++, G_MTX_MODELVIEW);
}

View File

@ -8,7 +8,7 @@
#define PAGE_BG_WIDTH (PAGE_BG_COLS * PAGE_BG_QUAD_WIDTH)
#define PAGE_BG_HEIGHT (PAGE_BG_ROWS * PAGE_BG_QUAD_HEIGHT)
#define RECOMP_PAGE_ROW_HEIGHT 14
#define RECOMP_PAGE_ROW_HEIGHT 15
#define RECOMP_PAGE_ROW_COUNT ((PAGE_BG_HEIGHT + RECOMP_PAGE_ROW_HEIGHT - 1) / RECOMP_PAGE_ROW_HEIGHT)
extern s16* sVtxPageQuadsX[VTX_PAGE_MAX];
@ -55,16 +55,16 @@ s16 KaleidoScope_SetPageVertices(PlayState* play, Vtx* vtx, s16 vtxPage, s16 num
vtx[4 * row + 0].v.flag = vtx[4 * row + 1].v.flag = vtx[4 * row + 2].v.flag = vtx[4 * row + 3].v.flag = 0;
#define PIXEL_OFFSET ((1 << 4))
#define PIXEL_OFFSET 0
vtx[4 * row + 0].v.tc[0] = PIXEL_OFFSET;
vtx[4 * row + 0].v.tc[1] = (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 1].v.tc[0] = PAGE_BG_WIDTH * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 1].v.tc[1] = (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 0].v.tc[1] = PIXEL_OFFSET;
vtx[4 * row + 1].v.tc[0] = (PAGE_BG_WIDTH + 2 - 1) * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 1].v.tc[1] = PIXEL_OFFSET;
vtx[4 * row + 2].v.tc[0] = PIXEL_OFFSET;
vtx[4 * row + 2].v.tc[1] = (cur_y - next_y + 1) * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 3].v.tc[0] = PAGE_BG_WIDTH * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 3].v.tc[1] = (cur_y - next_y + 1) * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 2].v.tc[1] = (cur_y - next_y + 1 - 1) * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 3].v.tc[0] = (PAGE_BG_WIDTH + 2 - 1) * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 3].v.tc[1] = (cur_y - next_y + 1 - 1) * (1 << 5) + PIXEL_OFFSET;
vtx[4 * row + 0].v.cn[0] = vtx[4 * row + 1].v.cn[0] = vtx[4 * row + 2].v.cn[0] = vtx[4 * row + 3].v.cn[0] = 0;
vtx[4 * row + 0].v.cn[1] = vtx[4 * row + 1].v.cn[1] = vtx[4 * row + 2].v.cn[1] = vtx[4 * row + 3].v.cn[1] = 0;
@ -73,21 +73,14 @@ s16 KaleidoScope_SetPageVertices(PlayState* play, Vtx* vtx, s16 vtxPage, s16 num
cur_y = next_y;
}
// These are overlay symbols, so their addresses need to be offset to get their actual loaded vram address.
// TODO remove this once the recompiler is able to handle overlay symbols automatically for patch functions.
s16** sVtxPageQuadsXRelocated = (s16**)KaleidoManager_GetRamAddr(sVtxPageQuadsX);
s16** sVtxPageQuadsWidthRelocated = (s16**)KaleidoManager_GetRamAddr(sVtxPageQuadsWidth);
s16** sVtxPageQuadsYRelocated = (s16**)KaleidoManager_GetRamAddr(sVtxPageQuadsY);
s16** sVtxPageQuadsHeightRelocated = (s16**)KaleidoManager_GetRamAddr(sVtxPageQuadsHeight);
s16 k = 60;
if (numQuads != 0) {
quadsX = sVtxPageQuadsXRelocated[vtxPage];
quadsWidth = sVtxPageQuadsWidthRelocated[vtxPage];
quadsY = sVtxPageQuadsYRelocated[vtxPage];
quadsHeight = sVtxPageQuadsHeightRelocated[vtxPage];
quadsX = sVtxPageQuadsX[vtxPage];
quadsWidth = sVtxPageQuadsWidth[vtxPage];
quadsY = sVtxPageQuadsY[vtxPage];
quadsHeight = sVtxPageQuadsHeight[vtxPage];
s16 i;
for (i = 0; i < numQuads; i++, k += 4) {
@ -185,10 +178,10 @@ void KaleidoUpdateWrapper(PlayState* play) {
void KaleidoDrawWrapper(PlayState* play) {
// @recomp Update the background image pointers to reflect the overlay's load address.
bg_pointers[0] = KaleidoManager_GetRamAddr(sMaskPageBgTextures);
bg_pointers[1] = KaleidoManager_GetRamAddr(sItemPageBgTextures);
bg_pointers[2] = KaleidoManager_GetRamAddr(sMapPageBgTextures);
bg_pointers[3] = KaleidoManager_GetRamAddr(sQuestPageBgTextures);
bg_pointers[0] = sMaskPageBgTextures;
bg_pointers[1] = sItemPageBgTextures;
bg_pointers[2] = sMapPageBgTextures;
bg_pointers[3] = sQuestPageBgTextures;
KaleidoScope_Draw(play);
@ -202,10 +195,10 @@ void KaleidoDrawWrapper(PlayState* play) {
uintptr_t old_segment_0D = gSegments[0x0D];
gSegments[0x08] = OS_K0_TO_PHYSICAL(play->pauseCtx.iconItemSegment);
gSegments[0x0D] = OS_K0_TO_PHYSICAL(play->pauseCtx.iconItemLangSegment);
assemble_image(KaleidoManager_GetRamAddr(sMaskPageBgTextures), &bg_images[0]);
assemble_image(KaleidoManager_GetRamAddr(sItemPageBgTextures), &bg_images[1]);
assemble_image(KaleidoManager_GetRamAddr(sMapPageBgTextures), &bg_images[2]);
assemble_image(KaleidoManager_GetRamAddr(sQuestPageBgTextures), &bg_images[3]);
assemble_image(sMaskPageBgTextures, &bg_images[0]);
assemble_image(sItemPageBgTextures, &bg_images[1]);
assemble_image(sMapPageBgTextures, &bg_images[2]);
assemble_image(sQuestPageBgTextures, &bg_images[3]);
gSegments[0x08] = old_segment_08;
gSegments[0x0D] = old_segment_0D;
}
@ -241,20 +234,21 @@ Gfx* KaleidoScope_DrawPageSections(Gfx* gfx, Vtx* vertices, TexturePtr* textures
// Draw the rows.
for (u32 bg_row = 0; bg_row < RECOMP_PAGE_ROW_COUNT; bg_row++) {
u32 cur_row_height = MIN(RECOMP_PAGE_ROW_HEIGHT, PAGE_BG_HEIGHT - bg_row * RECOMP_PAGE_ROW_HEIGHT);
gDPLoadTextureTile(gfx++, *cur_image,
G_IM_FMT_IA, G_IM_SIZ_8b, // fmt, siz
PAGE_BG_WIDTH + 2, PAGE_BG_HEIGHT + 2, // width, height
0, (bg_row + 0) * RECOMP_PAGE_ROW_HEIGHT, // uls, ult
PAGE_BG_WIDTH + 2, (bg_row + 1) * RECOMP_PAGE_ROW_HEIGHT + 2, // lrs, lrt
0, bg_row * RECOMP_PAGE_ROW_HEIGHT, // uls, ult
PAGE_BG_WIDTH + 2 - 1, bg_row * RECOMP_PAGE_ROW_HEIGHT + cur_row_height + 1 - 1, // lrs, lrt
0, // pal
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP,
G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gDPSetTileSize(gfx++, G_TX_RENDERTILE,
0 << G_TEXTURE_IMAGE_FRAC,
0 << G_TEXTURE_IMAGE_FRAC,
(PAGE_BG_WIDTH + 2) <<G_TEXTURE_IMAGE_FRAC,
(RECOMP_PAGE_ROW_HEIGHT + 2) << G_TEXTURE_IMAGE_FRAC);
(PAGE_BG_WIDTH + 2 - 1) <<G_TEXTURE_IMAGE_FRAC,
(cur_row_height + 1 - 1) << G_TEXTURE_IMAGE_FRAC);
gSPVertex(gfx++, vertices + 4 * bg_row, 4, 0);
gSP2Triangles(gfx++, 0, 3, 1, 0x0, 3, 0, 2, 0x0);
}
@ -333,18 +327,6 @@ s32 DemoEffect_OverrideLimbDrawTimewarp(PlayState* play, SkelCurve* skelCurve, s
return true;
}
void* gamestate_relocate(void* addr, GameStateId id) {
GameStateOverlay* ovl = &gGameStateOverlayTable[id];
if ((uintptr_t)addr >= 0x80800000) {
return (void*)((uintptr_t)addr -
(intptr_t)((uintptr_t)ovl->vramStart - (uintptr_t)ovl->loadedRamAddr));
}
else {
recomp_printf("Not an overlay address!: 0x%08X 0x%08X 0x%08X\n", (u32)addr, (u32)ovl->vramStart, (u32)ovl->loadedRamAddr);
return addr;
}
}
void DayTelop_Main(GameState* thisx);
void DayTelop_Destroy(GameState* thisx);
void DayTelop_Noop(DayTelopState* this);
@ -358,9 +340,8 @@ void DayTelop_Init(GameState* thisx) {
Matrix_Init(&this->state);
ShrinkWindow_Destroy();
View_Init(&this->view, this->state.gfxCtx);
// @recomp Manual relocation, TODO remove when automated.
this->state.main = (GameStateFunc)gamestate_relocate(DayTelop_Main, GAMESTATE_DAYTELOP);
this->state.destroy = (GameStateFunc)gamestate_relocate(DayTelop_Destroy, GAMESTATE_DAYTELOP);
this->state.main = DayTelop_Main;
this->state.destroy = DayTelop_Destroy;
// @recomp Add 120 extra frames (2 seconds with a frame divisor of 1) to account for faster loading.
this->transitionCountdown = 260;
this->fadeInState = DAYTELOP_HOURSTEXT_OFF;

View File

@ -181,9 +181,7 @@ void func_8083A98C(Actor* thisx, PlayState* play2) {
Message_StartTextbox(play, (play->sceneId == SCENE_AYASHIISHOP) ? 0x2A00 : 0x5E6, NULL);
}
} else {
// @recomp Manual relocation, TODO remove when automated.
Input* player_control_input = play->state.input;
*(Input**)KaleidoManager_GetRamAddr(&sPlayerControlInput) = player_control_input;
sPlayerControlInput = play->state.input;
if (play->view.fovy >= 25.0f) {
s16 prevFocusX = thisx->focus.rot.x;
s16 prevFocusY = thisx->focus.rot.y;
@ -193,7 +191,7 @@ void func_8083A98C(Actor* thisx, PlayState* play2) {
// @recomp Add in the analog camera Y input. Clamp to prevent moving the camera twice as fast if both sticks are held.
// Pitch:
inputY = CLAMP(player_control_input->rel.stick_y + analog_y, -60, 60) * 4;
inputY = CLAMP(sPlayerControlInput->rel.stick_y + analog_y, -60, 60) * 4;
// @recomp Invert the Y axis accordingly (default is inverted, so negate if not inverted).
if (!inverted_y) {
inputY = -inputY;
@ -205,7 +203,7 @@ void func_8083A98C(Actor* thisx, PlayState* play2) {
// @recomp Add in the analog camera X input. Clamp to prevent moving the camera twice as fast if both sticks are held.
// Yaw: shape.rot.y is used as a fixed starting position
inputX = CLAMP(player_control_input->rel.stick_x + analog_x, -60, 60) * -4;
inputX = CLAMP(sPlayerControlInput->rel.stick_x + analog_x, -60, 60) * -4;
// @recomp Invert the X axis accordingly.
if (inverted_x) {
inputX = -inputX;
@ -229,14 +227,14 @@ void func_8083A98C(Actor* thisx, PlayState* play2) {
if (play->sceneId == SCENE_AYASHIISHOP) {
camMode = CAM_MODE_DEKUHIDE;
} else if (CHECK_BTN_ALL(player_control_input->cur.button, BTN_A)) { // Zoom
} else if (CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) { // Zoom
camMode = CAM_MODE_TARGET;
} else {
camMode = CAM_MODE_NORMAL;
}
// Exit
if (CHECK_BTN_ALL(player_control_input->press.button, BTN_B)) {
if (CHECK_BTN_ALL(sPlayerControlInput->press.button, BTN_B)) {
Message_CloseTextbox(play);
if (play->sceneId == SCENE_00KEIKOKU) {
@ -355,18 +353,15 @@ u8* get_button_item_equip_ptr(u32 form, u32 button) {
// Return currently-pressed button, in order of priority D-Pad, B, CLEFT, CDOWN, CRIGHT.
EquipSlot func_8082FDC4(void) {
EquipSlot i;
// @recomp Manually relocate, TODO remove this when the recompiler can relocate automatically.
Input* sPlayerControlInput_reloc = *(Input**)KaleidoManager_GetRamAddr(&sPlayerControlInput);
for (int extra_slot_index = 0; extra_slot_index < ARRAY_COUNT(buttons_to_extra_slot); extra_slot_index++) {
if (CHECK_BTN_ALL(sPlayerControlInput_reloc->press.button, buttons_to_extra_slot[extra_slot_index].button)) {
if (CHECK_BTN_ALL(sPlayerControlInput->press.button, buttons_to_extra_slot[extra_slot_index].button)) {
return (EquipSlot)buttons_to_extra_slot[extra_slot_index].slot;
}
}
for (i = 0; i < ARRAY_COUNT(sPlayerItemButtons); i++) {
if (CHECK_BTN_ALL(sPlayerControlInput_reloc->press.button, sPlayerItemButtons[i])) {
if (CHECK_BTN_ALL(sPlayerControlInput->press.button, sPlayerItemButtons[i])) {
break;
}
}
@ -454,8 +449,7 @@ void Player_Action_86(Player *this, PlayState *play) {
s32 sp48 = false;
func_808323C0(this, play->playerCsIds[PLAYER_CS_ID_MASK_TRANSFORMATION]);
// @recomp Manual relocation, TODO remove when automated.
*(Input**)KaleidoManager_GetRamAddr(&sPlayerControlInput) = play->state.input;
sPlayerControlInput = play->state.input;
Camera_ChangeMode(GET_ACTIVE_CAM(play),
(this->transformation == PLAYER_FORM_HUMAN) ? CAM_MODE_NORMAL : CAM_MODE_JUMP);
@ -2569,16 +2563,9 @@ s32 func_80857950(PlayState* play, Player* this) {
}
wasOff = isOff;
// @recomp Manual relocation, TODO remove when automated.
Input* player_control_input = *(Input**)KaleidoManager_GetRamAddr(&sPlayerControlInput);
if (((this->unk_B86[1] == 0) && !CHECK_BTN_ALL(player_control_input->cur.button, BTN_A)) ||
if (((this->unk_B86[1] == 0) && !CHECK_BTN_ALL(sPlayerControlInput->cur.button, BTN_A)) ||
((this->av1.actionVar1 == 3) && (this->actor.velocity.y < 0.0f))) {
// @recomp Manual relocation, TODO remove when automated.
PlayerActionFunc Player_Action_4_reloc = KaleidoManager_GetRamAddr(Player_Action_4);
Player_SetAction(play, this, Player_Action_4_reloc, 1);
Player_SetAction(play, this, Player_Action_4, 1);
Math_Vec3f_Copy(&this->actor.world.pos, &this->actor.prevPos);
PlayerAnimation_Change(play, &this->skelAnime, &gPlayerAnim_pg_maru_change, -2.0f / 3.0f, 7.0f, 0.0f,
ANIMMODE_ONCE, 0.0f);
@ -2611,9 +2598,6 @@ extern void func_80836A5C(Player* this, PlayState* play);
// @recomp Patch the shielding function to respect the aiming axis inversion setting.
void Player_Action_18(Player* this, PlayState* play) {
//@recomp Manual relocation. TODO remove when automated
D_8085BE84_t* D_8085BE84_reloc = (D_8085BE84_t*)KaleidoManager_GetRamAddr(D_8085BE84);
Input* sPlayerControlInput_reloc = *(Input**)KaleidoManager_GetRamAddr(&sPlayerControlInput);
func_80832F24(this);
if (this->transformation == PLAYER_FORM_GORON) {
@ -2627,7 +2611,7 @@ void Player_Action_18(Player* this, PlayState* play) {
func_80123C58(this);
}
func_80836A98(this, D_8085BE84_reloc[PLAYER_ANIMGROUP_defense_end][this->modelAnimType], play);
func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_defense_end][this->modelAnimType], play);
func_80830B38(this);
} else {
this->stateFlags1 |= PLAYER_STATE1_400000;
@ -2639,7 +2623,7 @@ void Player_Action_18(Player* this, PlayState* play) {
if (PlayerAnimation_Update(play, &this->skelAnime)) {
if (!Player_IsGoronOrDeku(this)) {
Player_AnimationPlayLoop(play, this, D_8085BE84_reloc[PLAYER_ANIMGROUP_defense_wait][this->modelAnimType]);
Player_AnimationPlayLoop(play, this, D_8085BE84[PLAYER_ANIMGROUP_defense_wait][this->modelAnimType]);
}
this->av2.actionVar2 = 1;
@ -2656,8 +2640,8 @@ void Player_Action_18(Player* this, PlayState* play) {
}
if (this->av2.actionVar2 != 0) {
f32 yStick = sPlayerControlInput_reloc->rel.stick_y * 180;
f32 xStick = sPlayerControlInput_reloc->rel.stick_x * -120;
f32 yStick = sPlayerControlInput->rel.stick_y * 180;
f32 xStick = sPlayerControlInput->rel.stick_x * -120;
s16 temp_a0 = this->actor.shape.rot.y - Camera_GetInputDirYaw(GET_ACTIVE_CAM(play));
s16 var_a1;
s16 temp_ft5;
@ -2717,7 +2701,7 @@ void Player_Action_18(Player* this, PlayState* play) {
func_80123C58(this);
}
func_80836A98(this, D_8085BE84_reloc[PLAYER_ANIMGROUP_defense_end][this->modelAnimType], play);
func_80836A98(this, D_8085BE84[PLAYER_ANIMGROUP_defense_end][this->modelAnimType], play);
}
Player_PlaySfx(this, NA_SE_IT_SHIELD_REMOVE);

View File

@ -2,13 +2,12 @@
#include "transform_ids.h"
#include "overlays/actors/ovl_Arms_Hook/z_arms_hook.h"
// TODO replace these with externs when the recompiler can handle relocations in patches automatically.
Vec3f D_808C1C10 = { 0.0f, 0.0f, 0.0f };
Vec3f D_808C1C1C = { 0.0f, 0.0f, 900.0f };
Vec3f D_808C1C28 = { 0.0f, 500.0f, -3000.0f };
Vec3f D_808C1C34 = { 0.0f, -500.0f, -3000.0f };
Vec3f D_808C1C40 = { 0.0f, 500.0f, 0.0f };
Vec3f D_808C1C4C = { 0.0f, -500.0f, 0.0f };
extern Vec3f D_808C1C10;
extern Vec3f D_808C1C1C;
extern Vec3f D_808C1C28;
extern Vec3f D_808C1C34;
extern Vec3f D_808C1C40;
extern Vec3f D_808C1C4C;
extern Gfx object_link_child_DL_01D960[];
extern Gfx gHookshotChainDL[];
@ -31,10 +30,7 @@ void ArmsHook_Draw(Actor* thisx, PlayState* play) {
OPEN_DISPS(play->state.gfxCtx);
// @recomp Manually relocate ArmsHook_Shoot because it's an overlay symbol.
// TODO remove this when the recompiler handles relocations in patches automatically.
if (((ArmsHookActionFunc)actor_relocate(thisx, ArmsHook_Shoot) != this->actionFunc) || (this->timer <= 0)) {
if ((ArmsHook_Shoot != this->actionFunc) || (this->timer <= 0)) {
Matrix_MultVec3f(&D_808C1C10, &this->unk1E0);
Matrix_MultVec3f(&D_808C1C28, &sp5C);
Matrix_MultVec3f(&D_808C1C34, &sp50);

View File

@ -1010,14 +1010,12 @@ void set_all_vertex_flags() {
// Patches the given DL to replace a vertex command at the given position with a branch to the new DL.
void patch_ocarina_effect(Actor* actor, Gfx* original_dl, u32 dl_offset, Gfx* override_dl) {
Gfx* reloc_dl = (Gfx*)actor_relocate(actor, original_dl);
set_all_vertex_flags();
// Check if the DL hasn't been patched yet.
if (reloc_dl[dl_offset].words.w0 >> 24 == G_VTX) {
if (original_dl[dl_offset].words.w0 >> 24 == G_VTX) {
// Redirect the DL away from the original vertex command and to the override DL.
gSPBranchList(&reloc_dl[dl_offset], override_dl);
gSPBranchList(&original_dl[dl_offset], override_dl);
}
}
@ -1089,8 +1087,7 @@ void OceffWipe_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, 100, 0, 255, 128);
}
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, &sSongOfTimeFrustumMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, sSongOfTimeFrustumMaterialDL);
gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0 - scroll, scroll * -2, 32,
32, 1, 0 - scroll, scroll * -2, 32, 32));
// @recomp Use the new DL instead of the original.
@ -1144,8 +1141,7 @@ void OceffWipe2_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 100, 0, 128);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, sEponaSongFrustumMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, sEponaSongFrustumMaterialDL);
gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, scroll * 6, scroll * -6, 64,
64, 1, scroll * -6, 0, 64, 64));
// @recomp Use the new DL instead of the original.
@ -1198,8 +1194,7 @@ void OceffWipe3_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 170, 255);
gDPSetEnvColor(POLY_XLU_DISP++, 100, 200, 0, 128);
// @recomp Manual relocation, TODO remove when automated.
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, &sSariaSongFrustrumMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, sSariaSongFrustrumMaterialDL);
gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, 0, scroll * 12, scroll * -12, 64, 64, 1,
scroll * 8, scroll * -8, 64, 64));
// @recomp Use the new DL instead of the original.
@ -1253,17 +1248,16 @@ void OceffWipe4_Draw(Actor* thisx, PlayState* play) {
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Manual relocations, TODO remove when automated.
if (this->actor.params == OCEFF_WIPE4_UNUSED) {
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, sScarecrowSongUnusedMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, sScarecrowSongUnusedMaterialDL);
} else {
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, sScarecrowSongMaterialDL));
gSPDisplayList(POLY_XLU_DISP++, sScarecrowSongMaterialDL);
}
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, sScarecrowSongModelDL));
gSPDisplayList(POLY_XLU_DISP++, sScarecrowSongModelDL);
gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, scroll * 2, scroll * -2, 32,
64, 1, scroll * -1, scroll, 32, 32));
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, &sScarecrowSongModelDL[11]));
gSPDisplayList(POLY_XLU_DISP++, &sScarecrowSongModelDL[11]);
CLOSE_DISPS(play->state.gfxCtx);
}
@ -1339,9 +1333,8 @@ void OceffWipe5_Draw(Actor* thisx, PlayState* play) {
gDPSetEnvColor(POLY_XLU_DISP++, sEnvColors[colorIndex], sEnvColors[colorIndex + 1], sEnvColors[colorIndex + 2],
255);
// @recomp Manual relocations, TODO remove when automated.
AnimatedMat_Draw(play, (AnimatedMaterial*)actor_relocate(thisx, gOceff5TexAnim));
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, gOceff5DL));
AnimatedMat_Draw(play, gOceff5TexAnim);
gSPDisplayList(POLY_XLU_DISP++, gOceff5DL);
CLOSE_DISPS(play->state.gfxCtx);
}
@ -1392,9 +1385,8 @@ void OceffWipe6_Draw(Actor* thisx, PlayState* play) {
Matrix_RotateXS(0x708, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Manual relocations, TODO remove these when automatic.
AnimatedMat_Draw(play, (AnimatedMaterial*)actor_relocate(thisx, ovl_Oceff_Wipe6_Matanimheader_000338));
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, gOceff6DL));
AnimatedMat_Draw(play, ovl_Oceff_Wipe6_Matanimheader_000338);
gSPDisplayList(POLY_XLU_DISP++, gOceff6DL);
CLOSE_DISPS(play->state.gfxCtx);
}
@ -1443,9 +1435,8 @@ void OceffWipe7_Draw(Actor* thisx, PlayState* play) {
Matrix_RotateXS(0x708, MTXMODE_APPLY);
Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Manual relocations, TODO remove when automated.
AnimatedMat_Draw(play, (AnimatedMaterial*)actor_relocate(thisx, sSongofHealingEffectTexAnim));
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)actor_relocate(thisx, &sSongOfHealingEffectFrustumDL));
AnimatedMat_Draw(play, sSongofHealingEffectTexAnim);
gSPDisplayList(POLY_XLU_DISP++, sSongOfHealingEffectFrustumDL);
CLOSE_DISPS(play->state.gfxCtx);
}

View File

@ -40,63 +40,22 @@ extern u64 gFileSelCopyButtonENGTex[];
extern u64 gFileSelEraseButtonENGTex[];
extern u64 gFileSelYesButtonENGTex[];
extern u64 gFileSelQuitButtonENGTex[];
// TODO extern these when the recompiler handles relocations automatically.
s16 D_80814280[] = {
2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 0, 1, 1, 2, 1, 1, 4, 2, 2, 2, 1, 1, 0, 2, 0, 1, 1, 1, 1, 1, 0,
1, 1, 1, 2, 2, 2, 2, 2, 3, 2, 2, 4, 3, 2, 4, 1, 2, 2, 1, 1, 2, 2, 3, 2, 2, 0, 2, 2, 2, 0, 3, 1, 0,
};
s16 sWindowContentColors[] = { 100, 150, 255 };
TexturePtr sFileInfoBoxTextures[] = {
gFileSelFileInfoBox0Tex, gFileSelFileInfoBox1Tex, gFileSelFileInfoBox2Tex, gFileSelFileInfoBox3Tex,
gFileSelFileInfoBox4Tex, gFileSelFileExtraInfoBox0Tex, gFileSelFileExtraInfoBox1Tex,
};
TexturePtr sTitleLabels[] = {
gFileSelPleaseSelectAFileENGTex, gFileSelOpenThisFileENGTex, gFileSelCopyWhichFileENGTex,
gFileSelCopyToWhichFileENGTex, gFileSelAreYouSureCopyENGTex, gFileSelFileCopiedENGTex,
gFileSelEraseWhichFileENGTex, gFileSelAreYouSureEraseENGTex, gFileSelFileErasedENGTex,
};
TexturePtr sWarningLabels[] = {
gFileSelNoFileToCopyENGTex, gFileSelNoFileToEraseENGTex, gFileSelNoEmptyFileENGTex,
gFileSelFileEmptyENGTex, gFileSelFileInUseENGTex,
};
TexturePtr sFileButtonTextures[] = {
gFileSelFile1ButtonENGTex,
gFileSelFile2ButtonENGTex,
gFileSelFile3ButtonENGTex,
};
TexturePtr sActionButtonTextures[] = {
gFileSelCopyButtonENGTex,
gFileSelEraseButtonENGTex,
gFileSelYesButtonENGTex,
gFileSelQuitButtonENGTex,
};
s16 sFileInfoBoxPartWidths[] = {
36, 36, 36, 36, 24, 28, 28,
};
s16 sWalletFirstDigit[] = {
1, // tens (Default Wallet)
0, // hundreds (Adult Wallet)
0, // hundreds (Giant Wallet)
};
s16 D_80814620[] = { 8, 8, 8, 0 };
s16 D_80814628[] = { 12, 12, 12, 0 };
s16 D_80814630[] = { 12, 12, 12, 0 };
s16 D_80814638[] = {
88, 104, 120, 940, 944, 948,
};
s16 D_80814644[] = { 88, 104, 120, 944 };
s16 D_8081464C[] = { 940, 944 };
s16 D_80814650[] = { 940, 944, 948 };
extern s16 D_80814280[];
extern s16 sWindowContentColors[];
extern TexturePtr sFileInfoBoxTextures[];
extern TexturePtr sTitleLabels[];
extern TexturePtr sWarningLabels[];
extern TexturePtr sFileButtonTextures[];
extern TexturePtr sActionButtonTextures[];
extern s16 sFileInfoBoxPartWidths[];
extern s16 sWalletFirstDigit[];
extern s16 D_80814620[];
extern s16 D_80814628[];
extern s16 D_80814630[];
extern s16 D_80814638[];
extern s16 D_80814644[];
extern s16 D_8081464C[];
extern s16 D_80814650[];
void FileSelect_Main(GameState* thisx);
void FileSelect_InitContext(GameState* thisx);
@ -118,10 +77,8 @@ void FileSelect_Init(GameState* thisx) {
ShrinkWindow_Init();
View_Init(&this->view, this->state.gfxCtx);
// @recomp manually relocate these symbols as the recompiler doesn't do this automatically for patches yet.
GameStateOverlay* ovl = &gGameStateOverlayTable[GAMESTATE_FILE_SELECT];
this->state.main = (void*)((u32)FileSelect_Main - (u32)ovl->vramStart + (u32)ovl->loadedRamAddr);
this->state.destroy = (void*)((u32)FileSelect_Destroy - (u32)ovl->vramStart + (u32)ovl->loadedRamAddr);
this->state.main = FileSelect_Main;
this->state.destroy = FileSelect_Destroy;
FileSelect_InitContext(&this->state);
Font_LoadOrderedFont(&this->font);

View File

@ -101,7 +101,7 @@ extern Gfx gSunSparkleModelDL[];
extern u8 D_80B23C40[];
extern u8 D_80B23C2C[];
// @recomp Modified to take the actor as an argument for relocation and to tag firework transforms.
// @recomp Modified to tag firework transforms.
void func_80B22FA8_patched(Actor* thisx, EnHanabiStruct* arg0, PlayState* play2) {
PlayState* play = play2;
GraphicsContext* gfxCtx = play->state.gfxCtx;
@ -119,10 +119,6 @@ void func_80B22FA8_patched(Actor* thisx, EnHanabiStruct* arg0, PlayState* play2)
sp53 = 0xFF;
// @recomp Manually relocate, TODO remove when automated by recompiler.
u8* D_80B23C40_relocated = (u8*)actor_relocate(thisx, D_80B23C40);
u8* D_80B23C2C_relocated = (u8*)actor_relocate(thisx, D_80B23C2C);
for (i = 0; i < 400; i++, arg0++) {
if (arg0->unk_00 != 1) {
continue;
@ -145,18 +141,18 @@ void func_80B22FA8_patched(Actor* thisx, EnHanabiStruct* arg0, PlayState* play2)
if (sp53 != arg0->unk_02) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, D_80B23C40_relocated[arg0->unk_02], D_80B23C40_relocated[arg0->unk_02 + 1],
D_80B23C40_relocated[arg0->unk_02 + 2], 255);
gDPSetEnvColor(POLY_XLU_DISP++, D_80B23C40[arg0->unk_02], D_80B23C40[arg0->unk_02 + 1],
D_80B23C40[arg0->unk_02 + 2], 255);
sp53 = arg0->unk_02;
}
if (arg0->unk_01 < 6) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C_relocated[arg0->unk_02], D_80B23C2C_relocated[arg0->unk_02 + 1],
D_80B23C2C_relocated[arg0->unk_02 + 2], arg0->unk_01 * 50);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C[arg0->unk_02], D_80B23C2C[arg0->unk_02 + 1],
D_80B23C2C[arg0->unk_02 + 2], arg0->unk_01 * 50);
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C_relocated[arg0->unk_02], D_80B23C2C_relocated[arg0->unk_02 + 1],
D_80B23C2C_relocated[arg0->unk_02 + 2], 255);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, D_80B23C2C[arg0->unk_02], D_80B23C2C[arg0->unk_02 + 1],
D_80B23C2C[arg0->unk_02 + 2], 255);
}
gSPDisplayList(POLY_XLU_DISP++, gSunSparkleModelDL);
@ -172,7 +168,7 @@ void EnHanabi_Draw(Actor* thisx, PlayState* play) {
EnHanabi* this = (EnHanabi*)thisx;
Matrix_Push();
// @recomp Call a modified version of the function that takes the actor for relocation purposes.
// @recomp Call a modified version of the function that takes the actor for tagging purposes.
func_80B22FA8_patched(thisx, this->unk_148, play);
Matrix_Pop();
}
@ -385,7 +381,6 @@ void DemoKankyo_DrawMoonAndGiant(Actor* thisx, PlayState* play2) {
}
static Vec3f D_80A5AFB0 = { 0.0f, 0.0f, 0.0f };
static Vec3f D_80A5AFBC = { 0.0f, -1.0f, 0.0f };
// The byte after unk_01 in EnWaterEffectStruct is unused, so we'll use it as a respawn flag.
#define WATER_EFFECT_RESPAWNED(ptr) (&(ptr)->unk_01)[1]

View File

@ -63,17 +63,6 @@
int recomp_printf(const char* fmt, ...);
float recomp_powf(float, float);
static inline void* actor_relocate(Actor* actor, void* addr) {
if ((uintptr_t)addr >= 0x80800000) {
return (void*)((uintptr_t)addr -
(intptr_t)((uintptr_t)actor->overlayEntry->vramStart - (uintptr_t)actor->overlayEntry->loadedRamAddr));
}
else {
recomp_printf("Not an overlay address!: 0x%08X 0x%08X 0x%08X\n", (u32)addr, (u32)actor->overlayEntry->vramStart, (u32)actor->overlayEntry->loadedRamAddr);
return addr;
}
}
typedef enum {
/* 0 */ PICTO_BOX_STATE_OFF, // Not using the pictograph
/* 1 */ PICTO_BOX_STATE_LENS, // Looking through the lens of the pictograph

View File

@ -9,17 +9,13 @@ MEMORY {
SECTIONS {
.ctors : { *(.ctors*) *(.init_array*) } >extram AT >rom
.dtors : { *(.dtors*) } >extram AT >rom
.text : { *(.text*) } >extram AT >rom
.rodata : { *(.rodata*) } >extram AT >rom
.data : { *(.data*) } >extram AT >rom
/* The following sections will be removed from the objcopy */
/* bss isn't noload to make .text rom addresses valid for the recompiler */
.bss : { *(.bss*) *(COMMON) } >extram AT >rom
.bss (NOLOAD) : { *(.bss*) *(COMMON) } >extram
ASSERT(. < RAMBASE + EXTRA_RAM_SIZE, "Maxed out recomp extra ram")
/* Padding to push .text to avoid conflicts with original function addresses */
.pad : { . += 0x1000000; } >extram AT >rom
.text : { *(.text*) } >extram AT >rom
.reloc 0 : { *(.reloc*) }
.symtab 0 : { *(.symtab) }
.strtab 0 : { *(.strtab) }
.shstrtab 0 : { *(.shstrtab) }

View File

@ -29,14 +29,10 @@ void EnTest7_Draw(Actor* thisx, PlayState* play) {
if (mtx == NULL) {
return;
}
// func_80AF31D0 is an overlay symbol, so its addresses need to be offset to get the actual loaded vram address.
// TODO remove this once the recompiler is able to handle overlay symbols automatically for patch functions.
OverrideKeyframeDrawScaled func_80AF31D0_relocated = (OverrideKeyframeDrawScaled)actor_relocate(thisx, func_80AF31D0);
// @recomp Push the matrix group for the song of soaring's wings.
gEXMatrixGroupDecomposedNormal(POLY_OPA_DISP++, SOARING_WINGS_TRANSFORM_ID, G_EX_PUSH, G_MTX_MODELVIEW, G_EX_EDIT_ALLOW);
func_8018450C(play, &this->skeletonInfo, mtx, func_80AF31D0_relocated, NULL, &this->actor);
func_8018450C(play, &this->skeletonInfo, mtx, func_80AF31D0, NULL, &this->actor);
// @recomp Pop the wings matrix group.
gEXPopMatrixGroup(POLY_OPA_DISP++, G_MTX_MODELVIEW);
@ -180,12 +176,9 @@ void EnTest6_DrawThreeDayResetSoTCutscene(EnTest6* this, PlayState* play) {
POLY_OPA_DISP = this->gfx;
// @recomp Manual relocation, TODO remove when automated.
SoTCsAmmoDrops* sSoTCsAmmoDrops_reloc = (SoTCsAmmoDrops*)actor_relocate(&this->actor, sSoTCsAmmoDrops);
for (i = 0; i < ARRAY_COUNT(sSoTCsAmmoDrops); i++) {
if (sSoTCsAmmoDrops_reloc[i].scale > 0.0f) {
sSoTCsAmmoDrops_reloc[i].draw(this, play, &sSoTCsAmmoDrops_reloc[i]);
if (sSoTCsAmmoDrops[i].scale > 0.0f) {
sSoTCsAmmoDrops[i].draw(this, play, &sSoTCsAmmoDrops[i]);
}
}

View File

@ -46,17 +46,14 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
tanron2 = play->actorCtx.actorLists[ACTORCAT_BOSS].first;
// @recomp Manual relocation, TODO remove this when the recompiler does it automatically.
EnTanron2** D_80BB8458_relocated = (EnTanron2**)actor_relocate(thisx, D_80BB8458);
for (i = 0; i < ARRAY_COUNT(D_80BB8458); i++) {
D_80BB8458_relocated[i] = NULL;
D_80BB8458[i] = NULL;
}
found = 0;
while (tanron2 != NULL) {
if (tanron2->params < 100) {
D_80BB8458_relocated[found] = (EnTanron2*)tanron2;
D_80BB8458[found] = (EnTanron2*)tanron2;
found++;
}
tanron2 = tanron2->next;
@ -64,26 +61,26 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
for (j = 0; j < found - 1; j++) {
for (i = 0; i < found - 1; i++) {
if (D_80BB8458_relocated[i + 1] != NULL) {
if (D_80BB8458_relocated[i]->actor.projectedPos.z < D_80BB8458_relocated[i + 1]->actor.projectedPos.z) {
SWAP(EnTanron2*, D_80BB8458_relocated[i], D_80BB8458_relocated[i + 1]);
if (D_80BB8458[i + 1] != NULL) {
if (D_80BB8458[i]->actor.projectedPos.z < D_80BB8458[i + 1]->actor.projectedPos.z) {
SWAP(EnTanron2*, D_80BB8458[i], D_80BB8458[i + 1]);
}
}
}
}
for (i = 0; i < ARRAY_COUNT(D_80BB8458); i++) {
if (D_80BB8458_relocated[i] != NULL) {
Matrix_Translate(D_80BB8458_relocated[i]->actor.world.pos.x, D_80BB8458_relocated[i]->actor.world.pos.y,
D_80BB8458_relocated[i]->actor.world.pos.z, MTXMODE_NEW);
if (D_80BB8458[i] != NULL) {
Matrix_Translate(D_80BB8458[i]->actor.world.pos.x, D_80BB8458[i]->actor.world.pos.y,
D_80BB8458[i]->actor.world.pos.z, MTXMODE_NEW);
Matrix_ReplaceRotation(&play->billboardMtxF);
Matrix_Scale(D_80BB8458_relocated[i]->actor.scale.x, D_80BB8458_relocated[i]->actor.scale.y, 0.0f, MTXMODE_APPLY);
Matrix_RotateZS(D_80BB8458_relocated[i]->unk_14A, MTXMODE_APPLY);
Matrix_Scale(D_80BB8458[i]->actor.scale.x, D_80BB8458[i]->actor.scale.y, 0.0f, MTXMODE_APPLY);
Matrix_RotateZS(D_80BB8458[i]->unk_14A, MTXMODE_APPLY);
Matrix_Scale(0.13f, 0.14299999f, 0.13f, MTXMODE_APPLY);
Matrix_RotateZS(-D_80BB8458_relocated[i]->unk_14A, MTXMODE_APPLY);
Matrix_RotateZS(-D_80BB8458[i]->unk_14A, MTXMODE_APPLY);
// @recomp Tag the transform.
gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(&D_80BB8458_relocated[i]->actor) + 0,
gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(&D_80BB8458[i]->actor) + 0,
G_EX_PUSH, G_MTX_MODELVIEW,
G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE, G_EX_COMPONENT_INTERPOLATE,
G_EX_COMPONENT_INTERPOLATE, G_EX_ORDER_LINEAR, G_EX_EDIT_NONE);
@ -100,14 +97,11 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, 0, 0, 150);
gSPDisplayList(POLY_XLU_DISP++, gWartShadowMaterialDL);
// @recomp Manual relocation, TODO remove this when the recompiler does it automatically.
Boss04** D_80BB8450_relocated = (Boss04**)actor_relocate(thisx, &D_80BB8450);
tanron2 = play->actorCtx.actorLists[ACTORCAT_BOSS].first;
while (tanron2 != NULL) {
if ((tanron2->params < 100) && (((EnTanron2*)tanron2)->unk_15B != 0)) {
Matrix_Translate(tanron2->world.pos.x, (*D_80BB8450_relocated)->actor.floorHeight, tanron2->world.pos.z, MTXMODE_NEW);
Matrix_Translate(tanron2->world.pos.x, D_80BB8450->actor.floorHeight, tanron2->world.pos.z, MTXMODE_NEW);
Matrix_Scale(0.6f, 0.0f, 0.6f, MTXMODE_APPLY);
// @recomp Tag the transform.
@ -136,12 +130,9 @@ void EnTanron2_Draw(Actor* thisx, PlayState* play2) {
while (tanron2 != NULL) {
if ((tanron2->params < 100) && (((EnTanron2*)tanron2)->unk_15B != 0) &&
(tanron2->world.pos.y <= tanron2->floorHeight)) {
Matrix_Translate(tanron2->world.pos.x, (*D_80BB8450_relocated)->actor.floorHeight + 2.0f, tanron2->world.pos.z,
Matrix_Translate(tanron2->world.pos.x, D_80BB8450->actor.floorHeight + 2.0f, tanron2->world.pos.z,
MTXMODE_NEW);
// @recomp Manual relocation, TODO remove this when the recompiler does it automatically.
f32 D_80BB8454_value = *(f32*)actor_relocate(thisx, &D_80BB8454);
Matrix_Scale(D_80BB8454_value, 0.0f, D_80BB8454_value, MTXMODE_APPLY);
Matrix_Scale(D_80BB8454, 0.0f, D_80BB8454, MTXMODE_APPLY);
// @recomp Tag the transform.
gEXMatrixGroupSimple(POLY_XLU_DISP++, actor_transform_id(tanron2) + 2,
@ -732,20 +723,15 @@ void EnOsn_Idle(EnOsn* this, PlayState* play);
// @recomp Patched to skip interpolation when the Happy Mask Salesman changes animations.
void EnOsn_ChooseAction(EnOsn* this, PlayState* play) {
// @recomp Manually relocate the static symbol.
AnimationInfo* sAnimationInfo = (AnimationInfo*)actor_relocate(&this->actor, sHappyMaskSalesmanAnimationInfo);
u32 isSwitchFlagSet = Flags_GetSwitch(play, 0);
this->csId = this->actor.csId;
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, OSN_ANIM_IDLE);
Actor_ChangeAnimationByInfo(&this->skelAnime, sHappyMaskSalesmanAnimationInfo, OSN_ANIM_IDLE);
if (!isSwitchFlagSet) {
// @recomp No need to relocate as this function is replaced, so the patch compilation will pick the new address.
this->actionFunc = EnOsn_HandleCsAction;
} else {
// @recomp Manual relocation, TODO remove when automated by the recompiler.
this->actionFunc = (EnOsnActionFunc)actor_relocate(&this->actor, EnOsn_Idle);
this->actionFunc = EnOsn_Idle;
}
// @recomp Skip interpolation this frame.
@ -854,11 +840,8 @@ void EnOsn_HandleCsAction(EnOsn* this, PlayState* play) {
default:
this->animIndex = OSN_ANIM_IDLE;
break;
}
// @recomp Manually relocate the static symbol.
AnimationInfo* sAnimationInfo = (AnimationInfo*)actor_relocate(&this->actor, sHappyMaskSalesmanAnimationInfo);
Actor_ChangeAnimationByInfo(&this->skelAnime, sAnimationInfo, this->animIndex);
}
Actor_ChangeAnimationByInfo(&this->skelAnime, sHappyMaskSalesmanAnimationInfo, this->animIndex);
// @recomp Skip interpolation this frame.
actor_set_interpolation_skipped(&this->actor);
@ -981,10 +964,8 @@ void func_80A34B28(ObjEntotu* this, PlayState* play) {
this->unk_1B8.x = CLAMP(this->unk_1B8.x, 0.0f, 1.0f);
// @recomp Manual relocation, TODO remove when automated.
Vtx* verts = (Vtx*)actor_relocate(&this->actor, ovl_Obj_Entotu_Vtx_000D10);
for (i = 0; i < ARRAY_COUNT(ovl_Obj_Entotu_Vtx_000D10); i++) {
this->unk_148[i].v.cn[3] = verts[i].v.cn[3] * this->unk_1B8.x;
this->unk_148[i].v.cn[3] = ovl_Obj_Entotu_Vtx_000D10[i].v.cn[3] * this->unk_1B8.x;
}
if (this->unk_1B8.x > 0.0f) {

View File

@ -1,21 +1,5 @@
__start = 0x80000000;
/* Manual symbol overrides to work around recompiler ambiguity issue (TODO fix this) */
_ovl_daytelopSegmentOvlEnd = 0x0;
_ovl_kaleido_scopeSegmentTextStart = 0x0;
_ovl_kaleido_scopeSegmentStart = 0x0;
_ovl_daytelopSegmentBssStart = 0x0;
_ovl_daytelopSegmentEnd = 0x0;
_ovl_daytelopSegmentBssEnd = 0x0;
/* Static symbols that aren't in the elf */
sSceneEntranceTable = 0x801C5720;
D_808DE5B0 = 0x808DE5B0;
sHappyMaskSalesmanAnimationInfo = 0x80AD22C0;
D_808890F0 = 0x808890F0;
D_8088911C = 0x8088911C;
D_809EE4D0 = 0x809EE4D0;
/* Dummy addresses that get recompiled into function calls */
recomp_puts = 0x8F000000;
recomp_exit = 0x8F000004;

View File

@ -122,14 +122,16 @@ extern s16 D_80AAAE20;
extern s16 D_80AAAE22;
extern s16 D_80AAAE24;
extern f32 D_80AAAAB8;
extern f32 D_80AAAABC;
extern s16 D_80AAAAC0;
extern s16 D_80AAAAC4;
extern s16 D_80AAAAC8;
extern s16 D_80AAAACC;
// @recomp Patched to enable vertex interpolation for the dynamic water as Woodfall temple rises from below the water.
void DmChar01_Draw(Actor* thisx, PlayState* play) {
static f32 D_80AAAAB8 = 0.0f;
static f32 D_80AAAABC = 0.0f;
static s16 D_80AAAAC0 = 0;
static s16 D_80AAAAC4 = 0;
static s16 D_80AAAAC8 = 0;
static s16 D_80AAAACC = 0;
// @recomp Move function statics to externs so they still get reset on overlay load like normal.
DmChar01* this = (DmChar01*)thisx;
f32 temp_f12;
f32 spBC;
@ -162,8 +164,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0x96, 255, 255, 255, 255);
// @recomp Manual relocation, TODO remove when automated.
gSPSegment(POLY_OPA_DISP++, 0x0B, actor_relocate(thisx, gWoodfallSceneryDynamicPoisonWaterVtx));
gSPSegment(POLY_OPA_DISP++, 0x0B, gWoodfallSceneryDynamicPoisonWaterVtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix to enable vertex interpolation.
@ -178,8 +179,7 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (u8)this->unk_348);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x96, 255, 255, 255, (u8)this->unk_348);
// @recomp Manual relocation, TODO remove when automated.
gSPSegment(POLY_XLU_DISP++, 0x0B, actor_relocate(thisx, gWoodfallSceneryDynamicPoisonWaterVtx));
gSPSegment(POLY_XLU_DISP++, 0x0B, gWoodfallSceneryDynamicPoisonWaterVtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
// @recomp Tag the matrix to enable vertex interpolation.
@ -235,21 +235,16 @@ void DmChar01_Draw(Actor* thisx, PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
// @recomp Manual relocations, TODO remove when automated.
s16 D_80AAAE20_val = *(s16*)actor_relocate(thisx, &D_80AAAE20);
s16 D_80AAAE22_val = *(s16*)actor_relocate(thisx, &D_80AAAE22);
s16 D_80AAAE24_val = *(s16*)actor_relocate(thisx, &D_80AAAE24);
if (D_80AAAE24_val != 0) {
if ((D_80AAAE22_val > -1800) && (D_80AAAE22_val < 3000)) {
temp_f12 = D_80AAAE22_val - 640.0f;
if ((D_80AAAE20_val == 380) && (D_80AAAE22_val > 640)) {
if (D_80AAAE24 != 0) {
if ((D_80AAAE22 > -1800) && (D_80AAAE22 < 3000)) {
temp_f12 = D_80AAAE22 - 640.0f;
if ((D_80AAAE20 == 380) && (D_80AAAE22 > 640)) {
D_80AAAAC0 = 2;
D_80AAAAC4 = 0;
D_80AAAAC8 = 900;
D_80AAAACC = 700;
spB7 = true;
if (D_80AAAE22_val < 1350) {
if (D_80AAAE22 < 1350) {
f32 temp_f0 = temp_f12 / 2000.0f;
D_80AAAAB8 = 420.0f - (420.0f * temp_f0);

View File

@ -540,10 +540,10 @@ void Interface_Draw(PlayState* play) {
extern s16 sMaskEquipAnimTimer;
extern s16 sEquipState;
extern s16 sMaskEquipState;
s16 equip_timer = *(s16*)KaleidoManager_GetRamAddr(&sEquipAnimTimer);
s16 mask_equip_timer = *(s16*)KaleidoManager_GetRamAddr(&sMaskEquipAnimTimer);
s16 equip_state = *(s16*)KaleidoManager_GetRamAddr(&sEquipState);
s16 mask_equip_state = *(s16*)KaleidoManager_GetRamAddr(&sMaskEquipState);
s16 equip_timer = sEquipAnimTimer;
s16 mask_equip_timer = sMaskEquipAnimTimer;
s16 equip_state = sEquipState;
s16 mask_equip_state = sMaskEquipState;
s16 timer = MIN(equip_timer, mask_equip_timer);
s32 max_timer = 10;

View File

@ -54,14 +54,6 @@ extern TexturePtr sMapPageBgTextures[];
extern TexturePtr sQuestPageBgTextures[];
extern TexturePtr sMaskPageBgTextures[];
s16 kaleido_s16(s16* addr) {
return *(s16*)KaleidoManager_GetRamAddr(addr);
}
f32 kaleido_f32(f32* addr) {
return *(f32*)KaleidoManager_GetRamAddr(addr);
}
// @recomp Patched to set pageIndex to a dummy value when KaleidoScope_SetVertices is called to make it
// allocate vertices for all pages at all times. This is simpler than patching KaleidoScope_SetVertices directly.
void KaleidoScope_Draw(PlayState* play) {
@ -164,9 +156,8 @@ void KaleidoScope_DrawCursor(PlayState* play) {
gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0,
PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0);
// @recomp manual relocations, TODO remove when recompiler can handle this.
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, kaleido_s16(&sCursorPrimR), kaleido_s16(&sCursorPrimG), kaleido_s16(&sCursorPrimB), 255);
gDPSetEnvColor(POLY_OPA_DISP++, kaleido_s16(&sCursorEnvR), kaleido_s16(&sCursorEnvG), kaleido_s16(&sCursorEnvB), 255);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, sCursorPrimR, sCursorPrimG, sCursorPrimB, 255);
gDPSetEnvColor(POLY_OPA_DISP++, sCursorEnvR, sCursorEnvG, sCursorEnvB, 255);
Matrix_Translate(pauseCtx->cursorX, pauseCtx->cursorY, -50.0f, MTXMODE_NEW);
Matrix_Scale(1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
@ -181,8 +172,7 @@ void KaleidoScope_DrawCursor(PlayState* play) {
for (i = 0; i < 4; i++) {
Matrix_Push();
// @recomp manual relocations, TODO remove when recompiler can handle this.
Matrix_Translate(kaleido_f32(&sCursorCirclesX[i]), kaleido_f32(&sCursorCirclesY[i]), -50.0f, MTXMODE_APPLY);
Matrix_Translate(sCursorCirclesX[i], sCursorCirclesY[i], -50.0f, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPPipeSync(POLY_OPA_DISP++);
@ -209,6 +199,13 @@ void KaleidoScope_DrawCursor(PlayState* play) {
CLOSE_DISPS(play->state.gfxCtx);
}
extern s16 sPauseZRCursorColorTimer; // 8082B9C8 32899 -17976
extern s16 sPauseZRCursorColorIndex; // 8082B9CC 32899 -17972
extern s16 sPauseZRCursorRed; // 8082DA50 32899 -9648
extern s16 sPauseZRCursorGreen; // 8082DA52 32899 -9646
extern s16 sPauseZRCursorBlue; // 8082DA54 32899 -9644
extern s16 sPauseZRCursorAlpha; // 8082DA56 32899 -9642
/**
* infoPanelVtx
*
@ -223,16 +220,11 @@ void KaleidoScope_DrawCursor(PlayState* play) {
// @recomp Patched to tag the matrix for interpolating the vertices of the Z button, R button, and name panel.
void KaleidoScope_DrawInfoPanel(PlayState* play) {
static s16 sPauseZRCursorColorTargets[][4] = {
static const s16 sPauseZRCursorColorTargets[][4] = {
{ 180, 210, 255, 220 },
{ 100, 100, 150, 220 },
};
static s16 sPauseZRCursorColorTimer = 20;
static s16 sPauseZRCursorColorIndex = 0;
static s16 sPauseZRCursorRed;
static s16 sPauseZRCursorGreen;
static s16 sPauseZRCursorBlue;
static s16 sPauseZRCursorAlpha;
// @recomp Moved non-const function-local statics to externs so they still get reset on overlay load.
PauseContext* pauseCtx = &play->pauseCtx;
s16 stepR;
s16 stepG;
@ -242,11 +234,6 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) {
s16 i;
s16 j;
// @recomp Manual relocations, TODO remove when done automatically by the recompiler.
s16* sPauseZRCursorColorTimerInits_reloc = KaleidoManager_GetRamAddr(&sPauseZRCursorColorTimerInits);
TexturePtr* D_8082B998_reloc = KaleidoManager_GetRamAddr(&D_8082B998);
TexturePtr* D_8082B9A8_reloc = KaleidoManager_GetRamAddr(&D_8082B9A8);
OPEN_DISPS(play->state.gfxCtx);
stepR =
@ -288,7 +275,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) {
sPauseZRCursorGreen = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][1];
sPauseZRCursorBlue = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][2];
sPauseZRCursorAlpha = sPauseZRCursorColorTargets[sPauseZRCursorColorIndex][3];
sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits_reloc[0];
sPauseZRCursorColorTimer = sPauseZRCursorColorTimerInits[0];
sPauseZRCursorColorIndex ^= 1;
}
@ -331,42 +318,42 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) {
pauseCtx->infoPanelVtx[5].v.ob[0] = pauseCtx->infoPanelVtx[7].v.ob[0] = pauseCtx->infoPanelVtx[4].v.ob[0] + 72;
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = kaleido_s16(&sPauseCursorLeftX);
pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX;
pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 24;
pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = kaleido_s16(&D_8082B920);
pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920;
pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
pauseCtx->infoPanelVtx[8].v.ob[1] - 32;
} else {
pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = kaleido_s16(&sPauseCursorLeftX) + 3;
pauseCtx->infoPanelVtx[8].v.ob[0] = pauseCtx->infoPanelVtx[10].v.ob[0] = sPauseCursorLeftX + 3;
pauseCtx->infoPanelVtx[9].v.ob[0] = pauseCtx->infoPanelVtx[11].v.ob[0] = pauseCtx->infoPanelVtx[8].v.ob[0] + 18;
pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = kaleido_s16(&D_8082B920) - 3;
pauseCtx->infoPanelVtx[8].v.ob[1] = pauseCtx->infoPanelVtx[9].v.ob[1] = D_8082B920 - 3;
pauseCtx->infoPanelVtx[10].v.ob[1] = pauseCtx->infoPanelVtx[11].v.ob[1] =
pauseCtx->infoPanelVtx[8].v.ob[1] - 26;
}
if ((pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_RIGHT) && (pauseCtx->mainState == PAUSE_MAIN_STATE_IDLE)) {
pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = kaleido_s16(&sPauseCursorRightX);
pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX;
pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
pauseCtx->infoPanelVtx[12].v.ob[0] + 24;
pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = kaleido_s16(&D_8082B920);
pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920;
pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
pauseCtx->infoPanelVtx[12].v.ob[1] - 32;
} else {
pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = kaleido_s16(&sPauseCursorRightX) + 3;
pauseCtx->infoPanelVtx[12].v.ob[0] = pauseCtx->infoPanelVtx[14].v.ob[0] = sPauseCursorRightX + 3;
pauseCtx->infoPanelVtx[13].v.ob[0] = pauseCtx->infoPanelVtx[15].v.ob[0] =
pauseCtx->infoPanelVtx[12].v.ob[0] + 18;
pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = kaleido_s16(&D_8082B920) - 3;
pauseCtx->infoPanelVtx[12].v.ob[1] = pauseCtx->infoPanelVtx[13].v.ob[1] = D_8082B920 - 3;
pauseCtx->infoPanelVtx[14].v.ob[1] = pauseCtx->infoPanelVtx[15].v.ob[1] =
pauseCtx->infoPanelVtx[12].v.ob[1] - 26;
@ -512,10 +499,10 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) {
if (pauseCtx->cursorSpecialPos == PAUSE_CURSOR_PAGE_LEFT) {
POLY_OPA_DISP =
Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B998_reloc[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B998[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
} else {
POLY_OPA_DISP =
Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B9A8_reloc[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
Gfx_DrawTexQuad4b(POLY_OPA_DISP, D_8082B9A8[pauseCtx->pageIndex], G_IM_FMT_IA, 128, 16, 0);
}
}
} else if ((!pauseCtx->pageIndex || (pauseCtx->pageIndex == PAUSE_MASK)) &&
@ -541,7 +528,7 @@ void KaleidoScope_DrawInfoPanel(PlayState* play) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, 255);
POLY_OPA_DISP = Gfx_DrawTexQuad4b(POLY_OPA_DISP, gPauseToEquipENGTex, G_IM_FMT_IA, 64, 16, 4);
} else if ((pauseCtx->pageIndex == PAUSE_MAP) && kaleido_s16(&sInDungeonScene)) {
} else if ((pauseCtx->pageIndex == PAUSE_MAP) && sInDungeonScene) {
// No code in this case
} else if ((pauseCtx->pageIndex == PAUSE_QUEST) &&
(pauseCtx->cursorSlot[PAUSE_QUEST] == QUEST_BOMBERS_NOTEBOOK)) {
@ -608,87 +595,75 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
s16 stepG;
s16 stepB;
// @recomp Manual relocation, TODO remove when recompiler handles it automatically.
TexturePtr* sItemPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sItemPageBgTextures);
TexturePtr* sMapPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sMapPageBgTextures);
TexturePtr* sQuestPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sQuestPageBgTextures);
TexturePtr* sMaskPageBgTextures_reloc = KaleidoManager_GetRamAddr(&sMaskPageBgTextures);
s16* sCursorPrimR_reloc = KaleidoManager_GetRamAddr(&sCursorPrimR);
s16* sCursorPrimG_reloc = KaleidoManager_GetRamAddr(&sCursorPrimG);
s16* sCursorPrimB_reloc = KaleidoManager_GetRamAddr(&sCursorPrimB);
s16* sCursorEnvR_reloc = KaleidoManager_GetRamAddr(&sCursorEnvR);
s16* sCursorEnvG_reloc = KaleidoManager_GetRamAddr(&sCursorEnvG);
s16* sCursorEnvB_reloc = KaleidoManager_GetRamAddr(&sCursorEnvB);
OPEN_DISPS(gfxCtx);
if (!IS_PAUSE_STATE_GAMEOVER) {
if (pauseCtx->state != PAUSE_STATE_SAVEPROMPT) {
stepR =
ABS_ALT(*sCursorPrimR_reloc - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
ABS_ALT(sCursorPrimR - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
sCursorColorTimer;
stepG =
ABS_ALT(*sCursorPrimG_reloc - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
ABS_ALT(sCursorPrimG - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
sCursorColorTimer;
stepB =
ABS_ALT(*sCursorPrimB_reloc - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
ABS_ALT(sCursorPrimB - sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
sCursorColorTimer;
if (*sCursorPrimR_reloc >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
*sCursorPrimR_reloc -= stepR;
if (sCursorPrimR >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
sCursorPrimR -= stepR;
} else {
*sCursorPrimR_reloc += stepR;
sCursorPrimR += stepR;
}
if (*sCursorPrimG_reloc >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
*sCursorPrimG_reloc -= stepG;
if (sCursorPrimG >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
sCursorPrimG -= stepG;
} else {
*sCursorPrimG_reloc += stepG;
sCursorPrimG += stepG;
}
if (*sCursorPrimB_reloc >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
*sCursorPrimB_reloc -= stepB;
if (sCursorPrimB >= sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
sCursorPrimB -= stepB;
} else {
*sCursorPrimB_reloc += stepB;
sCursorPrimB += stepB;
}
stepR =
ABS_ALT(*sCursorEnvR_reloc - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
ABS_ALT(sCursorEnvR - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) /
sCursorColorTimer;
stepG =
ABS_ALT(*sCursorEnvG_reloc - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
ABS_ALT(sCursorEnvG - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) /
sCursorColorTimer;
stepB =
ABS_ALT(*sCursorEnvB_reloc - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
ABS_ALT(sCursorEnvB - sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) /
sCursorColorTimer;
if (*sCursorEnvR_reloc >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
*sCursorEnvR_reloc -= stepR;
if (sCursorEnvR >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0]) {
sCursorEnvR -= stepR;
} else {
*sCursorEnvR_reloc += stepR;
sCursorEnvR += stepR;
}
if (*sCursorEnvG_reloc >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
*sCursorEnvG_reloc -= stepG;
if (sCursorEnvG >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1]) {
sCursorEnvG -= stepG;
} else {
*sCursorEnvG_reloc += stepG;
sCursorEnvG += stepG;
}
if (*sCursorEnvB_reloc >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
*sCursorEnvB_reloc -= stepB;
if (sCursorEnvB >= sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2]) {
sCursorEnvB -= stepB;
} else {
*sCursorEnvB_reloc += stepB;
sCursorEnvB += stepB;
}
sCursorColorTimer--;
if (sCursorColorTimer == 0) {
*sCursorPrimR_reloc = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
*sCursorPrimG_reloc = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
*sCursorPrimB_reloc = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
*sCursorEnvR_reloc = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
*sCursorEnvG_reloc = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
*sCursorEnvB_reloc = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
sCursorPrimR = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
sCursorPrimG = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
sCursorPrimB = sCursorPrimColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
sCursorEnvR = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][0];
sCursorEnvG = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][1];
sCursorEnvB = sCursorEnvColorTarget[pauseCtx->cursorColorSet + sCursorColorTargetIndex][2];
sCursorColorTargetIndex ^= 1;
sCursorColorTimer = 10;
}
@ -704,14 +679,13 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(0.0f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures_reloc);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures);
KaleidoScope_DrawItemSelect(play);
}
@ -726,16 +700,15 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(-1.57f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures_reloc);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
if (kaleido_s16(&sInDungeonScene)) {
if (sInDungeonScene) {
KaleidoScope_DrawDungeonMap(play);
Gfx_SetupDL42_Opa(gfxCtx);
gDPSetCombineMode(POLY_OPA_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
@ -757,14 +730,13 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(-3.14f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures_reloc);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures);
KaleidoScope_DrawQuestStatus(play);
}
@ -781,14 +753,13 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(1.57f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures_reloc);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures);
KaleidoScope_DrawMaskSelect(play);
}
@ -804,15 +775,14 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(0.0f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->itemPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP =
KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures_reloc);
KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->itemPageVtx, sItemPageBgTextures);
KaleidoScope_DrawItemSelect(play);
}
@ -827,16 +797,15 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(-1.57f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->mapPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures_reloc);
POLY_OPA_DISP = KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->mapPageVtx, sMapPageBgTextures);
if (kaleido_s16(&sInDungeonScene)) {
if (sInDungeonScene) {
KaleidoScope_DrawDungeonMap(play);
Gfx_SetupDL42_Opa(gfxCtx);
@ -878,15 +847,14 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetTextureFilter(POLY_OPA_DISP++, G_TF_BILERP);
Matrix_RotateYF(-3.14f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->questPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP =
KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures_reloc);
KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->questPageVtx, sQuestPageBgTextures);
KaleidoScope_DrawQuestStatus(play);
break;
@ -900,15 +868,14 @@ void KaleidoScope_DrawPages(PlayState* play, GraphicsContext* gfxCtx) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 180, 180, 120, 255);
Matrix_RotateYF(1.57f, MTXMODE_NEW);
// @recomp Manual relocation, TODO remove when automated.
Matrix_Translate(0.0f, kaleido_f32(&sPauseMenuVerticalOffset) / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Translate(0.0f, sPauseMenuVerticalOffset / 100.0f, -93.0f, MTXMODE_APPLY);
Matrix_Scale(0.78f, 0.78f, 0.78f, MTXMODE_APPLY);
Matrix_RotateXFApply(-pauseCtx->maskPageRoll / 100.0f);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
POLY_OPA_DISP =
KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures_reloc);
KaleidoScope_DrawPageSections(POLY_OPA_DISP, pauseCtx->maskPageVtx, sMaskPageBgTextures);
KaleidoScope_DrawMaskSelect(play);
break;

File diff suppressed because it is too large Load Diff

View File

@ -5,7 +5,7 @@ entrypoint = 0x80080000
# Paths are relative to the location of this config file.
output_func_path = "RecompiledFuncs"
relocatable_sections_path = "overlays.us.rev1.txt"
symbols_file_path = "us.rev1.syms.toml"
symbols_file_path = "Zelda64RecompSyms/mm.us.rev1.syms.toml"
rom_file_path = "mm.us.rev1.rom_uncompressed.z64"
[patches]