summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIbot02 <jtp.jtp@gmx.de>2021-08-25 17:34:42 +0200
committerGitHub <noreply@github.com>2021-08-25 17:34:42 +0200
commitfa92a42dd1ac982be1e384db28a8a6aebfec9170 (patch)
treeeabfd7ecd85d64782e64f892563c144e2b5de11e /src
parentc065fe893891dbb6090a77b4562c66dae569cf87 (diff)
parentd1b63497a79fba6b271dd3f70710bc698d8d1e62 (diff)
Merge pull request #168 from 21aslade/master
book.c OK
Diffstat (limited to 'src')
-rw-r--r--src/object/book.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/object/book.c b/src/object/book.c
new file mode 100644
index 00000000..ee53ef99
--- /dev/null
+++ b/src/object/book.c
@@ -0,0 +1,235 @@
+#include "entity.h"
+#include "functions.h"
+#include "player.h"
+#include "script.h"
+#include "flags.h"
+#include "room.h"
+#include "textbox.h"
+
+extern void (*const BookActionFuncs[])(Entity*);
+extern s8 const gUnk_08123D94[];
+
+u32 sub_0809B688(Entity*);
+void sub_0809B6B0(Entity*, Entity*);
+
+void Book(Entity* this) {
+ BookActionFuncs[this->action](this);
+}
+
+void sub_0809B3C4(Entity* this) {
+ u32 obtained;
+
+ obtained = GetInventoryValue(this->type + 0x39);
+ if (this->type2 != 3) {
+ if (obtained) {
+ DeleteThisEntity();
+ }
+ } else {
+ if (CheckLocalFlag(0x73)) {
+ DeleteThisEntity();
+ }
+
+ if (obtained != 2) {
+ this->spriteSettings.b.draw = 0;
+ }
+ }
+
+ this->spriteOffsetY = 3;
+ if (CheckFlags(this->field_0x86.HWORD)) {
+ if (this->type2 == 0) {
+ this->y.HALF.HI += 48;
+ }
+
+ this->type2 = 2;
+ }
+
+ UpdateSpriteForCollisionLayer(this);
+ InitAnimationForceUpdate(this, this->type + 0x39);
+
+ switch (this->type2) {
+ case 0:
+ this->action = 1;
+ this->actionDelay = 22;
+ this->field_0xf = 2;
+ this->field_0x80.HALF.LO = 0;
+ this->spritePriority.b0 = 3;
+ break;
+ case 1: {
+ u32 scroll;
+ u32 height;
+ this->action = 3;
+ scroll = (u16)gRoomControls.roomScrollY - 0x10;
+ height = (u16)this->y.HALF.HI - scroll;
+ this->height.HALF.HI -= height;
+ return;
+ }
+ case 2:
+ this->action = 4;
+ return;
+ case 3:
+ this->action = 5;
+ this->subAction = 0;
+ this->spritePriority.b0 = 3;
+ break;
+ default:
+ return;
+ }
+}
+
+void sub_0809B4A8(Entity* this) {
+ sub_0800445C(this);
+
+ if (this->field_0x80.HALF.LO != 0) {
+ this->field_0x80.HALF.LO--;
+ return;
+ }
+
+ if (sub_0809B688(this)) {
+ if (--this->actionDelay) {
+ return;
+ }
+
+ this->action = 2;
+ this->actionDelay = 30;
+ this->speed = 64;
+ this->direction = 16;
+
+ gPlayerState.pushedObject = 0x9e;
+ gPlayerState.playerAction = 5;
+ gPlayerState.flags.all |= 1;
+
+ gPlayerEntity.x.HALF.LO = 0;
+ gPlayerEntity.y.HALF.LO = 0;
+ gPlayerEntity.direction = gPlayerEntity.animationState << 2;
+ EnqueueSFX(0x10f);
+ } else {
+ this->actionDelay = 0x16;
+ }
+}
+
+void sub_0809B524(Entity* this) {
+ if (--this->actionDelay == 0) {
+ if (--this->field_0xf == 0) {
+ this->action = 3;
+ this->y.HALF.HI += 32;
+ this->height.HALF.HI -= 32;
+ } else {
+ this->action = 1;
+ this->actionDelay = 22;
+ this->field_0x80.HALF.LO = 24;
+ }
+ }
+
+ sub_0806F69C(this);
+}
+
+void sub_0809B56C(Entity* this) {
+ Entity* fx;
+
+ if (sub_080044EC(this, 0x2800) != 1) {
+ return;
+ }
+
+ this->action = 4;
+ this->spritePriority.b0 = 4;
+
+ SetFlag(this->field_0x86.HWORD);
+
+ fx = CreateFx(this, 2, 0);
+ if (fx) {
+ ResolveEntityOnTop(this, fx);
+ }
+}
+
+void sub_0809B5B4(Entity* this) {
+ if (gPlayerState.flags.all & 0x80) {
+ sub_0800445C(this);
+ } else if (sub_08017850(this)) {
+ CreateItemEntity(this->type + 0x39, 0, 0);
+ DeleteThisEntity();
+ }
+}
+
+void sub_0809B5EC(Entity* this) {
+ if (this->spriteSettings.b.draw == 1) {
+ switch (this->subAction) {
+ case 0: {
+ Entity* parent;
+ parent = FindEntityByID(7, 26, 7);
+ if (!parent) {
+ return;
+ }
+ if (parent->x.HALF.HI < this->x.HALF.HI) {
+ return;
+ }
+ if (parent->animationState != 4) {
+ return;
+ }
+
+ this->parent = parent;
+ this->subAction = 1;
+ sub_0809B6B0(this->parent, this);
+ break;
+ }
+ case 1: {
+ if (!this->parent || !this->parent->next) {
+ DeleteThisEntity();
+ return;
+ }
+ sub_0809B6B0(this->parent, this);
+ break;
+ }
+ default:
+ return;
+ }
+
+ } else {
+ switch (this->subAction) {
+ default: {
+ DeleteThisEntity();
+ break;
+ }
+ case 0: {
+ if (GetInventoryValue(this->type + 0x39) == 2) {
+ this->subAction = 1;
+ }
+ break;
+ }
+ case 1: {
+ u8 doTextBox = gTextBox.doTextBox & 0x7f;
+ if (!doTextBox) {
+ this->spriteSettings.b.draw = 1;
+ this->subAction = doTextBox;
+ }
+ break;
+ }
+ }
+ }
+}
+
+u32 sub_0809B688(Entity* this) {
+ u32 ret;
+
+ ret = sub_080041A0(this, &gPlayerEntity, 6, 12);
+ if (ret == 1 && gPlayerState.field_0xd != 16) {
+ ret = 0;
+ }
+
+ return ret;
+}
+
+void sub_0809B6B0(Entity* parent, Entity* this) {
+ s32 offset;
+ offset = (s32)gUnk_08123D94[parent->animationState >> 1] << 16;
+
+ PositionRelative(parent, this, 0, offset);
+
+ this->height.HALF.HI = -(this->type << 2);
+ this->spritePriority.b0 = 3 - this->type;
+}
+
+void (*const BookActionFuncs[])(Entity*) = {
+ sub_0809B3C4, sub_0809B4A8, sub_0809B524, sub_0809B56C, sub_0809B5B4, sub_0809B5EC,
+};
+
+const s8 gUnk_08123D94[] = { -22, -20, -20, -20 }; \ No newline at end of file