mirror of
https://github.com/zeldaret/tmc
synced 2026-09-07 03:19:39 -04:00
134 lines
4.9 KiB
C
134 lines
4.9 KiB
C
#include "item.h"
|
|
#include "functions.h"
|
|
#include "sound.h"
|
|
#include "object.h"
|
|
#include "game.h"
|
|
|
|
extern s8 gUnk_08126EEC[];
|
|
extern Entity* CreatePlayerItemForItemIfNotExists(ItemBehavior*);
|
|
extern void sub_0807AB44(Entity*, s32, s32);
|
|
void sub_08075A0C(ItemBehavior*, u32);
|
|
void sub_08075ADC(ItemBehavior*, u32);
|
|
void sub_08075B54(ItemBehavior*, u32);
|
|
void sub_08075C9C(ItemBehavior*, u32);
|
|
|
|
void ItemLantern(ItemBehavior* this, u32 index) {
|
|
static void (*const stateFuncs[])(ItemBehavior*, u32) = {
|
|
sub_08075A0C,
|
|
sub_08075ADC,
|
|
sub_08075B54,
|
|
sub_08075C9C,
|
|
};
|
|
stateFuncs[this->stateID](this, index);
|
|
}
|
|
|
|
void sub_08075A0C(ItemBehavior* this, u32 index) {
|
|
Entity* object;
|
|
EquipSlot equipSlot;
|
|
s8* tmp;
|
|
equipSlot = IsItemEquipped(this->behaviorId);
|
|
if (gPlayerState.heldObject != 0 || gPlayerState.queued_action == PLAYER_ROLL || gPlayerState.jump_status != 0 ||
|
|
gPlayerState.item != NULL || (gPlayerState.flags & PL_MINISH) != 0) {
|
|
ForceEquipItem(ITEM_LANTERN_OFF, equipSlot);
|
|
gPlayerState.flags &= ~PL_USE_LANTERN;
|
|
ForceEquipItem(ITEM_LANTERN_OFF, equipSlot);
|
|
DeleteItemBehavior(this, index);
|
|
} else {
|
|
this->priority |= 0x80;
|
|
sub_08077D38(this, index);
|
|
CreatePlayerItemForItemIfNotExists(this);
|
|
sub_0806F948(&gPlayerEntity);
|
|
this->behaviorId = 0x10;
|
|
ForceEquipItem(ITEM_LANTERN_ON, equipSlot);
|
|
tmp = &gUnk_08126EEC[gPlayerEntity.animationState & 6];
|
|
object = CreateObjectWithParent(&gPlayerEntity, LAMP_PARTICLE, 1, 0);
|
|
if (object != NULL) {
|
|
object->spriteVramOffset = gPlayerEntity.spriteVramOffset;
|
|
object->x.HALF.HI = tmp[0] + object->x.HALF.HI;
|
|
object->y.HALF.HI = tmp[1] + object->y.HALF.HI;
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08075ADC(ItemBehavior* this, u32 index) {
|
|
u32 bVar1;
|
|
|
|
if (
|
|
#ifndef EU
|
|
gPlayerState.item != NULL ||
|
|
#endif
|
|
(this->playerFrame & 1) == 0 || (gPlayerState.flags & (PL_DISABLE_ITEMS | PL_CAPTURED)) != 0 ||
|
|
sub_08079D48() == 0) {
|
|
this->animPriority = 0;
|
|
this->stateID++;
|
|
gPlayerState.flags |= PL_USE_LANTERN;
|
|
bVar1 = 8 >> index;
|
|
gPlayerState.attack_status &= ~((bVar1 << 4) | bVar1);
|
|
bVar1 = ~bVar1;
|
|
gPlayerState.field_0xa = bVar1 & gPlayerState.field_0xa;
|
|
gPlayerState.keepFacing = bVar1 & gPlayerState.keepFacing;
|
|
SoundReq(SFX_ITEM_LANTERN_ON);
|
|
} else {
|
|
UpdateItemAnim(this);
|
|
}
|
|
}
|
|
|
|
void sub_08075B54(ItemBehavior* this, u32 index) {
|
|
u32 bVar1;
|
|
EquipSlot equipSlot;
|
|
Entity* object;
|
|
s8* tmp;
|
|
|
|
if ((gPlayerState.flags & (PL_CAPTURED | PL_DISABLE_ITEMS)) == 0) {
|
|
equipSlot = IsItemEquipped(this->behaviorId);
|
|
if (!(((IsItemActivatedThisFrame(this) == 0) && (equipSlot < EQUIP_SLOT_NONE)) ||
|
|
(gPlayerState.jump_status != 0))) {
|
|
ForceEquipItem(ITEM_LANTERN_OFF, equipSlot);
|
|
gPlayerState.flags &= ~PL_USE_LANTERN;
|
|
DeleteItemBehavior(this, index);
|
|
SoundReq(SFX_ITEM_LANTERN_OFF);
|
|
} else {
|
|
if (((gPlayerState.queued_action != PLAYER_ROLL) && (gPlayerEntity.frameIndex < 0x37)) &&
|
|
((u16)gPlayerEntity.spriteIndex == 6)) {
|
|
tmp = &gUnk_08126EEC[gPlayerEntity.animationState & 6];
|
|
|
|
if ((gPlayerState.jump_status == 0) &&
|
|
(sub_080B1BA4(TILE(gPlayerEntity.x.HALF.HI + tmp[0], gPlayerEntity.y.HALF.HI + tmp[1]),
|
|
gPlayerEntity.collisionLayer, 0x40) != 0)) {
|
|
this->animPriority = 0xf;
|
|
this->stateID++;
|
|
gPlayerEntity.field_0x7a.HWORD = 2;
|
|
object = CreateObjectWithParent(&gPlayerEntity, LAMP_PARTICLE, 1, 0);
|
|
if (object != NULL) {
|
|
object->spriteVramOffset = gPlayerEntity.spriteVramOffset;
|
|
object->x.HALF.HI = tmp[0] + object->x.HALF.HI;
|
|
object->y.HALF.HI = tmp[1] + object->y.HALF.HI;
|
|
}
|
|
SetItemAnim(this, ANIM_LANTERN_BURN);
|
|
bVar1 = (8 >> (index));
|
|
gPlayerState.field_0xa |= bVar1;
|
|
gPlayerState.keepFacing |= bVar1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08075C9C(ItemBehavior* this, u32 index) {
|
|
s8* tmp;
|
|
|
|
UpdateItemAnim(this);
|
|
if ((this->playerFrame & 0x10) != 0) {
|
|
tmp = &gUnk_08126EEC[gPlayerEntity.animationState & 6];
|
|
sub_0807AB44(&gPlayerEntity, tmp[0], tmp[1]);
|
|
}
|
|
if ((this->playerFrame & 0x80) != 0) {
|
|
this->animPriority = 0;
|
|
this->stateID--;
|
|
gPlayerState.field_0xa = (~(8 >> index)) & gPlayerState.field_0xa;
|
|
gPlayerState.keepFacing = (~(8 >> index)) & gPlayerState.keepFacing;
|
|
} else {
|
|
gPlayerEntity.field_0x7a.HWORD++;
|
|
}
|
|
}
|