Skip to content

Hookshot and Climb Anywhere#2537

Draft
mracsys wants to merge 2 commits into
OoTRandomizer:Devfrom
mracsys:hookshot-anywhere
Draft

Hookshot and Climb Anywhere#2537
mracsys wants to merge 2 commits into
OoTRandomizer:Devfrom
mracsys:hookshot-anywhere

Conversation

@mracsys
Copy link
Copy Markdown

@mracsys mracsys commented Mar 15, 2026

Implements two features under one setting:

  1. Hookshot and Longshot can attach to any surface.
  2. All wall-type surfaces are made climbable.

Logic is not currently implemented for either Glitchless or Advanced. I'm looking for someone willing to put that together, including base development, trick development, and review responses. I personally don't have the time or interest.

Testing

Worked as expected back on 7.1.

There is a quirk with doors where getting too close to a door will make you start climbing it, when you probably want to open it instead. The feature doesn't prevent opening doors.

@fenhl fenhl added Type: Enhancement New feature or request Status: Help Wanted Extra attention is needed Component: Logic Non-trivial changes to the JSON logic files Status: Needs Review Someone should be looking at it Component: Setting specific to setting(s) Status: Needs Testing Probably should be tested Status: Under Consideration Developers are considering whether to accept or decline the feature described Component: Patching Affects the patching of the ROM labels Mar 15, 2026
@djevangelia
Copy link
Copy Markdown

There is a quirk with doors where getting too close to a door will make you start climbing it, when you probably want to open it instead. The feature doesn't prevent opening doors.

I looked a bit at the climbing following this and have some ideas. (I did this in decomp by editing the walltypes in the array D_80119D90 which looks like what you did?)

You can let player open doors while climbing on them by adding this in the beginning of Player_Action_Climb (Player_Action_8084BF1C). Player cannot try opening doors if not close to one, so it is safe. Player falls down when opening sliding door but stays up in the air for normal doors, so I set new Y position. That could be limited to normal doors only by checking player->doorType.

if (Player_ActionHandler_1(this, play)) {
        this->actor.world.pos.y = this->doorActor->world.pos.y;
        return;
}

Doors have a Y check whether to allow opening, checked by EnDoor_Idle for normal doors and DoorShutter_GetPlayerDistance for sliding doors. For sliding doors the range is set depending on type of door. Y range of 50.0f seems good for normal-size doors to let player open at top of it.

Climbing up on non-horizontal edges doesn't have climb up animation because the game thinks player is not on the ground the frame after going into climb up action. So considering the game assumes player climbing up is on the ground, I added this to the end of Player_ProcessSceneCollision, which makes the animation play:

if (this->actionFunc == Player_Action_ClimbUp) { // Player_Action_8084BDFC
        this->actor.bgCheckFlags |= BGCHECKFLAG_GROUND;
}

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

Labels

Component: Logic Non-trivial changes to the JSON logic files Component: Patching Affects the patching of the ROM Component: Setting specific to setting(s) Status: Help Wanted Extra attention is needed Status: Needs Review Someone should be looking at it Status: Needs Testing Probably should be tested Status: Under Consideration Developers are considering whether to accept or decline the feature described Type: Enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants