daBakubaku_c: the last intermediate base, named and given a layout - #1408
Merged
Conversation
Moves only, so git records R100 and contributor credit follows; the content lands in the next commit. See the note in tools/prepush_attribution.py -- a commit that both moves and rewrites a file drops below git's rename threshold and the old path is reported as lost credit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XxDmkQ47fWa3GB6mj8xEQe
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XxDmkQ47fWa3GB6mj8xEQe
✅ PR validation — PassedCommitted merge introduces no reconstruction or attribution regression. Full merge validation
Per-file link-check detailAll 9 changed file(s) compile to the ROM byte-for-byte with correct relocation targets.
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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
daBakubaku_cis the last of the three intermediate bases the RTTI puts underdEnemyBase_c— except it has no children, so it is only "intermediate" by whereit sits in the graph. The decomp had no name for it at all: every one of its eight
functions was still
func_ov032_*, and it had no header. It gets both here.With this, all three bases are done — #1402 (
dCapEnemy_c=CapEnemy), #1403 and#1406 (
daOts_cand its three children), and this one.Two witnesses, agreeing offset for offset
func_ov032_0211244cis the factory:ActorBase::operator new(0x438), then_ZN5EnemyC2Ev, then one vtable store — one, not two, which is what says nothingderives from this class — then five members.
func_ov032_021111a0destroys the samefive backwards and chains to
_ZN5EnemyD2Ev;func_ov032_021111f0does that and thenMemory::Deallocate, so it is the deleting destructor.Size 0x438, the factory's own literal. The 0x5c above 0x3dc stays padding: none of
the eight functions reaches it through anything but a raw offset, so there is nothing
to name it from.
Named from the vtable, all 31 slots checked
Eight overrides, and every one is renamed from its placeholder:
func_ov032_021122dc_ZN12daBakubaku_c13InitResourcesEvfunc_ov032_02112124_ZN12daBakubaku_c16CleanupResourcesEvfunc_ov032_021121b4_ZN12daBakubaku_c8BehaviorEvfunc_ov032_02112164_ZN12daBakubaku_c6RenderEvfunc_ov032_02112160_ZN12daBakubaku_c16OnPendingDestroyEvfunc_ov032_021111a0_ZN12daBakubaku_cD1Evfunc_ov032_021111f0_ZN12daBakubaku_cD0Evfunc_ov032_02112444_ZN12daBakubaku_c16OnAimedAtWithEggEvThe destructor and four of the overrides become real C++ methods. Two are renamed
only, and the PR says which and why rather than pretending otherwise.
The vtable at ov032 0x02113824 gets the name
_ZTV12daBakubaku_c; the word before itis 0x021137e4,
_ZTI12daBakubaku_c. Worth noting: ov027 has_ZTV10SlidingIceatthat same address — ov027 and ov032 overlap, so an address alone does not identify a
symbol here.
Two spellings that turned out to be load-bearing
Render's temporary. The original wroteint b = (flag != 0); if (b) .... Foldedinto
if ((mFlags & 0x40000) != 0)the function came out 0x44 against the ROM's 0x50 —the temporary is what makes the compiler materialise the test as a 0/1 value
(
movne #1 / moveq #0 / cmp) before branching. Restored, with a comment saying not tofold it.
Behavior's pointer-to-member. That file builds atypedef void (Klass::*PMF)()on an incomplete class, and a PMF's representation depends on that incompleteness.
Giving
Klassa real definition is a codegen change, not a cleanup, so this one isrenamed and left alone — the same shape that currently blocks UnchainedChomp.
Renderalso reached its model through a six-slot stand-in whose last member wasTarget(int). That shape was doing real work: it made the call a virtual dispatchthrough slot 5, and slot 5 of
ModelAnimisRender(const Vector3 *). The realdeclaration reproduces it exactly —
ldr r2,[r2,#0x14]; blx r2.Split into two commits, from the start
First commit is
git mvonly, second is the content. A commit that moves and rewritesa file drops below git's 50% rename threshold and credit for the old path is reported
lost. Done this way it reads 8 renamed with credit intact.
Verified
rombuild -j16check_header_offsetseligible.pybracketcheck_referencesprepush_attributioncheck_data_definitionscheck_duplicate_sourcesport_refchecklayout_checkCounts are unchanged: a migration and eight renames, not a new match.
Not claimed
The factory keeps the name
func_ov032_0211244c. Its siblings are spelt<DecompName>_Spawn, and this class has no decomp name — inventing one to fit theconvention would be a guess, and the production name does not fit it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01XxDmkQ47fWa3GB6mj8xEQe