summaryrefslogtreecommitdiff
path: root/src/object
diff options
context:
space:
mode:
authortheo3 <arisstephenson2@gmail.com>2021-10-26 23:20:12 -0700
committertheo3 <arisstephenson2@gmail.com>2021-10-26 23:20:12 -0700
commit57eec4def41b5bd3cc3ac791ef4bc26b75125b5d (patch)
tree06117098718bb3224e2058793f2f8c5fc607e29b /src/object
parent6ecaea44c5944acd4a5e8e11582e280e69e22e08 (diff)
decompile jar portal
Diffstat (limited to 'src/object')
-rw-r--r--src/object/jarPortal.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/object/jarPortal.c b/src/object/jarPortal.c
new file mode 100644
index 00000000..b625bb1b
--- /dev/null
+++ b/src/object/jarPortal.c
@@ -0,0 +1,181 @@
+#include "global.h"
+#include "entity.h"
+#include "flags.h"
+#include "functions.h"
+#include "area.h"
+#include "audio.h"
+
+extern void (*gUnk_08121488[])(Entity*);
+
+extern u32 sub_08057810(void);
+extern void sub_080577AC(u32, u32, u32);
+
+u32 sub_0808C128(Entity*);
+void sub_0808C13C(Entity*);
+void sub_0808C148(Entity*, u32);
+void sub_0808C01C(Entity*, u32);
+
+void JarPortal(Entity* this) {
+ gUnk_08121488[this->action](this);
+}
+
+void sub_0808BE9C(Entity* this) {
+ this->flags |= 0x80;
+ this->damageType = 1;
+ this->field_0x3c = 0x47;
+ this->field_0x40 = 0x44;
+ this->flags2 = 0x80;
+ this->field_0x68.HALF.LO = 0;
+ if (CheckLocalFlag(this->type)) {
+ if (this->field_0x7c.BYTES.byte0 != 0) {
+ this->action = 1;
+ InitAnimationForceUpdate(this, 0);
+ } else {
+ this->action = 3;
+ InitAnimationForceUpdate(this, 1);
+ }
+ } else {
+ if (this->field_0x7c.BYTES.byte0 == 0) {
+ this->action = 1;
+ InitAnimationForceUpdate(this, 0);
+ } else {
+ this->action = 3;
+ InitAnimationForceUpdate(this, 1);
+ }
+ }
+}
+
+void sub_0808BF14(Entity* this) {
+ if (sub_0808C128(this)) {
+ this->action++;
+ sub_0808C13C(this);
+ if (this->field_0x7c.BYTES.byte0 == 0) {
+ SetLocalFlag(this->type);
+ } else {
+ ClearLocalFlag(this->type);
+ }
+ sub_0808C148(this, 0);
+ }
+ sub_0808C01C(this, 0);
+}
+
+void sub_0808BF58(Entity* this) {
+ sub_08003FC4(this, 0x2000);
+ switch (this->subAction) {
+ case 0:
+ if (this->field_0x20 <= 98303) {
+ ++this->subAction;
+ InitAnimationForceUpdate(this, 2);
+ }
+ break;
+ case 1:
+ UpdateAnimationSingleFrame(this);
+ if (!this->height.HALF.HI) {
+ ++this->subAction;
+ this->field_0x20 = 0x8000;
+ }
+ break;
+ case 2:
+ UpdateAnimationSingleFrame(this);
+ if (!this->height.HALF.HI) {
+ ++this->action;
+ this->field_0xf = 0;
+ InitAnimationForceUpdate(this, 1);
+ sub_0808C148(this, 1);
+ }
+ break;
+ }
+}
+
+void sub_0808BFD8(Entity* this) {
+ if (sub_0808C128(this)) {
+ ++this->action;
+ sub_0808C13C(this);
+ if (!this->field_0x7c.BYTES.byte0)
+ ClearLocalFlag(this->type);
+ else
+ SetLocalFlag(this->type);
+ sub_0808C148(this, 0);
+ }
+ sub_0808C01C(this, 1);
+}
+
+void sub_0808C01C(Entity* this, u32 r1) {
+ if (CheckPlayerProximity(this->x.HALF.HI - 0x18, this->y.HALF.HI - 0x18, 0x30, 0x30)) {
+ u32 type;
+ gArea.curPortalX = this->x.HALF.HI;
+ gArea.curPortalY = this->y.HALF.HI;
+ gArea.curPortalExitDirection = 2;
+ type = 4;
+ if (r1 != 0)
+ type = 2;
+ gArea.curPortalType = type;
+ if (r1 == 1) {
+ if (((gPlayerState.flags.all & 0x20) != 0) && (gPlayerState.jumpStatus == 0)) {
+ gArea.field_0x18 = 2;
+ } else {
+ if (sub_08057810() != 0) {
+ gArea.field_0x18 = 3;
+ }
+ }
+ sub_080577AC(this->x.HALF.HI, this->y.HALF.HI, this->collisionLayer);
+ if (this->field_0xf == 0) {
+ this->field_0xf = 1;
+ SoundReq(0x152);
+ }
+ }
+ }
+}
+
+void sub_0808C0AC(Entity* this) {
+ sub_08003FC4(this, 0x2000);
+ switch (this->subAction) {
+ case 0:
+ if (this->field_0x20 <= 98303) {
+ this->subAction = 1;
+ InitAnimationForceUpdate(this, 3);
+ }
+ break;
+ case 1:
+ UpdateAnimationSingleFrame(this);
+ if (!this->height.HALF.HI) {
+ ++this->subAction;
+ this->field_0x20 = 0x8000;
+ }
+ break;
+ case 2:
+ UpdateAnimationSingleFrame(this);
+ if (!this->height.HALF.HI) {
+ this->action = 1;
+ InitAnimationForceUpdate(this, 0);
+ sub_0808C148(this, 1);
+ }
+ break;
+ }
+}
+
+u32 sub_0808C128(Entity* this) {
+ return this->bitfield == 157;
+}
+
+void sub_0808C13C(Entity* this) {
+ this->subAction = 0;
+ this->field_0x20 = 163840;
+}
+
+void sub_0808C148(Entity* this, u32 a2) {
+ u32 pos;
+
+ pos = COORD_TO_TILE(this);
+ if (!a2) {
+ SetTile(16530, pos - 1, this->collisionLayer);
+ SetTile(16531, pos, this->collisionLayer);
+ SetTile(16532, pos + 63, this->collisionLayer);
+ SetTile(16533, pos + 64, this->collisionLayer);
+ } else {
+ sub_0807BA8C(pos - 1, this->collisionLayer);
+ sub_0807BA8C(pos, this->collisionLayer);
+ sub_0807BA8C(pos + 63, this->collisionLayer);
+ sub_0807BA8C(pos + 64, this->collisionLayer);
+ }
+}