diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2022-02-27 12:57:00 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-02-27 12:57:00 -0800 |
| commit | 108c4672eb68bb99ae5fb29acd91e5f214c28b08 (patch) | |
| tree | 78681c82e2e69db0c24448e2ac11b1ed3373ec21 /src/object | |
| parent | a60953268ad5f228b3ee24e0dc166cde0dab1686 (diff) | |
| parent | 86aefa49793d03c304aabae5c175802ac54a6269 (diff) | |
Merge pull request #409 from hatal175/bigbarrel
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/bigBarrel.c | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/src/object/bigBarrel.c b/src/object/bigBarrel.c new file mode 100644 index 00000000..af09b0f4 --- /dev/null +++ b/src/object/bigBarrel.c @@ -0,0 +1,349 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "flags.h" +#include "save.h" +#include "room.h" +#include "asm.h" +#include "sound.h" +#include "common.h" +#include "object.h" + +typedef struct { + Entity base; + const u8* unk68; +} BigBarrelEntity; + +void sub_08088A68(BigBarrelEntity*); +void sub_08088C9C(BigBarrelEntity*); +void sub_08088DB4(BigBarrelEntity*); +void sub_08088E74(BigBarrelEntity*); +void sub_08088F20(BigBarrelEntity*); +void sub_08088BE0(BigBarrelEntity*); +void sub_08089094(BigBarrelEntity*); +void sub_080890EC(BigBarrelEntity*, const s16*, s32); + +Entity* sub_08088C78(BigBarrelEntity*, u32, u32, u32); + +extern bool32 sub_0806FB38(Entity*); +extern void sub_0806FB00(Entity*, u32, u32, u32); + +const s8 gUnk_08120C1C[] = { 3, 0, 2, 0, 2, 0, 1, 0, -1 }; +const s8 gUnk_08120C25[] = { 5, 0, 4, 0, 4, 0, 2, 0, -1 }; +const s8 gUnk_08120C2E[] = { 3, 0, -1, 0, 0, 0 }; + +void BigBarrel(Entity* this) { + static void (*const typeFuncs[])(BigBarrelEntity*) = { + sub_08088A68, sub_08088C9C, sub_08088DB4, sub_08088E74, sub_08088F20, + }; + typeFuncs[this->type]((BigBarrelEntity*)this); +} + +void sub_08088A68(BigBarrelEntity* this) { + u32 uVar3; + const u8* pcVar3; + + if (super->action == 0) { + super->action = 1; + super->spriteSettings.draw = 3; + super->updatePriority = 3; + if (CheckGlobalFlag(0x17)) { + super->frameIndex = gSave.unk7 + 1; + } else { + super->frameIndex = gSave.unk7; + } + sub_08088BE0(this); + if (CheckPlayerInRegion(super->x.HALF.HI - gRoomControls.origin_x, super->y.HALF.HI - gRoomControls.origin_y, + 0x80, 0x60)) { + gRoomVars.animFlags |= 4; + } + } else { + if (gRoomVars.animFlags & 1) { + gRoomVars.animFlags &= ~1; + super->actionDelay = 1; + this->unk68 = gUnk_08120C1C; + SoundReq(SFX_BARREL_ENTER); + } + if (gRoomVars.animFlags & 2) { + gRoomVars.animFlags &= ~2; + super->actionDelay = 1; + this->unk68 = gUnk_08120C25; + SoundReq(SFX_BARREL_RELEASE); + } + if (gRoomVars.animFlags & 4) { + gRoomVars.animFlags &= ~4; + super->actionDelay = 1; + this->unk68 = gUnk_08120C2E; + SoundReq(SFX_BARREL_ENTER); + } + if (super->actionDelay) { + if (super->actionDelay-- == 1) { + pcVar3 = this->unk68; + uVar3 = pcVar3[0]; + *(u8*)&super->spriteOffsetY = uVar3; + pcVar3++; + if (*pcVar3 != 0xff) { + super->actionDelay = 8; + this->unk68 = pcVar3; + } else { + super->spriteOffsetY = 0; + } + } + } + } + super->spritePriority.b0 = 1; + if (CheckPlayerProximity(super->x.HALF.HI - 0x50, super->y.HALF.HI - 0x50, 0xa0, 0x30)) { + super->spritePriority.b0 = 5; + } + if (CheckPlayerProximity(super->x.HALF.HI - 0x50, super->y.HALF.HI + 0x30, 0xa0, 0x30)) { + super->spritePriority.b0 = 5; + } +} + +void sub_08088BE0(BigBarrelEntity* this) { + Entity* ent; + + if (CheckLocalFlag(0x15) == 0) { + sub_08088C78(this, 2, 0, 0xffffff88); + ent = sub_08088C78(this, 4, 0x15, 0); + if (ent) { + ent->x.HALF.HI = gRoomControls.origin_x + 0x48; + ent->y.HALF.HI = gRoomControls.origin_y + 200; + } + } + + if (CheckLocalFlag(0x16) == 0) { + sub_08088C78(this, 2, 1, 0x78); + ent = sub_08088C78(this, 4, 0x16, 0); + if (ent) { + ent->x.HALF.HI = gRoomControls.origin_x + 0x188; + ent->y.HALF.HI = gRoomControls.origin_y + 200; + } + } + sub_08088C78(this, 1, 0, 0xffffff88); + sub_08088C78(this, 1, 1, 0x78); +} + +Entity* sub_08088C78(BigBarrelEntity* this, u32 type, u32 type2, u32 xOffset) { + Entity* pEVar1; + + pEVar1 = CreateObject(BIG_BARREL, type, type2); + if (pEVar1) { + pEVar1->x.HALF.HI = super->x.HALF.HI + xOffset; + pEVar1->y.HALF.HI = super->y.HALF.HI; + pEVar1->parent = super; + } + return pEVar1; +} + +void sub_08088C9C(BigBarrelEntity* this) { + static const u8 gUnk_08120C48[] = { 2, 3, 4, 5, 6, 7, 7, 7 }; + static const s8 gUnk_08120C50[] = { 8, -8 }; + u32 localFlag; + s32 x; + + super->spritePriority.b0 = gUnk_08120C48[super->parent->spritePriority.b0]; + super->spriteOffsetY = super->parent->spriteOffsetY / 2; + switch (super->action) { + case 0: + super->action = 1; + super->spriteSettings.draw = 1; + super->frameIndex = super->type2 + 4; + super->updatePriority = 3; + if (super->type2 == 0) { + localFlag = 21; + } else { + localFlag = 22; + } + super->field_0xf = localFlag; + if (CheckLocalFlag(super->field_0xf) == 0) { + return; + } + + super->x.HALF_U.HI += gUnk_08120C50[super->type2]; + super->action = 4; + break; + case 1: + if (CheckLocalFlag(super->field_0xf) == 0) { + return; + } + super->action = 2; + break; + case 2: + if ((gRoomVars.animFlags & 0x20) == 0) { + return; + } + gRoomVars.animFlags &= ~0x20; + super->action = 3; + super->subAction = 4; + super->actionDelay = 1; + case 3: + if (--super->actionDelay) { + return; + } + super->actionDelay = 8; + x = super->x.HALF.HI; + if (super->type2) { + super->x.HALF.HI = x - 2; + } else { + super->x.HALF.HI = x + 2; + } + if (--super->subAction) { + return; + } + super->action = 4; + break; + } +} + +void sub_08088DB4(BigBarrelEntity* this) { + switch (super->action) { + case 0: + super->action = 1; + super->spriteSettings.draw = 1; + super->frameIndex = super->type2 * 4 + 6; + super->collisionLayer = 2; + SetDefaultPriority(super, 3); + super->type2 = super->type2 == 0 ? 0x15 : 0x16; + UpdateSpriteForCollisionLayer(super); + break; + case 1: + if (CheckLocalFlag(super->type2)) { + super->action++; + super->actionDelay = 10; + } + break; + case 2: + case 3: + case 4: + if ((gRoomVars.animFlags & 8) == 0) { + return; + } + if (--super->actionDelay) { + return; + } + super->actionDelay = 0x1e; + super->frameIndex++; + super->action++; + break; + default: + if (--super->actionDelay == 0) { + gRoomVars.animFlags &= ~0x8; + DeleteEntity(super); + } + break; + } +} + +void sub_08088E74(BigBarrelEntity* this) { + static const s8 gUnk_08120C52[] = { -2, 0, 2, 0 }; + Entity* ent; + + if (super->action == 0) { + super->action = 1; + super->collisionLayer = 2; + gRoomVars.animFlags |= 8; + } + if (sub_0806FB38(super)) { + gRoomVars.animFlags |= 0x10; + DeleteEntity(super); + } else { + if ((gRoomTransition.frameCount & 7U) == 0) { + ent = CreateObjectWithParent(super, OBJECT_2A, 0, 0x1e); + if (ent) { + ent->updatePriority = 3; + ent->spriteRendering.b3 = 0; + ent->spritePriority.b0 = 0; + ent->spriteOrientation.flipY = 0; + ent->y.HALF.HI += gUnk_08120C52[Random() & 3]; + } + } + } +} + +void sub_08088F20(BigBarrelEntity* this) { + Entity* pEVar3; + + switch (super->action) { + case 0: + super->action = 1; + super->updatePriority = 3; + if (CheckLocalFlag(super->type2) == 0) { + return; + } + DeleteEntity(super); + break; + case 1: + if (CheckLocalFlag(super->type2) == 0) { + return; + } + super->action = 2; + super->actionDelay = 30; + RequestPriorityDuration(super, 0x10e); + pEVar3 = CreateObject(OBJECT_2A, 1, 0); + if (pEVar3 != NULL) { + pEVar3->updatePriority = 3; + pEVar3->x.HALF.HI = super->x.HALF.HI; + pEVar3->y.HALF.HI = super->y.HALF.HI; + pEVar3->collisionLayer = 2; + pEVar3->spritePriority.b0 = 2; + } + SetTileType(0x76, COORD_TO_TILE(super), 2); + break; + case 2: + if (--super->actionDelay) { + return; + } + sub_08089094(this); + super->action = 3; + break; + case 3: + if ((gRoomVars.animFlags & 0x10) == 0) { + return; + } + super->action = 4; + super->actionDelay = 0x78; + break; + default: + if (--super->actionDelay == 0x5a) { + if (CheckLocalFlags(0x15, 2)) { + gRoomVars.animFlags |= 2; + } else { + gRoomVars.animFlags |= 1; + } + gRoomVars.animFlags |= 0x20; + } + if (super->actionDelay == 0) { + gRoomVars.animFlags &= ~0x10; + if (CheckLocalFlags(0x15, 2)) { + RequestPriorityDuration(super, 0x3c); + SoundReq(SFX_SECRET); + } + DeleteEntity(super); + } + break; + } +} + +void sub_08089094(BigBarrelEntity* this) { + static const s16 gUnk_08120C56[] = { 0x58, -0x30, 0x58, 0x30 }; + static const s16 gUnk_08120C5E[] = { -0x58, -0x30, -0x58, 0x30 }; + + if (super->x.HALF.HI - gRoomControls.origin_x < 0x100) { + sub_080890EC(this, gUnk_08120C56, -8); + sub_080890EC(this, gUnk_08120C56 + 2, 4); + } else { + sub_080890EC(this, gUnk_08120C5E, -8); + sub_080890EC(this, gUnk_08120C5E + 2, 4); + } +} + +void sub_080890EC(BigBarrelEntity* this, const s16* offsets, s32 yOffset) { + Entity* pEVar1 = CreateObject(BIG_BARREL, 3, 0); + if (pEVar1) { + SetDefaultPriority(pEVar1, 3); + pEVar1->x.HALF.HI = super->x.HALF.HI; + pEVar1->y.HALF.HI = super->y.HALF.HI + yOffset; + pEVar1->parent = super; + sub_0806FB00(pEVar1, pEVar1->x.HALF.HI + offsets[0], pEVar1->y.HALF.HI + offsets[1], 0x5a); + } +} |
