summaryrefslogtreecommitdiff
path: root/src
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
parent97164d57cdbab0455d110cf811d6ae5254ceb871 (diff)
Decompile PushableLever
Diffstat (limited to 'src')
-rw-r--r--src/enemy/businessScrub.c3
-rw-r--r--src/enemy/doorMimic.c3
-rw-r--r--src/enemy/fallingBoulder.c3
-rw-r--r--src/enemy/flyingSkull.c5
-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
-rw-r--r--src/player.c3
12 files changed, 165 insertions, 28 deletions
diff --git a/src/enemy/businessScrub.c b/src/enemy/businessScrub.c
index eb1bb1e1..5a4bb18a 100644
--- a/src/enemy/businessScrub.c
+++ b/src/enemy/businessScrub.c
@@ -18,7 +18,6 @@ bool32 sub_0802915C(Entity*);
bool32 sub_080291DC(Entity*);
void sub_0802922C(Entity*);
void sub_08028E9C(Entity*);
-u32 sub_080001DA(u32, u32);
void sub_08028FFC(Entity*);
void sub_0802925C(Entity*);
void sub_080290E0(Entity*, u32);
@@ -90,7 +89,7 @@ void sub_08028994(Entity* this) {
} else {
this->actionDelay = 0;
this->field_0x76.HWORD = COORD_TO_TILE(this);
- this->field_0x74.HWORD = sub_080001DA(this->field_0x76.HWORD, this->collisionLayer);
+ this->field_0x74.HWORD = GetTileIndex(this->field_0x76.HWORD, this->collisionLayer);
this->hurtType = 0x41;
sub_08028FFC(this);
}
diff --git a/src/enemy/doorMimic.c b/src/enemy/doorMimic.c
index bcb1e1af..f1187330 100644
--- a/src/enemy/doorMimic.c
+++ b/src/enemy/doorMimic.c
@@ -9,7 +9,6 @@
#include "enemy.h"
#include "functions.h"
-extern s16 sub_080001DA(u32, u32); // ?
extern void sub_08049CF4(Entity*);
void sub_080221C0(Entity*);
@@ -118,7 +117,7 @@ void sub_08022198(Entity* this) {
void sub_080221C0(Entity* this) {
u32 tile = COORD_TO_TILE(this) + gUnk_080B4488[this->type2];
this->field_0x7c.HALF.HI = tile;
- this->field_0x7c.HALF.LO = sub_080001DA(tile, this->collisionLayer);
+ this->field_0x7c.HALF.LO = GetTileIndex(tile, this->collisionLayer);
SetTile(gUnk_080CB79C[this->type2], tile, this->collisionLayer);
}
diff --git a/src/enemy/fallingBoulder.c b/src/enemy/fallingBoulder.c
index a9dfc7d6..3e81632d 100644
--- a/src/enemy/fallingBoulder.c
+++ b/src/enemy/fallingBoulder.c
@@ -137,14 +137,13 @@ void nullsub_148(Entity* this) {
/* ... */
}
-extern u32 sub_080001DA(u32, u32);
void sub_0802C4B0(Entity* this) {
u32 offset;
u32 index;
u32 rand;
- switch (sub_080001DA(this->field_0x7c.HALF_U.HI, this->collisionLayer)) {
+ switch (GetTileIndex(this->field_0x7c.HALF_U.HI, this->collisionLayer)) {
case 0x1ab ... 0x1af:
offset = 8;
break;
diff --git a/src/enemy/flyingSkull.c b/src/enemy/flyingSkull.c
index b7ce400a..adf57523 100644
--- a/src/enemy/flyingSkull.c
+++ b/src/enemy/flyingSkull.c
@@ -21,7 +21,6 @@ void (*const gUnk_080CFBD4[])(FlyingSkullEntity*);
const s8 gUnk_080CFBE4[4];
extern s32 sub_080012DC(Entity*);
-extern u32 sub_080001DA(u32, u32);
extern void sub_08078930(Entity*);
void sub_0803A100(FlyingSkullEntity* this);
@@ -118,7 +117,7 @@ void sub_08039D74(FlyingSkullEntity* this) {
super->y.HALF.HI += 3;
tmp = COORD_TO_TILE(super);
- this->unk_0x74 = sub_080001DA(tmp, super->collisionLayer);
+ this->unk_0x74 = GetTileIndex(tmp, super->collisionLayer);
SetTile(0x4060, tmp, super->collisionLayer);
InitializeAnimation(super, 0);
}
@@ -246,7 +245,7 @@ void sub_0803A0E0(FlyingSkullEntity* this) {
void sub_0803A100(FlyingSkullEntity* this) {
u32 tile = COORD_TO_TILE(super);
- if (sub_080001DA(tile, super->collisionLayer) == 0x4067) {
+ if (GetTileIndex(tile, super->collisionLayer) == 0x4067) {
SetTile(this->unk_0x74, tile, super->collisionLayer);
DeleteThisEntity();
}
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
diff --git a/src/player.c b/src/player.c
index 09e83b77..f1bb7fd4 100644
--- a/src/player.c
+++ b/src/player.c
@@ -281,7 +281,6 @@ extern u32 sub_080797C4(void);
extern void sub_0800892E(Entity*);
extern void sub_08078F24(void);
extern void sub_0807B068(Entity*);
-extern u32 sub_080001DA(u32, u32);
extern u32 sub_0807A2F8(u32);
extern u32 sub_0806F730(Entity*);
extern u32 sub_08007DD6(u32, const u16*);
@@ -2155,7 +2154,7 @@ static void PlayerInHoleInit(Entity* this) {
gPlayerState.animation = 0x950;
} else {
gPlayerState.animation = 0x61c;
- if (sub_080001DA(COORD_TO_TILE(this), this->collisionLayer) == 0x4020) {
+ if (GetTileIndex(COORD_TO_TILE(this), this->collisionLayer) == 0x4020) {
this->actionDelay = 1;
}
}