summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2022-02-27 12:57:00 -0800
committerGitHub <noreply@github.com>2022-02-27 12:57:00 -0800
commit108c4672eb68bb99ae5fb29acd91e5f214c28b08 (patch)
tree78681c82e2e69db0c24448e2ac11b1ed3373ec21 /src/object
parenta60953268ad5f228b3ee24e0dc166cde0dab1686 (diff)
parent86aefa49793d03c304aabae5c175802ac54a6269 (diff)
Merge pull request #409 from hatal175/bigbarrel
Diffstat (limited to 'src/object')
-rw-r--r--src/object/bigBarrel.c349
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);
+ }
+}