Skip to content

Real C++ member definitions across the minigame family (79 bodies); slots 18 and 32 return void, measured - #2114

Merged
andrewboudreau merged 1 commit into
mainfrom
cpp/minigame-methods-1
Sep 1, 2026
Merged

Real C++ member definitions across the minigame family (79 bodies); slots 18 and 32 return void, measured#2114
andrewboudreau merged 1 commit into
mainfrom
cpp/minigame-methods-1

Conversation

@andrewboudreau

Copy link
Copy Markdown
Collaborator

The slots-18-35 keystone campaign declared the minigame family's virtuals. Every declaration was measured against the ROM's vtables and call sites — but the bodies stayed free functions with hand-written mangled names:

extern "C" void _ZN12dScMgPanel_c13OnYoshiTryEatEi(char *self, int flag)

A free function can carry a signature the class never agreed to. 56 of the family's 90 bodies did exactly that — they disagreed with their own class declaration on return type, arity, or both, and nothing ever noticed, because the return type is not part of the Itanium mangled name and an unread trailing parameter costs no instruction.

This PR converts 79 of them into real members:

void dScMgPanel_c::OnYoshiTryEat(int flag)

which forces body and declaration into one spelling, so the ROM has to adjudicate.

Two slots changed their return type, and the bytes settled both

Slot 18 — OnYoshiTryEat(int): intvoid (31 declarations)

The int rested entirely on dScMgCoin_c ending return 0;. That does not survive its own disassembly:

