Skip to content

Zora/Goron Transformation Masks - #6896

Draft
serprex wants to merge 6 commits into
HarbourMasters:developfrom
serprex:mm
Draft

Zora/Goron Transformation Masks#6896
serprex wants to merge 6 commits into
HarbourMasters:developfrom
serprex:mm

Conversation

@serprex

@serprex serprex commented Jul 10, 2026

Copy link
Copy Markdown
Member

because I can vibe too

rips off #5802 so that both will be compatible with how to load mm data

Build Artifacts

@djevangelia djevangelia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Just some small comments from decomp perspective 🐳

}

// av1.actionVar1 = combo index (0..2), av2.actionVar2 = next punch queued
void FormMelee_PunchAction(Player* player, PlayState* play) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

  1. Think maybe player action functions should keep the form _Action_ to make them easily recognizable, something like FormMelee_Action_Punch
  2. I think MM forms uses the same triple slash system as sword (in OoT counter is player->unk_845) and actually I think at least the first part of the melee attack system is the same? If going all-in on similarity later.

}

static void RegisterFormMelee() {
// Start a punch on a fresh B press in a neutral grounded action. This runs before

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It should be possible if desired to integrate the check into melee attack action handler 7 through Player_TryActionHandlerList, either called by vanilla action function or custom.
Even if it could be seen as a contamination of source code, player update does run a fair amount of functions before reaching action handlers that would be skipped on punch frame. The check could also be instantly directed to a separate MM attack flow and not run any further OoT attack code.
It's not very documented in decomp, this is my version of AH 7:
https://github.com/djevangelia/oot/blob/8560e8762ac994b4526c7c65a684c6d6796cbe51/src/overlays/actors/ovl_player_actor/z_player.c#L16169-L16174

void Player_Action_808407CC(Player* player, PlayState* play); // idle, friendly lock-on/parallel
void Player_Action_80840DE4(Player* player, PlayState* play); // walk (targeting)
void Player_Action_808414F8(Player* player, PlayState* play); // run
void Player_Action_8084170C(Player* player, PlayState* play); // backwalk/sidewalk

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Some of these movement actions are incorrect and also missing some movement action functions if it has to be complete - I should have them in my decomp PR https://github.com/zeldaret/oot/pull/2728/changes

void Player_Action_808414F8(Player* player, PlayState* play); // run
void Player_Action_8084170C(Player* player, PlayState* play); // backwalk/sidewalk
void Player_Action_8084D610(Player* player, PlayState* play); // tread water (surface idle)
void Player_Action_8084D7C4(Player* player, PlayState* play); // swim, no control

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Startmode water

void Player_Action_8084D84C(Player* player, PlayState* play); // swim forward (surface)
void Player_Action_8084DAB4(Player* player, PlayState* play); // swim, z-targeting
void Player_Action_8084DC48(Player* player, PlayState* play); // dive
void Player_Action_8084E1EC(Player* player, PlayState* play); // surface with item/breath

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Finish dive/water resurface in general, the GI check is just an extra bonus (the cause of GIM by just entering water)

PlayState* play = gPlayState;
Player* player = GET_PLAYER(play);

// No transforming on horseback or while holding the fishing pole; force the mask off

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could probably do the anti-riding check in Actor_SetRideActor, make player remove mask before even starting riding

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants