mirror of https://github.com/zeldaret/tmc.git
145 lines
3.5 KiB
C
145 lines
3.5 KiB
C
#include "save.h"
|
|
#include "object.h"
|
|
#include "functions.h"
|
|
#include "item.h"
|
|
|
|
extern void (*const gUnk_08123EC0[])(Entity*);
|
|
extern void (*const gUnk_08123EEC[])(Entity*);
|
|
extern void (*const gUnk_08123EF4[])(Entity*);
|
|
extern void (*const gUnk_08123EFC[])(Entity*);
|
|
extern void (*const gUnk_08123F04[])(Entity*);
|
|
|
|
void Bird(Entity* this) {
|
|
gUnk_08123EC0[this->type](this);
|
|
}
|
|
|
|
void sub_0809CF3C(Entity* this) {
|
|
gUnk_08123EEC[this->action](this);
|
|
}
|
|
|
|
void sub_0809CF54(Entity* this) {
|
|
Entity* target;
|
|
|
|
this->action++;
|
|
this->spriteSettings.draw = TRUE;
|
|
this->actionDelay = 0x31;
|
|
this->field_0xf = 1;
|
|
this->zVelocity = Q_16_16(-1.5);
|
|
this->z.WORD = Q_16_16(-56.75);
|
|
this->field_0x68.HWORD = Q_16_16(-0.03125);
|
|
this->speed = 0x280;
|
|
this->direction = 8;
|
|
this->collisionLayer = 2;
|
|
this->x.HALF.HI = gRoomControls.scroll_x;
|
|
SoundReq(SFX_123);
|
|
UpdateSpriteForCollisionLayer(this);
|
|
InitAnimationForceUpdate(this, 0);
|
|
target = CreateObject(BIRD, 1, 0);
|
|
if (target != NULL) {
|
|
target->parent = this;
|
|
PositionRelative(this, target, 0, Q_16_16(8.0));
|
|
SortEntityAbove(this, target);
|
|
}
|
|
}
|
|
|
|
void sub_0809CFEC(Entity* this) {
|
|
|
|
LinearMoveUpdate(this);
|
|
GravityUpdate(this, *(s16*)&this->field_0x68.HWORD);
|
|
if (this->actionDelay != 0) {
|
|
if (--this->actionDelay == 0) {
|
|
this->field_0xf = 0;
|
|
}
|
|
} else if (CheckOnScreen(this) == 0) {
|
|
DeleteThisEntity();
|
|
}
|
|
UpdateAnimationSingleFrame(this);
|
|
}
|
|
|
|
void sub_0809D030(Entity* this) {
|
|
gUnk_08123EF4[this->action](this);
|
|
}
|
|
|
|
void sub_0809D048(Entity* this) {
|
|
this->action++;
|
|
this->collisionLayer = 1;
|
|
UpdateSpriteForCollisionLayer(this);
|
|
InitAnimationForceUpdate(this, 0x17);
|
|
}
|
|
|
|
void sub_0809D06C(Entity* this) {
|
|
gUnk_08123EFC[this->subAction](this);
|
|
}
|
|
|
|
void sub_0809D084(Entity* this) {
|
|
u32 temp;
|
|
|
|
if (this->parent != NULL) {
|
|
temp = this->parent->field_0xf;
|
|
if (temp != 0) {
|
|
PositionRelative(this->parent, this, 0, Q_16_16(8.0));
|
|
} else {
|
|
this->subAction++;
|
|
this->zVelocity = temp;
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_0809D0AC(Entity* this) {
|
|
Entity* fx;
|
|
|
|
if (sub_080044EC(this, 0x1800) < 2) {
|
|
this->type = 2;
|
|
this->action = 1;
|
|
this->z.WORD = 0;
|
|
this->collisionLayer = 1;
|
|
SetLocalFlag(LV3_OCARINA_FALL);
|
|
SoundReq(SFX_SECRET);
|
|
fx = CreateFx(this, FX_DASH, 0);
|
|
if (fx != NULL) {
|
|
SortEntityBelow(this, fx);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_0809D0F4(Entity* this) {
|
|
gUnk_08123F04[this->action](this);
|
|
}
|
|
|
|
void sub_0809D10C(Entity* this) {
|
|
this->action++;
|
|
this->collisionLayer = 1;
|
|
UpdateSpriteForCollisionLayer(this);
|
|
InitAnimationForceUpdate(this, 0x17);
|
|
}
|
|
|
|
void sub_0809D130(Entity* this) {
|
|
if ((gPlayerState.flags & PL_MINISH) != 0) {
|
|
sub_0800445C(this);
|
|
} else if (IsCollidingPlayer(this) != 0) {
|
|
CreateItemEntity(0x17, 0, 0);
|
|
gSave.windcrests |= 0x10000000;
|
|
DeleteThisEntity();
|
|
}
|
|
}
|
|
|
|
void sub_0809D178(Entity* this) {
|
|
|
|
if (this->action == 0) {
|
|
this->action++;
|
|
this->collisionLayer = 2;
|
|
UpdateSpriteForCollisionLayer(this);
|
|
this->frame = 0x80;
|
|
}
|
|
if ((this->frame & 0x80) != 0) {
|
|
InitializeAnimation(this, Random() & 3);
|
|
this->frameDuration = (Random() & 0xf) + 0x10;
|
|
this->spriteSettings.flipX = FALSE;
|
|
if ((Random() & 1) != 0) {
|
|
this->spriteSettings.flipX = TRUE;
|
|
}
|
|
} else {
|
|
GetNextFrame(this);
|
|
}
|
|
}
|