summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-01-24 18:41:48 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-01-24 18:41:48 +0100
commitc7c6c6010c058dc4191daaf5fde446451f88484d (patch)
tree5fdb9bfc2a2ad3bfb951e59a3a4cbe1f4d3dc03a /src/object
parent97164d57cdbab0455d110cf811d6ae5254ceb871 (diff)
Decompile PushableLever
Diffstat (limited to 'src/object')
-rw-r--r--src/object/button.c5
-rw-r--r--src/object/furniture.c3
-rw-r--r--src/object/lockedDoor.c3
-rw-r--r--src/object/mask.c5
-rw-r--r--src/object/metalDoor.c7
-rw-r--r--src/object/pot.c5
-rw-r--r--src/object/pushableLever.c148
7 files changed, 159 insertions, 17 deletions
diff --git a/src/object/button.c b/src/object/button.c
index 316f7608..3cc892d5 100644
--- a/src/object/button.c
+++ b/src/object/button.c
@@ -101,7 +101,6 @@ void sub_08081C98(Entity* this) {
}
Entity* sub_08081D74(Entity*);
-u32 sub_080001DA(u32, u32);
u32 sub_08081CB0(Entity* this) {
u16 tmp;
@@ -114,7 +113,7 @@ u32 sub_08081CB0(Entity* this) {
} else {
tmp = GetTileType(this->field_0x74.HWORD, this->collisionLayer);
if (tmp != 0x77 && tmp != 0x79 && tmp != 0x4035) {
- this->field_0x70.HALF.LO = sub_080001DA(this->field_0x74.HWORD, this->collisionLayer);
+ this->field_0x70.HALF.LO = GetTileIndex(this->field_0x74.HWORD, this->collisionLayer);
return 1;
}
}
@@ -129,7 +128,7 @@ u32 sub_08081D28(Entity* this) {
if (this->field_0x70.HALF_U.LO == 0xFFFF) {
return 0;
}
- if (sub_080001DA(this->field_0x74.HWORD, this->collisionLayer) != this->field_0x70.HALF_U.LO) {
+ if (GetTileIndex(this->field_0x74.HWORD, this->collisionLayer) != this->field_0x70.HALF_U.LO) {
return 0;
}
}
diff --git a/src/object/furniture.c b/src/object/furniture.c
index 05e7f7ca..5683156c 100644
--- a/src/object/furniture.c
+++ b/src/object/furniture.c
@@ -5,7 +5,6 @@
#include "object.h"
extern void sub_080001D0(u32, u32, u32);
-extern u32 sub_080001DA(u32, u32);
enum {
FURNITURE_INIT,
@@ -374,7 +373,7 @@ static void sub_08090B6C(FurnitureEntity* this) {
}
static void sub_08090CDC(u32 id, u32 pos, u32 layer) {
- u16 cur = sub_080001DA(pos, layer);
+ u16 cur = GetTileIndex(pos, layer);
u32 next = cur;
u32 id2;
diff --git a/src/object/lockedDoor.c b/src/object/lockedDoor.c
index 5ebe073f..ddd18056 100644
--- a/src/object/lockedDoor.c
+++ b/src/object/lockedDoor.c
@@ -37,7 +37,6 @@ void LockedDoor(Entity* this) {
extern Hitbox gHitbox_2;
-extern u32 sub_080001DA(u32, u32);
extern void sub_08078850(Entity*, u32, u32, u32);
typedef struct PACKED {
@@ -102,7 +101,7 @@ void sub_08083338(Entity* this) {
this->spritePriority.b0 = 5;
this->frame = this->type & 0xF;
this->field_0x76.HWORD = TILE(this->x.HALF.HI, this->y.HALF.HI);
- this->field_0x74.HWORD = sub_080001DA(this->field_0x76.HWORD, this->collisionLayer);
+ this->field_0x74.HWORD = GetTileIndex(this->field_0x76.HWORD, this->collisionLayer);
switch (this->type2) {
case 0:
if (!CheckFlags(this->field_0x86.HWORD)) {
diff --git a/src/object/mask.c b/src/object/mask.c
index 384c59f4..5d94288f 100644
--- a/src/object/mask.c
+++ b/src/object/mask.c
@@ -4,7 +4,6 @@
extern void (*MaskActionFuncs[])(Entity*);
extern void sub_08000148(u16, u16, u32);
-extern s16 sub_080001DA(u16, u32);
extern void sub_0805457C(Entity*, s32);
@@ -48,8 +47,8 @@ void sub_080929A4(Entity* this) {
this->frameIndex = this->type2 & 0x3f;
- this->field_0x7c.HALF.HI = COORD_TO_TILE(this);
- this->field_0x7c.HALF.LO = sub_080001DA(this->field_0x7c.HALF.HI, 1);
+ this->field_0x7c.HALF_U.HI = COORD_TO_TILE(this);
+ this->field_0x7c.HALF_U.LO = GetTileIndex(this->field_0x7c.HALF_U.HI, 1);
this->field_0x7a.HWORD = sub_080002E0((u16)this->field_0x7c.HALF.HI, 1);
diff --git a/src/object/metalDoor.c b/src/object/metalDoor.c
index ed89d276..b3998104 100644
--- a/src/object/metalDoor.c
+++ b/src/object/metalDoor.c
@@ -10,7 +10,6 @@
extern u32 sub_08083734(Entity*, u32);
extern void sub_080A080C(Entity*);
extern void sub_080A0870(Entity*);
-extern u32 sub_080001DA(u32, u32);
extern void (*const gUnk_0812493C[])(Entity*);
@@ -93,9 +92,9 @@ void sub_080A07F0(Entity* this) {
}
void sub_080A080C(Entity* this) {
- this->field_0x76.HWORD = sub_080001DA(this->field_0x74.HWORD - 1, this->collisionLayer);
- this->field_0x78.HWORD = sub_080001DA(this->field_0x74.HWORD, this->collisionLayer);
- this->field_0x7a.HWORD = sub_080001DA(this->field_0x74.HWORD + 1, this->collisionLayer);
+ this->field_0x76.HWORD = GetTileIndex(this->field_0x74.HWORD - 1, this->collisionLayer);
+ this->field_0x78.HWORD = GetTileIndex(this->field_0x74.HWORD, this->collisionLayer);
+ this->field_0x7a.HWORD = GetTileIndex(this->field_0x74.HWORD + 1, this->collisionLayer);
SetTile(0x4022, this->field_0x74.HWORD - 1, this->collisionLayer);
SetTile(0x4022, this->field_0x74.HWORD, this->collisionLayer);
SetTile(0x4022, this->field_0x74.HWORD + 1, this->collisionLayer);
diff --git a/src/object/pot.c b/src/object/pot.c
index cde45bc6..67b77328 100644
--- a/src/object/pot.c
+++ b/src/object/pot.c
@@ -18,7 +18,6 @@ extern void (*const gUnk_0811F0C4[])(Entity*);
extern Hitbox gHitbox_18; // TODO: should be const
extern Hitbox gUnk_080FD340; // TODO: should be const
-extern u32 sub_080001DA(u32, u32);
extern void sub_08078930(Entity*);
extern void sub_08016A6C(Entity*);
@@ -47,7 +46,7 @@ void sub_0808222C(Entity* this) {
ResolveCollisionLayer(this);
}
- this->field_0x70.HALF.LO = sub_080001DA(COORD_TO_TILE(this), this->collisionLayer);
+ this->field_0x70.HALF.LO = GetTileIndex(COORD_TO_TILE(this), this->collisionLayer);
if ((u16)this->field_0x70.HALF.LO == 0x4000) {
DeleteThisEntity();
}
@@ -188,7 +187,7 @@ void sub_08082614(Entity* this) {
this->speed <<= 1;
}
- this->field_0x70.HALF.LO = sub_080001DA(COORD_TO_TILE(this), this->collisionLayer);
+ this->field_0x70.HALF.LO = GetTileIndex(COORD_TO_TILE(this), this->collisionLayer);
tileType = GetTileTypeByEntity(this);
switch (tileType) {
case 0x71:
diff --git a/src/object/pushableLever.c b/src/object/pushableLever.c
new file mode 100644
index 00000000..503ec5b5
--- /dev/null
+++ b/src/object/pushableLever.c
@@ -0,0 +1,148 @@
+/**
+ * @file pushableLever.c
+ * @ingroup Objects
+ *
+ * @brief Pushable Lever object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u8 unk_68[8];
+ /*0x70*/ u16 tilePosition;
+ /*0x72*/ u16 tileIndex;
+ /*0x74*/ u16 timer;
+ /*0x76*/ u8 unk_76[16];
+ /*0x86*/ u16 pushedFlag;
+} PushableLeverEntity;
+
+enum PushableLeverAction {
+ INIT,
+ IDLE,
+ PUSHING
+};
+
+extern void (*const PushableLever_Actions[])(PushableLeverEntity*);
+extern const u16 PushableLever_Tiles[];
+extern const u8 PushableLever_InitialOffsets[];
+extern const u8 PushableLever_PushedOffsets[];
+
+void PushableLever_SetIdle(PushableLeverEntity*);
+bool32 PushableLever_ShouldStartPushing(PushableLeverEntity* this);
+void PushableLever_SetTiles(PushableLeverEntity*);
+void PushableLever_CalculateSpriteOffsets(PushableLeverEntity*);
+
+#define TILE_INITIAL 0x4053
+#define TILE_PUSHED 0x4052
+
+void PushableLever(PushableLeverEntity* this) {
+ PushableLever_Actions[super->action](this);
+}
+
+void PushableLever_Init(PushableLeverEntity* this) {
+ super->spritePriority.b0 = 5;
+ PushableLever_SetIdle(this);
+}
+
+void PushableLever_Idle(PushableLeverEntity* this) {
+ if (PushableLever_ShouldStartPushing(this)) {
+ super->action = PUSHING;
+ super->spriteOffsetX = 0;
+ super->spriteOffsetY = 0;
+ SetTile(this->tileIndex, this->tilePosition, super->collisionLayer);
+ EnqueueSFX(SFX_16A);
+ RequestPriorityDuration(super, 0x1e);
+ if (sub_08079F8C()) {
+ gPlayerState.pushedObject = 0x90;
+ gPlayerState.queued_action = 5;
+ gPlayerState.flags |= 1;
+ gPlayerEntity.x.HALF.LO = 0;
+ gPlayerEntity.y.HALF.LO = 0;
+ gPlayerEntity.direction = gPlayerEntity.animationState << 2;
+ }
+ }
+}
+
+void PushableLever_Pushing(PushableLeverEntity* this) {
+ GetNextFrame(super);
+ if ((super->frame & 0x80) != 0) {
+ if (super->type2 == 0) {
+ SetFlag(this->pushedFlag);
+ } else {
+ ClearFlag(this->pushedFlag);
+ }
+ PushableLever_SetIdle(this);
+ }
+}
+
+void PushableLever_SetIdle(PushableLeverEntity* this) {
+ super->action = IDLE;
+ this->timer = 0x3c;
+ PushableLever_SetTiles(this);
+}
+
+void PushableLever_SetTiles(PushableLeverEntity* this) {
+ if (CheckFlags(this->pushedFlag) == FALSE) {
+ super->type2 = 0;
+ this->tilePosition = COORD_TO_TILE_OFFSET(super, 0, 0x10);
+ this->tileIndex = GetTileIndex(this->tilePosition, super->collisionLayer);
+ SetTile(TILE_INITIAL, this->tilePosition, super->collisionLayer);
+ InitializeAnimation(super, 1);
+ } else {
+ super->type2 = 1;
+ this->tilePosition = COORD_TO_TILE_OFFSET(super, 0x10, 0);
+ this->tileIndex = GetTileIndex(this->tilePosition, super->collisionLayer);
+ SetTile(TILE_PUSHED, this->tilePosition, super->collisionLayer);
+ InitializeAnimation(super, 0);
+ }
+}
+
+bool32 PushableLever_ShouldStartPushing(PushableLeverEntity* this) {
+ if (GetTileIndex(this->tilePosition, super->collisionLayer) == 0x4054) {
+ if (--this->timer == 0) {
+ return TRUE;
+ }
+ PushableLever_CalculateSpriteOffsets(this);
+ SetTile(PushableLever_Tiles[super->type2], this->tilePosition, super->collisionLayer);
+ } else {
+ this->timer = 0x3c;
+ super->spriteOffsetX = 0;
+ super->spriteOffsetY = 0;
+ }
+ return FALSE;
+}
+
+void PushableLever_CalculateSpriteOffsets(PushableLeverEntity* this) {
+ const u8* offsets;
+ if (super->type2 == 0) {
+ offsets = PushableLever_InitialOffsets;
+ } else {
+ offsets = PushableLever_PushedOffsets;
+ }
+ offsets = &offsets[(this->timer / 4) & 6];
+ super->spriteOffsetX = offsets[0];
+ super->spriteOffsetY = offsets[1];
+ if ((this->timer & 3) == 0) {
+ EnqueueSFX(SFX_104);
+ }
+}
+
+void (*const PushableLever_Actions[])(PushableLeverEntity*) = {
+ PushableLever_Init,
+ PushableLever_Idle,
+ PushableLever_Pushing,
+};
+const u16 PushableLever_Tiles[] = {
+ TILE_INITIAL,
+ TILE_PUSHED,
+};
+const u8 PushableLever_InitialOffsets[] = {
+ 0, 0, 0, 0, 255, 0, 0, 0,
+};
+const u8 PushableLever_PushedOffsets[] = {
+ 0, 0, 0, 0, 0, 255, 0, 0,
+}; \ No newline at end of file