Files
tmc/src/object/book.c
T
2021-12-20 10:31:02 -08:00

233 lines
5.5 KiB
C

#include "object.h"
#include "functions.h"
#include "script.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(MIZUKAKI_BOOK_ALLBACK)) {
DeleteThisEntity();
}
if (obtained != 2) {
this->spriteSettings.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->z.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 |= 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->z.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, FX_DEATH, 0);
if (fx) {
ResolveEntityOnTop(this, fx);
}
}
void sub_0809B5B4(Entity* this) {
if (gPlayerState.flags & PL_MINISH) {
sub_0800445C(this);
} else if (sub_08017850(this)) {
CreateItemEntity(this->type + 0x39, 0, 0);
DeleteThisEntity();
}
}
void sub_0809B5EC(Entity* this) {
if (this->spriteSettings.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 = gMessage.doTextBox & 0x7f;
if (!doTextBox) {
this->spriteSettings.draw = 1;
this->subAction = doTextBox;
}
break;
}
}
}
}
u32 sub_0809B688(Entity* this) {
u32 ret;
ret = EntityInRectRadius(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->z.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 };