#include "global.h" #include "sound.h" #include "entity.h" #include "flags.h" #include "player.h" #include "object.h" #include "item.h" #include "itemMetaData.h" #include "functions.h" #include "hitbox.h" void sub_08081150(Entity*); u8 sub_0808147C(u32); void sub_080814A4(Entity*); u32 sub_080814C0(Entity*); void sub_08081500(Entity*); void sub_0808153C(Entity*); void sub_08081598(Entity*); void sub_080813BC(Entity*); void sub_080810FC(Entity*); bool32 CheckShouldPlayItemGetCutscene(Entity*); extern void (*const gUnk_0811E7D4[])(Entity*); extern void (*const gUnk_0811E7E8[])(Entity*); extern void (*const gUnk_0811E814[])(Entity*); extern void (*const gUnk_0811E840[])(Entity*); typedef struct { u8 unk0[2]; u16 sfx; u8 unk4; u8 unk5[3]; } Unk_0811E84C; extern const Unk_0811E84C gUnk_0811E84C[]; void ItemOnGround(Entity* this) { if (this->bitfield & 0x80) { switch (this->bitfield & 0x7F) { case 20: this->action = 3; COLLISION_OFF(this); this->spriteSettings.draw = 1; this->field_0x3c |= 0x10; this->child = this->field_0x4c; break; case 0: case 1: case 4: case 5: case 6: case 8: case 9: case 10: case 11: case 12: case 30: sub_08081598(this); break; } } if (sub_0806F520(this)) { sub_080813BC(this); } else { gUnk_0811E7D4[this->action](this); } if (this->type == 0x5C) { gRoomVars.field_0x4++; } sub_08080CB4(this); } void sub_08080F20(Entity* this) { if (this->field_0x86.HWORD && CheckFlags(this->field_0x86.HWORD)) { DeleteThisEntity(); } if (this->type != ITEM_FAIRY) { this->spriteSettings.draw = 1; this->spritePriority.b1 = 3; this->spriteSettings.shadow = 0; this->hitType = 7; this->field_0x3c = 0x47; this->hurtType = 0x44; this->health = 0xFF; this->hitbox = (Hitbox*)&gUnk_080FD1A8; switch (this->type) { case ITEM_SHELLS: case ITEM_RUPEE1: case ITEM_RUPEE5: case ITEM_RUPEE20: case ITEM_RUPEE50: case ITEM_RUPEE100: case ITEM_KINSTONE: case ITEM_BOMBS5: case ITEM_ARROWS5: case ITEM_HEART: this->flags2 = 0x17; break; default: this->flags2 = 0x11; break; } this->field_0x68.HALF.HI = this->actionDelay; this->field_0x6a.HALF.LO = 0; this->field_0x6c.HWORD = 0; this->field_0x68.HALF.LO = 0; this->actionDelay = 0; SetDefaultPriority(this, PRIO_NO_BLOCK); this->field_0x1c = sub_0808147C(this->type); gUnk_0811E7E8[this->field_0x68.HALF.HI](this); } else { Entity* entity = CreateObject(FAIRY, 0x60, 0); if (entity != NULL) { entity->actionDelay = 0; if (this->actionDelay == 1) { entity->type2 = 2; } CopyPosition(this, entity); DeleteThisEntity(); } } } void sub_080810A8(Entity* this) { this->action = 1; sub_080814A4(this); if (this->direction & 0x80) { this->direction &= 0x1F; if (this->speed == 0) { this->speed = 0x100; } } else { this->direction |= 0xFF; } if (this->zVelocity == 0) { this->zVelocity = Q_16_16(1.875); } if (this->collisionLayer == 2) { ResolveCollisionLayer(this); } } void sub_080810FC(Entity* this) { if (this->type != ITEM_HEART) { sub_08081598(this); } else { this->action = 2; this->subAction = 0; COLLISION_ON(this); this->flags2 = 0x11; CopyPosition(&gPlayerEntity, this); } } void sub_08081134(Entity* this) { sub_080814A4(this); this->field_0x6c.HWORD += 80; sub_08081150(this); } void sub_08081150(Entity* this) { this->action = 2; COLLISION_ON(this); this->z.HALF.HI = -0x80; this->spriteOrientation.flipY = 1; this->spriteRendering.b3 = 1; SoundReq(SFX_12D); } void sub_08081188(Entity* this) { this->action = 2; COLLISION_ON(this); if (this->collisionLayer == 2) { ResolveCollisionLayer(this); } } void sub_080811AC(Entity* this) { this->action = 2; this->spriteSettings.draw = 0; this->field_0x6e.HWORD = GetTileTypeByEntity(this); } void sub_080811C8(Entity* this) { this->action = 2; this->spriteSettings.draw = 0; } void sub_080811D8(Entity* this) { sub_08081188(this); SoundReq(SFX_215); } void sub_080811EC(Entity* this) { if (this->field_0x68.HALF.HI != 6) { ProcessMovement2(this); } else { LinearMoveUpdate(this); } GravityUpdate(this, 0x2800); if (this->zVelocity <= 0) { this->action = 2; COLLISION_ON(this); sub_080814A4(this); } } void sub_0808122C(Entity* this) { gUnk_0811E814[this->field_0x68.HALF.HI](this); } void sub_08081248(Entity* this) { sub_08081500(this); if (sub_080814C0(this)) { sub_08081404(this, 0); } else { sub_0800442E(this); } } void sub_0808126C(Entity* this) { UpdateAnimationSingleFrame(this); sub_0808153C(this); } void sub_0808127C(Entity* this) { if (sub_080814C0(this)) { sub_08081404(this, 0); } else { sub_0808153C(this); } } void nullsub_113(Entity* this) { } void sub_080812A0(Entity* this) { sub_08081500(this); } void sub_080812A8(Entity* this) { if (sub_080B1B0C(this) != 0xF && this->field_0x6e.HWORD != GetTileTypeByEntity(this)) { this->direction = 0; this->speed = 0; this->spriteSettings.draw = 1; this->field_0x68.HALF.HI = 0; sub_080810A8(this); } } void sub_080812E8(Entity* this) { PlayerState* playerState = &gPlayerState; #ifdef EU if ((playerState->swim_state & 0x80) && IsColliding(this, &gPlayerEntity)) { #else if ((playerState->swim_state & 0x80) && (playerState->flags & PL_MINISH) == 0 && IsColliding(this, &gPlayerEntity)) { #endif sub_080810FC(this); } } void nullsub_510(Entity* this) { } void sub_08081328(Entity* this) { Entity* other = this->child; if (!(other->kind == PLAYER_ITEM && other->id == 3)) { sub_08081404(this, 0); } else { CopyPosition(other, this); this->z.HALF.HI--; other = &gPlayerEntity; if (IsColliding(this, other)) { sub_080810FC(this); } } } void sub_0808136C(Entity* this) { if (--this->actionDelay) { Entity* other = this->child; this->x.WORD = other->x.WORD; this->y.WORD = other->y.WORD; this->spriteOrientation.flipY = other->spriteOrientation.flipY; this->spriteRendering.b3 = other->spriteRendering.b3; GravityUpdate(this, 0x2800); } else { sub_08081404(this, 1); } } void sub_080813BC(Entity* this) { gUnk_0811E840[this->subAction](this); } void sub_080813D4(Entity* this) { this->subAction = 1; this->field_0x1d = 1; this->spriteSettings.draw = 1; } void sub_080813E8(Entity* this) { sub_0806F4E8(this); } void sub_080813F0(Entity* this) { if (sub_0806F3E4(this)) { sub_080810FC(this); } } void sub_08081404(Entity* this, u32 arg1) { if (arg1 && this->field_0x86.HWORD) { SetFlag(this->field_0x86.HWORD); } DeleteThisEntity(); } bool32 sub_08081420(Entity* this) { if (CheckShouldPlayItemGetCutscene(this)) { SetDefaultPriority(this, PRIO_PLAYER_EVENT); CreateItemEntity(this->type, this->type2, 0); return TRUE; } else { GiveItem(this->type, this->type2); return FALSE; } } bool32 CheckShouldPlayItemGetCutscene(Entity* this) { return ((gItemMetaData[this->type].unk3 & 0x2) || !GetInventoryValue(this->type)); } u8 sub_0808147C(u32 arg0) { const Unk_0811E84C* var0 = &gUnk_0811E84C[arg0]; return var0->unk4; } void sub_0808148C(u32 arg0) { const Unk_0811E84C* var0 = &gUnk_0811E84C[arg0]; if (var0->sfx) { SoundReq(var0->sfx); } } void sub_080814A4(Entity* this) { if (this->field_0x68.HALF.HI == 10) { this->field_0x6c.HWORD = 120; } else { this->field_0x6c.HWORD = 600; } } u32 sub_080814C0(Entity* this) { if (!AnyPrioritySet()) { if (--this->field_0x6c.HWORD == 0) { return TRUE; } if (this->field_0x6c.HWORD < 90) { this->spriteSettings.draw ^= 1; } } return FALSE; } void sub_08081500(Entity* this) { if (this->field_0x68.HALF.LO == 0) { u32 var0 = sub_080044EC(this, 0x2800); if (var0 == 0) { this->field_0x68.HALF.LO = 1; } else { if (var0 == 1) { sub_0808148C(this->type); UpdateSpriteForCollisionLayer(this); } ProcessMovement2(this); } } } void sub_0808153C(Entity* this) { if (this->field_0x68.HALF.LO > 1) return; if (this->field_0x68.HALF.LO == 0) { if (!GravityUpdate(this, 0x1000) && !sub_0800442E(this)) { this->field_0x68.HALF.LO = 1; this->zVelocity = Q_16_16(1.875); sub_0808148C(this->type); UpdateSpriteForCollisionLayer(this); } } else { if (!GravityUpdate(this, 0x2800)) { this->field_0x68.HALF.LO = 2; sub_0808148C(this->type); } } } void sub_08081598(Entity* this) { if (this->health == 0) { sub_08081404(this, 1); } COLLISION_OFF(this); this->action = 4; this->actionDelay = 14; this->zVelocity = Q_16_16(2.0); this->spriteSettings.draw = 1; this->spritePriority.b1 = 2; this->spritePriority.b0 = 3; this->child = &gPlayerEntity; CopyPosition(this->child, this); this->z.HALF.HI -= 4; if (this->type != 0x5F && sub_08081420(this)) { sub_08081404(this, 1); } }