summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-12 11:46:10 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-13 02:30:06 +0100
commitcea5d6cc1ceba85561bf3f6cda447b18b708406a (patch)
tree88abd71d6bb08f8f9063a1d3b59087e70780403f /src/object
parentd1a2586001ddad7bde47fd37d66f62f6fe2792bf (diff)
Decompile FrozenWaterElement
Diffstat (limited to 'src/object')
-rw-r--r--src/object/frozenWaterElement.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/src/object/frozenWaterElement.c b/src/object/frozenWaterElement.c
new file mode 100644
index 00000000..f4c5964f
--- /dev/null
+++ b/src/object/frozenWaterElement.c
@@ -0,0 +1,177 @@
+/**
+ * @file frozenWaterElement.c
+ * @ingroup Objects
+ *
+ * @brief Frozen Water Element object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u8 unk_68[0xc];
+ /*0x74*/ u16 unk_74;
+ /*0x76*/ u8 unk_76[0xa];
+ /*0x80*/ u16 unk_80;
+ /*0x82*/ u16 unk_82;
+} FrozenWaterElementEntity;
+
+void sub_0809C0A8(FrozenWaterElementEntity*);
+void sub_0809C23C(FrozenWaterElementEntity*);
+void sub_0809BECC(FrozenWaterElementEntity*);
+void sub_0809BF1C(FrozenWaterElementEntity*);
+void sub_0809BF74(FrozenWaterElementEntity*);
+
+void FrozenWaterElement(FrozenWaterElementEntity* this) {
+ static void (*const gUnk_08123DB4[])(FrozenWaterElementEntity*) = {
+ sub_0809BECC,
+ sub_0809BF1C,
+ sub_0809BF74,
+ };
+ gUnk_08123DB4[super->action](this);
+}
+
+void sub_0809BECC(FrozenWaterElementEntity* this) {
+ Entity* obj;
+ if (CheckFlags(0x9b)) {
+ DeleteThisEntity();
+ }
+ obj = CreateObject(OBJECT_91, 0, 0);
+ super->child = obj;
+ if (obj != NULL) {
+ super->action = 1;
+ super->updatePriority = 3;
+ super->frameIndex = 0;
+ super->spriteRendering.b0 = 3;
+ sub_0809C0A8(this);
+ sub_0805EC9C(super, 0xcc, 0xcc, 0);
+ }
+}
+
+void sub_0809BF1C(FrozenWaterElementEntity* this) {
+ sub_0805EC9C(super, 0xcc, 0xcc, 0);
+ if (CheckFlags(OUGONTEKI_G)) {
+ Entity* obj = CreateObject(OBJECT_90, 0, 0);
+ if (obj != NULL) {
+ gRoomControls.camera_target = obj;
+ (super->child)->child = obj;
+ PositionRelative(super, obj, 0, 0x40000);
+ super->action = 2;
+ this->unk_74 = 0x140;
+ EnqueueSFX(SFX_ICE_BLOCK_MELT);
+ }
+ }
+}
+
+void sub_0809BF74(FrozenWaterElementEntity* this) {
+ static const u8 gUnk_08123DC0[] = {
+ 3, 7, 15, 31, 63, 63, 63, 63, 63, 63, 63, 0,
+ };
+ s32 rand;
+ u32 value;
+ Entity* effect;
+ s32 tmp;
+ s32 tmp2;
+
+ if (--this->unk_74 == 0) {
+ (super->child)->field_0xf = 1;
+ sub_0809C23C(this);
+ CheckFlags(0x9b);
+ DeleteThisEntity();
+ } else {
+ if ((this->unk_74 & 0x1f) == 0) {
+ EnqueueSFX(SFX_ICE_BLOCK_MELT);
+ }
+ if (this->unk_74 < 0x78) {
+ tmp2 = ((0x78 - this->unk_74) << 5);
+ tmp2 += 0xcc;
+ sub_0805EC9C(super, ((0x78 - this->unk_74) << 4) + 0xcc, tmp2, 0);
+ sub_0806FCF4(super, tmp2, 8, 0);
+ super->spriteOffsetY += 8;
+ }
+ value = gUnk_08123DC0[this->unk_74 >> 5];
+ effect = CreateObject(SPECIAL_FX, 0x11, 0x40);
+ if (effect != NULL) {
+ rand = Random();
+ tmp = (((rand >> 0x10) & value) - ((value + 1) >> 1));
+ tmp2 = (((value >> 1) & rand) - ((value + 1) >> 2));
+ effect->spritePriority.b0 = 3;
+ effect->x.HALF.HI = this->unk_80 + gRoomControls.origin_x + tmp;
+ effect->y.HALF.HI = this->unk_82 + gRoomControls.origin_y + tmp2;
+ }
+ effect = CreateObject(SPECIAL_FX, 2, 0x40);
+ if (effect != NULL) {
+ rand = Random();
+ tmp = (((rand >> 0x10) & value) - ((value + 1) >> 1));
+ tmp2 = ((value >> 1) & rand);
+ effect->spritePriority.b0 = 3;
+ effect->x.HALF.HI = this->unk_80 + gRoomControls.origin_x + tmp;
+ effect->y.HALF.HI = this->unk_82 + gRoomControls.origin_y + tmp2;
+ }
+ }
+}
+
+void sub_0809C0A8(FrozenWaterElementEntity* this) {
+ u32 position = COORD_TO_TILE(super);
+ SetTile(0x4022, position - 0x41, super->collisionLayer);
+ SetTile(0x4022, position - 0x40, super->collisionLayer);
+ SetTile(0x4022, position - 0x3f, super->collisionLayer);
+ SetTile(0x4022, position - 2, super->collisionLayer);
+ SetTile(0x4022, position - 1, super->collisionLayer);
+ SetTile(0x4022, position, super->collisionLayer);
+ SetTile(0x4022, position + 1, super->collisionLayer);
+ SetTile(0x4022, position + 2, super->collisionLayer);
+ SetTile(0x4022, position + 0x3e, super->collisionLayer);
+ SetTile(0x4022, position + 0x3f, super->collisionLayer);
+ SetTile(0x4022, position + 0x40, super->collisionLayer);
+ SetTile(0x4022, position + 0x41, super->collisionLayer);
+ SetTile(0x4022, position + 0x42, super->collisionLayer);
+ SetTile(0x4022, position + 0x7f, super->collisionLayer);
+ SetTile(0x4022, position + 0x80, super->collisionLayer);
+ SetTile(0x4022, position + 0x81, super->collisionLayer);
+ SetTile(0x4022, position + 0x13f, super->collisionLayer);
+ SetTile(0x4022, position + 0x140, super->collisionLayer);
+ SetTile(0x4022, position + 0x141, super->collisionLayer);
+ SetTile(0x4022, position + 0x17f, super->collisionLayer);
+ SetTile(0x4022, position + 0x181, super->collisionLayer);
+ SetTile(0x4022, position + 0x1bd, super->collisionLayer);
+ SetTile(0x4022, position + 0x1be, super->collisionLayer);
+ SetTile(0x4022, position + 0x1bf, super->collisionLayer);
+ SetTile(0x4022, position + 0x1c1, super->collisionLayer);
+ SetTile(0x4022, position + 0x1c2, super->collisionLayer);
+ SetTile(0x4022, position + 0x1c3, super->collisionLayer);
+}
+
+void sub_0809C23C(FrozenWaterElementEntity* this) {
+ u32 position = COORD_TO_TILE(super);
+ sub_0807BA8C(position - 0x41, super->collisionLayer);
+ sub_0807BA8C(position - 0x40, super->collisionLayer);
+ sub_0807BA8C(position - 0x3f, super->collisionLayer);
+ sub_0807BA8C(position - 2, super->collisionLayer);
+ sub_0807BA8C(position - 1, super->collisionLayer);
+ sub_0807BA8C(position, super->collisionLayer);
+ sub_0807BA8C(position + 1, super->collisionLayer);
+ sub_0807BA8C(position + 2, super->collisionLayer);
+ sub_0807BA8C(position + 0x3e, super->collisionLayer);
+ sub_0807BA8C(position + 0x3f, super->collisionLayer);
+ sub_0807BA8C(position + 0x40, super->collisionLayer);
+ sub_0807BA8C(position + 0x41, super->collisionLayer);
+ sub_0807BA8C(position + 0x42, super->collisionLayer);
+ sub_0807BA8C(position + 0x7f, super->collisionLayer);
+ sub_0807BA8C(position + 0x80, super->collisionLayer);
+ sub_0807BA8C(position + 0x81, super->collisionLayer);
+ sub_0807BA8C(position + 0x13f, super->collisionLayer);
+ sub_0807BA8C(position + 0x140, super->collisionLayer);
+ sub_0807BA8C(position + 0x141, super->collisionLayer);
+ sub_0807BA8C(position + 0x17f, super->collisionLayer);
+ sub_0807BA8C(position + 0x181, super->collisionLayer);
+ sub_0807BA8C(position + 0x1bd, super->collisionLayer);
+ sub_0807BA8C(position + 0x1be, super->collisionLayer);
+ sub_0807BA8C(position + 0x1bf, super->collisionLayer);
+ sub_0807BA8C(position + 0x1c1, super->collisionLayer);
+ sub_0807BA8C(position + 0x1c2, super->collisionLayer);
+ sub_0807BA8C(position + 0x1c3, super->collisionLayer);
+}