summaryrefslogtreecommitdiff
path: root/src/object/object20.c
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-03-11 17:08:27 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-03-11 17:08:27 +0100
commitcbae0aa1e51f13e261b204da7d5aee37ad461ef4 (patch)
treeafae49434826d35b88a4f7eb073c60115ade7d79 /src/object/object20.c
parent2044fdcaff7fde3d49362f38c34ce9fcdff4d348 (diff)
Decompile Object20
Diffstat (limited to 'src/object/object20.c')
-rw-r--r--src/object/object20.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/object/object20.c b/src/object/object20.c
new file mode 100644
index 00000000..1cfb4c2c
--- /dev/null
+++ b/src/object/object20.c
@@ -0,0 +1,91 @@
+/**
+ * @file object20.c
+ * @ingroup Objects
+ *
+ * @brief Object20 object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+
+void sub_08087824(Entity*);
+void sub_08087888(Entity*);
+void sub_080878CC(Entity*);
+
+void (*const gUnk_08120A28[])(Entity*) = {
+ sub_08087824,
+ sub_08087888,
+};
+const Hitbox3D gUnk_08120A30 = { 0, 0, { 0, 0, 0, 0 }, 6, 6, 10, { 0, 0, 0 } };
+const Hitbox3D gUnk_08120A3C = { 0, 0, { 0, 0, 0, 0 }, 12, 12, 16, { 0, 0, 0 } };
+const Hitbox3D gUnk_08120A48 = { 0, 0, { 0, 0, 0, 0 }, 16, 16, 20, { 0, 0, 0 } };
+const Hitbox3D* const gUnk_08120A54[] = { &gUnk_08120A30, &gUnk_08120A30, &gUnk_08120A48, &gUnk_08120A3C,
+ &gUnk_08120A3C };
+
+void Object20(Entity* this) {
+ gUnk_08120A28[this->action](this);
+}
+
+void sub_08087824(Entity* this) {
+ if (this->collisionLayer == 0) {
+ ResolveCollisionLayer(this);
+ }
+ this->action = 1;
+ this->flags |= 0x80;
+ this->field_0x3c = 0x13;
+ this->health = 0xff;
+ this->hitType = 0xa9;
+ this->hurtType = 0x16;
+ this->hitbox = (Hitbox*)gUnk_08120A54[0];
+ this->flags2 = 0x8b;
+ sub_080878CC(this);
+ InitializeAnimation(this, 1);
+ sub_0801766C(this);
+ EnqueueSFX(SFX_ITEM_BOMB_EXPLODE);
+}
+
+void sub_08087888(Entity* this) {
+ GetNextFrame(this);
+ if ((this->frame & 0x80) != 0) {
+ DeleteThisEntity();
+ } else {
+ if (this->frame < 5) {
+ this->hitbox = (Hitbox*)gUnk_08120A54[this->frame];
+ } else {
+ this->flags &= 0x7f;
+ }
+ }
+}
+
+NONMATCH("asm/non_matching/object20/sub_080878CC.inc", void sub_080878CC(Entity* this)) {
+ s32 x;
+ s32 y;
+ s32 itX;
+ s32 itY;
+ u32 layer;
+ u32 tileType;
+ u32 pos;
+
+ x = this->x.HALF.HI;
+ y = this->y.HALF.HI;
+ layer = this->collisionLayer;
+ for (itX = -0x10; itX < 0x11; itX += 0x10) {
+ for (itY = -0x10; itY < 0x11; itY += 0x10) {
+ pos = TILE((u32)x + itX, (u32)y + itY);
+ if (sub_080B1AE0(pos, layer) == 0x2e) {
+ tileType = GetTileType(pos, layer);
+ if (tileType == 0x368 || tileType == 0x367
+ /*(tileType < 0x369) && (0x366 < tileType)*/) {
+ sub_08008796(this, 3, x + itX, y + itY);
+ } else {
+ SetTile(0x4022, pos, layer);
+ }
+ } else {
+ sub_08008796(this, 3, x + itX, y + itY);
+ }
+ }
+ }
+}
+END_NONMATCH