tmc/src/object/warpPoint.c

229 lines
6.3 KiB
C

#include "global.h"
#include "object.h"
#include "game.h"
#include "functions.h"
#include "hitbox.h"
extern void sub_0807CAC8(u32);
extern u32 sub_0807CAEC(u32);
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->subtimer = 0;
tmp = gUnk_08121380[this->type];
this->palette.b.b0 = tmp;
this->spritePriority.b0 = 6;
this->hitbox = (Hitbox*)&gHitbox_1;
this->updatePriority = PRIO_NO_BLOCK;
InitializeAnimation(this, 0);
if (CheckFlags(this->field_0x86.HWORD)) {
sub_0808B830(this);
} else {
if (AreaIsDungeon() && sub_0807CAEC(this->type)) {
sub_0808B830(this);
}
}
if (!sub_0808B7C8(this))
return;
this->action = 4;
this->subtimer = 0x60;
gPlayerEntity.x.HALF.HI = this->x.HALF.HI;
gPlayerEntity.y.HALF.HI = this->y.HALF.HI;
gPlayerEntity.animationState = 4;
EnqueueSFX(SFX_112);
RequestPriorityDuration(this, this->subtimer + 0x10);
}
void sub_0808B530(Entity* this) {
if (CheckFlags(this->field_0x86.HWORD)) {
sub_0808B830(this);
if (AreaIsDungeon()) {
sub_0807CAC8(this->type);
}
this->action = 2;
this->subtimer = 60;
EnqueueSFX(SFX_112);
}
}
void sub_0808B564(Entity* this) {
if (!--this->subtimer) {
this->action = 3;
} else {
this->spriteSettings.draw = this->subtimer & 2 ? 0 : 1;
}
}
void sub_0808B590(Entity* this) {
GetNextFrame(this);
if (sub_0808B7C8(this)) {
if (this->timer)
return;
this->action = 5;
this->subtimer = 0x60;
PutAwayItems();
gPlayerEntity.x.HALF.HI = this->x.HALF.HI;
gPlayerEntity.y.HALF.HI = this->y.HALF.HI;
gPlayerEntity.animationState = 4;
gPlayerEntity.flags &= ~ENT_COLLIDE;
RequestPriorityDuration(this, this->subtimer + 0x10);
SoundReq(SFX_113);
} else {
this->timer = 0;
}
}
void sub_0808B5E8(Entity* this) {
u32 tmp;
if (!--this->subtimer) {
this->action = 3;
this->timer = 1;
gPlayerEntity.animationState = 4;
gPlayerEntity.direction = DirectionSouth;
return;
}
tmp = 0;
switch (this->subtimer & 0x60) {
case 0x40:
if (this->subtimer == 0x58) {
SoundReq(SFX_114);
}
if (!(this->subtimer & 1)) {
tmp = 1;
}
break;
case 0x20:
if (!(this->subtimer & 3)) {
tmp = 1;
}
break;
case 0:
if (!(this->subtimer & 7)) {
if (gPlayerEntity.animationState == 4) {
if (this->subtimer > 0x18) {
tmp = 1;
}
} else {
tmp = 1;
}
}
break;
}
if (tmp) {
gPlayerEntity.animationState += 2;
gPlayerEntity.animationState &= 6;
}
}
void sub_0808B684(Entity* this) {
u32 tmp;
if (!--this->subtimer) {
gRoomTransition.transitioningOut = 1;
gRoomTransition.type = TRANSITION_DEFAULT;
gRoomTransition.player_status.area_next = this->field_0x7c.BYTES.byte0;
gRoomTransition.player_status.room_next = this->field_0x7c.BYTES.byte1;
gRoomTransition.player_status.start_pos_x = ((this->cutsceneBeh.HWORD & 0x3f) << 4) + 8;
gRoomTransition.player_status.start_pos_y = ((this->cutsceneBeh.HWORD & 0xfc0) >> 2) + 8;
gRoomTransition.player_status.layer = 0;
gRoomTransition.player_status.start_anim = 4;
gRoomTransition.player_status.spawn_type = PL_SPAWN_DEFAULT;
if (this->type == 2) {
gRoomTransition.type = TRANSITION_FADE_WHITE_SLOW;
}
return;
}
tmp = 0;
switch (this->subtimer & 0x60) {
case 0x40:
if (!(this->subtimer & 7)) {
tmp = 1;
}
break;
case 0x20:
if (!(this->subtimer & 3)) {
tmp = 1;
}
break;
case 0:
if (this->subtimer > 0x10) {
if (!(this->subtimer & 1)) {
tmp = 1;
}
} else {
gPlayerEntity.spriteSettings.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 (EntityWithinDistance(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI, 0x28)) {
this->spriteSettings.draw = 1;
} else {
if (EntityWithinDistance(this, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI, 0x2e)) {
this->spriteSettings.draw ^= 1;
} else {
this->spriteSettings.draw = 0;
}
}
GetNextFrame(this);
}
u32 sub_0808B7C8(Entity* this) {
if (!(gPlayerState.flags & PL_MINISH) && gPlayerState.framestate != PL_STATE_DIE && gPlayerEntity.health != 0 &&
PlayerCanBeMoved() && EntityInRectRadius(this, &gPlayerEntity, 5, 5) && gPlayerEntity.z.HALF.HI == 0) {
if (this->timer == 0 && gPlayerEntity.action == PLAYER_08072C9C) {
ResetPlayerAnimationAndAction();
}
return 1;
}
return 0;
}
void sub_0808B830(Entity* this) {
Entity* tmp;
this->action = 3;
this->timer = 0;
this->spriteSettings.draw = 1;
tmp = CreateObject(WARP_POINT, 0, 0);
if (tmp) {
tmp->field_0x70.BYTES.byte0 = 1;
tmp->parent = this;
CopyPosition(this, tmp);
}
}