summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-13 19:54:05 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-18 20:48:24 +0100
commit3a27a147ad050ba2eef093d1353e7dd37dff8c8d (patch)
treef7964c33ffb7e12605a49154949a02f01a785cb4 /src/object
parent8d33a5857c3b02c3524a540a0602b4eb2157fc30 (diff)
Decompile ChestSpawner
Diffstat (limited to 'src/object')
-rw-r--r--src/object/chestSpawner.c322
-rw-r--r--src/object/houseDoorExterior.c1
-rw-r--r--src/object/jarPortal.c1
3 files changed, 304 insertions, 20 deletions
diff --git a/src/object/chestSpawner.c b/src/object/chestSpawner.c
index 811817d7..20016663 100644
--- a/src/object/chestSpawner.c
+++ b/src/object/chestSpawner.c
@@ -1,31 +1,317 @@
+/**
+ * @file chestSpawner.c
+ * @ingroup Objects
+ *
+ * @brief Chest Spawner object
+ */
+
+#define NENT_DEPRECATED
#include "global.h"
-#include "entity.h"
+#include "object.h"
+#include "functions.h"
+#include "screen.h"
+#include "structures.h"
+#include "item.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u8 unk_68[8];
+ /*0x70*/ u16 tilePosition;
+ /*0x72*/ u16 unk_72;
+ /*0x74*/ u8 unk_74[0x12];
+ /*0x86*/ u16 unk_86;
+} ChestSpawnerEntity;
-extern void sub_080842D8(Entity*);
-extern void sub_08078828(Entity*);
-extern void sub_08083E20(Entity*);
+extern const Hitbox gUnk_0811F8A8;
+extern const Hitbox gUnk_0811F8B0;
-extern void (*const gUnk_0811F7E8[])(Entity*);
-extern void (*const gUnk_0811F808[])(Entity*);
-extern void (*const gUnk_0811F818[])(Entity*);
+void sub_080842D8(ChestSpawnerEntity*);
+void sub_08078828(ChestSpawnerEntity*);
+void sub_08083E20(ChestSpawnerEntity*);
+void sub_08084074(u32);
+void sub_080840A8(s32, s32);
+void ChestSpawner_Type0(ChestSpawnerEntity*);
+void ChestSpawner_Type2(ChestSpawnerEntity*);
+void ChestSpawner_Type0Init(ChestSpawnerEntity*);
+void ChestSpawner_Type0Action1(ChestSpawnerEntity*);
+void ChestSpawner_Type0Action2(ChestSpawnerEntity*);
+void ChestSpawner_Type0Action3(ChestSpawnerEntity*);
+void ChestSpawner_Type2Init(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action1(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action2(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action3(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action4(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action5(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action6(ChestSpawnerEntity*);
+void ChestSpawner_Type2Action7(ChestSpawnerEntity*);
-extern u32 gUnk_0811F8B0;
-void ChestSpawner(Entity* this) {
- gUnk_0811F7E8[this->type](this);
+void ChestSpawner(ChestSpawnerEntity* this) {
+ static void (*const ChestSpawner_Types[])(ChestSpawnerEntity*) = {
+ ChestSpawner_Type0, ChestSpawner_Type0, ChestSpawner_Type2, ChestSpawner_Type2,
+ ChestSpawner_Type2, ChestSpawner_Type2, ChestSpawner_Type0, ChestSpawner_Type0,
+ };
+ ChestSpawner_Types[super->type](this);
}
-void sub_08083DF0(Entity* this) {
- gUnk_0811F808[this->action](this);
+void ChestSpawner_Type0(ChestSpawnerEntity* this) {
+ static void (*const ChestSpawner_Type0Actions[])(ChestSpawnerEntity*) = {
+ ChestSpawner_Type0Init,
+ ChestSpawner_Type0Action1,
+ ChestSpawner_Type0Action2,
+ ChestSpawner_Type0Action3,
+ };
+ ChestSpawner_Type0Actions[super->action](this);
}
-void sub_08083E08(Entity* this) {
- gUnk_0811F818[this->action](this);
+void ChestSpawner_Type2(ChestSpawnerEntity* this) {
+ static void (*const ChestSpawner_Type2Actions[])(ChestSpawnerEntity*) = {
+ ChestSpawner_Type2Init, ChestSpawner_Type2Action1, ChestSpawner_Type2Action2, ChestSpawner_Type2Action3,
+ ChestSpawner_Type2Action4, ChestSpawner_Type2Action5, ChestSpawner_Type2Action6, ChestSpawner_Type2Action7,
+ };
+ ChestSpawner_Type2Actions[super->action](this);
}
-void sub_08083E20(Entity* this) {
- this->action = 3;
- this->spriteSettings.draw = 1;
- this->spriteRendering.alphaBlend = 0;
+void sub_08083E20(ChestSpawnerEntity* this) {
+ super->action = 3;
+ super->spriteSettings.draw = 1;
+ super->spriteRendering.alphaBlend = 0;
sub_080842D8(this);
sub_08078828(this);
}
+void ChestSpawner_Type2Init(ChestSpawnerEntity* this) {
+ super->hitbox = (Hitbox*)&gUnk_0811F8B0;
+ if (CheckLocalFlag(super->type2)) {
+ super->spriteSettings.draw = 1;
+ super->action = 5;
+ sub_080842D8(this);
+ InitializeAnimation(super, 1);
+ } else {
+ if (CheckFlags(this->unk_86) || super->type == 4) {
+ sub_08083E20(this);
+ } else {
+ super->action = 1;
+ }
+ InitializeAnimation(super, 0);
+ }
+}
+
+void ChestSpawner_Type2Action1(ChestSpawnerEntity* this) {
+ if (CheckFlags(this->unk_86)) {
+ gScreen.controls.layerFXControl = 0xf40;
+ gScreen.controls.alphaBlend = 0x1000;
+ gUnk_02034490.unk0 = 1;
+ super->action = 2;
+ super->subAction = 0;
+ super->field_0xf = 0x1e;
+ super->spriteSettings.draw = 1;
+ super->spriteRendering.alphaBlend = 1;
+ RequestPriorityDuration(super, 0x1e);
+ sub_0805BC4C();
+ }
+}
+
+void ChestSpawner_Type2Action2(ChestSpawnerEntity* this) {
+ u32 tmp;
+
+ SetPriorityTimer(0x1e);
+ switch (super->subAction) {
+ case 0:
+ if (EntityInRectRadius(super, &gPlayerEntity, 0x10, 8)) {
+ sub_08078AC0(0x10, 0, 0);
+ gPlayerEntity.direction = 0x10;
+ }
+ super->subAction = 1;
+ break;
+ case 1:
+ if ((super->type == 5) || (gPlayerEntity.action == 1)) {
+ super->subAction = 2;
+ super->actionDelay = 8;
+ super->field_0xf = 0;
+ SoundReq(SFX_14A);
+ }
+ break;
+ default:
+ sub_0800445C(super);
+ CreateMagicSparkles(super->x.HALF.HI, super->y.HALF.HI, 2);
+ if (--super->actionDelay == 0) {
+ super->actionDelay = 8;
+ tmp = ++super->field_0xf;
+ gScreen.controls.alphaBlend = (((0x10 - tmp) * 0x100) & 0xff00) | tmp;
+ if (gScreen.controls.alphaBlend == 0x10) {
+ gUnk_02034490.unk0 = 0;
+ gScreen.controls.layerFXControl = 0;
+ sub_08083E20(this);
+ SoundReq(SFX_SECRET_BIG);
+ }
+ }
+ break;
+ }
+}
+
+void ChestSpawner_Type2Action3(ChestSpawnerEntity* this) {
+ sub_0800445C(super);
+ if (super->interactType != 0) {
+ super->action = 4;
+ super->field_0xf = 0x1e;
+ sub_080788E0(super);
+ RequestPriorityDuration(super, 0x3c);
+ SoundReq(SFX_CHEST_OPEN);
+ }
+}
+
+void ChestSpawner_Type2Action4(ChestSpawnerEntity* this) {
+ sub_0800445C(super);
+ GetNextFrame(super);
+ if ((super->frame & 0x80) != 0) {
+ if (--super->field_0xf == 0) {
+ if (super->actionDelay == 0x18) {
+ super->action = 6;
+ super->actionDelay = 8;
+ super->field_0xf = 0x10;
+ } else {
+ super->action = 5;
+ sub_08084074(super->type2);
+ }
+ }
+ SetLocalFlag(super->type2);
+ }
+}
+
+void sub_08084074(u32 param_1) {
+ u8* arr = (u8*)GetCurrentRoomProperty(3);
+ if (arr != NULL) {
+ for (; arr[0] != 0; arr += 8) {
+ if ((arr[0] == 3) && (param_1 == arr[1])) {
+ CreateItemEntity(arr[2], arr[3], 0);
+ return;
+ }
+ }
+ }
+}
+
+void sub_080840A8(s32 param_1, s32 param_2) {
+ static const u8 gUnk_0811F838[] = { 84, 84, 84, 84, 85, 85, 85, 86 };
+ static const s32 gUnk_0811F840[] = { 393216, 458752, 524288, 589824 };
+ static const s8 gUnk_0811F850[] = { -6, 0, 0, 6 };
+ Entity* obj = CreateObject(GROUND_ITEM, gUnk_0811F838[Random() & 7], 0);
+ if (obj != NULL) {
+ obj->actionDelay = 6;
+ obj->direction = ((Random() & 7) + 0xc) | 0x80;
+ obj->speed = (Random() & 0xf) * 2 + 0x20;
+ obj->zVelocity = gUnk_0811F840[Random() & 3];
+ obj->x.HALF.HI = gUnk_0811F850[Random() & 3] + param_1;
+ obj->y.HALF.HI = param_2 + 1;
+ obj->z.HALF.HI = 0xfff8;
+ ResolveCollisionLayer(obj);
+ obj = CreateFx(obj, FX_DASH, 0);
+ if (obj != NULL) {
+ SoundReq(SFX_124);
+ }
+ }
+}
+
+void ChestSpawner_Type2Action6(ChestSpawnerEntity* this) {
+ if (--super->actionDelay == 0) {
+ super->actionDelay = 8;
+ if (--super->field_0xf != 0) {
+ sub_080840A8(super->x.HALF.HI, super->y.HALF.HI);
+ } else {
+ super->action = 5;
+ }
+ }
+}
+
+void ChestSpawner_Type2Action5(ChestSpawnerEntity* this) {
+ sub_0800445C(super);
+}
+
+void ChestSpawner_Type2Action7(ChestSpawnerEntity* this) {
+}
+
+void ChestSpawner_Type0Init(ChestSpawnerEntity* this) {
+ super->action++;
+ this->tilePosition = COORD_TO_TILE(super);
+ super->hitbox = (Hitbox*)&gUnk_0811F8A8;
+ if (GetTileTypeByEntity(super) == 0x74) {
+ DeleteThisEntity();
+ }
+ if (CheckFlags(this->unk_86)) {
+ super->action = 3;
+ sub_0807B7D8(0x73, this->tilePosition, super->collisionLayer);
+ if ((super->type & 1) == 0) {
+ DeleteThisEntity();
+ }
+ }
+}
+
+void ChestSpawner_Type0Action1(ChestSpawnerEntity* this) {
+ if (CheckFlags(this->unk_86)) {
+ super->action = 2;
+ }
+}
+
+void ChestSpawner_Type0Action2(ChestSpawnerEntity* this) {
+ sub_0807B7D8(0x73, this->tilePosition, super->collisionLayer);
+ switch (super->type) {
+ case 6:
+ case 7:
+ SoundReq(SFX_215);
+ break;
+ default:
+ SoundReq(SFX_SECRET);
+ CreateDust(super);
+ break;
+ }
+ super->action = 3;
+ this->unk_72 = super->actionDelay * 0x3c;
+ if ((super->type & 1) == 0) {
+ DeleteThisEntity();
+ }
+}
+
+void ChestSpawner_Type0Action3(ChestSpawnerEntity* this) {
+ if ((super->type == 1) || (super->type == 7)) {
+ if (GetTileTypeByEntity(super) == 0x74) {
+ DeleteEntity(super);
+ } else {
+ if (!CheckFlags(this->unk_86)) {
+ if (this->unk_72 != 0) {
+ this->unk_72--;
+ } else {
+ super->action = 1;
+ sub_0807BA8C(this->tilePosition, super->collisionLayer);
+ CreateDust(super);
+ }
+ }
+ }
+ }
+}
+
+void sub_080842D8(ChestSpawnerEntity* this) {
+ static const u8 gUnk_0811F854[] = {
+ 35, 64, 191, 255, 35, 64, 192, 255, 38, 64, 255, 255, 38, 64, 0, 0, 255, 255,
+ };
+ static const u8 gUnk_0811F866[] = {
+ 39, 64, 191, 255, 35, 64, 192, 255, 40, 64, 193, 255, 41, 64, 255, 255, 38, 64, 0, 0, 42, 64, 1, 0, 255, 255,
+ };
+ static const u8 gUnk_0811F880[] = {
+ 34, 64, 255, 255, 34, 64, 0, 0, 255, 255,
+ };
+ static const u8 gUnk_0811F88A[] = {
+ 36, 64, 255, 255, 34, 64, 0, 0, 37, 64, 1, 0, 255, 255,
+ };
+ static const u8* const gUnk_0811F898[] = {
+ gUnk_0811F854,
+ gUnk_0811F866,
+ gUnk_0811F880,
+ gUnk_0811F88A,
+ };
+ s32 index = -(-(super->x.HALF.HI & 8) >> 0x1f);
+ if ((super->y.HALF.HI & 8) != 0) {
+ index += 2;
+ }
+ sub_0801AF18((u8*)gUnk_0811F898[index], COORD_TO_TILE(super), super->collisionLayer);
+}
+
+const Hitbox gUnk_0811F8A8 = { 0, -3, { 0, 0, 0, 0 }, 6, 6 };
+const Hitbox gUnk_0811F8B0 = { 0, -3, { 0, 0, 0, 0 }, 12, 6 };
diff --git a/src/object/houseDoorExterior.c b/src/object/houseDoorExterior.c
index 92ba70b8..62d0cb95 100644
--- a/src/object/houseDoorExterior.c
+++ b/src/object/houseDoorExterior.c
@@ -29,7 +29,6 @@ void sub_0808681C(Entity*);
static u8 sub_08086954(Entity*);
extern u32 CheckRegionOnScreen(u32, u32, u32, u32);
-extern void sub_08078AC0(u32, u32, u32);
extern void (*const gUnk_081206B4[])(Entity*);
extern Hitbox gUnk_081206AC; // TODO: should be const
diff --git a/src/object/jarPortal.c b/src/object/jarPortal.c
index a482621d..6be250de 100644
--- a/src/object/jarPortal.c
+++ b/src/object/jarPortal.c
@@ -5,7 +5,6 @@
extern void (*gUnk_08121488[])(Entity*);
extern u32 sub_08057810(void);
-extern void CreateMagicSparkles(u32, u32, u32);
u32 sub_0808C128(Entity*);
void sub_0808C13C(Entity*);