summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
Diffstat (limited to 'src/object')
-rw-r--r--src/object/backgroundCloud.c2
-rw-r--r--src/object/bigVortex.c111
-rw-r--r--src/object/bird.c144
-rw-r--r--src/object/button.c286
-rw-r--r--src/object/cloud.c9
-rw-r--r--src/object/fan.c4
-rw-r--r--src/object/floatingBlock.c13
-rw-r--r--src/object/greatFairy.c8
-rw-r--r--src/object/heartContainer.c6
-rw-r--r--src/object/hiddenLadderDown.c44
-rwxr-xr-xsrc/object/itemOnGround.c442
-rw-r--r--src/object/jailBars.c4
-rw-r--r--src/object/lightableSwitch.c20
-rw-r--r--src/object/mask.c10
-rw-r--r--src/object/metalDoor.c6
-rw-r--r--src/object/minecart.c2
-rw-r--r--src/object/mineralWaterSource.c4
-rw-r--r--src/object/minishSizedEntrance.c1
-rw-r--r--src/object/object1A.c12
-rw-r--r--src/object/object2A.c4
-rw-r--r--src/object/object49.c8
-rw-r--r--src/object/object86.c1
-rw-r--r--src/object/object9E.c1
-rw-r--r--src/object/objectA.c6
-rw-r--r--src/object/objectA8.c2
-rw-r--r--src/object/objectAF.c2
-rw-r--r--src/object/objectB2.c52
-rw-r--r--src/object/pinwheel.c43
-rwxr-xr-xsrc/object/pot.c10
-rw-r--r--src/object/railtrack.c82
-rw-r--r--src/object/smoke.c4
-rw-r--r--src/object/treeHidingPortal.c8
32 files changed, 1201 insertions, 150 deletions
diff --git a/src/object/backgroundCloud.c b/src/object/backgroundCloud.c
index a6106ca7..6be23764 100644
--- a/src/object/backgroundCloud.c
+++ b/src/object/backgroundCloud.c
@@ -20,7 +20,7 @@ void sub_0808F658(Entity* this) {
this->direction = 8;
this->nonPlanarMovement = gUnk_08121EB0[(this->entityType).form];
this->field_0x78.HWORD = gRoomControls.roomOriginX - 0x60;
- this->field_0x7a.HWORD = gRoomControls.roomOriginX + gRoomControls.filler2[3] + 0x60;
+ this->field_0x7a.HWORD = gRoomControls.roomOriginX + gRoomControls.width + 0x60;
this->animationState = 0;
this->x.HALF.HI += (Random() & 0xf) << 4;
this->actionDelay = 0;
diff --git a/src/object/bigVortex.c b/src/object/bigVortex.c
new file mode 100644
index 00000000..8e8522c0
--- /dev/null
+++ b/src/object/bigVortex.c
@@ -0,0 +1,111 @@
+#include "global.h"
+#include "entity.h"
+#include "functions.h"
+#include "flags.h"
+
+extern void sub_08098E3C(Entity*);
+extern void sub_08098E88(Entity*);
+
+extern void (*const gUnk_0812367C[])(Entity*);
+
+extern u16 gUnk_08123690[];
+
+void BigVortex(Entity* this) {
+ if ((this->entityType).form == 0) {
+ gUnk_0812367C[this->action](this);
+ } else {
+ sub_08098E3C(this);
+ }
+}
+
+void sub_08098D1C(Entity* this) {
+ u32 temp;
+ this->action = 1;
+ this->height.HALF.HI = -0x10;
+
+ temp = this->field_0x86.HWORD;
+
+ if ((temp != 0) && !CheckFlags(temp)) {
+ this->action = 1;
+ } else {
+ this->action = 3;
+ this->spriteSettings.b.draw = TRUE;
+ sub_08098E88(this);
+ }
+ sub_0805E3A0(this, 6);
+ InitAnimationForceUpdate(this, 0);
+}
+
+void sub_08098D6C(Entity* this) {
+ Entity* ent;
+
+ if (CheckFlags(this->field_0x86.HWORD)) {
+ this->action = 2;
+ this->actionDelay = 0x2d;
+ ent = CreateFx(this, 0x43, 0);
+ if (ent != NULL) {
+ ent->y.HALF.HI += 8;
+ }
+ }
+}
+
+void sub_08098D9C(Entity* this) {
+ if (--this->actionDelay == 0) {
+ this->action = 3;
+ this->spriteSettings.b.draw = TRUE;
+ sub_08098E88(this);
+ }
+}
+
+void sub_08098DC4(Entity* this) {
+
+ if (sub_0800419C(this, &gPlayerEntity, 8, 8) != 0) {
+ CopyPosition(this, &gPlayerEntity);
+ sub_08004542(this);
+ sub_08004542(&gPlayerEntity);
+ gPlayerEntity.collisionLayer = 1;
+ ResolveEntityOnTop(this, &gPlayerEntity);
+ gPlayerState.playerAction = 0x1f;
+ gPlayerState.field_0x34[4] = 1;
+ gPlayerState.field_0x34[5] = this->entityType.parameter;
+ this->action = 4;
+ if (this->entityType.parameter == 1) {
+ SetGlobalFlag(0x23);
+ }
+ sub_08077B20();
+ }
+ UpdateAnimationSingleFrame(this);
+}
+
+void sub_08098E34(Entity* this) {
+ UpdateAnimationSingleFrame(this);
+}
+
+void sub_08098E3C(Entity* this) {
+ u16* temp;
+
+ if (this->action == 0) {
+ this->action = 1;
+ this->spriteSettings.b.draw = TRUE;
+ InitAnimationForceUpdate(this, this->entityType.form);
+ }
+ temp = &gUnk_08123690[this->entityType.form & 2];
+ sub_0805EC9C(this, temp[0], temp[1], 0);
+ UpdateAnimationSingleFrame(this);
+}
+
+void sub_08098E88(Entity* this) {
+ Entity* ent1;
+ Entity* ent2;
+
+ ent1 = CreateObject(0x82, 1, 0);
+ if (ent1 != NULL) {
+ PositionRelative(this, ent1, 0, -0x10000);
+ ent1->spriteOffsetY = 8;
+ }
+ ent2 = CreateObject(0x82, 2, 0);
+ if (ent2 != NULL) {
+ PositionRelative(this, ent2, 0, -0x20000);
+ ent2->spriteOffsetY = 0x10;
+ }
+} \ No newline at end of file
diff --git a/src/object/bird.c b/src/object/bird.c
new file mode 100644
index 00000000..83af1b5d
--- /dev/null
+++ b/src/object/bird.c
@@ -0,0 +1,144 @@
+#include "global.h"
+#include "entity.h"
+#include "flags.h"
+#include "functions.h"
+
+extern void (*const gUnk_08123EC0[])(Entity*);
+extern void (*const gUnk_08123EEC[])(Entity*);
+extern void (*const gUnk_08123EF4[])(Entity*);
+extern void (*const gUnk_08123EFC[])(Entity*);
+extern void (*const gUnk_08123F04[])(Entity*);
+
+void Bird(Entity* this) {
+ gUnk_08123EC0[this->entityType.form](this);
+}
+
+void sub_0809CF3C(Entity* this) {
+ gUnk_08123EEC[this->action](this);
+}
+
+void sub_0809CF54(Entity* this) {
+ Entity* target;
+
+ this->action++;
+ this->spriteSettings.b.draw = TRUE;
+ this->actionDelay = 0x31;
+ this->field_0xf = 1;
+ this->field_0x20 = -0x18000;
+ this->height.WORD = -0x38C000;
+ this->field_0x68.HWORD = -0x800;
+ this->nonPlanarMovement = 0x280;
+ this->direction = 8;
+ this->collisionLayer = 2;
+ this->x.HALF.HI = gRoomControls.roomScrollX;
+ PlaySFX(0x123);
+ UpdateSpriteForCollisionLayer(this);
+ InitAnimationForceUpdate(this, 0);
+ target = CreateObject(0x95, 1, 0);
+ if (target != NULL) {
+ target->parent = this;
+ PositionRelative(this, target, 0, 0x80000);
+ ResolveEntityOnTop(this, target);
+ }
+}
+
+void sub_0809CFEC(Entity* this) {
+
+ sub_0806F69C(this);
+ sub_08003FC4(this, *(s16*)&this->field_0x68.HWORD);
+ if (this->actionDelay != 0) {
+ if (--this->actionDelay == 0) {
+ this->field_0xf = 0;
+ }
+ } else if (sub_080040A8(this) == 0) {
+ DeleteThisEntity();
+ }
+ UpdateAnimationSingleFrame(this);
+}
+
+void sub_0809D030(Entity* this) {
+ gUnk_08123EF4[this->action](this);
+}
+
+void sub_0809D048(Entity* this) {
+ this->action++;
+ this->collisionLayer = 1;
+ UpdateSpriteForCollisionLayer(this);
+ InitAnimationForceUpdate(this, 0x17);
+}
+
+void sub_0809D06C(Entity* this) {
+ gUnk_08123EFC[this->previousActionFlag](this);
+}
+
+void sub_0809D084(Entity* this) {
+ u32 temp;
+
+ if (this->parent != NULL) {
+ temp = this->parent->field_0xf;
+ if (temp != 0) {
+ PositionRelative(this->parent, this, 0, 0x80000);
+ } else {
+ this->previousActionFlag++;
+ this->field_0x20 = temp;
+ }
+ }
+}
+
+void sub_0809D0AC(Entity* this) {
+ Entity* fx;
+
+ if (sub_080044EC(this, 0x1800) < 2) {
+ (this->entityType).form = 2;
+ this->action = 1;
+ this->height.WORD = 0;
+ this->collisionLayer = 1;
+ SetLocalFlag(0x45);
+ PlaySFX(0x72);
+ fx = CreateFx(this, 0x11, 0);
+ if (fx != NULL) {
+ sub_0806FAD8(this, fx);
+ }
+ }
+}
+
+void sub_0809D0F4(Entity* this) {
+ gUnk_08123F04[this->action](this);
+}
+
+void sub_0809D10C(Entity* this) {
+ this->action++;
+ this->collisionLayer = 1;
+ UpdateSpriteForCollisionLayer(this);
+ InitAnimationForceUpdate(this, 0x17);
+}
+
+void sub_0809D130(Entity* this) {
+ if ((gPlayerState.flags.all & 0x80) != 0) {
+ sub_0800445C(this);
+ } else if (sub_08017850(this) != 0) {
+ CreateItemEntity(0x17, 0, 0);
+ gUnk_02002A40.windcrests |= 0x10000000;
+ DeleteThisEntity();
+ }
+}
+
+void sub_0809D178(Entity* this) {
+
+ if (this->action == 0) {
+ this->action++;
+ this->collisionLayer = 2;
+ UpdateSpriteForCollisionLayer(this);
+ this->frames.all = 0x80;
+ }
+ if ((this->frames.all & 0x80) != 0) {
+ InitializeAnimation(this, Random() & 3);
+ this->frameDuration = (Random() & 0xf) + 0x10;
+ this->spriteSettings.b.flipX = FALSE;
+ if ((Random() & 1) != 0) {
+ this->spriteSettings.b.flipX = TRUE;
+ }
+ } else {
+ GetNextFrame(this);
+ }
+} \ No newline at end of file
diff --git a/src/object/button.c b/src/object/button.c
new file mode 100644
index 00000000..99d018b3
--- /dev/null
+++ b/src/object/button.c
@@ -0,0 +1,286 @@
+#include "global.h"
+#include "entity.h"
+#include "flags.h"
+#include "room.h"
+#include "functions.h"
+
+extern void (*const gUnk_0811EE38[])(Entity*);
+
+void Button(Entity* this) {
+ gUnk_0811EE38[this->action](this);
+}
+
+extern u32 sub_08081E3C(Entity*);
+
+void sub_08081AE0(Entity* this) {
+ this->flags &= 0x7F;
+ this->scriptedScene = 3;
+ this->y.HALF.HI++;
+ if (this->cutsceneBeh.HWORD != 0) {
+ this->collisionLayer = this->cutsceneBeh.HWORD;
+ }
+ this->field_0x74.HWORD = (((this->x.HALF.HI - gRoomControls.roomOriginX)>>4) & 0x3F) |
+ ((((this->y.HALF.HI - gRoomControls.roomOriginY)>>4) & 0x3F) << 6);
+ this->field_0x70.HALF.HI = GetTileType(this->field_0x74.HWORD, this->collisionLayer);
+ if (this->entityType.form == 0 && CheckFlags(this->field_0x86.HWORD)) {
+ this->action = 5;
+ SetTileType(0x7A, this->field_0x74.HWORD, this->collisionLayer);
+ } else {
+ if (sub_08081E3C(this)) {
+ this->action = 2;
+ } else {
+ this->action = 1;
+ }
+ }
+}
+
+void sub_08081B84(Entity* this) {
+ if (sub_08081E3C(this)) {
+ this->action=2;
+ this->field_0x70.HALF.HI = GetTileType(this->field_0x74.HWORD, this->collisionLayer);
+ }
+}
+
+u32 sub_08081CB0(Entity*);
+void sub_0805E4E0(Entity*, u32);
+void sub_08081FF8(Entity*);
+
+void sub_08081BAC(Entity* this) {
+ if (sub_08081CB0(this)) {
+ this->previousActionFlag = 0;
+ this->actionDelay = 0xA;
+ sub_0805E4E0(this, 0xA);
+ sub_08081FF8(this);
+ if (this->entityType.form == 1) {
+ this->action = 3;
+ } else {
+ this->action = 5;
+ }
+ }
+}
+
+u32 sub_08081F7C(Entity*, u32);
+u32 sub_08081D28(Entity*);
+void sub_08081E6C(Entity*);
+
+void sub_08081BE0(Entity* this) {
+ if (!sub_08081F7C(this, 0x78))
+ return;
+ if (!sub_08081D28(this)) {
+ this->action = 4;
+ this->field_0xf = 1;
+ if ((gPlayerState.heldObject == 2) || (!(gPlayerState.field_0x34[1] & 0x80))) {
+ this->actionDelay = 0x18;
+ } else {
+ this->actionDelay = 0x8;
+ }
+ } else {
+ sub_08081E6C(this);
+ }
+}
+
+void sub_08081C30(Entity* this) {
+ if (this->actionDelay != 0) {
+ this->actionDelay--;
+ if (this->field_0xf != 0) {
+ this->field_0xf = 0;
+ SetTile(0x4035, this->field_0x74.HWORD, this->collisionLayer);
+ }
+ if (sub_08081CB0(this)) {
+ this->action = 3;
+ this->actionDelay = 0;
+ }
+ } else {
+ this->action = 2;
+ ClearFlag(this->field_0x86.HWORD);
+ SetTileType(0x77, this->field_0x74.HWORD, this->collisionLayer);
+ PlaySFX(0x10C);
+ }
+}
+
+void sub_08081C98(Entity* this) {
+ if (sub_08081F7C(this, 0x7a)) {
+ sub_08081E6C(this);
+ }
+}
+
+Entity* sub_08081D74(Entity*);
+void sub_0807B7D8(u32, u32, u32);
+u32 sub_080001DA(u32, u32);
+
+u32 sub_08081CB0(Entity* this) {
+ u16 tmp;
+ if (sub_08081D74(this)) {
+ this->field_0x70.HALF.LO = -1;
+ if (GetTileType(this->field_0x74.HWORD, this->collisionLayer) == 0x4035) {
+ sub_0807B7D8(0x78, this->field_0x74.HWORD, this->collisionLayer);
+ }
+ return 1;
+ } 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);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+u32 sub_08081D28(Entity* this) {
+ if (sub_08081D74(this)) {
+ this->field_0x70.HALF_U.LO = 0xFFFF;
+ return 1;
+ } else {
+ 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) {
+ return 0;
+ }
+ }
+ return 1;
+}
+
+extern u32 sub_080002E0(u32, u32);
+extern Entity* gUnk_03004040[];
+extern u32 sub_080041A0(Entity*, Entity*, u32, u32);
+u32 sub_08081E0C(Entity*);
+
+Entity* sub_08081D74(Entity* this) {
+ Entity* ent;
+ if (sub_080002E0(this->field_0x74.HWORD, this->collisionLayer) == 0xF) {
+ return 0;
+ }
+ ent = 0;
+ if (sub_08081E0C(this)) {
+ if (!(gPlayerState.flags.all & 0x10) && !(gPlayerState.flags.all & 0x80)) {
+ ent = &gPlayerEntity;
+ }
+ } else {
+ if (gPlayerState.flags.all & 0x400000) {
+ if (sub_080041A0(this, gUnk_03004040[0], 5, 6)) {
+ ent = gUnk_03004040[0];
+ } else if (sub_080041A0(this, gUnk_03004040[1], 5, 6)) {
+ ent = gUnk_03004040[1];
+ } else if (sub_080041A0(this, gUnk_03004040[2], 5, 6)) {
+ ent = gUnk_03004040[2];
+ }
+ }
+ }
+ this->attachedEntity=ent;
+ return ent;
+}
+
+extern u32 sub_08079F8C();
+
+u32 sub_08081E0C(Entity* this) {
+ Entity* tmp = &gPlayerEntity;
+ if (tmp->height.HALF.HI != 0 || !sub_08079F8C()) {
+ return 0;
+ } else {
+ return sub_080041A0(this, tmp, 5, 6);
+ }
+}
+
+extern u16 gUnk_0811EE50[];
+
+u32 sub_08081E3C(Entity* this) {
+ u16* tmp1;
+ int tmp2;
+ tmp2 = GetTileType(this->field_0x74.HWORD, this->collisionLayer);
+ tmp1 = gUnk_0811EE50;
+ do {
+ if (*tmp1 == tmp2) return 1;
+ } while (*++tmp1);
+ return 0;
+}
+
+u32 sub_08081F00(u32*, u32*);
+
+extern u16 gMapDataTopSpecial[0x2000];
+
+#ifdef NON_MATCHING
+void sub_08081E6C(Entity* this) {
+ u32 r4;
+ u16 *tmp, *r1;
+ u8 *tmp2;
+ u32 r6 = this->field_0x74.HWORD;
+ u32 r5 = this->collisionLayer;
+ u32 tile = GetTileType(r6,r5);
+ if (tile < 0x4000)
+ return;
+ r1 = GetLayerByIndex(r5);
+ r4 = (this->entityType.form == 0 ? 0x7a : 0x78);
+ tmp = r1 + 0x3802;
+ r1 += 0x3002 + r4;
+ tmp = tmp + (*r1 << 2);
+ tmp2 = (r5 == 2 ? gMapDataTopSpecial : (u8*)&gUnk_02019EE0);
+ tmp2 += (((0x3f & r6)<<1)+((0xfc0 & r6)<<2))<<1;
+ if (sub_08081F00((u32*)tmp2, (u32*)tmp))
+ return;
+ SetTileType(r4, r6, r5);
+ SetTile(tile,r6,r5);
+}
+#else
+NAKED
+void sub_08081E6C(Entity* this) {
+ asm(".include \"asm/non_matching/button/sub_08081E6C.s\"");
+}
+#endif
+
+u32 sub_08081F00(u32* unk1, u32* unk2) {
+ if (*unk1 != *unk2) return 0;
+ if (unk1[0x40] != unk2[1]) return 0;
+ return 1;
+}
+
+void sub_08081F24(Entity* this) {
+ Entity* fx = CreateFx(this, 0x11, 0x40);
+ if (fx) {
+ fx->scriptedScene = 3;
+ fx->x.HALF.HI += 7;
+ fx->y.HALF.HI += 5;
+ }
+ fx = CreateFx(this, 0x11, 0x40);
+ if (fx) {
+ fx->scriptedScene = 3;
+ fx->x.HALF.HI -= 7;
+ fx->y.HALF.HI += 5;
+ }
+}
+
+u32 sub_08081F7C(Entity* this, u32 r7) {
+ u16 tmp;
+ if (this->actionDelay == 0) return 1;
+ if (--this->actionDelay > 6) {
+ if(this->attachedEntity)
+ this->attachedEntity->spriteOffsetY = 0xfc;
+ } else {
+ if (this->actionDelay == 6) {
+ SetFlag(this->field_0x86.HWORD);
+ SetTileType(r7, this->field_0x74.HWORD, this->collisionLayer);
+ sub_08081F24(this);
+ PlaySFX(0x10C);
+ if (this->field_0x70.HALF_U.LO != 0xFFFF)
+ SetTile(this->field_0x70.HALF_U.LO, this->field_0x74.HWORD, this->collisionLayer);
+ return 0;
+ }
+ }
+ return 1;
+}
+
+extern Entity* gUnk_03004040[3];
+extern void sub_080044AE(Entity*, u32, u32);
+
+void sub_08081FF8(Entity* this) {
+ u32 direction;
+ u32 i;
+ if (this->attachedEntity != &gPlayerEntity) return;
+ direction = GetFacingDirection(this->attachedEntity, this);
+ sub_080044AE(this->attachedEntity, 0x200, direction);
+ for (i = 0; i < 3; i++) {
+ if (gUnk_03004040[i]) {
+ sub_080044AE(gUnk_03004040[i],0x200, direction);
+ }
+ }
+}
diff --git a/src/object/cloud.c b/src/object/cloud.c
index fce592f1..8a133c2e 100644
--- a/src/object/cloud.c
+++ b/src/object/cloud.c
@@ -3,6 +3,7 @@
#include "room.h"
#include "player.h"
#include "flags.h"
+#include "functions.h"
extern void sub_0809F7BC(Entity*);
extern void PlaySFX(u32);
@@ -13,7 +14,6 @@ extern void DeleteThisEntity();
extern u32 CheckRoomFlag(u32);
extern void sub_08078A90(u32);
extern void sub_08078B48(void);
-extern u32 Random(void);
extern void sub_0806F69C(Entity*);
extern void (*gUnk_08124798[])(Entity*);
extern void (*gUnk_081247A0[])(Entity*);
@@ -23,7 +23,6 @@ extern void PositionEntityOnTop(Entity*, Entity*);
extern void sub_0807BB68(u32*, u32, u32);
extern u8 gUnk_02034490;
-extern u32 gScreenTransition;
extern void* gUnk_080DD750;
extern Entity gPlayerEntity;
extern PlayerState gPlayerState;
@@ -62,7 +61,7 @@ void sub_0809F548(Entity* this) {
sub_0809F814((((this->x.HALF.HI - gRoomControls.roomOriginX) >> 4) & 63) |
(((this->y.HALF.HI - gRoomControls.roomOriginY) >> 4) & 63) << 6);
} else {
- if ((gScreenTransition & 7) == 0) {
+ if ((gScreenTransition.frameCount & 7) == 0) {
sub_0809F7BC(this);
}
sub_0809F7F4(this);
@@ -110,7 +109,7 @@ void sub_0809F61C(Entity* this) {
sub_0809F814((((this->x.HALF.HI - gRoomControls.roomOriginX) >> 4) & 63) |
(((this->y.HALF.HI - gRoomControls.roomOriginY) >> 4) & 63) << 6);
} else {
- if ((gScreenTransition & 7) == 0) {
+ if ((gScreenTransition.frameCount & 7) == 0) {
sub_0809F7BC(this);
}
sub_0809F7F4(this);
@@ -145,7 +144,7 @@ void sub_0809F700(Entity* this) {
this->actionDelay = (Random() & 30) + 8;
this->flags = this->flags | 12;
}
- if ((gScreenTransition & 3) == 0) {
+ if ((gScreenTransition.frameCount & 3) == 0) {
uVar2 = Random();
this->spriteOffsetX = gUnk_081247C0[uVar2 & 7];
this->spriteOffsetY = gUnk_081247C0[uVar2 >> 4 & 7];
diff --git a/src/object/fan.c b/src/object/fan.c
index e56beeff..04854f4d 100644
--- a/src/object/fan.c
+++ b/src/object/fan.c
@@ -40,8 +40,8 @@ void sub_0809ED88(Entity *this)
{
sub_0809F08C();
sub_0809EE44(this);
- if (this->field_0x86 != 0) {
- if (this->cutsceneBeh.HWORD == this->field_0x86) {
+ if (this->field_0x86.HWORD != 0) {
+ if (this->cutsceneBeh.HWORD == this->field_0x86.HWORD) {
if (CheckFlags(this->cutsceneBeh.HWORD)) {
return;
}
diff --git a/src/object/floatingBlock.c b/src/object/floatingBlock.c
new file mode 100644
index 00000000..3b865e91
--- /dev/null
+++ b/src/object/floatingBlock.c
@@ -0,0 +1,13 @@
+#include "global.h"
+#include "entity.h"
+#include "functions.h"
+
+void FloatingBlock(Entity* this) {
+ if (this->action == 0) {
+ this->action = 1;
+ this->frameIndex=this->entityType.form;
+ this->spritePriority.b0 = 0xe;
+ this->collisionLayer = 1;
+ UpdateSpriteForCollisionLayer(this);
+ }
+} \ No newline at end of file
diff --git a/src/object/greatFairy.c b/src/object/greatFairy.c
index 9174ab63..16664216 100644
--- a/src/object/greatFairy.c
+++ b/src/object/greatFairy.c
@@ -4,6 +4,7 @@
#include "screen.h"
#include "greatFairy.h"
#include "structures.h"
+#include "functions.h"
enum {
BEHAVIORS,
@@ -550,14 +551,14 @@ void sub_08087424(Entity* arg0, struct_08087424* arg1) {
void sub_0808747C(u32 arg0, u32 arg1) {
u32 iVar1;
- iVar1 = FindEntityInListByForm(0x6, 0xf, 0x6, 0xb, 0x0);
+ iVar1 = (u32)FindEntityInListByForm(0x6, 0xf, 0x6, 0xb, 0x0);
if (iVar1 != 0) {
iVar1 = 1;
}
*(u32*)(arg1 + 0x14) = iVar1;
}
-//clang-format off
+// clang-format off
void (*const GreatFairy_Main[])(Entity*) = {
GreatFairy_CallBehavior,
GreatFairy_WingsCallBehavior,
@@ -647,5 +648,4 @@ void (*const GreatFairy_Form2Behaviors[])(Entity*) = {
sub_08087264,
sub_0808727C
};
-
-//clang-format on
+// clang-format on
diff --git a/src/object/heartContainer.c b/src/object/heartContainer.c
index d55f7171..a2a35887 100644
--- a/src/object/heartContainer.c
+++ b/src/object/heartContainer.c
@@ -5,9 +5,7 @@
extern void DeleteThisEntity();
extern void sub_08080CB4(Entity*);
-extern int sub_08017850(Entity*);
-extern void CreateItemEntity(u32, u32, u32);
-
+extern u32 sub_08017850(Entity*);
static void sub_0808E6A0(Entity*);
static void sub_0808E6E4(Entity*);
static void sub_0808E714(Entity*);
@@ -39,7 +37,7 @@ static void sub_0808E6A0(Entity* this) {
}
static void sub_0808E6E4(Entity* this) {
- if (CheckFlags(this->field_0x86)) {
+ if (CheckFlags(this->field_0x86.HWORD)) {
this->action = 2;
this->spriteSettings.b.draw = 1;
this->spriteRendering.b0 = 3;
diff --git a/src/object/hiddenLadderDown.c b/src/object/hiddenLadderDown.c
new file mode 100644
index 00000000..932018c8
--- /dev/null
+++ b/src/object/hiddenLadderDown.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "entity.h"
+#include "functions.h"
+#include "room.h"
+#include "flags.h"
+
+extern void (*const gUnk_08122604[])(Entity*);
+
+void HiddenLadderDown(Entity* this) {
+ if (this->action < 2) {
+ gUnk_08122604[this->action](this);
+ }
+}
+
+void sub_08091F14(Entity* this) {
+ u16* puVar3;
+
+ this->action = 1;
+ this->spritePriority.b0 = 7;
+ this->animIndex = 0;
+ this->field_0x70.HALF.LO = COORD_TO_TILE(this);
+ puVar3 = &this->field_0x70.HALF.LO;
+ if (CheckFlags(this->field_0x86.HWORD) != 0) {
+ this->action = 2;
+ this->spriteSettings.b.draw = TRUE;
+ SetTileType(0x1a2, *puVar3 - 0x41, this->collisionLayer);
+ SetTileType(0x1a3, *puVar3 - 0x40, this->collisionLayer);
+ SetTileType(0x1a4, *puVar3 - 0x3f, this->collisionLayer);
+ SetTileType(0x1a5, *puVar3 - 1, this->collisionLayer);
+ SetTileType(0x1a6, *puVar3, this->collisionLayer);
+ SetTileType(0x1a7, *puVar3 + 1, this->collisionLayer);
+ SetTileType(0x1a8, *puVar3 + 0x3f, this->collisionLayer);
+ SetTileType(0x1a9, *puVar3 + 0x40, this->collisionLayer);
+ SetTileType(0x1aa, *puVar3 + 0x41, this->collisionLayer);
+ }
+}
+
+void sub_08092000(Entity* this) {
+ if (GetTileType(*(u16*)&this->field_0x70.HALF.LO, this->collisionLayer) == 0x1a6) {
+ this->action = 2;
+ this->spriteSettings.b.draw = TRUE;
+ SetFlag(this->field_0x86.HWORD);
+ }
+} \ No newline at end of file
diff --git a/src/object/itemOnGround.c b/src/object/itemOnGround.c
new file mode 100755
index 00000000..ad8bdec9
--- /dev/null
+++ b/src/object/itemOnGround.c
@@ -0,0 +1,442 @@
+#include "global.h"
+#include "entity.h"
+#include "flags.h"
+#include "functions.h"
+#include "player.h"
+
+static void sub_08081150(Entity*);
+static u8 sub_0808147C(u32);
+static void sub_080814A4(Entity*);
+static u32 sub_080814C0(Entity*);
+static void sub_08081500(Entity*);
+static void sub_0808153C(Entity*);
+static void sub_08081598(Entity*);
+static void sub_080813BC(Entity*);
+static void sub_080810FC(Entity*);
+static bool32 CheckShouldPlayItemGetCutscene(Entity*);
+
+extern u32 sub_080002D0(Entity*);
+extern u32 sub_080177A0(Entity*, Entity*);
+extern void GiveItem(u32, u32);
+extern u32 sub_0805E40C(Entity*);
+
+extern void (*const gUnk_0811E7D4[])(Entity*);
+extern void (*const gUnk_0811E7E8[])(Entity*);
+extern void (*const gUnk_0811E814[])(Entity*);
+extern void (*const gUnk_0811E840[])(Entity*);
+extern BoundingBox gUnk_080FD1A8;
+
+typedef struct {
+ u8 unk0[3];
+ u8 unk3;
+ u8 unk4[4];
+} Unk_080FD5B4;
+
+extern const Unk_080FD5B4 gUnk_080FD5B4[];
+
+typedef struct {
+ u8 unk0[2];
+ u16 sfx;
+ u8 unk4;
+ u8 unk5[3];
+} Unk_0811E84C;
+
+extern const Unk_0811E84C gUnk_0811E84C[];
+
+void ItemOnGround(Entity* this) {
+ if (this->bitfield & 0x80) {
+ switch (this->bitfield & 0x7F) {
+ case 20:
+ this->action = 3;
+ this->flags &= 0x7F;
+ this->spriteSettings.b.draw = 1;
+ this->field_0x3c |= 0x10;
+ this->attachedEntity = this->field_0x4c;
+ break;
+ case 0:
+ case 1:
+ case 4:
+ case 5:
+ case 6:
+ case 8:
+ case 9:
+ case 10:
+ case 11:
+ case 12:
+ case 30:
+ sub_08081598(this);
+ break;
+ }
+ }
+
+ if (sub_0806F520(this)) {
+ sub_080813BC(this);
+ } else {
+ gUnk_0811E7D4[this->action](this);
+ }
+
+ if (this->entityType.form == 0x5C) {
+ gRoomVars.field_0x4++;
+ }
+
+ sub_08080CB4(this);
+}
+
+void sub_08080F20(Entity* this) {
+ if (this->field_0x86.HWORD && CheckFlags(this->field_0x86.HWORD)) {
+ DeleteThisEntity();
+ }
+
+ if (this->entityType.form != 0x60) {
+ this->spriteSettings.b.draw = 1;
+ this->spritePriority.b1 = 3;
+ this->spriteSettings.b.shadow = 0;
+ this->damageType = 7;
+ this->field_0x3c = 0x47;
+ this->field_0x40 = 0x44;
+ this->currentHealth = 0xFF;
+ this->boundingBox = &gUnk_080FD1A8;
+ switch (this->entityType.form - 0x3F) {
+ case 0:
+ case 21:
+ case 22:
+ case 23:
+ case 24:
+ case 25:
+ case 29:
+ case 30:
+ case 31:
+ case 32:
+ this->flags2 = 0x17;
+ break;
+ default:
+ this->flags2 = 0x11;
+ break;
+ }
+
+ this->field_0x68.HALF.HI = this->actionDelay;
+ this->field_0x6a.HALF.LO = 0;
+ this->field_0x6c.HWORD = 0;
+ this->field_0x68.HALF.LO = 0;
+ this->actionDelay = 0;
+ sub_0805E3A0(this, 3);
+ this->field_0x1c = sub_0808147C(this->entityType.form);
+ gUnk_0811E7E8[this->field_0x68.HALF.HI](this);
+ } else {
+ Entity* entity = CreateObject(0x40, 0x60, 0);
+ if (entity) {
+ entity->actionDelay = 0;
+ if (this->actionDelay == 1) {
+ entity->entityType.parameter = 2;
+ }
+
+ CopyPosition(this, entity);
+ DeleteThisEntity();
+ }
+ }
+}
+
+static void sub_080810A8(Entity* this) {
+ this->action = 1;
+ sub_080814A4(this);
+ if (this->direction & 0x80) {
+ this->direction &= 0x1F;
+ if (this->nonPlanarMovement == 0) {
+ this->nonPlanarMovement = 0x100;
+ }
+ } else {
+ this->direction |= 0xFF;
+ }
+
+ if (this->field_0x20 == 0) {
+ this->field_0x20 = 0x1E000;
+ }
+
+ if (this->collisionLayer == 2) {
+ sub_08016A30(this);
+ }
+}
+
+static void sub_080810FC(Entity* this) {
+ if (this->entityType.form != 0x5F) {
+ sub_08081598(this);
+ } else {
+ this->action = 2;
+ this->previousActionFlag = 0;
+ this->flags |= 0x80;
+ this->flags2 = 0x11;
+ CopyPosition(&gPlayerEntity, this);
+ }
+}
+
+void sub_08081134(Entity* this) {
+ sub_080814A4(this);
+ this->field_0x6c.HWORD += 80;
+ sub_08081150(this);
+}
+
+static void sub_08081150(Entity* this) {
+ this->action = 2;
+ this->flags |= 0x80;
+ this->height.HALF.HI = -0x80;
+ this->spriteOrientation.flipY = 1;
+ this->spriteRendering.b3 = 1;
+ PlaySFX(0x12D);
+}
+
+static void sub_08081188(Entity* this) {
+ this->action = 2;
+ this->flags |= 0x80;
+ if (this->collisionLayer == 2) {
+ sub_08016A30(this);
+ }
+}
+
+void sub_080811AC(Entity* this) {
+ this->action = 2;
+ this->spriteSettings.b.draw = 0;
+ this->field_0x6e.HWORD = GetTileTypeByEntity(this);
+}
+
+void sub_080811C8(Entity* this) {
+ this->action = 2;
+ this->spriteSettings.b.draw = 0;
+}
+
+void sub_080811D8(Entity* this) {
+ sub_08081188(this);
+ PlaySFX(0x215);
+}
+
+void sub_080811EC(Entity* this) {
+ if (this->field_0x68.HALF.HI != 6) {
+ sub_080AEFE0(this);
+ } else {
+ sub_0806F69C(this);
+ }
+
+ sub_08003FC4(this, 0x2800);
+ if (this->field_0x20 <= 0) {
+ this->action = 2;
+ this->flags |= 0x80;
+ sub_080814A4(this);
+ }
+}
+
+void sub_0808122C(Entity* this) {
+ gUnk_0811E814[this->field_0x68.HALF.HI](this);
+}
+
+void sub_08081248(Entity* this) {
+ sub_08081500(this);
+ if (sub_080814C0(this)) {
+ sub_08081404(this, 0);
+ } else {
+ sub_0800442E(this);
+ }
+}
+
+void sub_0808126C(Entity* this) {
+ UpdateAnimationSingleFrame(this);
+ sub_0808153C(this);
+}
+
+void sub_0808127C(Entity* this) {
+ if (sub_080814C0(this)) {
+ sub_08081404(this, 0);
+ } else {
+ sub_0808153C(this);
+ }
+}
+
+void nullsub_113(Entity* this) {
+}
+
+void sub_080812A0(Entity* this) {
+ sub_08081500(this);
+}
+
+void sub_080812A8(Entity* this) {
+ if (sub_080002D0(this) != 0xF && this->field_0x6e.HWORD != GetTileTypeByEntity(this)) {
+ this->direction = 0;
+ this->nonPlanarMovement = 0;
+ this->spriteSettings.b.draw = 1;
+ this->field_0x68.HALF.HI = 0;
+ sub_080810A8(this);
+ }
+}
+
+void sub_080812E8(Entity* this) {
+ PlayerState* playerState = &gPlayerState;
+ if ((playerState->swimState & 0x80) &&
+ !(playerState->flags.all & 0x80) &&
+ sub_080177A0(this, &gPlayerEntity)) {
+ sub_080810FC(this);
+ }
+}
+
+void nullsub_510(Entity* this) {
+}
+
+void sub_08081328(Entity* this) {
+ Entity* other = this->attachedEntity;
+ if (!(other->entityType.type == 8 && other->entityType.subtype == 3)) {
+ sub_08081404(this, 0);
+ } else {
+ CopyPosition(other, this);
+ this->height.HALF.HI--;
+ other = &gPlayerEntity;
+ if (sub_080177A0(this, other)) {
+ sub_080810FC(this);
+ }
+ }
+}
+
+void sub_0808136C(Entity* this) {
+ if (--this->actionDelay) {
+ Entity* other = this->attachedEntity;
+ this->x.WORD = other->x.WORD;
+ this->y.WORD = other->y.WORD;
+ this->spriteOrientation.flipY = other->spriteOrientation.flipY;
+ this->spriteRendering.b3 = other->spriteRendering.b3;
+ sub_08003FC4(this, 0x2800);
+ } else {
+ sub_08081404(this, 1);
+ }
+}
+
+static void sub_080813BC(Entity* this) {
+ gUnk_0811E840[this->previousActionFlag](this);
+}
+
+void sub_080813D4(Entity* this) {
+ this->previousActionFlag = 1;
+ this->field_0x1d = 1;
+ this->spriteSettings.b.draw = 1;
+}
+
+void sub_080813E8(Entity* this) {
+ sub_0806F4E8(this);
+}
+
+void sub_080813F0(Entity* this) {
+ if (sub_0806F3E4(this)) {
+ sub_080810FC(this);
+ }
+}
+
+void sub_08081404(Entity* this, u32 arg1) {
+ if (arg1 && this->field_0x86.HWORD) {
+ SetFlag(this->field_0x86.HWORD);
+ }
+
+ DeleteThisEntity();
+}
+
+bool32 sub_08081420(Entity* this) {
+ if (CheckShouldPlayItemGetCutscene(this)) {
+ sub_0805E3A0(this, 6);
+ CreateItemEntity(this->entityType.form, this->entityType.parameter, 0);
+ return TRUE;
+ } else {
+ GiveItem(this->entityType.form, this->entityType.parameter);
+ return FALSE;
+ }
+}
+
+static bool32 CheckShouldPlayItemGetCutscene(Entity* this) {
+ bool32 result = FALSE;
+ if ((gUnk_080FD5B4[this->entityType.form].unk0[3] & 0x2) || !GetInventoryValue(this->entityType.form)) {
+ result = TRUE;
+ }
+ return result;
+}
+
+static u8 sub_0808147C(u32 arg0) {
+ const Unk_0811E84C* var0 = &gUnk_0811E84C[arg0];
+ return var0->unk4;
+}
+
+void sub_0808148C(u32 arg0) {
+ const Unk_0811E84C* var0 = &gUnk_0811E84C[arg0];
+ if (var0->sfx) {
+ PlaySFX(var0->sfx);
+ }
+}
+
+static void sub_080814A4(Entity* this) {
+ if (this->field_0x68.HALF.HI == 10) {
+ this->field_0x6c.HWORD = 120;
+ } else {
+ this->field_0x6c.HWORD = 600;
+ }
+}
+
+static u32 sub_080814C0(Entity* this) {
+ if (!sub_0805E40C(this)) {
+ if (--this->field_0x6c.HWORD == 0) {
+ return TRUE;
+ }
+
+ if (this->field_0x6c.HWORD < 90) {
+ this->spriteSettings.b.draw ^= 1;
+ }
+ }
+
+ return FALSE;
+}
+
+static void sub_08081500(Entity* this) {
+ if (this->field_0x68.HALF.LO == 0) {
+ u32 var0 = sub_080044EC(this, 0x2800);
+ if (var0 == 0) {
+ this->field_0x68.HALF.LO = 1;
+ } else {
+ if (var0 == 1) {
+ sub_0808148C(this->entityType.form);
+ UpdateSpriteForCollisionLayer(this);
+ }
+
+ sub_080AEFE0(this);
+ }
+ }
+}
+
+static void sub_0808153C(Entity* this) {
+ if (this->field_0x68.HALF.LO > 1)
+ return;
+
+ if (this->field_0x68.HALF.LO == 0) {
+ if (!sub_08003FC4(this, 0x1000) && !sub_0800442E(this)) {
+ this->field_0x68.HALF.LO = 1;
+ this->field_0x20 = 0x1E000;
+ sub_0808148C(this->entityType.form);
+ UpdateSpriteForCollisionLayer(this);
+ }
+ } else {
+ if (!sub_08003FC4(this, 0x2800)) {
+ this->field_0x68.HALF.LO = 2;
+ sub_0808148C(this->entityType.form);
+ }
+ }
+}
+
+static void sub_08081598(Entity* this) {
+ if (this->currentHealth == 0) {
+ sub_08081404(this, 1);
+ }
+
+ this->flags &= 0x7F;
+ this->action = 4;
+ this->actionDelay = 14;
+ this->field_0x20 = 0x20000;
+ this->spriteSettings.b.draw = 1;
+ this->spritePriority.b1 = 2;
+ this->spritePriority.b0 = 3;
+ this->attachedEntity = &gPlayerEntity;
+ CopyPosition(this->attachedEntity, this);
+ this->height.HALF.HI -= 4;
+ if (this->entityType.form != 0x5F && sub_08081420(this)) {
+ sub_08081404(this, 1);
+ }
+}
diff --git a/src/object/jailBars.c b/src/object/jailBars.c
index e4128830..f262e819 100644
--- a/src/object/jailBars.c
+++ b/src/object/jailBars.c
@@ -18,7 +18,7 @@ void JailBars(Entity *this)
void sub_080A08C4(Entity *this)
{
- if (CheckFlags(this->field_0x86) == 0) {
+ if (CheckFlags(this->field_0x86.HWORD) == 0) {
this->action = 1;
sub_080A0960(this, 0);
}
@@ -34,7 +34,7 @@ void sub_080A08C4(Entity *this)
void sub_080A0910(Entity *this)
{
- if (CheckFlags(this->field_0x86) != 0) {
+ if (CheckFlags(this->field_0x86.HWORD) != 0) {
this->action = 2;
sub_080A0960(this, 1);
PlaySFX(0x10b);
diff --git a/src/object/lightableSwitch.c b/src/object/lightableSwitch.c
index 77c6489a..5d3e693c 100644
--- a/src/object/lightableSwitch.c
+++ b/src/object/lightableSwitch.c
@@ -7,7 +7,7 @@
extern void sub_0809EB30(Entity*);
extern void sub_0809EAD8(Entity*);
extern void sub_0809EABC(Entity*);
-extern void sub_08004488(u32);
+extern void EnqueueSFX(u32);
extern void sub_080A2CC0(Entity*, Entity**, u16*);
extern Entity* GetCurrentRoomProperty(u32);
extern void SetTile(u32, u32, u32);
@@ -45,12 +45,12 @@ void sub_0809EA34(Entity* this) {
void sub_0809EA80(Entity* this) {
if ((this->bitfield & 0x80) != 0) {
- if (CheckFlags(this->field_0x86) != 0) {
- ClearFlag(this->field_0x86);
+ if (CheckFlags(this->field_0x86.HWORD) != 0) {
+ ClearFlag(this->field_0x86.HWORD);
} else {
- SetFlag(this->field_0x86);
+ SetFlag(this->field_0x86.HWORD);
}
- sub_08004488(0x110);
+ EnqueueSFX(0x110);
}
sub_0809EABC(this);
}
@@ -59,7 +59,7 @@ void sub_0809EABC(Entity* this) {
bool32 anySet;
u32 f;
- f = CheckFlags(this->field_0x86);
+ f = CheckFlags(this->field_0x86.HWORD);
anySet = (-f | f) >> 0x1F;
if (this->frameIndex != anySet) {
this->frameIndex = anySet;
@@ -122,8 +122,8 @@ void sub_0809EBD8(Entity* this) {
this->action = 2;
this->actionDelay = 0x10;
this->frameIndex = 2;
- SetFlag(this->field_0x86);
- sub_08004488(0x110);
+ SetFlag(this->field_0x86.HWORD);
+ EnqueueSFX(0x110);
}
}
@@ -136,8 +136,8 @@ void sub_0809EC08(Entity* this) {
if (--this->actionDelay == 0) {
this->action = 1;
this->frameIndex = 3;
- ClearFlag(this->field_0x86);
- sub_08004488(0x110);
+ ClearFlag(this->field_0x86.HWORD);
+ EnqueueSFX(0x110);
}
}
}
diff --git a/src/object/mask.c b/src/object/mask.c
index 675805b8..9fb42c68 100644
--- a/src/object/mask.c
+++ b/src/object/mask.c
@@ -20,7 +20,7 @@ extern void sub_08000148(u16, u16, u32);
extern s16 sub_080001DA(u16, u32);
extern u16 sub_080002E0(u16, u32);
-extern void sub_08004488(u32);
+extern void EnqueueSFX(u32);
extern void sub_080044EC(Entity *, u16);
extern void sub_0805457C(Entity *, s32);
@@ -31,7 +31,7 @@ void Mask(Entity *this) {
void sub_080929A4(Entity *this) {
if (this->entityType.parameter & 0xC0) {
- if (CheckFlags(this->field_0x86)) {
+ if (CheckFlags(this->field_0x86.HWORD)) {
s32 field_0x0a;
switch (this->entityType.parameter & 0xC0) {
@@ -45,7 +45,7 @@ void sub_080929A4(Entity *this) {
goto switchEnd;
}
- ClearFlag(this->field_0x86);
+ ClearFlag(this->field_0x86.HWORD);
break;
case 0x80:
DeleteThisEntity();
@@ -115,9 +115,9 @@ void sub_08092B0C(Entity *this) {
switch (this->entityType.parameter & 0xC0)
{
case 0x80:
- sub_08004488(0x72);
+ EnqueueSFX(0x72);
case 0x40:
- SetFlag(this->field_0x86);
+ SetFlag(this->field_0x86.HWORD);
break;
}
diff --git a/src/object/metalDoor.c b/src/object/metalDoor.c
index 4a4de7f5..888c35f7 100644
--- a/src/object/metalDoor.c
+++ b/src/object/metalDoor.c
@@ -6,7 +6,7 @@
extern u32 sub_08083734(Entity*, u32);
extern void sub_080A080C(Entity*);
extern void sub_0806F69C(Entity*);
-extern void sub_08004488(u32);
+extern void EnqueueSFX(u32);
extern void sub_080A0870(Entity*);
extern void PlaySFX(u32);
extern u32 sub_080001DA(u32, u32);
@@ -71,13 +71,13 @@ void sub_080A074C(Entity *this)
ent->x.HALF.HI -= 0xc;
ent->y.HALF.HI -= 0xc;
}
- sub_08004488(0x10b);
+ EnqueueSFX(0x10b);
}
}
void sub_080A07BC(Entity *this)
{
- if (CheckFlags(this->field_0x86)) {
+ if (CheckFlags(this->field_0x86.HWORD)) {
this->action = 4;
this->actionDelay = 0xc;
this->direction = 0x10;
diff --git a/src/object/minecart.c b/src/object/minecart.c
index 783e9696..9207c8c0 100644
--- a/src/object/minecart.c
+++ b/src/object/minecart.c
@@ -50,7 +50,7 @@ void sub_080916EC(Entity* this) {
this->field_0x3c = 0x47;
this->field_0x40 = 0x44;
this->flags2 = 0x80;
- this->direction = this->animationState << 3;
+ this->direction = DirectionFromAnimationState(this->animationState);
this->nonPlanarMovement = 0x700;
this->spritePriority.b1 = 3;
InitAnimationForceUpdate(this, this->entityType.parameter + 4 + this->animationState);
diff --git a/src/object/mineralWaterSource.c b/src/object/mineralWaterSource.c
index 61b8a26e..50887521 100644
--- a/src/object/mineralWaterSource.c
+++ b/src/object/mineralWaterSource.c
@@ -30,8 +30,8 @@ void MineralWaterSource_Init(Entity *this) {
this->entityType.parameter = unknownParameters->field_0x00;
this->field_0x40 = unknownParameters->field_0x03;
- this->boundingBox->field_0x6 = unknownParameters->field_0x01;
- this->boundingBox->field_0x7 = unknownParameters->field_0x02;
+ this->boundingBox->unknown[6] = unknownParameters->field_0x01;
+ this->boundingBox->unknown[7] = unknownParameters->field_0x02;
this->flags |= 0x80;
diff --git a/src/object/minishSizedEntrance.c b/src/object/minishSizedEntrance.c
index ca261d35..55160cb7 100644
--- a/src/object/minishSizedEntrance.c
+++ b/src/object/minishSizedEntrance.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "entity.h"
-extern u32 Random();
extern bool32 CheckIsDungeon();
extern void sub_080AE068(Entity*);
extern void LoadFixedGFX(Entity*, u32);
diff --git a/src/object/object1A.c b/src/object/object1A.c
index 91129a16..a8924998 100644
--- a/src/object/object1A.c
+++ b/src/object/object1A.c
@@ -1,12 +1,8 @@
#include "global.h"
#include "entity.h"
+#include "functions.h"
-extern void CopyPosition();
extern void sub_08086A6C();
-extern s32 sub_080044EC();
-extern void sub_080AEF88();
-extern void DeleteThisEntity();
-extern u32 Random(void);
extern void (*gUnk_081206C4[99])(Entity*);
@@ -35,16 +31,14 @@ void sub_080869DC(Entity* ent) {
}
void sub_08086A28(Entity* ent) {
- s32 iVar1;
-
if (ent->attachedEntity->next == NULL) {
ent->action = 2;
} else {
- iVar1 = sub_080044EC(ent, 10240);
+ u32 iVar1 = sub_080044EC(ent, 10240);
if (iVar1 == 0) {
ent->action = 2;
}
- sub_080AEF88(ent);
+ ProcessMovement(ent);
CopyPosition(ent, ent->attachedEntity);
}
}
diff --git a/src/object/object2A.c b/src/object/object2A.c
index 5ce12dc7..44d272c5 100644
--- a/src/object/object2A.c
+++ b/src/object/object2A.c
@@ -30,11 +30,11 @@ void sub_08089B18(Entity *this)
CopyPosition(this->parent, this);
break;
case 4:
- if (!CheckFlags(this->field_0x86)) {
+ if (!CheckFlags(this->field_0x86.HWORD)) {
this->spriteSettings.b.draw = FALSE;
this->previousActionFlag = 1;
return;
}
}
- sub_08004488(0x124);
+ EnqueueSFX(0x124);
}
diff --git a/src/object/object49.c b/src/object/object49.c
index e3fa37dd..0617aad2 100644
--- a/src/object/object49.c
+++ b/src/object/object49.c
@@ -243,10 +243,10 @@ void sub_0808F498(Entity* this) {
this->action = 1;
this->actionDelay = 64;
var0 = this->entityType.parameter != 0 ? 44 : 43;
- this->x.HALF.HI -= this->parent->boundingBox->field_0x6;
- this->x.HALF.HI += (s32)Random() % (this->parent->boundingBox->field_0x6 * 2);
- this->y.HALF.HI -= this->parent->boundingBox->field_0x7;
- this->y.HALF.HI += (s32)Random() % (this->parent->boundingBox->field_0x7 * 2);
+ this->x.HALF.HI -= this->parent->boundingBox->unknown[6];
+ this->x.HALF.HI += (s32)Random() % (this->parent->boundingBox->unknown[6] * 2);
+ this->y.HALF.HI -= this->parent->boundingBox->unknown[7];
+ this->y.HALF.HI += (s32)Random() % (this->parent->boundingBox->unknown[7] * 2);
sub_0801D2B4(this, var0);
InitializeAnimation(this, 4);
}
diff --git a/src/object/object86.c b/src/object/object86.c
index 0520cb55..e6a1b683 100644
--- a/src/object/object86.c
+++ b/src/object/object86.c
@@ -7,7 +7,6 @@ extern u32 sub_080041A0(Entity*, Entity*, u32, u32);
void sub_08099ECC(Entity*);
extern void sub_0805E4E0(Entity*, u32);
extern void sub_0805B390(u32);
-extern void CopyPosition(Entity*, Entity*);
extern void (*const gUnk_081237F8[])(Entity*);
diff --git a/src/object/object9E.c b/src/object/object9E.c
index 8737f21a..5923b167 100644
--- a/src/object/object9E.c
+++ b/src/object/object9E.c
@@ -5,7 +5,6 @@
extern BoundingBox gUnk_080FD168;
extern void SetTile(u32, u32, u32);
-extern void CopyPosition(Entity*, Entity*);
void Object9E(Entity *this)
{
diff --git a/src/object/objectA.c b/src/object/objectA.c
index 564f83c5..dbb79088 100644
--- a/src/object/objectA.c
+++ b/src/object/objectA.c
@@ -20,7 +20,7 @@ void ObjectA(Entity *this) {
uVar2 = 0x34;
}
this->field_0x70.HALF.LO = uVar2;
- if (CheckFlags(this->field_0x86) != 0) {
+ if (CheckFlags(this->field_0x86.HWORD) != 0) {
SetTileType(*(u16*)&this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer);
if ((gRoomControls.unk2 & 1) != 0) {
gUnk_02000070 = 0;
@@ -31,8 +31,8 @@ void ObjectA(Entity *this) {
}
} else if (this->interactType != 0) {
SetTileType(*(u16*)&this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer);
- SetFlag(this->field_0x86);
- sub_080A29BC(this);
+ SetFlag(this->field_0x86.HWORD);
+ CreateDust(this);
sub_080526F8(-1);
DeleteThisEntity();
}
diff --git a/src/object/objectA8.c b/src/object/objectA8.c
index ab7713c5..9f4f4bb4 100644
--- a/src/object/objectA8.c
+++ b/src/object/objectA8.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "entity.h"
-extern void CreateItemEntity(u32, u32, u32);
+extern Entity* CreateItemEntity(u32, u32, u32);
extern void DeleteThisEntity();
extern void sub_08080CB4(Entity*);
diff --git a/src/object/objectAF.c b/src/object/objectAF.c
index 752cb31f..ac8864bb 100644
--- a/src/object/objectAF.c
+++ b/src/object/objectAF.c
@@ -2,8 +2,6 @@
#include "entity.h"
extern void sub_080A0640(Entity*);
-extern void PositionRelative(Entity*, Entity*, s32, s32);
-extern void CopyPosition(Entity*, Entity*);
extern void (*const gUnk_081248C4[])(Entity*);
diff --git a/src/object/objectB2.c b/src/object/objectB2.c
index 3db27795..7c4073fb 100644
--- a/src/object/objectB2.c
+++ b/src/object/objectB2.c
@@ -7,38 +7,32 @@ extern u32 sub_080AE4CC(Entity*, u32, u32, u32);
extern void* gUnk_02027EB4;
extern void* gUnk_0200D654;
-#if 0
+void ObjectB2(Entity* this) {
+ void* pEVar3;
-void ObjectB2(Entity *this)
-{
- void* pEVar3;
-
- if (this->action == 0) {
- this->action = 1;
- this->actionDelay = 0x10;
- this->direction = (this->entityType).form << 3;
- if (this->collisionLayer == 2) {
- pEVar3 = &gUnk_0200D654;
+ if (this->action == 0) {
+ this->action = 1;
+ this->actionDelay = 0x10;
+ this->direction = (this->entityType).form << 3;
+ if (this->collisionLayer == 2) {
+ pEVar3 = &gUnk_0200D654;
+ } else {
+ pEVar3 = &gUnk_02027EB4;
+ }
+ this->attachedEntity = pEVar3;
+ InitializeAnimation(this, this->entityType.form);
}
- else {
- pEVar3 = &gUnk_02027EB4;
+ this->nonPlanarMovement = this->parent->nonPlanarMovement;
+ sub_0806F69C(this);
+ if (sub_080AE4CC(this->attachedEntity, this->x.HALF.HI, this->y.HALF.HI, 9) != 0) {
+ DeleteThisEntity();
}
- this->attachedEntity = pEVar3;
- InitializeAnimation(this, this->entityType.form);
- }
- this->nonPlanarMovement = this->parent->nonPlanarMovement;
- sub_0806F69C(this);
- if (sub_080AE4CC(this->attachedEntity, this->x.HALF.HI, this->y.HALF.HI, 9) != 0) {
- DeleteThisEntity();
- }
- if (this->nonPlanarMovement < 0x41) {
- this->spriteSettings.b.draw ^= 1;
+ if (this->nonPlanarMovement < 0x41) {
+ this->spriteSettings.b.draw ^= 1;
- if (--this->actionDelay == 0) {
- DeleteThisEntity();
+ if (--this->actionDelay == 0) {
+ DeleteThisEntity();
+ }
}
- }
- GetNextFrame(this);
+ GetNextFrame(this);
}
-
-#endif
diff --git a/src/object/pinwheel.c b/src/object/pinwheel.c
new file mode 100644
index 00000000..1476bc58
--- /dev/null
+++ b/src/object/pinwheel.c
@@ -0,0 +1,43 @@
+#include "global.h"
+#include "entity.h"
+#include "functions.h"
+
+extern u32 ReadBit(u32*, u32);
+extern void DeleteThisEntity();
+extern u32 CheckLocalFlag(u32);
+
+extern u32 gUnk_020342F8;
+extern u16 gUnk_08125050[];
+extern void (*gUnk_0812505C[])(Entity*);
+
+void Pinwheel(Entity* this) {
+ u16 x = this->currentHealth;
+ if ((x & 0x7f) != 0) {
+ if (ReadBit(&gUnk_020342F8,x-1) == 0) {
+ DeleteThisEntity();
+ }
+ }
+ gUnk_0812505C[this->action](this);
+}
+
+void sub_080A23DC(Entity *this) {
+ this->field_0x68.HWORD = gUnk_08125050[this->entityType.parameter];
+ this->spritePriority.b0 = 7;
+ if (CheckLocalFlag(this->field_0x68.HWORD) !=0) {
+ this->action = 2;
+ }
+ else {
+ this->action = 1;
+ }
+ InitializeAnimation(this,0);
+}
+
+void sub_080A2420(Entity *this) {
+ if (CheckLocalFlag(this->field_0x68.HWORD) != 0) {
+ this->action = 2;
+ CreateDust(this);
+ }
+}
+void sub_080A243C(Entity *this) {
+ GetNextFrame(this);
+} \ No newline at end of file
diff --git a/src/object/pot.c b/src/object/pot.c
index 5ea63ab5..47ea8c9f 100755
--- a/src/object/pot.c
+++ b/src/object/pot.c
@@ -18,11 +18,9 @@ extern BoundingBox gUnk_080FD340; // TODO: should be const
extern u32 sub_08016A30(Entity*);
extern u32 sub_080001DA(u32, u32);
-extern u32 GetTileTypeByEntity(Entity*);
extern void sub_08078930(Entity*);
extern u32 sub_080002B8(Entity*);
extern void sub_08016A6C(Entity*);
-extern u32 sub_0800442E(Entity*);
void Pot(Entity* this) {
gUnk_0811F090[this->action](this);
@@ -30,7 +28,7 @@ void Pot(Entity* this) {
}
void sub_0808222C(Entity* this) {
- if (this->entityType.parameter == 1 && CheckFlags(this->field_0x86)) {
+ if (this->entityType.parameter == 1 && CheckFlags(this->field_0x86.HWORD)) {
DeleteThisEntity();
}
@@ -92,7 +90,7 @@ void sub_08082310(Entity* this) {
this->actionDelay = 64;
}
SetTile((u16)this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer);
- sub_08004488(0x10F);
+ EnqueueSFX(0x10F);
break;
case 0x4067:
SetTile((u16)this->field_0x70.HALF.LO, COORD_TO_TILE(this), this->collisionLayer);
@@ -271,7 +269,7 @@ static void sub_08082850(Entity* this, Entity* parent) {
}
if (this->entityType.parameter == 1) {
- SetFlag(this->field_0x86);
+ SetFlag(this->field_0x86.HWORD);
}
DeleteThisEntity();
@@ -292,7 +290,7 @@ u32 sub_0808288C(Entity* this, u32 form, u32 arg2, u32 arg3) {
if (entity) {
if (arg3 == 2) {
entity->actionDelay = 5;
- entity->field_0x86 = this->field_0x86;
+ entity->field_0x86.HWORD = this->field_0x86.HWORD;
} else {
entity->actionDelay = 0;
}
diff --git a/src/object/railtrack.c b/src/object/railtrack.c
index 8ecc8ec0..57f58f76 100644
--- a/src/object/railtrack.c
+++ b/src/object/railtrack.c
@@ -6,7 +6,7 @@
extern u32* GetLayerByIndex(u32);
extern void sub_08085394(Entity*);
extern void sub_0808543C(Entity*);
-extern void sub_08004488(u32);
+extern void EnqueueSFX(u32);
extern u32 sub_080854A8(Entity*);
extern void SetTile(u32, u32, u32);
@@ -32,7 +32,7 @@ void sub_080851AC(Entity* this) {
}
this->animationState = this->entityType.parameter & 2;
if ((this->entityType).form == 3) {
- uVar1 = CheckFlags(this->field_0x86);
+ uVar1 = CheckFlags(this->field_0x86.HWORD);
this->field_0x7a.HWORD = uVar1;
if ((u16)(uVar1 & -1) != 0) {
this->animationState = (this->animationState + 2) & 3;
@@ -45,16 +45,16 @@ void sub_080851AC(Entity* this) {
}
void sub_08085264(Entity* this) {
- if (CheckFlags(this->field_0x86)) {
+ if (CheckFlags(this->field_0x86.HWORD)) {
this->action = 2;
this->field_0xf = 8;
if (this->entityType.form == 1) {
- ClearFlag(this->field_0x86);
+ ClearFlag(this->field_0x86.HWORD);
}
this->animationState = (this->animationState + *(u8*)&this->field_0x7c) & 3;
InitializeAnimation(this, this->animationState);
sub_0808543C(this);
- sub_08004488(0x151);
+ EnqueueSFX(0x151);
}
}
@@ -62,11 +62,11 @@ void sub_080852B4(Entity* this) {
if (--this->field_0xf == 0) {
this->action = 3;
this->field_0xf = this->actionDelay;
- this->field_0x7a.HWORD = CheckFlags(this->field_0x86);
+ this->field_0x7a.HWORD = CheckFlags(this->field_0x86.HWORD);
this->animationState = (this->animationState + *(u8*)&this->field_0x7c) & 3;
InitializeAnimation(this, this->animationState);
sub_08085394(this);
- sub_08004488(0x151);
+ EnqueueSFX(0x151);
}
}
@@ -77,13 +77,13 @@ void sub_08085308(Entity* this) {
case 1:
break;
case 2:
- if (CheckFlags(this->field_0x86) == 0) {
+ if (CheckFlags(this->field_0x86.HWORD) == 0) {
this->action = 1;
return;
}
break;
case 3:
- if (CheckFlags(this->field_0x86) == *(u16*)&this->field_0x7a) {
+ if (CheckFlags(this->field_0x86.HWORD) == *(u16*)&this->field_0x7a) {
this->field_0xf = 0xff;
} else {
this->field_0xf = 1;
@@ -96,60 +96,52 @@ void sub_08085308(Entity* this) {
this->animationState = (this->animationState + *(u8*)&this->field_0x7c) & 3;
InitializeAnimation(this, this->animationState);
sub_0808543C(this);
- sub_08004488(0x151);
+ EnqueueSFX(0x151);
}
}
}
-#if 0
-void sub_08085394(Entity *this)
-{
+void sub_08085394(Entity* this) {
u32 uVar1;
- u16 *layerData;
- u32 iVar3;
- u32 uVar4;
- u8 *pbVar5;
+ u16* layerData;
+ u32 tile;
+ s8 off;
uVar1 = gUnk_081205E0[this->animationState / 2];
- iVar3 = this->animationState / 2;
- layerData = *(u16 **)&this->field_0x70;
- uVar4 = COORD_TO_TILE(this);
- this->field_0x74.HWORD = layerData[gUnk_080B4488[iVar3]];
- pbVar5 = &this->collisionLayer;
- SetTile(uVar1, uVar4 - iVar3, *pbVar5);
- this->field_0x76 = layerData[0];
- SetTile(uVar1,uVar4, *pbVar5);
- *(u16 *)&this->field_0x78 = layerData[iVar3];
- SetTile(uVar1,uVar4 + iVar3, *pbVar5);
-}
-#endif
+ off = gUnk_080B4488[this->animationState / 2][0];
+ layerData = (u16*)this->field_0x70.WORD;
+ tile = COORD_TO_TILE(this);
-NAKED
-void sub_08085394(Entity* this) {
- asm(".include \"asm/non_matching/railtrack/sub_08085394.inc\"");
+ this->field_0x74.HWORD = *(layerData - off);
+ SetTile(uVar1, tile - off, this->collisionLayer);
+
+ this->field_0x76.HWORD = layerData[0x0];
+ SetTile(uVar1, tile - 0x0, this->collisionLayer);
+
+ this->field_0x78.HWORD = layerData[off];
+ SetTile(uVar1, tile + off, this->collisionLayer);
}
-void sub_0808543C(Entity *this)
-{
- s8 *cVar1;
- u32 uVar2;
- s8 temp;
-
- temp = gUnk_080B4488[this->animationState / 2][0];
- uVar2 = COORD_TO_TILE(this);
- SetTile(this->field_0x74.HWORD, uVar2 - temp, this->collisionLayer);
- SetTile(this->field_0x76.HWORD, uVar2, this->collisionLayer);
- SetTile(this->field_0x78.HWORD, uVar2 + temp, this->collisionLayer);
+void sub_0808543C(Entity* this) {
+ s8* cVar1;
+ u32 uVar2;
+ s8 temp;
+
+ temp = gUnk_080B4488[this->animationState / 2][0];
+ uVar2 = COORD_TO_TILE(this);
+ SetTile(this->field_0x74.HWORD, uVar2 - temp, this->collisionLayer);
+ SetTile(this->field_0x76.HWORD, uVar2, this->collisionLayer);
+ SetTile(this->field_0x78.HWORD, uVar2 + temp, this->collisionLayer);
}
-u32 sub_080854A8(Entity *this) {
+u32 sub_080854A8(Entity* this) {
u16 var0;
u16* var1;
s8* var2;
var0 = gUnk_081205E0[this->animationState / 2];
var2 = gUnk_080B4488[this->animationState / 2];
- var1 = (u16 *)this->field_0x70.WORD;
+ var1 = (u16*)this->field_0x70.WORD;
if (var0 != *(var1 - var2[0])) {
return TRUE;
}
diff --git a/src/object/smoke.c b/src/object/smoke.c
index 48fcaff8..54047762 100644
--- a/src/object/smoke.c
+++ b/src/object/smoke.c
@@ -1,10 +1,8 @@
#include "global.h"
#include "entity.h"
+#include "functions.h"
-extern u32 Random(void);
-extern void CopyPosition(Entity*, Entity*);
extern void sub_0806F69C(Entity*);
-extern void DeleteEntity(Entity*);
extern void (*const gUnk_08121060[])(Entity*);
extern void (*const gUnk_08121070[])(Entity*);
diff --git a/src/object/treeHidingPortal.c b/src/object/treeHidingPortal.c
index 446731a8..8d34e3b9 100644
--- a/src/object/treeHidingPortal.c
+++ b/src/object/treeHidingPortal.c
@@ -6,7 +6,7 @@
extern void sub_0809E96C(Entity*);
extern u32 sub_0800419C(Entity*, Entity*, u32, u32);
-extern void sub_080A2B80(Entity*);
+extern void CreateSparkle(Entity*);
extern u32 sub_0809E9A0(void);
extern void sub_08078A90(u32);
extern void sub_0809E918(Entity*);
@@ -23,7 +23,7 @@ void TreeHidingPortal(Entity* this) {
}
void sub_0809E83C(Entity* this) {
- if (CheckFlags(this->field_0x86)) {
+ if (CheckFlags(this->field_0x86.HWORD)) {
sub_0809E96C(this);
DeleteThisEntity();
}
@@ -37,7 +37,7 @@ void sub_0809E86C(Entity* this) {
if (sub_0800419C(this, &gPlayerEntity, 0x30, 0x30)) {
if (CheckGlobalFlag(EZERO_1ST)) {
if (((gScreenTransition & 3) == 0)) {
- sub_080A2B80(this);
+ CreateSparkle(this);
}
}
}
@@ -60,7 +60,7 @@ void sub_0809E8BC(Entity* this) {
void sub_0809E8EC(Entity* this) {
if (--this->actionDelay == 0) {
- SetFlag(this->field_0x86);
+ SetFlag(this->field_0x86.HWORD);
sub_08078A90(0);
PlaySFX(0x73);
DeleteThisEntity();