+0x6c  bl  <func_ov004_020adc1c>   ; result lands in r0
+0x70  add r1, r4, #0x5000         ; r0 is LIVE, so the address goes to r1
+0x74  str r0, [r1, #0x1d4]
+0x78  mov r0, #0                  ; r0 now free -- this is the CONSTANT
+0x7c  str r0, [r1, #0x1c8]        ; ...being stored to unk_51c8

r1 holds the address because r0 still held a call result, not because r0 was reserved for a return value. Coin is byte-identical under both spellings and pins neither.

Six overrides do pin it, and they pin void. Compiled as int, mwcc reserves r0 as the result register, and every register at those exits shifts by one:

override mismatching words
dScMgSlot1_c 3 of 19
dScMgMemory_c 5 of 24
dScMgMemory2_c 5 of 24
dScMgRoulette_c 3 of 63
dScMgPanel_c 4 of 68
dScMgSlot3_c 84 of 205
ROM   add r0, r4, #0x4000 / mov r1, #0 / str r1,[r0,#0x6b4]
int   add r1, r4, #0x4000 / mov r2, #0 / str r2,[r1,#0x6b4]

Slot 32 — Virtual80(): intvoid (2 declarations)

Same signature, from dScMgSlot3_c's single override — 6 words of 42:

ROM   ldr r2,[pc,#0x18] / ldr r0,[pc,#0x20] / ldrh r1,[r2]
int   ldr r3,[pc,#0x18] / ldr r1,[pc,#0x20] / ldrh r2,[r3]

The header had called that int "A HINT ... no body pins". A body pins it now. The base's own body was byte-exact either way — which is exactly why the hint survived unrefuted for so long. Unrefuted is not confirmed.

mwcc rejects the halfway position outright: a void override of an int virtual is differs from virtual base function ... in return type only — an error, not a warning. So the base and all 31 declarations move together. The return type is not mangled, so no symbol, vtable, or config entry moves.

The recipe — steps 5-7 surface no compile error

  1. git mv the .c to .cpp
  2. //cpp as the first bytes — the marker is the whole language test; rombuild.compile_one never looks at the extension
  3. #include "<Class>.h"
  4. spell the definition <declRet> Class::Method(<declParams>)
  5. point config/arm9/overlays/ovNNN/delinks.txt at the new .cpp. Skipping this does not fail the compile — the function silently falls back to ROM bytes and only layout-check notices. 61 keys repointed here.
  6. re-point any prose naming the old path (check_dead_references)
  7. wrap every file-scope declaration in extern "C" { }. A .c file needs no linkage marker; the same declarations in .cpp are C++ declarations, so mwcc mangles them — and one whose identifier is itself a mangled name gets mangled a second time. Nothing catches it until the whole-ROM link:
    mwldarm.exe: Undefined : "_ZN3G2S13GetBG1CharPtrEv()"
    mwldarm.exe: Referenced from "dScMgBase_c::Virtual7C()"
    
    Declarations come in two shapes and both bite — extern void Foo(int); and bare void MultiStore16(u16, void*, int); with no keyword — and one may span several lines, so the unit is the run up to the terminating ;, not the line.
  8. fix the C-only constructs C++ rejects: void* arithmetic, implicit declarations, and a local extern that conflicts with the one the newly included class header brings in.

Verification

python tools/rombuild.py -j 16 --no-rom
  11,088 / 11,088 functions reproducing, 0 mismatching
  106/106 modules exact, 100.000000% of compared bytes
  ROM-build analysis: PASS

Static gates, all green: dead-references, duplicate-sources, header-offsets, langmode-ratchet, layout-check, src-tu-refs, source-coverage, converted-ratchet, port_refcheck.

Base

Stacked on cpp/minigame-slot35 (#2112). Merge that first.

attribution-override per the standing instruction — attribution is a non-goal here.

…nd two vtable-slot return types MEASURED

The slots-18-35 campaign declared the family's virtuals; every declaration was
measured against the ROM's vtables and call sites, but the BODIES stayed free
functions with hand-written mangled names:

    extern "C" void _ZN12dScMgPanel_c13OnYoshiTryEatEi(char *self, int flag)

A free function can hold a signature the class never agreed to, and 56 of the
90 family bodies did exactly that -- they disagreed with their own class
declaration on return type, arity, or both, and nothing ever noticed, because
the return type is not part of the Itanium mangled name and an unread trailing
parameter costs no instruction. This converts 79 of them to real members:

    void dScMgPanel_c::OnYoshiTryEat(int flag)

which forces body and declaration into ONE spelling. The ROM then adjudicates.

TWO SLOTS CHANGED THEIR RETURN TYPE, and the bytes settled both.

  Slot 18, OnYoshiTryEat(int): int -> void. The `int` rested entirely on
  dScMgCoin_c ending `return 0;`. That does not survive its own disassembly --
  Coin's tail puts the address in r1 because r0 still held a CALL RESULT, not
  because r0 was reserved for a return value, and the trailing `mov r0,#0` is
  the constant being stored to unk_51c8. Coin is byte-identical under both
  spellings and pins neither. Six overrides do pin it, and they pin void:
  converted as `int`, mwcc reserves r0 and shifts every register at their exits
  by one -- dScMgSlot1_c 3 words of 19, dScMgMemory_c and dScMgMemory2_c 5 of 24
  each, dScMgRoulette_c 3 of 63, dScMgPanel_c 4 of 68, dScMgSlot3_c 84 of 205.

      ROM   add r0, r4, #0x4000 / mov r1, #0 / str r1,[r0,#0x6b4]
      int   add r1, r4, #0x4000 / mov r2, #0 / str r2,[r1,#0x6b4]

  Slot 32, Virtual80(): int -> void, on the same evidence from dScMgSlot3_c's
  single override, 6 words of 42. The header had called that `int` "A HINT ...
  no body pins"; a body pins it now. The base's own body was byte-exact either
  way, which is exactly why the hint survived unrefuted for so long. Unrefuted
  is not confirmed.

mwcc rejects the halfway position outright -- a void override of an int virtual
is "differs from virtual base function ... in return type only", an error, not
a warning -- so the base and all 31 declarations move together. The return type
is not mangled, so no symbol, vtable, or config entry moves.

THE RECIPE, and steps 5-7 are the ones no compile error surfaces:

  1. git mv the .c to .cpp
  2. //cpp as the FIRST BYTES -- the marker is the whole language test;
     rombuild.compile_one never looks at the extension
  3. #include "<Class>.h"
  4. spell the definition as <declRet> Class::Method(<declParams>)
  5. point config/arm9/overlays/ovNNN/delinks.txt at the new .cpp path.
     Skipping this does NOT fail the compile: the function silently falls back
     to ROM bytes and only layout-check notices. 61 keys repointed here.
  6. re-point any PROSE that named the old path (check_dead_references)
  7. wrap EVERY file-scope declaration in extern "C" { }. A .c file needs no
     linkage marker; the same declarations in .cpp are C++ declarations, so
     mwcc mangles them -- and one whose identifier is ITSELF a mangled name
     gets mangled a second time. Nothing catches it until the whole-ROM link:
         Undefined : "_ZN3G2S13GetBG1CharPtrEv()"
         Referenced from "dScMgBase_c::Virtual7C()"
     Declarations come in two shapes and both bite: `extern void Foo(int);`
     and bare `void MultiStore16(u16, void*, int);` with no extern keyword.
  8. fix the C-only constructs C++ rejects: void* arithmetic, implicit
     function declarations, and a local extern that conflicts with the one
     the newly included class header brings in.

Slot 30's return type was measured the same way and is recorded in its own
evidence block: dScMgBase_c::OnAimedAtWithEggReturnVec is void, 14 of 93 words.

VERIFIED: python tools/rombuild.py -j 16 --no-rom
  11,088 / 11,088 functions reproducing, 0 mismatching
  106/106 modules exact, 100.000000% of compared bytes
Static gates, all green: dead-references, duplicate-sources, header-offsets,
langmode-ratchet, layout-check, src-tu-refs, source-coverage, converted-ratchet,
port_refcheck.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QhhAeJwXBnfPp7B5DNjCwh
@tangos-validator

tangos-validator Bot commented Aug 31, 2026

Copy link
Copy Markdown

✅ PR validation — Passed

Committed merge introduces no reconstruction or attribution regression.

Full merge validation

Check Result
Committed test merge yes
Byte-verified functions 10,781 / 11,347 (95.01%, +0)
Byte-verified code bytes 2,004,460 / 2,211,124 (90.65%, +0)
Claimed, not byte-verified 436 functions, 101,220 bytes (+0)
Perfect source moves 0 R100
Enrolled ranges (delinks complete) 11,059 functions, 2,053,148 bytes (92.86%, +0) -- differs from byte-verified by +278
Contributor credit 0 added, 0 changed, 0 lost
Relocation check 359 checked; 1 BLIND, 1 NO-SYM, 357 VERIFIED
Port reference check 405 checked; 0 stale
Module fidelity 106/106 exact; 100.000000% compared bytes
Code linked from verified source 11,088 functions, 2,067,148 bytes (93.49%)
Module bytes from source 2,067,148 / 3,049,600 (67.8%); 811,492 (26.6%) are data no delink entry reaches
ROM data reproduced from source 496 symbol(s) exact, 223 partial, 5 differ

Byte-verified means the range carries complete in a delinks.txt, so the ROM build compiled it and compared it to the cartridge. The 436 claimed functions have a src/ file named after the symbol with no NONMATCHING banner, and nothing compiles them -- dsd fills their addresses with the ROM's own bytes. Both together are the 11,217 this project calls matched.

Warnings: 1 linkcheck result(s) have unresolved relocations; 1 affected source file(s) could not be fully link-checked.

Per-file link-check detail

1 of 249 changed file(s) do not match the ROM (NO-SYM).

File Symbol Result Slots checked
src/_ZN10dScMgCup_c13InitResourcesEv.cpp _ZN10dScMgCup_c13InitResourcesEv ✅ verified 1
src/_ZN10dScMgCup_c13OnYoshiTryEatEi.cpp _ZN10dScMgCup_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN10dScMgCup_c6RenderEv.cpp _ZN10dScMgCup_c6RenderEv ✅ verified 1
src/_ZN10dScMgCup_c8BehaviorEv.cpp _ZN10dScMgCup_c8BehaviorEv ✅ verified 1
src/_ZN10dScMgCup_c9Virtual50Ev.cpp _ZN10dScMgCup_c9Virtual50Ev ✅ verified 1
src/_ZN10dScMgCup_cD0Ev.cpp _ZN10dScMgCup_cD0Ev ✅ verified 1
src/_ZN10dScMgCup_cD1Ev.cpp _ZN10dScMgCup_cD1Ev ✅ verified 1
src/_ZN11dScMgBase_c11OnAttacked1Ev.cpp _ZN11dScMgBase_c11OnAttacked1Ev ✅ verified 1
src/_ZN11dScMgBase_c11OnAttacked2Ev.cpp _ZN11dScMgBase_c11OnAttacked2Ev ✅ verified 1
src/_ZN11dScMgBase_c13OnTurnIntoEggEi.cpp _ZN11dScMgBase_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN11dScMgBase_c13OnYoshiTryEatEi.cpp _ZN11dScMgBase_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN11dScMgBase_c15OnGroundPoundedEv.cpp _ZN11dScMgBase_c15OnGroundPoundedEv ✅ verified 1
src/_ZN11dScMgBase_c15OnHitByMegaCharEv.cpp _ZN11dScMgBase_c15OnHitByMegaCharEv ✅ verified 1
src/_ZN11dScMgBase_c15graphCallback_c14GraphCallback0Ev.cpp _ZN11dScMgBase_c15graphCallback_c14GraphCallback0Ev ✅ verified 1
src/_ZN11dScMgBase_c15graphCallback_c14GraphCallback1Ev.cpp _ZN11dScMgBase_c15graphCallback_c14GraphCallback1Ev ✅ verified 1
src/_ZN11dScMgBase_c15graphCallback_c14GraphCallback2Ev.cpp _ZN11dScMgBase_c15graphCallback_c14GraphCallback2Ev ✅ verified 1
src/_ZN11dScMgBase_c15graphCallback_c14GraphCallback3Ev.cpp _ZN11dScMgBase_c15graphCallback_c14GraphCallback3Ev ✅ verified 1
src/_ZN11dScMgBase_c16OnAimedAtWithEggEv.cpp _ZN11dScMgBase_c16OnAimedAtWithEggEv ✅ verified 1
src/_ZN11dScMgBase_c19OnHitFromUnderneathEv.cpp _ZN11dScMgBase_c19OnHitFromUnderneathEv ✅ verified 1
src/_ZN11dScMgBase_c24OnHitByCannonBlastedCharEv.cpp _ZN11dScMgBase_c24OnHitByCannonBlastedCharEv ✅ verified 1
src/_ZN11dScMgBase_c25OnAimedAtWithEggReturnVecEv.cpp _ZN11dScMgBase_c25OnAimedAtWithEggReturnVecEv ✅ verified 1
src/_ZN11dScMgBase_c8OnKickedEv.cpp _ZN11dScMgBase_c8OnKickedEv ✅ verified 1
src/_ZN11dScMgBase_c8OnPushedEv.cpp _ZN11dScMgBase_c8OnPushedEv ✅ verified 1
src/_ZN11dScMgBase_c9Virtual50Ev.cpp _ZN11dScMgBase_c9Virtual50Ev ✅ verified 1
src/_ZN11dScMgBase_c9Virtual7CEv.cpp _ZN11dScMgBase_c9Virtual7CEv ✅ verified 1
src/_ZN11dScMgBase_c9Virtual80Ev.cpp _ZN11dScMgBase_c9Virtual80Ev ✅ verified 1
src/_ZN11dScMgBase_c9Virtual84Ev.cpp _ZN11dScMgBase_c9Virtual84Ev ✅ verified 1
src/_ZN11dScMgBase_c9Virtual88Eiiii.cpp _ZN11dScMgBase_c9Virtual88Eiiii ✅ verified 1
src/_ZN11dScMgBase_c9Virtual8CEv.cpp _ZN11dScMgBase_c9Virtual8CEv ✅ verified 1
src/_ZN11dScMgBase_cC2Ev.cpp _ZN11dScMgBase_cC2Ev ✅ verified 1
src/_ZN11dScMgBase_cD0Ev.cpp _ZN11dScMgBase_cD0Ev ✅ verified 1
src/_ZN11dScMgBase_cD1Ev.cpp _ZN11dScMgBase_cD1Ev ✅ verified 1
src/_ZN11dScMgBase_cD2Ev.cpp _ZN11dScMgBase_cD2Ev ✅ verified 1
src/_ZN11dScMgCoin_c13InitResourcesEv.cpp _ZN11dScMgCoin_c13InitResourcesEv ✅ verified 1
src/_ZN11dScMgCoin_c13OnYoshiTryEatEi.cpp _ZN11dScMgCoin_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN11dScMgCoin_c6RenderEv.cpp _ZN11dScMgCoin_c6RenderEv ✅ verified 1
src/_ZN11dScMgCoin_c8BehaviorEv.cpp _ZN11dScMgCoin_c8BehaviorEv ✅ verified 1
src/_ZN11dScMgCoin_cD0Ev.cpp _ZN11dScMgCoin_cD0Ev ✅ verified 1
src/_ZN11dScMgCoin_cD1Ev.cpp _ZN11dScMgCoin_cD1Ev ✅ verified 1
src/_ZN11dScMgJump_c13InitResourcesEv.cpp _ZN11dScMgJump_c13InitResourcesEv ✅ verified 1
src/_ZN11dScMgJump_c13OnTurnIntoEggEi.cpp _ZN11dScMgJump_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN11dScMgJump_c16CleanupResourcesEv.cpp _ZN11dScMgJump_c16CleanupResourcesEv ✅ verified 1
src/_ZN11dScMgJump_c6RenderEv.cpp _ZN11dScMgJump_c6RenderEv ✅ verified 1
src/_ZN11dScMgJump_c8BehaviorEv.cpp _ZN11dScMgJump_c8BehaviorEv ✅ verified 1
src/_ZN11dScMgJump_cD0Ev.cpp _ZN11dScMgJump_cD0Ev ✅ verified 1
src/_ZN11dScMgJump_cD1Ev.cpp _ZN11dScMgJump_cD1Ev ✅ verified 1
src/_ZN12dScMg3DEsp_c13InitResourcesEv.cpp _ZN12dScMg3DEsp_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMg3DEsp_c13OnYoshiTryEatEi.cpp _ZN12dScMg3DEsp_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMg3DEsp_c16CleanupResourcesEv.cpp _ZN12dScMg3DEsp_c16CleanupResourcesEv ✅ verified 1
src/_ZN12dScMg3DEsp_c6RenderEv.cpp _ZN12dScMg3DEsp_c6RenderEv ✅ verified 1
src/_ZN12dScMg3DEsp_c8BehaviorEv.cpp _ZN12dScMg3DEsp_c8BehaviorEv ✅ verified 1
src/_ZN12dScMg3DEsp_c9Virtual50Ev.cpp _ZN12dScMg3DEsp_c9Virtual50Ev ✅ verified 1
src/_ZN12dScMg3DEsp_cD0Ev.cpp _ZN12dScMg3DEsp_cD0Ev ✅ verified 1
src/_ZN12dScMg3DEsp_cD1Ev.cpp _ZN12dScMg3DEsp_cD1Ev ✅ verified 1
src/_ZN12dScMgAmida_c13InitResourcesEv.cpp _ZN12dScMgAmida_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgAmida_c13OnYoshiTryEatEi.cpp _ZN12dScMgAmida_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMgAmida_c21AfterCleanupResourcesEj.cpp _ZN12dScMgAmida_c21AfterCleanupResourcesEj ✅ verified 1
src/_ZN12dScMgAmida_c5Unk36Ev.cpp _ZN12dScMgAmida_c5Unk36Ev ✅ verified 1
src/_ZN12dScMgAmida_c6RenderEv.cpp _ZN12dScMgAmida_c6RenderEv ✅ verified 1
src/_ZN12dScMgAmida_c8BehaviorEv.cpp _ZN12dScMgAmida_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgAmida_c9Virtual7CEv.cpp _ZN12dScMgAmida_c9Virtual7CEv ✅ verified 1
src/_ZN12dScMgAmida_c9Virtual88Eiiii.cpp _ZN12dScMgAmida_c9Virtual88Eiiii ✅ verified 1
src/_ZN12dScMgAmida_c9Virtual8CEv.cpp _ZN12dScMgAmida_c9Virtual8CEv ✅ verified 1
src/_ZN12dScMgAmida_cD0Ev.cpp _ZN12dScMgAmida_cD0Ev ✅ verified 1
src/_ZN12dScMgAmida_cD1Ev.cpp _ZN12dScMgAmida_cD1Ev ✅ verified 1
src/_ZN12dScMgJump2_c13InitResourcesEv.cpp _ZN12dScMgJump2_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgJump2_c13OnTurnIntoEggEi.cpp _ZN12dScMgJump2_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN12dScMgJump2_c13OnYoshiTryEatEi.cpp _ZN12dScMgJump2_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMgJump2_c16CleanupResourcesEv.cpp _ZN12dScMgJump2_c16CleanupResourcesEv ✅ verified 1
src/_ZN12dScMgJump2_c6RenderEv.cpp _ZN12dScMgJump2_c6RenderEv ✅ verified 1
src/_ZN12dScMgJump2_c8BehaviorEv.cpp _ZN12dScMgJump2_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgJump2_cD0Ev.cpp _ZN12dScMgJump2_cD0Ev ✅ verified 1
src/_ZN12dScMgJump2_cD1Ev.cpp _ZN12dScMgJump2_cD1Ev ✅ verified 1
src/_ZN12dScMgLuigi_c13InitResourcesEv.cpp _ZN12dScMgLuigi_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgLuigi_c13OnYoshiTryEatEi.cpp _ZN12dScMgLuigi_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMgLuigi_c21AfterCleanupResourcesEj.cpp _ZN12dScMgLuigi_c21AfterCleanupResourcesEj ✅ verified 1
src/_ZN12dScMgLuigi_c6RenderEv.cpp _ZN12dScMgLuigi_c6RenderEv ✅ verified 1
src/_ZN12dScMgLuigi_c8BehaviorEv.cpp _ZN12dScMgLuigi_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgLuigi_cD0Ev.cpp _ZN12dScMgLuigi_cD0Ev ✅ verified 1
src/_ZN12dScMgLuigi_cD1Ev.cpp _ZN12dScMgLuigi_cD1Ev ✅ verified 1
src/_ZN12dScMgPanel_c13InitResourcesEv.cpp _ZN12dScMgPanel_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgPanel_c13OnYoshiTryEatEi.cpp _ZN12dScMgPanel_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMgPanel_c6RenderEv.cpp _ZN12dScMgPanel_c6RenderEv ✅ verified 1
src/_ZN12dScMgPanel_c8BehaviorEv.cpp _ZN12dScMgPanel_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgPanel_cD0Ev.cpp _ZN12dScMgPanel_cD0Ev ✅ verified 1
src/_ZN12dScMgPanel_cD1Ev.cpp _ZN12dScMgPanel_cD1Ev ✅ verified 1
src/_ZN12dScMgSlot1_c13InitResourcesEv.cpp _ZN12dScMgSlot1_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgSlot1_c13OnYoshiTryEatEi.cpp _ZN12dScMgSlot1_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMgSlot1_c15OnHitByMegaCharEv.cpp _ZN12dScMgSlot1_c15OnHitByMegaCharEv ✅ verified 1
src/_ZN12dScMgSlot1_c19OnHitFromUnderneathEv.cpp _ZN12dScMgSlot1_c19OnHitFromUnderneathEv ✅ verified 1
src/_ZN12dScMgSlot1_c6RenderEv.cpp _ZN12dScMgSlot1_c6RenderEv ✅ verified 1
src/_ZN12dScMgSlot1_c9betIcon_c6RenderEv.cpp _ZN12dScMgSlot1_c9betIcon_c6RenderEv ✅ verified 1
src/_ZN12dScMgSlot1_c9betIcon_c8BehaviorEv.cpp _ZN12dScMgSlot1_c9betIcon_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgSlot1_cD0Ev.cpp _ZN12dScMgSlot1_cD0Ev ✅ verified 1
src/_ZN12dScMgSlot1_cD1Ev.cpp _ZN12dScMgSlot1_cD1Ev ✅ verified 1
src/_ZN12dScMgSlot3_c13InitResourcesEv.cpp _ZN12dScMgSlot3_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgSlot3_c13OnYoshiTryEatEi.cpp _ZN12dScMgSlot3_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN12dScMgSlot3_c16OnAimedAtWithEggEv.cpp _ZN12dScMgSlot3_c16OnAimedAtWithEggEv ✅ verified 1
src/_ZN12dScMgSlot3_c25OnAimedAtWithEggReturnVecEv.cpp _ZN12dScMgSlot3_c25OnAimedAtWithEggReturnVecEv ✅ verified 1
src/_ZN12dScMgSlot3_c6RenderEv.cpp _ZN12dScMgSlot3_c6RenderEv ✅ verified 1
src/_ZN12dScMgSlot3_c8BehaviorEv.cpp _ZN12dScMgSlot3_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgSlot3_c9Virtual80Ev.cpp _ZN12dScMgSlot3_c9Virtual80Ev ✅ verified 1
src/_ZN12dScMgSlot3_cD0Ev.cpp _ZN12dScMgSlot3_cD0Ev ✅ verified 1
src/_ZN12dScMgSlot3_cD1Ev.cpp _ZN12dScMgSlot3_cD1Ev ✅ verified 1
src/_ZN12dScMgSound_c13InitResourcesEv.cpp _ZN12dScMgSound_c13InitResourcesEv ✅ verified 1
src/_ZN12dScMgSound_c13OnYoshiTryEatEi.cpp _ZN12dScMgSound_c13OnYoshiTryEatEi 🔶 blind (a reloc slot could not be resolved) 1
src/_ZN12dScMgSound_c6RenderEv.cpp _ZN12dScMgSound_c6RenderEv ✅ verified 1
src/_ZN12dScMgSound_c8BehaviorEv.cpp _ZN12dScMgSound_c8BehaviorEv ✅ verified 1
src/_ZN12dScMgSound_c9Virtual50Ev.cpp _ZN12dScMgSound_c9Virtual50Ev ✅ verified 1
src/_ZN12dScMgSound_cD0Ev.cpp _ZN12dScMgSound_cD0Ev ✅ verified 1
src/_ZN12dScMgSound_cD1Ev.cpp _ZN12dScMgSound_cD1Ev ✅ verified 1
src/_ZN13dScMgFlower_c13InitResourcesEv.cpp _ZN13dScMgFlower_c13InitResourcesEv ✅ verified 1
src/_ZN13dScMgFlower_c13OnYoshiTryEatEi.cpp _ZN13dScMgFlower_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN13dScMgFlower_c6RenderEv.cpp _ZN13dScMgFlower_c6RenderEv ✅ verified 1
src/_ZN13dScMgFlower_c8BehaviorEv.cpp _ZN13dScMgFlower_c8BehaviorEv ✅ verified 1
src/_ZN13dScMgFlower_cD0Ev.cpp _ZN13dScMgFlower_cD0Ev ✅ verified 1
src/_ZN13dScMgFlower_cD1Ev.cpp _ZN13dScMgFlower_cD1Ev ✅ verified 1
src/_ZN13dScMgMemory_c13InitResourcesEv.cpp _ZN13dScMgMemory_c13InitResourcesEv ✅ verified 1
src/_ZN13dScMgMemory_c13OnTurnIntoEggEi.cpp _ZN13dScMgMemory_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN13dScMgMemory_c13OnYoshiTryEatEi.cpp _ZN13dScMgMemory_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN13dScMgMemory_c15OnGroundPoundedEv.cpp _ZN13dScMgMemory_c15OnGroundPoundedEv ✅ verified 1
src/_ZN13dScMgMemory_c6RenderEv.cpp _ZN13dScMgMemory_c6RenderEv ✅ verified 1
src/_ZN13dScMgMemory_c8BehaviorEv.cpp _ZN13dScMgMemory_c8BehaviorEv ✅ verified 1
src/_ZN13dScMgMemory_cD0Ev.cpp _ZN13dScMgMemory_cD0Ev ✅ verified 1
src/_ZN13dScMgMemory_cD1Ev.cpp _ZN13dScMgMemory_cD1Ev ✅ verified 1
src/_ZN13dScMgTeresa_c13InitResourcesEv.cpp _ZN13dScMgTeresa_c13InitResourcesEv ✅ verified 1
src/_ZN13dScMgTeresa_c13OnYoshiTryEatEi.cpp _ZN13dScMgTeresa_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN13dScMgTeresa_c6RenderEv.cpp _ZN13dScMgTeresa_c6RenderEv ✅ verified 1
src/_ZN13dScMgTeresa_c8BehaviorEv.cpp _ZN13dScMgTeresa_c8BehaviorEv ✅ verified 1
src/_ZN13dScMgTeresa_c9Virtual50Ev.cpp _ZN13dScMgTeresa_c9Virtual50Ev ✅ verified 1
src/_ZN13dScMgTeresa_c9Virtual88Eiiii.cpp _ZN13dScMgTeresa_c9Virtual88Eiiii ✅ verified 1
src/_ZN13dScMgTeresa_cD0Ev.cpp _ZN13dScMgTeresa_cD0Ev ✅ verified 1
src/_ZN13dScMgTeresa_cD1Ev.cpp _ZN13dScMgTeresa_cD1Ev ✅ verified 1
src/_ZN14dScMgBomroom_c13InitResourcesEv.cpp _ZN14dScMgBomroom_c13InitResourcesEv ✅ verified 1
src/_ZN14dScMgBomroom_c13OnYoshiTryEatEi.cpp _ZN14dScMgBomroom_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN14dScMgBomroom_c6RenderEv.cpp _ZN14dScMgBomroom_c6RenderEv ✅ verified 1
src/_ZN14dScMgBomroom_c8BehaviorEv.cpp _ZN14dScMgBomroom_c8BehaviorEv ✅ verified 1
src/_ZN14dScMgBomroom_cD0Ev.cpp _ZN14dScMgBomroom_cD0Ev ✅ verified 1
src/_ZN14dScMgBomroom_cD1Ev.cpp _ZN14dScMgBomroom_cD1Ev ✅ verified 1
src/_ZN14dScMgCurling_c13InitResourcesEv.cpp _ZN14dScMgCurling_c13InitResourcesEv ✅ verified 1
src/_ZN14dScMgCurling_c13OnYoshiTryEatEi.cpp _ZN14dScMgCurling_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN14dScMgCurling_c6RenderEv.cpp _ZN14dScMgCurling_c6RenderEv ✅ verified 1
src/_ZN14dScMgCurling_c8BehaviorEv.cpp _ZN14dScMgCurling_c8BehaviorEv ✅ verified 1
src/_ZN14dScMgCurling_cD0Ev.cpp _ZN14dScMgCurling_cD0Ev ✅ verified 1
src/_ZN14dScMgCurling_cD1Ev.cpp _ZN14dScMgCurling_cD1Ev ✅ verified 1
src/_ZN14dScMgD3DBase_c11AfterRenderEj.cpp _ZN14dScMgD3DBase_c11AfterRenderEj ✅ verified 1
src/_ZN14dScMgD3DBase_c12BeforeRenderEv.cpp _ZN14dScMgD3DBase_c12BeforeRenderEv ✅ verified 1
src/_ZN14dScMgD3DBase_c14BeforeBehaviorEv.cpp _ZN14dScMgD3DBase_c14BeforeBehaviorEv ✅ verified 1
src/_ZN14dScMgD3DBase_c15OnHitByMegaCharEv.cpp _ZN14dScMgD3DBase_c15OnHitByMegaCharEv ✅ verified 1
src/_ZN14dScMgD3DBase_c16OnAimedAtWithEggEv.cpp _ZN14dScMgD3DBase_c16OnAimedAtWithEggEv ✅ verified 1
src/_ZN14dScMgD3DBase_c18AfterInitResourcesEj.cpp _ZN14dScMgD3DBase_c18AfterInitResourcesEj ✅ verified 1
src/_ZN14dScMgD3DBase_c19BeforeInitResourcesEv.cpp _ZN14dScMgD3DBase_c19BeforeInitResourcesEv ✅ verified 1
src/_ZN14dScMgD3DBase_c19OnHitFromUnderneathEv.cpp _ZN14dScMgD3DBase_c19OnHitFromUnderneathEv ✅ verified 1
src/_ZN14dScMgD3DBase_c21AfterCleanupResourcesEj.cpp _ZN14dScMgD3DBase_c21AfterCleanupResourcesEj ✅ verified 1
src/_ZN14dScMgD3DBase_c24OnHitByCannonBlastedCharEv.cpp _ZN14dScMgD3DBase_c24OnHitByCannonBlastedCharEv ✅ verified 1
src/_ZN14dScMgD3DBase_c25OnAimedAtWithEggReturnVecEv.cpp _ZN14dScMgD3DBase_c25OnAimedAtWithEggReturnVecEv ✅ verified 1
src/_ZN14dScMgD3DBase_c8OnKickedEv.cpp _ZN14dScMgD3DBase_c8OnKickedEv ✅ verified 1
src/_ZN14dScMgD3DBase_c8OnPushedEv.cpp _ZN14dScMgD3DBase_c8OnPushedEv ✅ verified 1
src/_ZN14dScMgD3DBase_c9Virtual7CEv.cpp _ZN14dScMgD3DBase_c9Virtual7CEv ✅ verified 1
src/_ZN14dScMgD3DBase_c9Virtual84Ev.cpp _ZN14dScMgD3DBase_c9Virtual84Ev ✅ verified 1
src/_ZN14dScMgD3DBase_cD0Ev.cpp _ZN14dScMgD3DBase_cD0Ev ✅ verified 1
src/_ZN14dScMgD3DBase_cD1Ev.cpp _ZN14dScMgD3DBase_cD1Ev ✅ verified 1
src/_ZN14dScMgMemory2_c13InitResourcesEv.cpp _ZN14dScMgMemory2_c13InitResourcesEv ✅ verified 1
src/_ZN14dScMgMemory2_c13OnTurnIntoEggEi.cpp _ZN14dScMgMemory2_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN14dScMgMemory2_c13OnYoshiTryEatEi.cpp _ZN14dScMgMemory2_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN14dScMgMemory2_c15OnGroundPoundedEv.cpp _ZN14dScMgMemory2_c15OnGroundPoundedEv ✅ verified 1
src/_ZN14dScMgMemory2_c6RenderEv.cpp _ZN14dScMgMemory2_c6RenderEv ✅ verified 1
src/_ZN14dScMgMemory2_c8BehaviorEv.cpp _ZN14dScMgMemory2_c8BehaviorEv ✅ verified 1
src/_ZN14dScMgMemory2_cD0Ev.cpp _ZN14dScMgMemory2_cD0Ev ✅ verified 1
src/_ZN14dScMgMemory2_cD1Ev.cpp _ZN14dScMgMemory2_cD1Ev ✅ verified 1
src/_ZN15dScMgCurling2_c13InitResourcesEv.cpp _ZN15dScMgCurling2_c13InitResourcesEv ✅ verified 1
src/_ZN15dScMgCurling2_c13OnYoshiTryEatEi.cpp _ZN15dScMgCurling2_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN15dScMgCurling2_c6RenderEv.cpp _ZN15dScMgCurling2_c6RenderEv ✅ verified 1
src/_ZN15dScMgCurling2_c8BehaviorEv.cpp _ZN15dScMgCurling2_c8BehaviorEv ✅ verified 1
src/_ZN15dScMgCurling2_cD0Ev.cpp _ZN15dScMgCurling2_cD0Ev ✅ verified 1
src/_ZN15dScMgCurling2_cD1Ev.cpp _ZN15dScMgCurling2_cD1Ev ✅ verified 1
src/_ZN15dScMgHanachan_c13InitResourcesEv.cpp _ZN15dScMgHanachan_c13InitResourcesEv ✅ verified 1
src/_ZN15dScMgHanachan_c13OnYoshiTryEatEi.cpp _ZN15dScMgHanachan_c13OnYoshiTryEatEi 🔶 no-sym 1
src/_ZN15dScMgHanachan_c16CleanupResourcesEv.cpp _ZN15dScMgHanachan_c16CleanupResourcesEv ✅ verified 1
src/_ZN15dScMgHanachan_c6RenderEv.cpp _ZN15dScMgHanachan_c6RenderEv ✅ verified 1
src/_ZN15dScMgHanachan_c8BehaviorEv.cpp _ZN15dScMgHanachan_c8BehaviorEv ✅ verified 1
src/_ZN15dScMgHanachan_cD0Ev.cpp _ZN15dScMgHanachan_cD0Ev ✅ verified 1
src/_ZN15dScMgHanachan_cD1Ev.cpp _ZN15dScMgHanachan_cD1Ev ✅ verified 1
src/_ZN15dScMgPachinko_c13InitResourcesEv.cpp _ZN15dScMgPachinko_c13InitResourcesEv ✅ verified 1
src/_ZN15dScMgPachinko_c13OnYoshiTryEatEi.cpp _ZN15dScMgPachinko_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN15dScMgPachinko_c6RenderEv.cpp _ZN15dScMgPachinko_c6RenderEv ✅ verified 1
src/_ZN15dScMgPachinko_c8BehaviorEv.cpp _ZN15dScMgPachinko_c8BehaviorEv ✅ verified 1
src/_ZN15dScMgPachinko_cD0Ev.cpp _ZN15dScMgPachinko_cD0Ev ✅ verified 1
src/_ZN15dScMgPachinko_cD1Ev.cpp _ZN15dScMgPachinko_cD1Ev ✅ verified 1
src/_ZN15dScMgRoulette_c13InitResourcesEv.cpp _ZN15dScMgRoulette_c13InitResourcesEv ✅ verified 1
src/_ZN15dScMgRoulette_c13OnTurnIntoEggEi.cpp _ZN15dScMgRoulette_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN15dScMgRoulette_c13OnYoshiTryEatEi.cpp _ZN15dScMgRoulette_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN15dScMgRoulette_c16CleanupResourcesEv.cpp _ZN15dScMgRoulette_c16CleanupResourcesEv ✅ verified 1
src/_ZN15dScMgRoulette_c6RenderEv.cpp _ZN15dScMgRoulette_c6RenderEv ✅ verified 1
src/_ZN15dScMgRoulette_c8BehaviorEv.cpp _ZN15dScMgRoulette_c8BehaviorEv ✅ verified 1
src/_ZN15dScMgRoulette_cD0Ev.cpp _ZN15dScMgRoulette_cD0Ev ✅ verified 1
src/_ZN15dScMgRoulette_cD1Ev.cpp _ZN15dScMgRoulette_cD1Ev ✅ verified 1
src/_ZN15dScMgSnowball_c11OnAttacked2Ev.cpp _ZN15dScMgSnowball_c11OnAttacked2Ev ✅ verified 1
src/_ZN15dScMgSnowball_c13InitResourcesEv.cpp _ZN15dScMgSnowball_c13InitResourcesEv ✅ verified 1
src/_ZN15dScMgSnowball_c13OnYoshiTryEatEi.cpp _ZN15dScMgSnowball_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN15dScMgSnowball_c16CleanupResourcesEv.cpp _ZN15dScMgSnowball_c16CleanupResourcesEv ✅ verified 1
src/_ZN15dScMgSnowball_c6RenderEv.cpp _ZN15dScMgSnowball_c6RenderEv ✅ verified 1
src/_ZN15dScMgSnowball_c8BehaviorEv.cpp _ZN15dScMgSnowball_c8BehaviorEv ✅ verified 1
src/_ZN15dScMgSnowball_c8OnKickedEv.cpp _ZN15dScMgSnowball_c8OnKickedEv ✅ verified 1
src/_ZN15dScMgSnowball_c8OnPushedEv.cpp _ZN15dScMgSnowball_c8OnPushedEv ✅ verified 1
src/_ZN15dScMgSnowball_cD0Ev.cpp _ZN15dScMgSnowball_cD0Ev ✅ verified 1
src/_ZN15dScMgSnowball_cD1Ev.cpp _ZN15dScMgSnowball_cD1Ev ✅ verified 1
src/_ZN16dScMgPachinko2_c13InitResourcesEv.cpp _ZN16dScMgPachinko2_c13InitResourcesEv ✅ verified 1
src/_ZN16dScMgPachinko2_c13OnYoshiTryEatEi.cpp _ZN16dScMgPachinko2_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN16dScMgPachinko2_c6RenderEv.cpp _ZN16dScMgPachinko2_c6RenderEv ✅ verified 1
src/_ZN16dScMgPachinko2_c8BehaviorEv.cpp _ZN16dScMgPachinko2_c8BehaviorEv ✅ verified 1
src/_ZN16dScMgPachinko2_cD0Ev.cpp _ZN16dScMgPachinko2_cD0Ev ✅ verified 1
src/_ZN16dScMgPachinko2_cD1Ev.cpp _ZN16dScMgPachinko2_cD1Ev ✅ verified 1
src/_ZN16dScMgSmartball_c13OnYoshiTryEatEi.cpp _ZN16dScMgSmartball_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN16dScMgSmartball_c21AfterCleanupResourcesEj.cpp _ZN16dScMgSmartball_c21AfterCleanupResourcesEj ✅ verified 1
src/_ZN16dScMgSmartball_c6RenderEv.cpp _ZN16dScMgSmartball_c6RenderEv ✅ verified 1
src/_ZN16dScMgSmartball_c8BehaviorEv.cpp _ZN16dScMgSmartball_c8BehaviorEv ✅ verified 1
src/_ZN16dScMgSmartball_c8OnPushedEv.cpp _ZN16dScMgSmartball_c8OnPushedEv ✅ verified 1
src/_ZN16dScMgSmartball_c9Virtual7CEv.cpp _ZN16dScMgSmartball_c9Virtual7CEv ✅ verified 1
src/_ZN16dScMgSmartball_cD0Ev.cpp _ZN16dScMgSmartball_cD0Ev ✅ verified 1
src/_ZN16dScMgSmartball_cD1Ev.cpp _ZN16dScMgSmartball_cD1Ev ✅ verified 1
src/_ZN17dScMgTrampoline_c11OnAttacked2Ev.cpp _ZN17dScMgTrampoline_c11OnAttacked2Ev ✅ verified 1
src/_ZN17dScMgTrampoline_c13InitResourcesEv.cpp _ZN17dScMgTrampoline_c13InitResourcesEv ✅ verified 1
src/_ZN17dScMgTrampoline_c13OnTurnIntoEggEi.cpp _ZN17dScMgTrampoline_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN17dScMgTrampoline_c13OnYoshiTryEatEi.cpp _ZN17dScMgTrampoline_c13OnYoshiTryEatEi ✅ verified 1
src/_ZN17dScMgTrampoline_c16CleanupResourcesEv.cpp _ZN17dScMgTrampoline_c16CleanupResourcesEv ✅ verified 1
src/_ZN17dScMgTrampoline_c6RenderEv.cpp _ZN17dScMgTrampoline_c6RenderEv ✅ verified 1
src/_ZN17dScMgTrampoline_c8BehaviorEv.cpp _ZN17dScMgTrampoline_c8BehaviorEv ✅ verified 1
src/_ZN17dScMgTrampoline_c8OnKickedEv.cpp _ZN17dScMgTrampoline_c8OnKickedEv ✅ verified 1
src/_ZN17dScMgTrampoline_c8OnPushedEv.cpp _ZN17dScMgTrampoline_c8OnPushedEv ✅ verified 1
src/_ZN17dScMgTrampoline_c9Virtual88Eiiii.cpp _ZN17dScMgTrampoline_c9Virtual88Eiiii ✅ verified 1
src/_ZN17dScMgTrampoline_cD0Ev.cpp _ZN17dScMgTrampoline_cD0Ev ✅ verified 1
src/_ZN17dScMgTrampoline_cD1Ev.cpp _ZN17dScMgTrampoline_cD1Ev ✅ verified 1
src/_ZN18dScMgTrampoline2_c11OnAttacked2Ev.cpp _ZN18dScMgTrampoline2_c11OnAttacked2Ev ✅ verified 1
src/_ZN18dScMgTrampoline2_c13InitResourcesEv.cpp _ZN18dScMgTrampoline2_c13InitResourcesEv ✅ verified 1
src/_ZN18dScMgTrampoline2_c13OnTurnIntoEggEi.cpp _ZN18dScMgTrampoline2_c13OnTurnIntoEggEi ✅ verified 1
src/_ZN18dScMgTrampoline2_c16CleanupResourcesEv.cpp _ZN18dScMgTrampoline2_c16CleanupResourcesEv ✅ verified 1
src/_ZN18dScMgTrampoline2_c6RenderEv.cpp _ZN18dScMgTrampoline2_c6RenderEv ✅ verified 1
src/_ZN18dScMgTrampoline2_c8BehaviorEv.cpp _ZN18dScMgTrampoline2_c8BehaviorEv ✅ verified 1
src/_ZN18dScMgTrampoline2_cD0Ev.cpp _ZN18dScMgTrampoline2_cD0Ev ✅ verified 1
src/_ZN18dScMgTrampoline2_cD1Ev.cpp _ZN18dScMgTrampoline2_cD1Ev ✅ verified 1
src/actors/dScMgBSC_c.cpp _ZN10dScMgBSC_cD1Ev + _ZN10dScMgBSC_cD0Ev + func_ov006_02124a04 + func_ov006_02124a08 + func_ov006_02124ae4 + func_ov006_02124b58 + func_ov006_02124bb4 + func_ov006_02124cb4 + func_ov006_02124dc0 + func_ov006_02124e1c + func_ov006_02124ec4 + func_ov006_02124fd8 + func_ov006_021250e4 + _ZN10dScMgBSC_c15OnGroundPoundedEv + _ZN10dScMgBSC_c13OnTurnIntoEggEi + _ZN10dScMgBSC_c13OnYoshiTryEatEi + _ZN10dScMgBSC_c6RenderEv + _ZN10dScMgBSC_c8BehaviorEv + _ZN10dScMgBSC_c13InitResourcesEv ✅ verified 19
src/actors/dScMgBase_c.cpp _ZN11dScMgBase_c16OnPendingDestroyEv + _ZN11dScMgBase_c6RenderEv + _ZN11dScMgBase_c12BeforeRenderEv + _ZN11dScMgBase_c8BehaviorEv + _ZN11dScMgBase_c14BeforeBehaviorEv + _ZN11dScMgBase_c21AfterCleanupResourcesEj + _ZN11dScMgBase_c18AfterInitResourcesEj + _ZN11dScMgBase_c19BeforeInitResourcesEv ✅ verified 8
src/actors/dScMgCard_c.cpp _ZN11dScMgCard_cD1Ev + _ZN11dScMgCard_cD0Ev + func_ov006_020d96e0 + func_ov006_020d96f0 + func_ov006_020d970c + func_ov006_020d978c + func_ov006_020d9998 + func_ov006_020d99a4 + func_ov006_020d99ec + func_ov006_020d9a14 + func_ov006_020d9bd0 + func_ov006_020d9bdc + func_ov006_020d9c5c + func_ov006_020da00c + func_ov006_020da0ac + func_ov006_020da154 + func_ov006_020da174 + func_ov006_020da420 + func_ov006_020da4ac + func_ov006_020da5e8 + func_ov006_020da834 + func_ov006_020da860 + func_ov006_020da88c + func_ov006_020da8b8 + func_ov006_020da8e4 + func_ov006_020da974 + _ZN11dScMgCard_c16CleanupResourcesEv + _ZN11dScMgCard_c6RenderEv + _ZN11dScMgCard_c8BehaviorEv + func_ov006_020dac34 + _ZN11dScMgCard_c15OnGroundPoundedEv + _ZN11dScMgCard_c13OnTurnIntoEggEi + _ZN11dScMgCard_c13OnYoshiTryEatEi + _ZN11dScMgCard_c13InitResourcesEv ✅ verified 34
src/actors/dScMgMCarlo2_c.cpp _ZN14dScMgMCarlo2_cD1Ev + _ZN14dScMgMCarlo2_cD0Ev + func_ov006_020f8ff0 + func_ov006_020f9000 + func_ov006_020f94f4 + func_ov006_020f9560 + func_ov006_020f95f0 + func_ov006_020f9668 + func_ov006_020f96e0 + func_ov006_020f9760 + func_ov006_020f98dc + func_ov006_020f9994 + func_ov006_020f9bec + func_ov006_020f9cbc + func_ov006_020f9d68 + func_ov006_020f9db8 + func_ov006_020f9f40 + _ZN14dScMgMCarlo2_c16CleanupResourcesEv + _ZN14dScMgMCarlo2_c6RenderEv + _ZN14dScMgMCarlo2_c8BehaviorEv + _ZN14dScMgMCarlo2_c13OnTurnIntoEggEi + _ZN14dScMgMCarlo2_c13OnYoshiTryEatEi + _ZN14dScMgMCarlo2_c13InitResourcesEv ✅ verified 23
src/actors/dScMgMCarlo_c.cpp _ZN13dScMgMCarlo_cD1Ev + _ZN13dScMgMCarlo_cD0Ev + func_ov006_020f7730 + func_ov006_020f7740 + func_ov006_020f7994 + func_ov006_020f7a00 + func_ov006_020f7a90 + func_ov006_020f7b10 + func_ov006_020f7b90 + func_ov006_020f7c10 + func_ov006_020f7e2c + func_ov006_020f7ee4 + func_ov006_020f8154 + func_ov006_020f8224 + func_ov006_020f82d0 + func_ov006_020f8320 + func_ov006_020f84a8 + func_ov006_020f8540 + _ZN13dScMgMCarlo_c6RenderEv + _ZN13dScMgMCarlo_c8BehaviorEv + _ZN13dScMgMCarlo_c13OnTurnIntoEggEi + _ZN13dScMgMCarlo_c13OnYoshiTryEatEi + _ZN13dScMgMCarlo_c13InitResourcesEv ✅ verified 23
src/actors/dScMgSingle3DBase_c.cpp _ZN19dScMgSingle3DBase_cD1Ev + _ZN19dScMgSingle3DBase_cD0Ev + func_ov006_0210a534 + _ZN19dScMgSingle3DBase_c24OnHitByCannonBlastedCharEv + _ZN19dScMgSingle3DBase_c21AfterCleanupResourcesEj + _ZN19dScMgSingle3DBase_c12BeforeRenderEv + _ZN19dScMgSingle3DBase_c14BeforeBehaviorEv + _ZN19dScMgSingle3DBase_c18AfterInitResourcesEj + _ZN19dScMgSingle3DBase_c9Virtual84Ev ✅ verified 9
src/func_ov004_020b0a54.cpp func_ov004_020b0a54 ✅ verified 1
src/func_ov006_0210d6b8.cpp func_ov006_0210d6b8 ✅ verified 1

The private worker commits a test merge, builds the stock ROM profile, compares every executable module, measures matched and source-built code, checks contributor lineage, and verifies affected relocations. The mod profile is opt-in and is not part of this merge gate.

@tangos-validator

Copy link
Copy Markdown

⏳ PR validation — Validating

Building 8fb19d99 on 2ad2889983d5. The worker commits a test merge, builds the stock ROM profile, and compares every executable module against retail.

This comment is replaced with the verdict when it finishes.

@andrewboudreau andrewboudreau added the attribution-override Maintainer accepts this PR's contributor-credit changes; validation reports them as warnings label Aug 31, 2026
@andrewboudreau

Copy link
Copy Markdown
Collaborator Author

Self-review. No PR here can be APPROVED (one shared account), so the sign-off is in this comment, with what I actually checked and what I could not.

What I verified

  • Whole-ROM byte identity, after the final tree state — not an earlier one. rombuild.py -j 16 --no-rom: 11,088/11,088 reproducing, 0 mismatching, 106/106 modules exact, 100.000000%. That is the only gate that can see a return-type change, since return types are not mangled: a wrong one moves no symbol and passes every static gate.
  • All nine static gates, run against base b2ffb512c, all PASS.
  • check_header_offsets was run as --changed b2ffb512c. With no arguments it refuses to run ("an empty check is not a pass") — worth knowing, because that refusal reads like a failure and its silence would read like a pass.

What this PR does NOT prove

The 56/90 signature disagreements are resolved for the 79 bodies converted, not for the family. The inventory found 56 of 90 family bodies whose free-function signature contradicted their own class declaration. This converts 79 bodies; the disagreements inside those are now impossible by construction. Eleven bodies remain unconverted — they are the ones whose first parameter is not obviously this, and the converter refuses them rather than guess. They still carry unadjudicated signatures.

Only two return types were re-measured, because only two had a body that could refute them. Slot 30 (OnAimedAtWithEggReturnVec) is recorded in its own evidence block at 14 of 93 words. Every other slot in 18-35 whose base body is byte-exact under both spellings is still unrefuted, which this campaign has now twice shown is not the same as confirmed.

Two traps that cost real time here

Double mangling. My first blast-radius estimate for the extern "C" wrapping was wrong — 11 files, from a context-free grep. Nine of those already had their declarations inside an extern "C" { block; a depth-tracking pass corrected it to 2. A grep that does not track nesting will overcount this every time.

The wrapper itself had two defects, both found by the link and not by any gate:

  • it matched only declarations with the extern keyword, missing bare void MultiStore16(u16, void*, int);
  • it treated a line as the unit, so a declaration spanning several lines was half-wrapped

Line endings. This worktree runs core.autocrlf=true, but the repo's blobs are a mix — some stored CRLF, some LF. Checkout gives everything CRLF on disk, so any tool that faithfully preserves on-disk endings churns whole files whose blob is LF, and sed -i in Git Bash churns the ones whose blob is CRLF, in the opposite direction. Both happened. The diff was 2368/2058 over 96 files for this exact content; normalizing each file against the PR base's blob brought it to 658/263.

Two things made this hard to diagnose and are worth recording:

  • git show <rev>:<path> silently returns wrong data under MSYS (path conversion). It produced a false "0 files restored" verdict twice. Read base blobs with git ls-tree -r <base> + git cat-file blob <oid>.
  • a b'\r\n' not in text test is defeated by a single stray CRLF in an otherwise-LF file. Use a ratio (crlf >= 0.5 * lf).

None of this changes a byte of output — but a 2368-line diff over 658 lines of real change is not reviewable, and the churn hid inside two earlier commits until I checked.

Merge order

Stacked on #2112. cpp/minigame-slot35 must land first. I have not run premerge_check.py on this one yet — the merge tree does not exist until its base lands.

@andrewboudreau andrewboudreau left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified independently. The measurement holds; the paperwork undersells it.

This is the return-type claim family I have publicly retracted twice in this repo, so I did not take the headline on trust — I re-measured it from the cartridge by a different method. It survives. Details below, then three asks, one of which is the only thing I'd call a real defect.

Why I believe the byte pin

The trap in "this slot returns void" claims is that return 0; fakes a refutation: you add an instruction, the diff grows, and you conclude int costs something when all you did was write a store nobody asked for. This PR does not fall into it, and says so explicitly — Coin's mov r0,#0 is identified as a stored constant, and the int variants are shown producing register shifts, not extra instructions:

ROM   ldr r0,[pc,#0x38] / mov r3,#0x4000000 / ldr r1,[r3]
int   ldr r1,[pc,#0x38] / mov r4,#0x4000000 / ldr r2,[r4]

That is a reservation effect — int reserves r0 across the body and everything downstream shuffles up one. Fourteen of ninety-three words at slot 30, six of forty-two at slot 32. That is the signature of a real refutation and it is not something return 0; can counterfeit.

Independent corroboration, from the consumer side

I scanned for ldr rN,[rM,#<offset>] + blx rN pairs and classified what happens to r0 at each site — is it overwritten before it is read (DISCARDED), read first (CONSUMED), live at a bl (ARG), or tail-forwarded. Scoped to ov004 and ov006:

slot offset sites verdict
18 +0x48 22 20 DISCARDED, 2 FORWARD, 0 CONSUMED
30 +0x78 1 DISCARDED — add r0, r4, #0x4000
32 +0x80 1 DISCARDED — mov r0, #2

Slot 30's single site is _ZN11dScMgBase_c8OnKickedEv, which confirms your "OnKicked is the only caller" line exactly. Slot 32's is _ZN11dScMgBase_c18AfterInitResourcesEj. On slot 18 I chased both forwarders rather than counting them as unknowns: func_ov004_020b29a0 has 11 direct callers and all 11 discard (mvn r0,#-1 ×10, mov r0,#0x1d ×1); func_ov006_020df1c0 has zero direct callers and is reached only by dispatch.

So from the caller side as well as the codegen side, nothing in this family reads a result at any of the three slots.

One caution that validates your own filtering. A byte offset does not identify a class. Run that same +0x48 scan across arm9 and all 103 overlays and it reports 19 CONSUMED sites — cmp r0,#6 in ov062, cmp r0,#6 and cmp r0,#4 in ov084. Every one belongs to a different hierarchy that happens to have a slot at the same offset. Restricted to ov004/ov006 the count is zero. Your slot-29 block already does this correctly ("35 sites, of which exactly ONE lies in ov004 or ov006") — I'm noting it because anyone re-running this scan without the module filter will get a number that looks like it contradicts the PR and doesn't.

Ask 1 — the title and body undercount the change

The title says slots 18 and 32. Three slots flip: 18, 30, and 32. Slot 30 (OnAimedAtWithEggReturnVec) is the one carrying the strongest evidence in the whole PR — the fourteen-of-ninety-three word diff quoted above is its measurement — and it appears nowhere in the PR body. Please add it to both. A reviewer skimming the title will not know a third slot moved.

Ask 2 — a stale cross-reference this PR invalidates itself

include/dScMgBase_c.h:560-562, inside the slot-30 block:

Contrast slots 31, 32, 35 and the OnXxx slots, where int costs nothing because r0 is not contended at the exit -- there the hint stands unrefuted, which is NOT the same as confirmed.

Line 769 of the same file, in the same PR, declares slot 32 void on a measured refutation. Drop 32 from that list.

Ask 3 — the one I'd actually hold on: a header/decl disagreement this stack introduces

I ran tools/check_decl_return_types.py (from #2105) against every tree in the stack. It compares a symbol's declared return type in include/**/*.h against the same symbol in include/decl_common.h:

origin/main   2 rows   AfterInitResources, BeforeInitResources
#2099         2
#2100         3   + OnAimedAtWithEgg          header int   vs decl_common void
#2102         4   + OnAimedAtWithEggReturnVec header int   vs decl_common void
#2106-#2112   4   (carried)
#2114         3   fixes ReturnVec's, leaves OnAimedAtWithEgg's

So the net effect of the whole twelve-PR stack landing is 2 → 3: one new symbol declared two different ways in two headers. It is slot 29, OnAimedAtWithEgg. include/dScMgBase_c.h:539 says:

virtual int  OnAimedAtWithEgg();                   /* slot 29 */

and include/decl_common.h:2322 says:

extern void _ZN11dScMgBase_c16OnAimedAtWithEggEv(void*);

This will never fail a check. check_decl_return_types.py is not wired into any CI job, and it exits 1 on origin/main today at those 2 rows — which is exactly why I'm raising it in prose instead of pointing at a red X.

To be precise about what I am and am not claiming: the ROM is neutral at slot 29. The header's own prose is honest about that ("A HINT, the second consecutive slot that no body pins"), and I retracted a "slot 29 is void, proven" claim of my own earlier in this campaign — I am not making it again. This is an agreement fix, not a measurement one. One symbol should not carry two declared return types across two headers in the same tree, and since this PR is already the return-type-reconciliation PR, flipping line 539 to void is the natural place to close it. If you'd rather keep int there, the equivalent fix is to change decl_common.h:2322 instead — either direction resolves it and I have no preference.

Where that leaves this PR

Content is verified and I have no objection to the measurement. Ask 3 is what I'd like resolved before merge, because it is a correctness-of-source issue and the project's ordering puts that ahead of readability. Asks 1 and 2 are documentation and I'd take them in the same push.

Note this PR also fixes the row-18 sentence I had committed to correcting in a follow-up of my own across five earlier reviews — that follow-up is now down to one item (restating the tally as six-for-seven), so thank you for absorbing it.

This is still gated behind #2099, which has not moved.

Base automatically changed from cpp/minigame-slot35 to main September 1, 2026 07:09
@andrewboudreau
andrewboudreau merged commit 163d2f8 into main Sep 1, 2026
9 checks passed
@andrewboudreau
andrewboudreau deleted the cpp/minigame-methods-1 branch September 1, 2026 07:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

attribution-override Maintainer accepts this PR's contributor-credit changes; validation reports them as warnings

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant