diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-12 11:46:10 +0100 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2022-02-13 02:30:06 +0100 |
| commit | cea5d6cc1ceba85561bf3f6cda447b18b708406a (patch) | |
| tree | 88abd71d6bb08f8f9063a1d3b59087e70780403f /src/object | |
| parent | d1a2586001ddad7bde47fd37d66f62f6fe2792bf (diff) | |
Decompile FrozenWaterElement
Diffstat (limited to 'src/object')
| -rw-r--r-- | src/object/frozenWaterElement.c | 177 |
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); +} |
