summaryrefslogtreecommitdiff
path: root/mm/2s2h/Enhancements/Player/InfiniteDekuHopping.cpp
blob: 483dd6b3df200c1f044642b61c2db893e5c0576f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <libultraship/bridge/consolevariablebridge.h>
#include "2s2h/GameInteractor/GameInteractor.h"
#include "2s2h/ShipInit.hpp"

extern "C" {
#include "variables.h"
}

#define CVAR_NAME "gEnhancements.Player.InfiniteDekuHopping"
#define CVAR CVarGetInteger(CVAR_NAME, 0)

void RegisterInfiniteDekuHopping() {
    COND_VB_SHOULD(VB_DEKU_LINK_SPIN_ON_LAST_HOP, CVAR, {
        if (*should) {
            Player* player = GET_PLAYER(gPlayState);
            if (gSaveContext.save.saveInfo.playerData.health != 0) {
                player->remainingHopsCounter = 5;
            }
        }
    });

    COND_VB_SHOULD(VB_APPLY_AIR_CONTROL, CVAR, {
        f32* dekuSpeedTargetMultiplier = va_arg(args, f32*);
        Player* player = GET_PLAYER(gPlayState);

        if (player->transformation == PLAYER_FORM_DEKU && player->stateFlags3 & PLAYER_STATE3_200000) {
            // Deku Link's air control speedTarget gets halved, so we negate that by doubling it when deku hopping
            *dekuSpeedTargetMultiplier *= 2.0f;
        }
    });
}

static RegisterShipInitFunc initFunc(RegisterInfiniteDekuHopping, { CVAR_NAME });