summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/manager/manager15.c4
-rw-r--r--src/manager/manager2E.c3
-rw-r--r--src/manager/managerF.c5
-rw-r--r--src/npc/picolyteBottle.c10
-rw-r--r--src/object/warpPoint.c230
5 files changed, 239 insertions, 13 deletions
diff --git a/src/manager/manager15.c b/src/manager/manager15.c
index 47a384ac..24b214b5 100644
--- a/src/manager/manager15.c
+++ b/src/manager/manager15.c
@@ -296,8 +296,6 @@ void sub_0805A758(Manager15* this) {
}
}
-extern void sub_0805E4E0(Manager*, u32);
-
void sub_0805A76C(Manager15* this) {
if ((gPlayerEntity.currentHealth != 0) && (gPlayerEntity.height.HALF.HI == 0) && (!gPlayerState.field_0x2c)) {
switch (gPlayerState.field_0xa9) {
@@ -307,7 +305,7 @@ void sub_0805A76C(Manager15* this) {
this->manager.action++;
sub_08004168(&gPlayerEntity);
gPlayerEntity.animationState = 4;
- sub_0805E4E0(&this->manager, 0x258);
+ sub_0805E4E0((Entity*)this, 0x258);
sub_08078A90(0xFF);
gUnk_02034490[0] = 1;
gRoomControls.cameraTarget = 0;
diff --git a/src/manager/manager2E.c b/src/manager/manager2E.c
index 5d114b6f..f52c185e 100644
--- a/src/manager/manager2E.c
+++ b/src/manager/manager2E.c
@@ -19,7 +19,6 @@ extern void (*const gUnk_08108D3C[])(Manager2E*);
extern void (*const gUnk_08108D44[])(Manager2E*);
void sub_0805D2F4(Manager2E*);
-extern void sub_0805E4E0(void*, u32);
extern void (*const gUnk_08108D50[])(Manager2E*);
@@ -52,7 +51,7 @@ void sub_0805D2C0(Manager2E* this) {
if (this->manager.unk_0e == 1) {
sub_0805D2F4(this);
}
- sub_0805E4E0(this, this->manager.unk_0e);
+ sub_0805E4E0((Entity*)this, this->manager.unk_0e);
}
}
diff --git a/src/manager/managerF.c b/src/manager/managerF.c
index a4f5c78f..d7e1d7bb 100644
--- a/src/manager/managerF.c
+++ b/src/manager/managerF.c
@@ -92,7 +92,6 @@ void sub_08059064(ManagerF*);
void sub_080592EC(ManagerF*);
void sub_0805930C(ManagerF*);
u32 sub_080593CC(ManagerF*);
-void sub_0805E4E0(ManagerF*, u32);
// to be moved to headers
extern EntityData gUnk_080F4B88[];
@@ -151,7 +150,7 @@ void sub_08058FB0(ManagerF* this) {
if (CheckFlags(this->unk_3e)) {
this->manager.action = 2;
this->manager.unk_0e = 120;
- sub_0805E4E0(this, 0xF0);
+ sub_0805E4E0((Entity*)this, 0xF0);
sub_08059064(this);
}
break;
@@ -241,7 +240,7 @@ void sub_08059124(ManagerF* this) {
break;
case 1:
if (CheckFlags(this->unk_3e)) {
- sub_0805E4E0(this, 0x4b);
+ sub_0805E4E0((Entity*)this, 0x4b);
this->manager.unk_0e = 0x2d;
this->manager.action++;
}
diff --git a/src/npc/picolyteBottle.c b/src/npc/picolyteBottle.c
index 4dd3dcaf..73c99b40 100644
--- a/src/npc/picolyteBottle.c
+++ b/src/npc/picolyteBottle.c
@@ -38,7 +38,7 @@ void sub_0806DF00(Entity* this) {
npc->parent = this;
this->field_0x74.HWORD = 0;
this->field_0x76.HWORD = 10;
- gScreenTransition.field_0x8 = 10;
+ gScreenTransition.field_0x6 = 10;
sub_0806E014(this);
sub_0807DD50(this);
} else {
@@ -108,17 +108,17 @@ void sub_0806E1FC(Entity* this) {
}
void sub_0806E20C(void) {
- if (gScreenTransition.field_0x8 != 0) {
+ if (gScreenTransition.field_0x6 != 0) {
TextboxNoOverlapFollow(0x421f);
- gTextBox.field_0x10 = gScreenTransition.field_0x8;
+ gTextBox.field_0x10 = gScreenTransition.field_0x6;
} else {
TextboxNoOverlapFollow(0x4220);
}
}
void sub_0806E23C(void) {
- if (gScreenTransition.field_0x8 != 0) {
- ModRupees(gScreenTransition.field_0x8);
+ if (gScreenTransition.field_0x6 != 0) {
+ ModRupees(gScreenTransition.field_0x6);
}
}
diff --git a/src/object/warpPoint.c b/src/object/warpPoint.c
new file mode 100644
index 00000000..287a2e70
--- /dev/null
+++ b/src/object/warpPoint.c
@@ -0,0 +1,230 @@
+#include "global.h"
+#include "object.h"
+#include "player.h"
+#include "flags.h"
+#include "game.h"
+#include "audio.h"
+#include "functions.h"
+
+extern Hitbox gUnk_080FD168;
+
+void WarpPoint(Entity*);
+void sub_0808B474(Entity*);
+void sub_0808B530(Entity*);
+void sub_0808B564(Entity*);
+void sub_0808B590(Entity*);
+void sub_0808B5E8(Entity*);
+void sub_0808B684(Entity*);
+void sub_0808B73C(Entity*);
+u32 sub_0808B7C8(Entity*);
+void sub_0808B830(Entity*);
+
+void (*const gUnk_08121368[])(Entity*) = {
+ sub_0808B474, sub_0808B530, sub_0808B564, sub_0808B590, sub_0808B5E8, sub_0808B684,
+};
+
+const u8 gUnk_08121380[3] = { 1, 0, 2 };
+
+void WarpPoint(Entity* this) {
+ if (!this->field_0x70.BYTES.byte0) {
+ gUnk_08121368[this->action](this);
+ } else {
+ sub_0808B73C(this);
+ }
+}
+
+void sub_0808B474(Entity* this) {
+ u32 tmp;
+ this->action = 1;
+ this->field_0xf = 0;
+ tmp = gUnk_08121380[this->type];
+ this->palette.b.b0 = tmp;
+ this->spritePriority.b0 = 6;
+ this->hitbox = &gUnk_080FD168;
+ this->scriptedScene = 3;
+ InitializeAnimation(this, 0);
+ if (CheckFlags(this->field_0x86.HWORD)) {
+ sub_0808B830(this);
+ } else {
+ if (CheckIsDungeon() && sub_0807CAEC(this->type)) {
+ sub_0808B830(this);
+ }
+ }
+ if (!sub_0808B7C8(this))
+ return;
+ this->action = 4;
+ this->field_0xf = 0x60;
+ gPlayerEntity.x.HALF.HI = this->x.HALF.HI;
+ gPlayerEntity.y.HALF.HI = this->y.HALF.HI;
+ gPlayerEntity.animationState = 4;
+ EnqueueSFX(0x112);
+ sub_0805E4E0(this, this->field_0xf + 0x10);
+}
+
+void sub_0808B530(Entity* this) {
+ if (CheckFlags(this->field_0x86.HWORD)) {
+ sub_0808B830(this);
+ if (CheckIsDungeon()) {
+ sub_0807CAC8(this->type);
+ }
+ this->action = 2;
+ this->field_0xf = 60;
+ EnqueueSFX(0x112);
+ }
+}
+
+void sub_0808B564(Entity* this) {
+ if (!--this->field_0xf) {
+ this->action = 3;
+ } else {
+ this->spriteSettings.b.draw = this->field_0xf & 2 ? 0 : 1;
+ }
+}
+
+void sub_0808B590(Entity* this) {
+ GetNextFrame(this);
+ if (sub_0808B7C8(this)) {
+ if (this->actionDelay)
+ return;
+ this->action = 5;
+ this->field_0xf = 0x60;
+ sub_08077B20();
+ gPlayerEntity.x.HALF.HI = this->x.HALF.HI;
+ gPlayerEntity.y.HALF.HI = this->y.HALF.HI;
+ gPlayerEntity.animationState = 4;
+ gPlayerEntity.flags &= ~0x80;
+ sub_0805E4E0(this, this->field_0xf + 0x10);
+ SoundReq(0x113);
+ } else {
+ this->actionDelay = 0;
+ }
+}
+
+void sub_0808B5E8(Entity* this) {
+ u32 tmp;
+ if (!--this->field_0xf) {
+ this->action = 3;
+ this->actionDelay = 1;
+ gPlayerEntity.animationState = 4;
+ gPlayerEntity.direction = DirectionSouth;
+ return;
+ }
+ tmp = 0;
+ switch (this->field_0xf & 0x60) {
+ case 0x40:
+ if (this->field_0xf == 0x58) {
+ SoundReq(0x114);
+ }
+ if (!(this->field_0xf & 1)) {
+ tmp = 1;
+ }
+ break;
+ case 0x20:
+ if (!(this->field_0xf & 3)) {
+ tmp = 1;
+ }
+ break;
+ case 0:
+ if (!(this->field_0xf & 7)) {
+ if (gPlayerEntity.animationState == 4) {
+ if (this->field_0xf > 0x18) {
+ tmp = 1;
+ }
+ } else {
+ tmp = 1;
+ }
+ }
+ break;
+ }
+ if (tmp) {
+ gPlayerEntity.animationState += 2;
+ gPlayerEntity.animationState &= 6;
+ }
+}
+
+void sub_0808B684(Entity* this) {
+ u32 tmp;
+ if (!--this->field_0xf) {
+ gScreenTransition.transitioningOut = 1;
+ gScreenTransition.transitionType = 0;
+ gScreenTransition.areaID = this->field_0x7c.BYTES.byte0;
+ gScreenTransition.roomID = this->field_0x7c.BYTES.byte1;
+ gScreenTransition.playerStartPos.HALF.x = ((this->cutsceneBeh.HWORD & 0x3f) << 4) + 8;
+ gScreenTransition.playerStartPos.HALF.y = ((this->cutsceneBeh.HWORD & 0xfc0) >> 2) + 8;
+ gScreenTransition.playerLayer = 0;
+ gScreenTransition.playerState = 4;
+ gScreenTransition.field_0xf = 0;
+ if (this->type == 2) {
+ gScreenTransition.transitionType = 2;
+ }
+ return;
+ }
+ tmp = 0;
+ switch (this->field_0xf & 0x60) {
+ case 0x40:
+ if (!(this->field_0xf & 7)) {
+ tmp = 1;
+ }
+ break;
+ case 0x20:
+ if (!(this->field_0xf & 3)) {
+ tmp = 1;
+ }
+ break;
+ case 0:
+ if (this->field_0xf > 0x10) {
+ if (!(this->field_0xf & 1)) {
+ tmp = 1;
+ }
+ } else {
+ gPlayerEntity.spriteSettings.b.draw = 0;
+ }
+ break;
+ }
+ if (tmp) {
+ gPlayerEntity.animationState += 2;
+ gPlayerEntity.animationState &= 6;
+ }
+}
+
+void sub_0808B73C(Entity* this) {
+ if (this->action == 0) {
+ this->action = 1;
+ this->palette.b.b0 = this->parent->palette.b.b0;
+ InitializeAnimation(this, 1);
+ }
+ if (sub_0806FCB8(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI, 0x28)) {
+ this->spriteSettings.b.draw = 1;
+ } else {
+ if (sub_0806FCB8(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI, 0x2e)) {
+ this->spriteSettings.b.draw ^= 1;
+ } else {
+ this->spriteSettings.b.draw = 0;
+ }
+ }
+ GetNextFrame(this);
+}
+
+u32 sub_0808B7C8(Entity* this) {
+ if (!(gPlayerState.flags.all & 0x80) && gPlayerState.field_0xa8 != 0x12 && gPlayerEntity.currentHealth != 0 &&
+ sub_08079F8C() && sub_080041A0(this, &gPlayerEntity, 5, 5) && gPlayerEntity.height.HALF.HI == 0) {
+ if (this->actionDelay == 0 && gPlayerEntity.action == 0x1b) {
+ sub_080791D0();
+ }
+ return 1;
+ }
+ return 0;
+}
+
+void sub_0808B830(Entity* this) {
+ Entity* tmp;
+ this->action = 3;
+ this->actionDelay = 0;
+ this->spriteSettings.b.draw = 1;
+ tmp = CreateObject(0x34, 0, 0);
+ if (tmp) {
+ tmp->field_0x70.BYTES.byte0 = 1;
+ tmp->parent = this;
+ CopyPosition(this, tmp);
+ }
+}