#include "item.h"
#include "functions.h"

extern void (*const gUnk_0811BDB4[])(ItemBehavior*, u32);

u32 sub_08077F64(ItemBehavior* arg0, u32 unk);

void ItemTryPickupObject(ItemBehavior* this, u32 arg1) {
    gUnk_0811BDB4[this->stateID](this, arg1);
}

ASM_FUNC("asm/non_matching/itemTryPickupObject/sub_080761C0.inc", void sub_080761C0(ItemBehavior* this, u32 arg1))

void sub_080762C4(ItemBehavior* this, u32 arg1, u8 arg2, u32 arg3) {
    this->field_0x18 = arg1;
    gPlayerState.heldObject = arg2;
    sub_08077D38(this, arg3);
}

ASM_FUNC("asm/non_matching/itemTryPickupObject/sub_080762D8.inc", void sub_080762D8(ItemBehavior* this, u32 arg1))

void sub_08076488(ItemBehavior* this, u32 arg1) {
    u32 bVar1;
    s32 iVar2;

    if (this->field_0x5[2] == 0) {
        if (sub_08077F64(this, arg1) != 0) {
            if (((*(u8*)((this->field_0x18) + 0x16) & 0xf0) == 0x10) && ((gRoomTransition.frameCount & 1U) != 0)) {
                return;
            }
            UpdateItemAnim(this);
            if ((this->field_0x5[9] & 0x80) != 0) {
                gPlayerEntity.flags |= ENT_COLLIDE;
                gPlayerState.heldObject = 4;
                bVar1 = ~(8 >> arg1);
                gPlayerState.keepFacing = bVar1 & gPlayerState.keepFacing;
                gPlayerState.field_0xa = bVar1 & gPlayerState.field_0xa;
                this->stateID += 1;
                this->field_0xf = 0;
            }
        }
    } else {
        this->field_0x5[2] -= 1;
    }
    gPlayerState.framestate = PL_STATE_HOLD;
}

ASM_FUNC("asm/non_matching/itemTryPickupObject/sub_08076518.inc", void sub_08076518(ItemBehavior* this, u32 arg1))

void sub_080765E0(ItemBehavior* this, u32 arg1) {
    if (sub_08077F64(this, arg1) != 0) {
        if ((this->field_0x5[9] & 0x80) != 0) {
            sub_08077F50(this, arg1);
        } else {
            UpdateItemAnim(this);
        }
    }
}

void sub_0807660C(ItemBehavior* this, u32 arg1) {
    UpdateItemAnim(this);
    if ((--this->field_0x5[2] == 0xff) || (gPlayerState.field_0x0[1] == 0)) {
        gPlayerState.field_0x0[1] = 0;
        sub_08077E78(this, arg1);
    }
}
