summaryrefslogtreecommitdiff
path: root/src/00_Core/Player/LinkStateItem.cpp
blob: 56b6bc3722aa433f644be13a7cad0efd1cea0e41 (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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "Player/LinkStateItem.hpp"
#include "DTCM/UnkStruct_027e103c.hpp"
#include "DTCM/UnkStruct_027e1098.hpp"
#include "Item/ItemManager.hpp"
#include "Player/EquipBomb.hpp"
#include "Player/EquipHammer.hpp"
#include "Player/EquipItem.hpp"
#include "Player/EquipScoop.hpp"
#include "Player/PlayerControl.hpp"
#include "Save/AdventureFlags.hpp"

extern void func_ov000_020b7e6c(s32 *param1);

THUMB void LinkStateItem::vfunc_00() {}

ARM LinkStateId LinkStateItem::GetId() {
    return LinkStateId_Item;
}

ARM s32 LinkStateItem::IsHammerEquipped() {
    switch (this->mEquipId) {
        case ItemFlag_Hammer: return 0;
        default: return -1;
    }
}

ARM void LinkStateItem::OnStateLeave(s32 param1) {
    EquipItem *pEVar1;
    LinkStateMove *pLVar2;
    s32 iVar3;
    unk32 *puVar4;

    LinkStateBase::OnStateLeave(param1);

    switch (this->mEquipId) {
        case ItemFlag_BombchuBag:
            iVar3 = data_027e103c->func_ov000_020cf01c();
            if (*(u8 *) (iVar3 + 0xe0) == '\0') {
                GetEquipBombchu()->func_ov014_0213ec64();
            }
            data_027e1098->func_ov014_0211fd04();
            break;
        case ItemFlag_OshusSword: break;
        case ItemFlag_WoodenShield: break;
        case ItemFlag_Boomerang: break;
        case ItemFlag_BombBag: EquipBomb::StopUsing(this, param1); break;
        case ItemFlag_Bow: break;
        case ItemFlag_GrapplingHook: EquipRope::StopUsing(this); break;
        case ItemFlag_Hammer: EquipHammer::StopUsing(this); break;
        case ItemFlag_PotionA:
        case ItemFlag_PotionB:
            UnkStruct_027e103c *unk = data_027e103c;
            unk->mUnk_2a            = 0;
            unk->func_ov000_020cf9dc(0, 0);
            break;
        case ItemFlag_Shovel: EquipScoop::StopUsing(this); break;
    }

    if (this->mEquipId != ItemFlag_None) {
        pEVar1 = this->GetEquipItem(this->mEquipId);
        pEVar1->vfunc_1c();
    }

    switch (this->mEquipId) {
        case ItemFlag_None:
        case ItemFlag_OshusSword: break;
        case ItemFlag_WoodenShield: break;
        case ItemFlag_PotionA:
        case ItemFlag_PotionB: this->EquipItem_vfunc_28(); break;
        default:
            this->EquipItem_vfunc_28();
            if (param1 != 4 && param1 != 2) {
                pLVar2          = this->GetLinkStateMove();
                pLVar2->mUnk_14 = true;
            }
    }

    this->mNextEquip = ItemFlag_None;

    puVar4 = (unk32 *) this + 20;
    for (; puVar4 != (unk32 *) this + 22; puVar4++) {
        func_ov000_020b7e6c(puVar4);
    }
    if (gPlayerControl->mUnk_80 != false) {
        gPlayerControl->StopFollowing();
    }
    this->mUnk_25[1] = 0;
    return;
}

ARM EquipBombchu *LinkStateItem::GetEquipBombchu() {
    return (EquipBombchu *) ItemManager::GetEquipItemUnchecked(ItemFlag_BombchuBag);
}

ARM LinkStateMove *LinkStateItem::GetLinkStateMove() {
    return (LinkStateMove *) GetLinkState(LinkStateId_Move);
}

ARM bool LinkStateItem::func_ov00_020abf70() {
    return gAdventureFlags->func_ov00_02097b9c(this->mUnk_5c);
}

ARM bool LinkStateItem::vfunc_28() {
    return this->mUnk_5c < 0;
}