/** * @file objectB.c * @ingroup Objects * * @brief ObjectB object */ #define NENT_DEPRECATED #include "global.h" #include "object.h" #include "functions.h" #include "itemMetaData.h" #include "message.h" #include "save.h" #include "game.h" #include "item.h" typedef struct { /*0x00*/ Entity base; /*0x68*/ u16 unk_68; } ObjectBEntity; typedef struct { u8 unk_0[6]; u16 unk_6; } struct_080FD964; extern const struct_080FD964 gUnk_080FD964[]; void ObjectB_Init(ObjectBEntity*); void ObjectB_Action1(ObjectBEntity*); void ObjectB_Action2(ObjectBEntity*); void ObjectB_Action3(ObjectBEntity*); void ObjectB(ObjectBEntity* this) { static void (*const ObjectB_Actions[])(ObjectBEntity*) = { ObjectB_Init, ObjectB_Action1, ObjectB_Action2, ObjectB_Action3 }; u32 tmp; ObjectB_Actions[super->action](this); tmp = (super->parent->frame >> 6); super->spriteSettings.draw = tmp & 1; sub_08080CB4(super); super->spritePriority.b1 = 0; super->spriteOrientation.flipY = 1; super->spriteRendering.b3 = 0; } void ObjectB_Init(ObjectBEntity* this) { SetDefaultPriority(super, 6); super->action = 1; } void ObjectB_Action1(ObjectBEntity* this) { u32 tmp; const ItemMetaData* ptr; if ((super->parent)->frame != 0x41) { return; } super->action = 2; switch (super->timer) { case 0: case 1: this->unk_68 = GiveItem(super->type, super->type2); switch (super->type) { case 0x40: case 0x41: case 0x42: case 0x43: break; default: SoundReq(SFX_ITEM_GET); break; } break; case 2: GiveItem(super->type, super->type2); this->unk_68 = gUnk_080FD964[super->type].unk_6; SoundReq(SFX_ITEM_GET); break; case 5: tmp = GetInventoryValue((u32)super->type); ptr = &gItemMetaData[super->type]; if (tmp == 0) { this->unk_68 = *(u16*)&ptr->textId; } else { this->unk_68 = *(u16*)&ptr->unk6; } return; case 3: case 4: default: return; } } void ObjectB_Action2(ObjectBEntity* this) { u32 messageIndex; if ((super->parent)->frame == 0x42) { super->action = 3; switch (super->timer) { case 1: case 3: case 4: default: break; case 0: case 2: case 5: messageIndex = this->unk_68; if (messageIndex != 0) { switch (super->type) { case 0x63: messageIndex += gSave.stats.heartPieces; break; case 0x3f: if (super->type2 > 1) { if (messageIndex == TEXT_INDEX(TEXT_ITEM_GET, 0x77)) { messageIndex--; } else { messageIndex++; } } break; } MessageFromTarget(messageIndex); gMessage.rupees = super->type2; } } } } void ObjectB_Action3(ObjectBEntity* this) { u32 tmp; if ((super->parent)->action == 8) { return; } switch (super->timer) { case 0: case 1: case 2: if (super->type != 0x62) { if (super->type != 0x63) { break; } ModHealth(0xa0); gSave.stats.heartPieces++; if (gSave.stats.heartPieces < 4) { break; } gSave.stats.heartPieces = 0; } gSave.stats.maxHealth += 8; if (gSave.stats.maxHealth > 0xa0) { gSave.stats.maxHealth = 0xa0; } ModHealth(0xa0); break; case 3: tmp = GetBottleContaining(super->type); if (tmp != 0) { gSave.stats.itemButtons[tmp + 1] = 0x20; } else { SetInventoryValue(super->type, ITEM_GREEN_SWORD); } break; case 4: case 5: break; } DeleteThisEntity(); }