mirror of
https://github.com/zeldaret/tmc
synced 2026-07-24 14:09:12 -04:00
merge
This commit is contained in:
@@ -22,7 +22,7 @@ void sub_0809CC74(Entity* this) {
|
||||
/* Create steam clouds */
|
||||
for (i = 0; i < 3; i++) {
|
||||
ent = CreateObject(BAKER_OVEN, 1, i);
|
||||
if (ent) {
|
||||
if (ent != NULL) {
|
||||
ent->parent = this;
|
||||
PositionRelative(this, ent, 16 * Q_16_16((i + 1) / 2) - Q_16_16(8.0), Q_16_16(-14.0));
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ void sub_08088BE0(BigBarrelEntity* this) {
|
||||
if (CheckLocalFlag(0x15) == 0) {
|
||||
sub_08088C78(this, 2, 0, 0xffffff88);
|
||||
ent = sub_08088C78(this, 4, 0x15, 0);
|
||||
if (ent) {
|
||||
if (ent != NULL) {
|
||||
ent->x.HALF.HI = gRoomControls.origin_x + 0x48;
|
||||
ent->y.HALF.HI = gRoomControls.origin_y + 200;
|
||||
}
|
||||
@@ -114,7 +114,7 @@ void sub_08088BE0(BigBarrelEntity* this) {
|
||||
if (CheckLocalFlag(0x16) == 0) {
|
||||
sub_08088C78(this, 2, 1, 0x78);
|
||||
ent = sub_08088C78(this, 4, 0x16, 0);
|
||||
if (ent) {
|
||||
if (ent != NULL) {
|
||||
ent->x.HALF.HI = gRoomControls.origin_x + 0x188;
|
||||
ent->y.HALF.HI = gRoomControls.origin_y + 200;
|
||||
}
|
||||
@@ -249,7 +249,7 @@ void sub_08088E74(BigBarrelEntity* this) {
|
||||
} else {
|
||||
if ((gRoomTransition.frameCount & 7U) == 0) {
|
||||
ent = CreateObjectWithParent(super, OBJECT_2A, 0, 0x1e);
|
||||
if (ent) {
|
||||
if (ent != NULL) {
|
||||
ent->updatePriority = 3;
|
||||
ent->spriteRendering.b3 = 0;
|
||||
ent->spritePriority.b0 = 0;
|
||||
|
||||
+281
-24
@@ -2,22 +2,45 @@
|
||||
#include "object.h"
|
||||
#include "functions.h"
|
||||
#include "item.h"
|
||||
#include "message.h"
|
||||
#include "game.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*);
|
||||
extern u16 script_EzloTalkOcarina[];
|
||||
|
||||
void Bird_Type0(Entity*);
|
||||
void Bird_Type1(Entity*);
|
||||
void Bird_Type2(Entity*);
|
||||
void Bird_Type3(Entity*);
|
||||
void Bird_Type8(Entity*);
|
||||
void Bird_Type9(Entity*);
|
||||
void Bird_Type10(Entity*);
|
||||
void Bird_Type0_Init(Entity*);
|
||||
void Bird_Type0_Action1(Entity*);
|
||||
void Bird_Type1_Init(Entity*);
|
||||
void Bird_Type1_Action1(Entity*);
|
||||
void Bird_Type1_Action1_Subaction0(Entity*);
|
||||
void Bird_Type1_Action1_Subaction1(Entity*);
|
||||
void Bird_Type2_Init(Entity*);
|
||||
void Bird_Type2_Action1(Entity*);
|
||||
|
||||
void Bird(Entity* this) {
|
||||
gUnk_08123EC0[this->type](this);
|
||||
static void (*const typeFuncs[])(Entity*) = {
|
||||
Bird_Type0, Bird_Type1, Bird_Type2, Bird_Type3, Bird_Type3, Bird_Type3,
|
||||
Bird_Type3, Bird_Type3, Bird_Type8, Bird_Type9, Bird_Type10,
|
||||
};
|
||||
typeFuncs[this->type](this);
|
||||
}
|
||||
|
||||
void sub_0809CF3C(Entity* this) {
|
||||
gUnk_08123EEC[this->action](this);
|
||||
void Bird_Type0(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
Bird_Type0_Init,
|
||||
Bird_Type0_Action1,
|
||||
};
|
||||
|
||||
actionFuncs[this->action](this);
|
||||
}
|
||||
|
||||
void sub_0809CF54(Entity* this) {
|
||||
void Bird_Type0_Init(Entity* this) {
|
||||
Entity* target;
|
||||
|
||||
this->action++;
|
||||
@@ -42,8 +65,7 @@ void sub_0809CF54(Entity* this) {
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809CFEC(Entity* this) {
|
||||
|
||||
void Bird_Type0_Action1(Entity* this) {
|
||||
LinearMoveUpdate(this);
|
||||
GravityUpdate(this, *(s16*)&this->field_0x68.HWORD);
|
||||
if (this->actionDelay != 0) {
|
||||
@@ -56,22 +78,30 @@ void sub_0809CFEC(Entity* this) {
|
||||
UpdateAnimationSingleFrame(this);
|
||||
}
|
||||
|
||||
void sub_0809D030(Entity* this) {
|
||||
gUnk_08123EF4[this->action](this);
|
||||
void Bird_Type1(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
Bird_Type1_Init,
|
||||
Bird_Type1_Action1,
|
||||
};
|
||||
actionFuncs[this->action](this);
|
||||
}
|
||||
|
||||
void sub_0809D048(Entity* this) {
|
||||
void Bird_Type1_Init(Entity* this) {
|
||||
this->action++;
|
||||
this->collisionLayer = 1;
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
InitAnimationForceUpdate(this, 0x17);
|
||||
}
|
||||
|
||||
void sub_0809D06C(Entity* this) {
|
||||
gUnk_08123EFC[this->subAction](this);
|
||||
void Bird_Type1_Action1(Entity* this) {
|
||||
static void (*const subActionFuncs[])(Entity*) = {
|
||||
Bird_Type1_Action1_Subaction0,
|
||||
Bird_Type1_Action1_Subaction1,
|
||||
};
|
||||
subActionFuncs[this->subAction](this);
|
||||
}
|
||||
|
||||
void sub_0809D084(Entity* this) {
|
||||
void Bird_Type1_Action1_Subaction0(Entity* this) {
|
||||
u32 temp;
|
||||
|
||||
if (this->parent != NULL) {
|
||||
@@ -85,7 +115,7 @@ void sub_0809D084(Entity* this) {
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809D0AC(Entity* this) {
|
||||
void Bird_Type1_Action1_Subaction1(Entity* this) {
|
||||
Entity* fx;
|
||||
|
||||
if (sub_080044EC(this, 0x1800) < 2) {
|
||||
@@ -102,28 +132,32 @@ void sub_0809D0AC(Entity* this) {
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809D0F4(Entity* this) {
|
||||
gUnk_08123F04[this->action](this);
|
||||
void Bird_Type2(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
Bird_Type2_Init,
|
||||
Bird_Type2_Action1,
|
||||
};
|
||||
actionFuncs[this->action](this);
|
||||
}
|
||||
|
||||
void sub_0809D10C(Entity* this) {
|
||||
void Bird_Type2_Init(Entity* this) {
|
||||
this->action++;
|
||||
this->collisionLayer = 1;
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
InitAnimationForceUpdate(this, 0x17);
|
||||
}
|
||||
|
||||
void sub_0809D130(Entity* this) {
|
||||
void Bird_Type2_Action1(Entity* this) {
|
||||
if ((gPlayerState.flags & PL_MINISH) != 0) {
|
||||
sub_0800445C(this);
|
||||
} else if (IsCollidingPlayer(this) != 0) {
|
||||
CreateItemEntity(0x17, 0, 0);
|
||||
CreateItemEntity(ITEM_OCARINA, 0, 0);
|
||||
gSave.windcrests |= 0x10000000;
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809D178(Entity* this) {
|
||||
void Bird_Type3(Entity* this) {
|
||||
|
||||
if (this->action == 0) {
|
||||
this->action++;
|
||||
@@ -131,6 +165,7 @@ void sub_0809D178(Entity* this) {
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
this->frame = 0x80;
|
||||
}
|
||||
|
||||
if ((this->frame & ANIM_DONE) != 0) {
|
||||
InitializeAnimation(this, Random() & 3);
|
||||
this->frameDuration = (Random() & 0xf) + 0x10;
|
||||
@@ -142,3 +177,225 @@ void sub_0809D178(Entity* this) {
|
||||
GetNextFrame(this);
|
||||
}
|
||||
}
|
||||
|
||||
void Bird_Type8(Entity* this) {
|
||||
Entity* pEVar5;
|
||||
|
||||
switch (this->action) {
|
||||
case 0:
|
||||
if (this->actionDelay != 0) {
|
||||
this->frameIndex = 0xff;
|
||||
this->actionDelay--;
|
||||
return;
|
||||
}
|
||||
this->action = 1;
|
||||
this->zVelocity = 0;
|
||||
this->z.WORD = Q_16_16(-20.0);
|
||||
this->speed = 0x180;
|
||||
this->direction = 8;
|
||||
this->collisionLayer = 1;
|
||||
this->spritePriority.b0 = 0;
|
||||
this->spriteRendering.b3 = 0;
|
||||
this->spriteOrientation.flipY = 1;
|
||||
this->x.HALF.HI = gRoomControls.scroll_x;
|
||||
this->y.HALF.HI = gPlayerEntity.y.HALF.HI;
|
||||
this->child = NULL;
|
||||
SetDefaultPriority(this, 6);
|
||||
InitAnimationForceUpdate(this, 0);
|
||||
SoundReq(0x123);
|
||||
break;
|
||||
case 1:
|
||||
this->collisionLayer = gPlayerEntity.collisionLayer;
|
||||
this->speed += 8;
|
||||
if (this->speed > 0x300) {
|
||||
this->speed = 0x300;
|
||||
}
|
||||
|
||||
if ((gPlayerEntity.flags & 0x80) != 0 && (gMessage.doTextBox & 0x7f) == 0 && gPlayerEntity.action != 28 &&
|
||||
gPlayerEntity.action != 6 && gPlayerEntity.action != 9 && gPlayerState.framestate != 24 &&
|
||||
gPlayerState.framestate != 11 && gPlayerState.framestate != 8 && sub_08079F8C() &&
|
||||
(EntityInRectRadius(this, &gPlayerEntity, 0xe, 0xe))) {
|
||||
s32 z = gPlayerEntity.z.HALF.HI - this->z.HALF.HI - 8;
|
||||
if ((u16)z < 0x20 && gPlayerEntity.health != 0) {
|
||||
pEVar5 = CreateObject(0x95, 10, 0);
|
||||
if (pEVar5 != NULL) {
|
||||
this->child = pEVar5;
|
||||
this->action = 2;
|
||||
this->actionDelay = 8;
|
||||
this->speed = 0x300;
|
||||
this->field_0x68.HWORD = 0xe000;
|
||||
sub_08079184();
|
||||
sub_08078B48();
|
||||
ResetPlayerAnimationAndAction();
|
||||
sub_08077B20();
|
||||
gPlayerState.swim_state = 0;
|
||||
gPlayerState.jump_status = 0;
|
||||
gPlayerEntity.flags &= 0x7f;
|
||||
gPlayerEntity.spriteSettings.draw = 0;
|
||||
gPriorityHandler.sys_priority = 6;
|
||||
gUnk_02034490.unk0 = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sub_08078B48();
|
||||
gPlayerEntity.spriteSettings.draw = 0;
|
||||
break;
|
||||
}
|
||||
LinearMoveUpdate(this);
|
||||
GravityUpdate(this, (s16)this->field_0x68.HWORD);
|
||||
UpdateAnimationSingleFrame(this);
|
||||
pEVar5 = this->child;
|
||||
if (pEVar5 != NULL) {
|
||||
if (gPlayerEntity.x.HALF.HI < this->x.HALF.HI - 8) {
|
||||
this->actionDelay = 0;
|
||||
}
|
||||
|
||||
if (this->actionDelay == 0) {
|
||||
PositionRelative(this, pEVar5, 0xfff80000, 0);
|
||||
pEVar5->z.HALF.HI += 0x18;
|
||||
pEVar5->spritePriority.b0 = this->spritePriority.b0;
|
||||
pEVar5->spriteRendering.b3 = this->spriteRendering.b3;
|
||||
pEVar5->spriteOrientation.flipY = this->spriteOrientation.flipY;
|
||||
} else {
|
||||
this->actionDelay--;
|
||||
CopyPosition(&gPlayerEntity, pEVar5);
|
||||
}
|
||||
}
|
||||
|
||||
if (CheckOnScreen(this) == 0) {
|
||||
if (this->action == 2) {
|
||||
gSave.windcrests |= 0x10000000;
|
||||
MenuFadeIn(9, 0);
|
||||
}
|
||||
pEVar5 = this->child;
|
||||
if (pEVar5 != NULL) {
|
||||
DeleteEntityAny(pEVar5);
|
||||
}
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
|
||||
void Bird_Type9(Entity* this) {
|
||||
Entity* pEVar1;
|
||||
Entity* child;
|
||||
|
||||
if (this->action == 0) {
|
||||
this->action = 1;
|
||||
this->spriteSettings.draw = 1;
|
||||
this->zVelocity = -0x28000;
|
||||
this->z.WORD = 0xffb4c000;
|
||||
this->field_0x68.HWORD = 0xf000;
|
||||
this->speed = 0x300;
|
||||
this->direction = 8;
|
||||
this->collisionLayer = 1;
|
||||
this->spritePriority.b0 = 0;
|
||||
this->spriteRendering.b3 = 0;
|
||||
this->spriteOrientation.flipY = 1;
|
||||
;
|
||||
SetDefaultPriority(this, 6);
|
||||
this->x.HALF.HI = gRoomControls.scroll_x;
|
||||
this->y.HALF.HI = gPlayerEntity.y.HALF.HI;
|
||||
SoundReq(SFX_123);
|
||||
this->spritePriority.b1 = 2;
|
||||
InitAnimationForceUpdate(this, 0);
|
||||
sub_08078B48();
|
||||
} else if (this->action == 1) {
|
||||
gPlayerEntity.spriteSettings.draw = 0;
|
||||
child = this->child;
|
||||
if (child != NULL) {
|
||||
PositionRelative(this, child, Q_16_16(-8), 0);
|
||||
child->z.HALF.HI += 0x18;
|
||||
child->spritePriority.b0 = this->spritePriority.b0;
|
||||
child->spriteRendering.b3 = this->spriteRendering.b3;
|
||||
child->spriteOrientation.flipY = this->spriteOrientation.flipY;
|
||||
}
|
||||
sub_08078B48();
|
||||
if (gRoomControls.scroll_x + 0x78 < this->x.HALF.HI) {
|
||||
this->action++;
|
||||
this->spritePriority.b1 = 1;
|
||||
if (child != NULL) {
|
||||
child->action++;
|
||||
}
|
||||
gRoomControls.camera_target = &gPlayerEntity;
|
||||
gPlayerEntity.spriteSettings.draw = 1;
|
||||
ResetPlayerAnimationAndAction();
|
||||
ResetPlayerEventPriority();
|
||||
gUnk_02034490.unk0 = 0;
|
||||
if (!CheckGlobalFlag(WARP_1ST)) {
|
||||
pEVar1 = CreateObject(OBJECT_69, 0, 0);
|
||||
if (pEVar1 != NULL) {
|
||||
*(ScriptExecutionContext**)&pEVar1->cutsceneBeh = StartCutscene(pEVar1, script_EzloTalkOcarina);
|
||||
SetGlobalFlag(WARP_1ST);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
LinearMoveUpdate(this);
|
||||
GravityUpdate(this, (short)this->field_0x68.HWORD);
|
||||
UpdateAnimationSingleFrame(this);
|
||||
if (!CheckOnScreen(this)) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
|
||||
void Bird_Type10(Entity* this) {
|
||||
this->palette.b.b0 = gPlayerEntity.palette.b.b0;
|
||||
switch (this->action) {
|
||||
case 0:
|
||||
this->action = 1;
|
||||
this->spriteSettings.draw = 1;
|
||||
this->collisionLayer = 1;
|
||||
this->spritePriority.b0 = 0;
|
||||
this->spriteRendering.b3 = 0;
|
||||
this->spriteOrientation.flipY = 1;
|
||||
SetDefaultPriority(this, 6);
|
||||
InitAnimationForceUpdate(this, 0xe0);
|
||||
case 1:
|
||||
UpdateAnimationSingleFrame(this);
|
||||
break;
|
||||
case 2:
|
||||
this->action = 3;
|
||||
break;
|
||||
case 3:
|
||||
DeleteThisEntity();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CreateBird(void) {
|
||||
Entity* birdEnt;
|
||||
|
||||
#ifndef EU
|
||||
if (AreaAllowsWarp()) {
|
||||
#else
|
||||
if (AreaIsOverworld()) {
|
||||
#endif
|
||||
if (!FindEntity(OBJECT, BIRD, 6, 8, 0)) {
|
||||
birdEnt = CreateObject(BIRD, 8, 0);
|
||||
if (birdEnt != NULL) {
|
||||
birdEnt->actionDelay = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809D738(void) {
|
||||
Entity* pEVar1;
|
||||
Entity* pEVar2;
|
||||
|
||||
pEVar1 = CreateObject(BIRD, 9, 0);
|
||||
if (pEVar1 != NULL) {
|
||||
gRoomControls.camera_target = NULL;
|
||||
SetDefaultPriority(pEVar1, 6);
|
||||
SetPlayerEventPriority();
|
||||
pEVar2 = CreateObject(BIRD, 10, 0);
|
||||
if (pEVar2 != NULL) {
|
||||
pEVar1->child = pEVar2;
|
||||
}
|
||||
gUnk_02034490.unk0 = 1;
|
||||
} else {
|
||||
ResetPlayerAnimationAndAction();
|
||||
}
|
||||
}
|
||||
|
||||
+21
-25
@@ -15,11 +15,9 @@ void Book(Entity* this) {
|
||||
}
|
||||
|
||||
void sub_0809B3C4(Entity* this) {
|
||||
u32 obtained;
|
||||
|
||||
obtained = GetInventoryValue(this->type + ITEM_QST_BOOK1);
|
||||
u32 obtained = GetInventoryValue(this->type + ITEM_QST_BOOK1);
|
||||
if (this->type2 != 3) {
|
||||
if (obtained) {
|
||||
if (obtained != 0) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
} else {
|
||||
@@ -42,7 +40,7 @@ void sub_0809B3C4(Entity* this) {
|
||||
}
|
||||
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
InitAnimationForceUpdate(this, this->type + 0x39);
|
||||
InitAnimationForceUpdate(this, this->type + ITEM_QST_BOOK1);
|
||||
|
||||
switch (this->type2) {
|
||||
case 0:
|
||||
@@ -55,22 +53,23 @@ void sub_0809B3C4(Entity* this) {
|
||||
case 1: {
|
||||
u32 scroll;
|
||||
u32 height;
|
||||
|
||||
this->action = 3;
|
||||
scroll = (u16)gRoomControls.scroll_y - 0x10;
|
||||
height = (u16)this->y.HALF.HI - scroll;
|
||||
this->z.HALF.HI -= height;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
this->action = 4;
|
||||
return;
|
||||
break;
|
||||
case 3:
|
||||
this->action = 5;
|
||||
this->subAction = 0;
|
||||
this->spritePriority.b0 = 3;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,10 +88,10 @@ void sub_0809B4A8(Entity* this) {
|
||||
|
||||
this->action = 2;
|
||||
this->actionDelay = 30;
|
||||
this->speed = 64;
|
||||
this->direction = 16;
|
||||
this->speed = 0x40;
|
||||
this->direction = 0x10;
|
||||
|
||||
gPlayerState.pushedObject = 0x9e;
|
||||
gPlayerState.pushedObject = TREE_THORNS;
|
||||
gPlayerState.queued_action = PLAYER_PUSH;
|
||||
gPlayerState.flags |= PL_BUSY;
|
||||
|
||||
@@ -101,7 +100,7 @@ void sub_0809B4A8(Entity* this) {
|
||||
gPlayerEntity.direction = gPlayerEntity.animationState << 2;
|
||||
EnqueueSFX(SFX_10F);
|
||||
} else {
|
||||
this->actionDelay = 0x16;
|
||||
this->actionDelay = 22;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,12 +108,12 @@ 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;
|
||||
this->y.HALF.HI += 0x20;
|
||||
this->z.HALF.HI -= 0x20;
|
||||
} else {
|
||||
this->action = 1;
|
||||
this->actionDelay = 22;
|
||||
this->field_0x80.HALF.LO = 24;
|
||||
this->field_0x80.HALF.LO = 0x18;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,7 +133,7 @@ void sub_0809B56C(Entity* this) {
|
||||
SetFlag(this->field_0x86.HWORD);
|
||||
|
||||
fx = CreateFx(this, FX_DEATH, 0);
|
||||
if (fx) {
|
||||
if (fx != NULL) {
|
||||
SortEntityAbove(this, fx);
|
||||
}
|
||||
}
|
||||
@@ -143,7 +142,7 @@ void sub_0809B5B4(Entity* this) {
|
||||
if (gPlayerState.flags & PL_MINISH) {
|
||||
sub_0800445C(this);
|
||||
} else if (IsCollidingPlayer(this)) {
|
||||
CreateItemEntity(this->type + 0x39, 0, 0);
|
||||
CreateItemEntity(this->type + ITEM_QST_BOOK1, 0, 0);
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
@@ -152,9 +151,8 @@ void sub_0809B5EC(Entity* this) {
|
||||
if (this->spriteSettings.draw == 1) {
|
||||
switch (this->subAction) {
|
||||
case 0: {
|
||||
Entity* parent;
|
||||
parent = FindEntityByID(NPC, STURGEON, 7);
|
||||
if (!parent) {
|
||||
Entity* parent = FindEntityByID(NPC, STURGEON, 7);
|
||||
if (parent == NULL) {
|
||||
return;
|
||||
}
|
||||
if (parent->x.HALF.HI < this->x.HALF.HI) {
|
||||
@@ -170,7 +168,7 @@ void sub_0809B5EC(Entity* this) {
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
if (!this->parent || !this->parent->next) {
|
||||
if ((this->parent == NULL) || (this->parent->next == NULL)) {
|
||||
DeleteThisEntity();
|
||||
return;
|
||||
}
|
||||
@@ -206,9 +204,8 @@ void sub_0809B5EC(Entity* this) {
|
||||
}
|
||||
|
||||
u32 sub_0809B688(Entity* this) {
|
||||
u32 ret;
|
||||
u32 ret = EntityInRectRadius(this, &gPlayerEntity, 6, 12);
|
||||
|
||||
ret = EntityInRectRadius(this, &gPlayerEntity, 6, 12);
|
||||
if (ret == 1 && gPlayerState.field_0xd != 16) {
|
||||
ret = 0;
|
||||
}
|
||||
@@ -217,8 +214,7 @@ u32 sub_0809B688(Entity* this) {
|
||||
}
|
||||
|
||||
void sub_0809B6B0(Entity* parent, Entity* this) {
|
||||
s32 offset;
|
||||
offset = (s32)gUnk_08123D94[parent->animationState >> 1] << 16;
|
||||
s32 offset = (s32)gUnk_08123D94[parent->animationState >> 1] << 16;
|
||||
|
||||
PositionRelative(parent, this, 0, offset);
|
||||
|
||||
|
||||
+1
-1
@@ -242,7 +242,7 @@ u32 sub_08081F7C(Entity* this, u32 r7) {
|
||||
if (this->actionDelay == 0)
|
||||
return 1;
|
||||
if (--this->actionDelay > 6) {
|
||||
if (this->child)
|
||||
if (this->child != NULL)
|
||||
this->child->spriteOffsetY = -4;
|
||||
} else {
|
||||
if (this->actionDelay == 6) {
|
||||
|
||||
@@ -0,0 +1,358 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "script.h"
|
||||
#include "npc.h"
|
||||
#include "fileselect.h"
|
||||
#include "functions.h"
|
||||
#include "object.h"
|
||||
#include "enemy.h"
|
||||
|
||||
typedef struct {
|
||||
Entity base;
|
||||
s16 unk68;
|
||||
s16 unk6a;
|
||||
s16 unk6c;
|
||||
u16 unk6e;
|
||||
u8 unk70[0x18];
|
||||
} ObjectB9Entity;
|
||||
|
||||
typedef Entity* ObjectB9Heap[10];
|
||||
|
||||
u32 sub_080A1514();
|
||||
|
||||
const u16 gUnk_08124C20[] = {
|
||||
25, 0x2, 25, 0x3, 30, 0x4, 45, 0x5, 50, 0x5, 45, 0x5, 50, 0x6, 60, 0x7, 55, 0x2, 55, 0x3,
|
||||
};
|
||||
|
||||
static const u16 pObjectB9_MinigameCuccoDefs[][30] = {
|
||||
{ 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001,
|
||||
0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321,
|
||||
0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC },
|
||||
{ 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001,
|
||||
0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321,
|
||||
0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC },
|
||||
{ 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001,
|
||||
0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321,
|
||||
0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC },
|
||||
{
|
||||
0x0002, 0x02F6, 0x0346, 0x0001, 0x0266, 0x033C, 0x0001, 0x0319, 0x0296, 0x0001,
|
||||
0x0284, 0x0284, 0x0002, 0x0216, 0x0284, 0x0001, 0x0142, 0x0330, 0x0002, 0x0179,
|
||||
0x039F, 0x0001, 0x03A6, 0x0280, 0x0001, 0x039A, 0x015D, 0x0001, 0x031E, 0x01E5,
|
||||
},
|
||||
{ 0x0001, 0x0296, 0x0314, 0x0001, 0x02E6, 0x0231, 0x0001, 0x0254, 0x0290, 0x0001,
|
||||
0x01F8, 0x0325, 0x0001, 0x0185, 0x0367, 0x0001, 0x0320, 0x01D6, 0x0002, 0x01F8,
|
||||
0x0287, 0x0002, 0x029D, 0x01B1, 0x0002, 0x01F9, 0x022D, 0x0002, 0x0114, 0x0321 },
|
||||
{ 0x0002, 0x02F6, 0x0346, 0x0001, 0x0266, 0x033C, 0x0001, 0x0319, 0x0296, 0x0001,
|
||||
0x0284, 0x0284, 0x0002, 0x0216, 0x0284, 0x0001, 0x0142, 0x0330, 0x0002, 0x0179,
|
||||
0x039F, 0x0002, 0x022D, 0x01CB, 0x0001, 0x039A, 0x015D, 0x0001, 0x031E, 0x01E5 },
|
||||
{ 0x0001, 0x02E9, 0x0318, 0x0001, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001,
|
||||
0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321,
|
||||
0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0001, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC },
|
||||
{ 0x0001, 0x02E9, 0x0318, 0x0002, 0x0280, 0x0380, 0x0002, 0x0277, 0x0314, 0x0001,
|
||||
0x0332, 0x0248, 0x0001, 0x0257, 0x028C, 0x0001, 0x0199, 0x031B, 0x0001, 0x0321,
|
||||
0x01B4, 0x0002, 0x02DF, 0x01D8, 0x0002, 0x03AD, 0x02DE, 0x0001, 0x0216, 0x01CC },
|
||||
{ 0x0001, 0x004D, 0x00F3, 0x0001, 0x011A, 0x0247, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 },
|
||||
{ 0x0001, 0x0051, 0x0328, 0x0002, 0x0114, 0x0321, 0x0002, 0x0332, 0x0248, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }
|
||||
};
|
||||
|
||||
static const u8 gUnk_08124EA0[] = { 0x3F, 0x0A, 0x01, 0x00, 0x3F, 0x0A, 0x01, 0x00, 0x3F, 0x14, 0x01, 0x00, 0x3F, 0x14,
|
||||
0x01, 0x00, 0x3F, 0x1E, 0x01, 0x00, 0x3F, 0x1E, 0x01, 0x00, 0x5C, 0x6E, 0x01, 0x00,
|
||||
0x5C, 0x6F, 0x01, 0x00, 0x5C, 0x70, 0x01, 0x00, 0x63, 0x00, 0x01, 0x00 };
|
||||
|
||||
static const u16 CuccoMinigame_Sounds[] = { SFX_VO_CUCCO5, SFX_VO_CUCCO_CALL };
|
||||
|
||||
static const u8 CuccoMinigameRupees[] = { 0, 10, 50, 0 };
|
||||
|
||||
void ObjectB9(ObjectB9Entity* this) {
|
||||
int index;
|
||||
u32 val;
|
||||
u8* puVar2;
|
||||
const u16* ptr;
|
||||
|
||||
if (super->action == 0) {
|
||||
super->action++;
|
||||
ptr = gUnk_08124C20 + sub_080A1514() * 2;
|
||||
this->unk68 = ptr[0] * 0x3c;
|
||||
this->unk6a = 0;
|
||||
this->unk6c = ptr[1];
|
||||
this->unk6e = 1;
|
||||
|
||||
for (puVar2 = this->unk70, val = 0, index = 9; index >= 0; index--) {
|
||||
*puVar2++ = val;
|
||||
}
|
||||
sub_0807DD64(super);
|
||||
sub_0806EC20(super);
|
||||
}
|
||||
sub_0807DD94(super, 0);
|
||||
}
|
||||
|
||||
NONMATCH("asm/non_matching/objectB9/sub_080A1270.inc", void sub_080A1270(ObjectB9Entity* this)) {
|
||||
s32 iVar1;
|
||||
int iVar2;
|
||||
s32 iVar4;
|
||||
s32 sVar6;
|
||||
int iVar7;
|
||||
s8* ptr;
|
||||
s32 val;
|
||||
Entity* pEnt;
|
||||
Entity** entArray;
|
||||
|
||||
sVar6 = 0;
|
||||
entArray = ((Entity**)super->myHeap);
|
||||
ptr = this->unk70;
|
||||
iVar1 = (gRoomControls.origin_x + 0x360);
|
||||
iVar4 = (gRoomControls.origin_y + 0x350);
|
||||
iVar1 = (iVar1 << 16) >> 16;
|
||||
iVar4 = (iVar4 << 16) >> 16;
|
||||
val = -1;
|
||||
|
||||
for (iVar7 = 0; iVar7 < 9; iVar7++) {
|
||||
pEnt = entArray[iVar7];
|
||||
if (((s8*)ptr)[iVar7] == 0) {
|
||||
if (pEnt->next != NULL && pEnt != NULL) {
|
||||
if ((iVar1 <= pEnt->x.HALF.HI) && (iVar4 <= pEnt->y.HALF.HI)) {
|
||||
ptr[iVar7] = pEnt->type + 1;
|
||||
pEnt->type2 = 1;
|
||||
sVar6++;
|
||||
SoundReq(CuccoMinigame_Sounds[pEnt->type]);
|
||||
}
|
||||
} else {
|
||||
((s8*)ptr)[iVar7] = val;
|
||||
}
|
||||
} else if (0 < (s8)ptr[iVar7]) {
|
||||
sVar6++;
|
||||
if (pEnt->next != NULL && pEnt != NULL) {
|
||||
iVar2 = iVar1 + 4;
|
||||
if (iVar2 > pEnt->x.HALF.HI) {
|
||||
pEnt->x.HALF.HI = iVar2;
|
||||
}
|
||||
iVar2 = iVar4 + 4;
|
||||
if (iVar2 > pEnt->y.HALF.HI) {
|
||||
pEnt->y.HALF.HI = iVar2;
|
||||
}
|
||||
} else {
|
||||
((s8*)ptr)[iVar7] = val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this->unk6a = sVar6;
|
||||
gPlayerState.field_0x27[0] = 0xff;
|
||||
if (--this->unk68 < 1) {
|
||||
SoundReq(SFX_CUCCO_MINIGAME_BELL);
|
||||
sub_08050384();
|
||||
} else {
|
||||
gActiveScriptInfo.commandSize = 0;
|
||||
}
|
||||
}
|
||||
END_NONMATCH
|
||||
|
||||
void CuccoMinigame_Cleanup(ObjectB9Entity* this) {
|
||||
Entity** puVar1;
|
||||
s8* pcVar2;
|
||||
int index;
|
||||
|
||||
pcVar2 = this->unk70;
|
||||
puVar1 = super->myHeap;
|
||||
|
||||
for (index = 9; index >= 0; index--, pcVar2++, puVar1++) {
|
||||
Entity* pEnt = *puVar1;
|
||||
if (*pcVar2 >= 0 && pEnt != NULL) {
|
||||
DeleteEntityAny(pEnt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A13B4(ObjectB9Entity* this, ScriptExecutionContext* context) {
|
||||
if (this->unk6a >= this->unk6c) {
|
||||
MessageFromTarget(0x300c);
|
||||
context->condition = 1;
|
||||
} else {
|
||||
MessageFromTarget(0x3005);
|
||||
context->condition = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A13E8(ObjectB9Entity* this) {
|
||||
bool32 bVar2;
|
||||
const u8* ptr = &gUnk_08124EA0[sub_080A1514() * 4];
|
||||
|
||||
bVar2 = 0;
|
||||
switch (ptr[0]) {
|
||||
case 0x3f:
|
||||
if (gSave.stats.hasAllFigurines) {
|
||||
bVar2 = 1;
|
||||
}
|
||||
break;
|
||||
case 0x5c:
|
||||
if (gSave.didAllFusions) {
|
||||
bVar2 = 1;
|
||||
}
|
||||
break;
|
||||
case 0x63:
|
||||
if (!CheckGlobalFlag(0x4f)) {
|
||||
SetGlobalFlag(0x4f);
|
||||
break;
|
||||
}
|
||||
bVar2 = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!bVar2) {
|
||||
sub_080A7C18(ptr[0], ptr[1], 0);
|
||||
} else {
|
||||
this->unk6e = 2;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A1460(ObjectB9Entity* this) {
|
||||
s8* pcVar1;
|
||||
int iVar2;
|
||||
s32 rupees;
|
||||
const u8* ptr;
|
||||
|
||||
sub_080A1514();
|
||||
pcVar1 = this->unk70;
|
||||
rupees = 0;
|
||||
ptr = CuccoMinigameRupees;
|
||||
|
||||
for (iVar2 = 9; iVar2 >= 0; iVar2--) {
|
||||
// Weird register addition
|
||||
// ptr[*pcVar1] translates to add r0,r3,r0 but should be add r0,r3
|
||||
u32 temp = *pcVar1;
|
||||
temp += (int)ptr;
|
||||
rupees += *(u8*)temp;
|
||||
pcVar1++;
|
||||
}
|
||||
ModRupees(rupees);
|
||||
MessageNoOverlap(0x3007, super);
|
||||
gMessage.rupees = (u16)rupees;
|
||||
}
|
||||
|
||||
void sub_080A14A8(void) {
|
||||
int iVar1;
|
||||
|
||||
iVar1 = sub_080A1514();
|
||||
iVar1++;
|
||||
if (iVar1 > 9) {
|
||||
iVar1 = 9;
|
||||
}
|
||||
|
||||
if (iVar1 & 1) {
|
||||
SetGlobalFlag(0x4b);
|
||||
} else {
|
||||
ClearGlobalFlag(0x4b);
|
||||
}
|
||||
|
||||
if (iVar1 & 2) {
|
||||
SetGlobalFlag(0x4c);
|
||||
} else {
|
||||
ClearGlobalFlag(0x4c);
|
||||
}
|
||||
|
||||
if (iVar1 & 4) {
|
||||
SetGlobalFlag(0x4d);
|
||||
} else {
|
||||
ClearGlobalFlag(0x4d);
|
||||
}
|
||||
|
||||
if (iVar1 & 8) {
|
||||
SetGlobalFlag(0x4e);
|
||||
} else {
|
||||
ClearGlobalFlag(0x4e);
|
||||
}
|
||||
}
|
||||
|
||||
u32 sub_080A1514(void) {
|
||||
u32 rv = 0;
|
||||
|
||||
if (CheckGlobalFlag(0x4b)) {
|
||||
rv = 1;
|
||||
}
|
||||
|
||||
if (CheckGlobalFlag(0x4c)) {
|
||||
rv |= 2;
|
||||
}
|
||||
|
||||
if (CheckGlobalFlag(0x4d)) {
|
||||
rv |= 4;
|
||||
}
|
||||
|
||||
if (CheckGlobalFlag(0x4e)) {
|
||||
rv |= 8;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
void CuccoMinigame_Init(Entity* this, ScriptExecutionContext* context) {
|
||||
Entity* pEnt;
|
||||
const short* pCuccoMinigameDef;
|
||||
int index;
|
||||
Entity** ppEVar5;
|
||||
RoomControls* room;
|
||||
|
||||
context->condition = 0;
|
||||
pEnt = CreateObject(CUCCO_MINIGAME, 0, 0);
|
||||
if (pEnt != NULL) {
|
||||
pEnt->myHeap = (u32*)zMalloc(sizeof(ObjectB9Heap));
|
||||
if (pEnt->myHeap == NULL) {
|
||||
DeleteEntityAny(pEnt);
|
||||
} else {
|
||||
*(ScriptExecutionContext**)&((GenericEntity*)pEnt)->cutsceneBeh =
|
||||
(ScriptExecutionContext*)StartCutscene(pEnt, (u16*)context->intVariable);
|
||||
pCuccoMinigameDef = pObjectB9_MinigameCuccoDefs[sub_080A1514()];
|
||||
ppEVar5 = (Entity**)pEnt->myHeap;
|
||||
room = &gRoomControls;
|
||||
for (index = 9; index >= 0; index--, pCuccoMinigameDef += 3) {
|
||||
if (pCuccoMinigameDef[0] < 1) {
|
||||
pEnt = NULL;
|
||||
} else {
|
||||
pEnt = (Entity*)CreateEnemy(CUCCO_AGGR, pCuccoMinigameDef[0] - 1);
|
||||
if (pEnt != NULL) {
|
||||
pEnt->x.HALF.HI = room->origin_x + pCuccoMinigameDef[1];
|
||||
pEnt->y.HALF.HI = room->origin_y + pCuccoMinigameDef[2];
|
||||
pEnt->collisionLayer = 1;
|
||||
}
|
||||
}
|
||||
*ppEVar5++ = pEnt;
|
||||
}
|
||||
context->condition = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A1608(void) {
|
||||
u16 messageIndex;
|
||||
const u16* ptr;
|
||||
|
||||
messageIndex = 0x3002;
|
||||
if (CheckRoomFlag(1)) {
|
||||
messageIndex = 0x3006;
|
||||
}
|
||||
MessageFromTarget(messageIndex);
|
||||
gMessage.textWindowPosX = 1;
|
||||
gMessage.textWindowPosY = 0;
|
||||
ptr = &gUnk_08124C20[sub_080A1514() * 2];
|
||||
gMessage.rupees = ptr[0];
|
||||
gMessage.field_0x14 = ptr[1];
|
||||
}
|
||||
|
||||
void sub_080A1648(void) {
|
||||
SetTileType(0x407f, 0xd36, 1);
|
||||
SetTileType(0x407f, 0xd37, 1);
|
||||
SetTileType(0x407f, 0xd38, 1);
|
||||
SetTileType(0x407e, 0xd75, 1);
|
||||
SetTileType(0x407e, 0xe75, 1);
|
||||
}
|
||||
|
||||
void sub_080A169C(void) {
|
||||
sub_0807BA8C(0xd36, 1);
|
||||
sub_0807BA8C(0xd37, 1);
|
||||
sub_0807BA8C(0xd38, 1);
|
||||
sub_0807BA8C(0xd75, 1);
|
||||
sub_0807BA8C(0xe75, 1);
|
||||
}
|
||||
@@ -303,7 +303,7 @@ void FigurineDevice_Action4(FigurineDeviceEntity* this) {
|
||||
gMessage.textWindowPosX = 1;
|
||||
gMessage.textWindowPosY = 0xc;
|
||||
#endif
|
||||
gMessage.field_0x10 = this->unk_81;
|
||||
gMessage.rupees = this->unk_81;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -417,9 +417,9 @@ void sub_080882A8(FigurineDeviceEntity* this) {
|
||||
sub_08057044(this->unk_83, &gUnk_020227E8[1], 0x202020);
|
||||
ptr = (u8*)0x02000000;
|
||||
if (ptr[7] == 0) {
|
||||
sub_0805F46C((u32)gUnk_08120AE4[super->type2], &gUnk_08120AB4);
|
||||
sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120AB4); // TODO convert data
|
||||
} else {
|
||||
sub_0805F46C((u32)gUnk_08120AE4[super->type2], &gUnk_08120ACC);
|
||||
sub_0805F46C((u32)gUnk_08120AE4[super->type2], (Font*)&gUnk_08120ACC); // TODO convert data
|
||||
}
|
||||
gScreen.bg0.updated = 1;
|
||||
}
|
||||
@@ -477,7 +477,7 @@ void sub_08088478(void) {
|
||||
gMessage.textWindowPosX = 1;
|
||||
gMessage.textWindowPosY = 0xc;
|
||||
if (set0x10) {
|
||||
gMessage.field_0x10 = 5;
|
||||
gMessage.rupees = 5;
|
||||
}
|
||||
#ifndef EU
|
||||
gPlayerEntity.animationState = 6;
|
||||
|
||||
@@ -252,7 +252,7 @@ void sub_0808EABC(Entity* this) {
|
||||
|
||||
void sub_0808EB74(Entity* this) {
|
||||
Entity* entity = sub_0808EC80(gMapDataBottomSpecial.unk6);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
this->x.WORD = entity->x.WORD;
|
||||
this->y.WORD = entity->y.WORD;
|
||||
this->spriteRendering.b3 = entity->spriteRendering.b3;
|
||||
@@ -305,7 +305,7 @@ void sub_0808EBB8(Entity* this) {
|
||||
// Fall through
|
||||
default:
|
||||
entity = sub_0808EC80(var0);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
SortEntityBelow(entity, this);
|
||||
this->spriteRendering.b3 = entity->spriteRendering.b3;
|
||||
x = entity->x.HALF.HI;
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "global.h"
|
||||
#include "entity.h"
|
||||
#include "functions.h"
|
||||
#include "projectile.h"
|
||||
#include "projectile/winder.h"
|
||||
|
||||
void FireballChain(Entity* thisx) {
|
||||
WinderEntity* newSegment;
|
||||
Entity* parent;
|
||||
Entity* child;
|
||||
s32 i;
|
||||
s32 j;
|
||||
|
||||
if (gEntCount > 0x42) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < 5; i++) {
|
||||
u16* tmp;
|
||||
|
||||
newSegment = (WinderEntity*)CreateProjectile(WINDER);
|
||||
if (i == 0) {
|
||||
child = parent = &newSegment->base;
|
||||
}
|
||||
|
||||
newSegment->base.type = i;
|
||||
newSegment->base.parent = parent;
|
||||
newSegment->base.child = child;
|
||||
CopyPosition(thisx, &newSegment->base);
|
||||
|
||||
for (j = 0, tmp = newSegment->positions; j < WINDER_NUM_SEGMENTS; j++) {
|
||||
*tmp++ = thisx->x.HALF.HI;
|
||||
*tmp++ = thisx->y.HALF.HI;
|
||||
}
|
||||
|
||||
child = &newSegment->base;
|
||||
}
|
||||
|
||||
DeleteThisEntity();
|
||||
}
|
||||
@@ -33,12 +33,11 @@ void sub_080860D8(FloatingPlatformEntity* this) {
|
||||
}
|
||||
|
||||
void sub_0808611C(FloatingPlatformEntity* this) {
|
||||
int iVar2;
|
||||
bool32 iVar2 = sub_08086168(this);
|
||||
|
||||
iVar2 = sub_08086168(this);
|
||||
if (super->actionDelay != 0 && super->parent->actionDelay == 0) {
|
||||
|
||||
if (iVar2 != 0) {
|
||||
if (iVar2) {
|
||||
super->parent->actionDelay++;
|
||||
}
|
||||
|
||||
@@ -46,7 +45,7 @@ void sub_0808611C(FloatingPlatformEntity* this) {
|
||||
} else if (super->actionDelay == 0) {
|
||||
sub_080A2BE4(super, iVar2);
|
||||
} else {
|
||||
sub_080A2BE4(super, 0);
|
||||
sub_080A2BE4(super, FALSE);
|
||||
}
|
||||
|
||||
if (--this->unk70 == 0) {
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
|
||||
extern const ScreenTransitionData gUnk_0813ABD0;
|
||||
|
||||
extern u32 sub_08079F8C(void);
|
||||
struct GyorgChildSpawns {
|
||||
s16 offsetX;
|
||||
s16 offsetY;
|
||||
|
||||
@@ -53,7 +53,7 @@ void sub_080866D8(Entity* this) {
|
||||
if ((*((u32*)(&this->field_0x68)) & mask) == 0 && sub_080867CC(prop->unk5) &&
|
||||
CheckRegionOnScreen(prop->unk0, prop->unk2, 32, 32)) {
|
||||
entity = CreateObject(HOUSE_DOOR_EXT, prop->unk7, prop->unk6);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
entity->field_0x6c.HALF.LO = i;
|
||||
entity->x.HALF.HI = gRoomControls.origin_x + prop->unk0 + 16;
|
||||
entity->y.HALF.HI = gRoomControls.origin_y + prop->unk2 + 32;
|
||||
@@ -157,7 +157,7 @@ static void sub_080868EC(Entity* entity, unk_80868EC* arg1) {
|
||||
void sub_0808692C(Entity* this) {
|
||||
this->flags &= ~ENT_SCRIPTED;
|
||||
this->type2 = 2;
|
||||
this->action = this->frameIndex == 0 ? 1 : 2;
|
||||
this->action = (this->frameIndex == 0) ? 1 : 2;
|
||||
this->subAction = 0;
|
||||
this->actionDelay = 8;
|
||||
}
|
||||
|
||||
+10
-10
@@ -4,7 +4,7 @@
|
||||
extern u16 gUnk_08123318[];
|
||||
|
||||
static void sub_08097B24(Entity* this);
|
||||
static u32 sub_08097ADC(Entity* this);
|
||||
static bool32 sub_08097ADC(Entity* this);
|
||||
|
||||
void LilypadSmall(Entity* this) {
|
||||
u32 rand;
|
||||
@@ -29,19 +29,19 @@ void LilypadSmall(Entity* this) {
|
||||
}
|
||||
}
|
||||
|
||||
static u32 sub_08097ADC(Entity* this) {
|
||||
if ((gPlayerState.flags & PL_MINISH) == 0) {
|
||||
return 0;
|
||||
static bool32 sub_08097ADC(Entity* this) {
|
||||
if (!(gPlayerState.flags & PL_MINISH)) {
|
||||
return FALSE;
|
||||
} else if (EntityInRectRadius(this, &gPlayerEntity, 8, 8) == 0) {
|
||||
return 0;
|
||||
} else if (sub_08079F8C() == 0) {
|
||||
return 0;
|
||||
return FALSE;
|
||||
} else if (!sub_08079F8C()) {
|
||||
return FALSE;
|
||||
} else {
|
||||
gPlayerState.field_0x14 = 1;
|
||||
if (gPlayerEntity.z.HALF.HI != 0) {
|
||||
return 0;
|
||||
return FALSE;
|
||||
} else {
|
||||
return 1;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ static void sub_08097B24(Entity* this) {
|
||||
u16* temp3;
|
||||
|
||||
if (--this->actionDelay == 0) {
|
||||
this->actionDelay = 0x5a;
|
||||
this->actionDelay = 90;
|
||||
this->frameIndex = (this->frameIndex + 1) & 3;
|
||||
}
|
||||
temp3 = gUnk_08123318;
|
||||
|
||||
@@ -0,0 +1,207 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "global.h"
|
||||
#include "entity.h"
|
||||
#include "enemy.h"
|
||||
#include "functions.h"
|
||||
#include "item.h"
|
||||
#include "object.h"
|
||||
#include "player.h"
|
||||
#include "new_player.h"
|
||||
#include "room.h"
|
||||
#include "screen.h"
|
||||
#include "sound.h"
|
||||
|
||||
extern u16 script_Object89Mazaal[];
|
||||
|
||||
typedef struct {
|
||||
/* 0x00 */ Entity base;
|
||||
/* 0x68 */ u8 unk_68[0x1C];
|
||||
/* 0x84 */ ScriptExecutionContext* cutsceneBeh;
|
||||
} MazaalBossObjectEntity;
|
||||
|
||||
enum MazaalBossObjectActions {
|
||||
/* 0 */ MAZAAL_BOSS_OBJECT_ACTION_0,
|
||||
/* 1 */ MAZAAL_BOSS_OBJECT_ACTION_1,
|
||||
/* 2 */ MAZAAL_BOSS_OBJECT_ACTION_2,
|
||||
/* 3 */ MAZAAL_BOSS_OBJECT_ACTION_3,
|
||||
/* 4 */ MAZAAL_BOSS_OBJECT_ACTION_4,
|
||||
/* 5 */ MAZAAL_BOSS_OBJECT_ACTION_5,
|
||||
/* 6 */ MAZAAL_BOSS_OBJECT_ACTION_6,
|
||||
/* 7 */ MAZAAL_BOSS_OBJECT_ACTION_7,
|
||||
/* 8 */ MAZAAL_BOSS_OBJECT_ACTION_8,
|
||||
};
|
||||
|
||||
void MazaalBossObject_Action0(MazaalBossObjectEntity* this); // 0809AB04
|
||||
void MazaalBossObject_Action1(MazaalBossObjectEntity* this); // 0809ABA4
|
||||
void MazaalBossObject_Action2(MazaalBossObjectEntity* this); // 0809ABB0
|
||||
void MazaalBossObject_Action3(MazaalBossObjectEntity* this); // 0809ABD4
|
||||
void MazaalBossObject_Action4(MazaalBossObjectEntity* this); // 0809ABF4
|
||||
void MazaalBossObject_Action5(MazaalBossObjectEntity* this); // 0809AC3C
|
||||
void MazaalBossObject_Action6(MazaalBossObjectEntity* this); // 0809ACA0
|
||||
void MazaalBossObject_Action7(MazaalBossObjectEntity* this); // 0809ACCC
|
||||
void MazaalBossObject_Action8(MazaalBossObjectEntity* this); // 0809ACE8
|
||||
void sub_0809AD68(MazaalBossObjectEntity* this); // 0809AD68
|
||||
void sub_0809AD8C(MazaalBossObjectEntity* this); // 0809AD8C
|
||||
|
||||
void MazaalBossObject(Entity* thisx) {
|
||||
static void (*const MazaalBossObject_Actions[])(MazaalBossObjectEntity*) = {
|
||||
MazaalBossObject_Action0, MazaalBossObject_Action1, MazaalBossObject_Action2,
|
||||
MazaalBossObject_Action3, MazaalBossObject_Action4, MazaalBossObject_Action5,
|
||||
MazaalBossObject_Action6, MazaalBossObject_Action7, MazaalBossObject_Action8,
|
||||
};
|
||||
|
||||
MazaalBossObject_Actions[thisx->action]((MazaalBossObjectEntity*)thisx);
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action0(MazaalBossObjectEntity* this) {
|
||||
Entity* mazaalHead;
|
||||
|
||||
if (CheckFlags(0x31)) {
|
||||
sub_0809AD68(this);
|
||||
sub_0809AD8C(this);
|
||||
DeleteThisEntity();
|
||||
}
|
||||
|
||||
mazaalHead = CreateEnemy(MAZAAL_HEAD, 0);
|
||||
if (mazaalHead == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
CopyPosition(super, mazaalHead);
|
||||
super->child = mazaalHead;
|
||||
|
||||
if (gRoomTransition.field_0x38 != 0) {
|
||||
if (gRoomTransition.field_0x39 != 0) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_7;
|
||||
super->spriteSettings.draw = 0;
|
||||
gRoomControls.camera_target = super;
|
||||
sub_080809D4();
|
||||
} else {
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_1;
|
||||
super->actionDelay = 30;
|
||||
super->frameIndex = gRoomTransition.field_0x38;
|
||||
super->spritePriority.b0 = 7;
|
||||
super->spriteOffsetY = 0x20;
|
||||
|
||||
this->cutsceneBeh = StartCutscene(super, script_Object89Mazaal);
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action1(MazaalBossObjectEntity* this) {
|
||||
ExecuteScriptForEntity(super, NULL);
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action2(MazaalBossObjectEntity* this) {
|
||||
if (--super->actionDelay == 0) {
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_3;
|
||||
super->actionDelay = 120;
|
||||
gRoomControls.camera_target = super->child;
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action3(MazaalBossObjectEntity* this) {
|
||||
if (--super->actionDelay == 0) {
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_4;
|
||||
super->actionDelay = 90;
|
||||
super->child->subAction = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action4(MazaalBossObjectEntity* this) {
|
||||
if (super->child->subAction > 2) {
|
||||
if (--super->actionDelay == 0) {
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_5;
|
||||
super->actionDelay = 8;
|
||||
super->field_0xf = 0;
|
||||
super->spriteRendering.alphaBlend = BLDALPHA_BLEND(1, 0);
|
||||
|
||||
gScreen.controls.layerFXControl =
|
||||
BLDCNT_TGT2_BG3 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG0 | BLDCNT_EFFECT_BLEND;
|
||||
gScreen.controls.alphaBlend = BLDALPHA_BLEND(0x10, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action5(MazaalBossObjectEntity* this) {
|
||||
u32 tmp;
|
||||
|
||||
if (--super->actionDelay == 0) {
|
||||
super->actionDelay = 8;
|
||||
|
||||
tmp = ++super->field_0xf;
|
||||
tmp &= 0xFF;
|
||||
gScreen.controls.alphaBlend = BLDALPHA_BLEND((0x10 - tmp) & 0xFF, tmp);
|
||||
|
||||
if (super->field_0xf > 15) {
|
||||
super->spriteRendering.alphaBlend = BLDALPHA_BLEND(4, 0);
|
||||
gScreen.controls.layerFXControl = 0;
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_6;
|
||||
super->actionDelay = 15;
|
||||
super->spriteSettings.draw = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action6(MazaalBossObjectEntity* this) {
|
||||
if (--super->actionDelay == 0) {
|
||||
super->child->subAction = 6;
|
||||
gRoomTransition.field_0x38 = 0xF1;
|
||||
|
||||
DeleteEntity(super);
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action7(MazaalBossObjectEntity* this) {
|
||||
if (super->child->actionDelay == 1) {
|
||||
super->action = MAZAAL_BOSS_OBJECT_ACTION_8;
|
||||
super->subAction = 0;
|
||||
super->actionDelay = 180;
|
||||
}
|
||||
}
|
||||
|
||||
void MazaalBossObject_Action8(MazaalBossObjectEntity* this) {
|
||||
switch (super->subAction) {
|
||||
default:
|
||||
if (--super->actionDelay == 0) {
|
||||
super->actionDelay = 90;
|
||||
super->subAction = 1;
|
||||
SoundReq(SFX_SECRET_BIG);
|
||||
SetFlag(0x31);
|
||||
sub_0809AD8C(this);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--super->actionDelay == 0) {
|
||||
super->actionDelay = 120;
|
||||
super->subAction = 2;
|
||||
sub_0809AD68(this);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (--super->actionDelay == 0) {
|
||||
gRoomControls.camera_target = &gNewPlayerEntity.base;
|
||||
gPlayerState.controlMode = CONTROL_1;
|
||||
DeleteThisEntity();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809AD68(MazaalBossObjectEntity* this) {
|
||||
LoadRoomEntityList(GetCurrentRoomProperty(super->type));
|
||||
if (GetInventoryValue(ITEM_OCARINA) != 0) {
|
||||
LoadRoomEntityList(GetCurrentRoomProperty(super->type2));
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809AD8C(MazaalBossObjectEntity* this) {
|
||||
Entity* archway = CreateObject(ARCHWAY, 0x22, 0);
|
||||
|
||||
if (archway != NULL) {
|
||||
archway->x.HALF.HI = gRoomControls.origin_x + 0xB8;
|
||||
archway->y.HALF.HI = gRoomControls.origin_y + 8;
|
||||
}
|
||||
}
|
||||
+220
-89
@@ -1,67 +1,82 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "object.h"
|
||||
#include "functions.h"
|
||||
#include "hitbox.h"
|
||||
|
||||
extern u32 sub_08091DDC(Entity*);
|
||||
typedef struct {
|
||||
Entity base;
|
||||
u8 filler[0x1C];
|
||||
struct_030010EC* minecartData;
|
||||
} MinecartEntity;
|
||||
|
||||
extern u32 sub_08007DD6(u32, u32);
|
||||
extern void sub_08017744(Entity*);
|
||||
extern void sub_08091C0C(Entity*);
|
||||
|
||||
extern void (*const gUnk_081223A8[])(Entity*);
|
||||
u32 sub_08091DDC(MinecartEntity*);
|
||||
void sub_080916EC(MinecartEntity*);
|
||||
void sub_080917DC(MinecartEntity*);
|
||||
void sub_080918A4(MinecartEntity*);
|
||||
void sub_080919AC(MinecartEntity*);
|
||||
void sub_08091C0C(MinecartEntity*);
|
||||
void sub_08091C98(MinecartEntity*);
|
||||
void sub_08091CC8(MinecartEntity*);
|
||||
void sub_08091D90(MinecartEntity*);
|
||||
|
||||
extern const s8 gUnk_081223C8[];
|
||||
extern const u32 gUnk_081223D8[];
|
||||
|
||||
void Minecart(Entity* this) {
|
||||
gUnk_081223A8[this->action](this);
|
||||
static void (*const actionFuncs[])(MinecartEntity*) = {
|
||||
sub_080916EC, sub_080917DC, sub_080918A4, sub_080919AC, sub_08091C0C, sub_08091C98, sub_08091CC8, sub_08091D90,
|
||||
};
|
||||
actionFuncs[this->action]((MinecartEntity*)this);
|
||||
this->bitfield = 0;
|
||||
}
|
||||
|
||||
void sub_080916EC(Entity* this) {
|
||||
struct_030010EC* unk = &gRoomTransition.minecart_data[this->actionDelay];
|
||||
void sub_080916EC(MinecartEntity* this) {
|
||||
struct_030010EC* unk = &gRoomTransition.minecart_data[super->actionDelay];
|
||||
|
||||
*(struct_030010EC**)&this->cutsceneBeh.HWORD = unk;
|
||||
if ((gRoomControls.room != unk->field_0x4) || (gPlayerState.flags & PL_IN_MINECART) != 0) {
|
||||
this->minecartData = unk;
|
||||
if ((gRoomControls.room != unk->room) || (gPlayerState.flags & PL_IN_MINECART) != 0) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
this->x.HALF.HI = gRoomControls.origin_x + ((unk->field_0x0 & 0x3f) << 4) + 8;
|
||||
this->y.HALF.HI = gRoomControls.origin_y + ((unk->field_0x0 & 0xfc << 4) >> 2) + 8;
|
||||
this->animationState = unk->field_0x5;
|
||||
this->type2 = unk->field_0x6;
|
||||
this->action = 1;
|
||||
this->hitbox = (Hitbox*)&gUnk_080FD310;
|
||||
COLLISION_ON(this);
|
||||
this->hitType = 1;
|
||||
this->field_0x3c = 0x47;
|
||||
this->hurtType = 0x44;
|
||||
this->flags2 = 0x80;
|
||||
this->direction = DirectionFromAnimationState(this->animationState);
|
||||
this->speed = 0x700;
|
||||
this->spritePriority.b1 = 3;
|
||||
InitAnimationForceUpdate(this, this->type2 + 4 + this->animationState);
|
||||
SetTile(0x4022, COORD_TO_TILE(this), this->collisionLayer);
|
||||
super->x.HALF.HI = gRoomControls.origin_x + ((unk->tilePos & 0x3f) << 4) + 8;
|
||||
super->y.HALF.HI = gRoomControls.origin_y + ((unk->tilePos & 0xfc << 4) >> 2) + 8;
|
||||
super->animationState = unk->animationState;
|
||||
super->type2 = unk->field_0x6;
|
||||
super->action = 1;
|
||||
super->hitbox = (Hitbox*)&gUnk_080FD310;
|
||||
COLLISION_ON(super);
|
||||
super->hitType = 1;
|
||||
super->field_0x3c = 0x47;
|
||||
super->hurtType = 0x44;
|
||||
super->flags2 = 0x80;
|
||||
super->direction = DirectionFromAnimationState(super->animationState);
|
||||
super->speed = 0x700;
|
||||
super->spritePriority.b1 = 3;
|
||||
InitAnimationForceUpdate(super, super->type2 + 4 + super->animationState);
|
||||
SetTile(0x4022, COORD_TO_TILE(super), super->collisionLayer);
|
||||
}
|
||||
|
||||
void sub_080917DC(Entity* this) {
|
||||
if ((this->bitfield & 0x7f) == 0x1d) {
|
||||
this->zVelocity = Q_16_16(2.625);
|
||||
this->action = 7;
|
||||
InitAnimationForceUpdate(this, this->type2 + 4 + this->animationState);
|
||||
void sub_080917DC(MinecartEntity* this) {
|
||||
if ((super->bitfield & 0x7f) == 0x1d) {
|
||||
super->zVelocity = Q_16_16(2.625);
|
||||
super->action = 7;
|
||||
InitAnimationForceUpdate(super, super->type2 + 4 + super->animationState);
|
||||
SoundReq(SFX_13B);
|
||||
} else {
|
||||
if (sub_0800445C(this) != 0) {
|
||||
if (sub_0800445C(super) != 0) {
|
||||
if (!((gPlayerState.flags & (PL_MINISH | PL_ROLLING)) || gPlayerState.field_0x1c ||
|
||||
gPlayerState.heldObject || gPlayerState.jump_status)) {
|
||||
this->actionDelay++;
|
||||
super->actionDelay++;
|
||||
} else {
|
||||
this->actionDelay = 0;
|
||||
super->actionDelay = 0;
|
||||
}
|
||||
} else {
|
||||
this->actionDelay = 0;
|
||||
super->actionDelay = 0;
|
||||
}
|
||||
if (this->type2 == 0) {
|
||||
if (this->actionDelay > 8) {
|
||||
this->action++;
|
||||
if (super->type2 == 0) {
|
||||
if (super->actionDelay > 8) {
|
||||
super->action++;
|
||||
gPlayerState.jump_status = 0x81;
|
||||
gPlayerState.flags |= PL_ENTER_MINECART;
|
||||
gPlayerEntity.zVelocity = Q_16_16(2.0);
|
||||
@@ -72,100 +87,102 @@ void sub_080917DC(Entity* this) {
|
||||
SoundReq(SFX_PLY_JUMP);
|
||||
}
|
||||
} else {
|
||||
this->actionDelay = 0;
|
||||
super->actionDelay = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080918A4(Entity* this) {
|
||||
if (EntityInRectRadius(this, &gPlayerEntity, 2, 2) != 0) {
|
||||
gPlayerEntity.x.HALF.HI = this->x.HALF.HI;
|
||||
gPlayerEntity.y.HALF.HI = this->y.HALF.HI;
|
||||
void sub_080918A4(MinecartEntity* this) {
|
||||
if (EntityInRectRadius(super, &gPlayerEntity, 2, 2) != 0) {
|
||||
gPlayerEntity.x.HALF.HI = super->x.HALF.HI;
|
||||
gPlayerEntity.y.HALF.HI = super->y.HALF.HI;
|
||||
if (gPlayerEntity.z.HALF.HI > -0x10) {
|
||||
if (gPlayerEntity.zVelocity >= 0) {
|
||||
return;
|
||||
}
|
||||
gPlayerEntity.animationState = this->animationState << 1;
|
||||
gPlayerEntity.animationState = super->animationState << 1;
|
||||
gPlayerState.flags = (gPlayerState.flags ^ PL_ENTER_MINECART) | PL_IN_MINECART;
|
||||
this->action++;
|
||||
this->field_0xf = 1;
|
||||
this->flags |= ENT_PERSIST;
|
||||
this->hitType = 0x97;
|
||||
this->field_0x3c = (gPlayerEntity.field_0x3c + 1) | 0x20;
|
||||
this->flags2 = gPlayerEntity.flags2;
|
||||
this->hurtType = 0x18;
|
||||
this->damage = 8;
|
||||
sub_0801766C(this);
|
||||
RestorePrevTileEntity(COORD_TO_TILE(this), this->collisionLayer);
|
||||
super->action++;
|
||||
super->field_0xf = 1;
|
||||
super->flags |= ENT_PERSIST;
|
||||
super->hitType = 0x97;
|
||||
super->field_0x3c = (gPlayerEntity.field_0x3c + 1) | 0x20;
|
||||
super->flags2 = gPlayerEntity.flags2;
|
||||
super->hurtType = 0x18;
|
||||
super->damage = 8;
|
||||
sub_0801766C(super);
|
||||
RestorePrevTileEntity(COORD_TO_TILE(super), super->collisionLayer);
|
||||
SoundReq(SFX_137);
|
||||
}
|
||||
} else {
|
||||
gPlayerEntity.direction = GetFacingDirection(&gPlayerEntity, this);
|
||||
gPlayerEntity.direction = GetFacingDirection(&gPlayerEntity, super);
|
||||
}
|
||||
if (gPlayerEntity.zVelocity < 0) {
|
||||
gPlayerEntity.spritePriority.b0 = this->spritePriority.b0 - 1;
|
||||
gPlayerEntity.spritePriority.b0 = super->spritePriority.b0 - 1;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080919AC(Entity* this) {
|
||||
void sub_080919AC(MinecartEntity* this) {
|
||||
static const s8 gUnk_081223C8[] = { 0, -7, 7, 0, 0, 7, -7, 0 };
|
||||
|
||||
u32 iVar2;
|
||||
u32 uVar3;
|
||||
|
||||
gRoomControls.unk5 = 7;
|
||||
if ((gPlayerState.flags & PL_IN_MINECART) == 0) {
|
||||
this->action = 1;
|
||||
super->action = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((gPlayerEntity.frame & 0xf) == 0) {
|
||||
COLLISION_OFF(this);
|
||||
CopyPosition(this, &gPlayerEntity);
|
||||
COLLISION_OFF(super);
|
||||
CopyPosition(super, &gPlayerEntity);
|
||||
if ((gPlayerEntity.frame & 0xf0) == 0x10) {
|
||||
this->spriteOffsetY = 1;
|
||||
super->spriteOffsetY = 1;
|
||||
} else {
|
||||
this->spriteOffsetY = 0;
|
||||
super->spriteOffsetY = 0;
|
||||
}
|
||||
} else {
|
||||
COLLISION_ON(this);
|
||||
COLLISION_ON(super);
|
||||
gPlayerEntity.speed = 0;
|
||||
LinearMoveUpdate(this);
|
||||
CopyPosition(this, &gPlayerEntity);
|
||||
gPlayerEntity.spritePriority.b0 = this->spritePriority.b0 - 1;
|
||||
LinearMoveUpdate(super);
|
||||
CopyPosition(super, &gPlayerEntity);
|
||||
gPlayerEntity.spritePriority.b0 = super->spritePriority.b0 - 1;
|
||||
if (!sub_08091DDC(this)) {
|
||||
if ((gRoomTransition.frameCount & 0xf) == 0) {
|
||||
SoundReq(SFX_138);
|
||||
}
|
||||
|
||||
if (--this->field_0xf == 0xff) {
|
||||
if (--super->field_0xf == 0xff) {
|
||||
SoundReq(SFX_PLY_VO7);
|
||||
this->field_0xf = 0x3c;
|
||||
super->field_0xf = 0x3c;
|
||||
}
|
||||
|
||||
uVar3 = GetRelativeCollisionTile(this, gUnk_081223C8[this->animationState * 2],
|
||||
gUnk_081223C8[this->animationState * 2 + 1]);
|
||||
iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[this->animationState]);
|
||||
uVar3 = GetRelativeCollisionTile(super, gUnk_081223C8[super->animationState * 2],
|
||||
gUnk_081223C8[super->animationState * 2 + 1]);
|
||||
iVar2 = sub_08007DD6(uVar3, gUnk_081223D8[super->animationState]);
|
||||
if (iVar2 == 0) {
|
||||
this->direction = DirectionTurnAround(this->direction);
|
||||
this->animationState = AnimationStateFlip90(this->animationState);
|
||||
super->direction = DirectionTurnAround(super->direction);
|
||||
super->animationState = AnimationStateFlip90(super->animationState);
|
||||
} else {
|
||||
switch (uVar3) {
|
||||
case 0x64:
|
||||
this->flags &= ~ENT_PERSIST;
|
||||
this->hitType = 1;
|
||||
this->field_0x3c = 0x47;
|
||||
this->hurtType = 0x44;
|
||||
this->flags2 = 0x80;
|
||||
this->action = 6;
|
||||
sub_08017744(this);
|
||||
super->flags &= ~ENT_PERSIST;
|
||||
super->hitType = 1;
|
||||
super->field_0x3c = 0x47;
|
||||
super->hurtType = 0x44;
|
||||
super->flags2 = 0x80;
|
||||
super->action = 6;
|
||||
sub_08017744(super);
|
||||
gPlayerState.jump_status = 0x41;
|
||||
gPlayerState.flags = (gPlayerState.flags ^ PL_IN_MINECART) | PL_ENTER_MINECART;
|
||||
gPlayerEntity.zVelocity = Q_16_16(2.0);
|
||||
gPlayerEntity.speed = 0x200;
|
||||
gPlayerEntity.animationState = this->animationState << 1;
|
||||
gPlayerEntity.direction = this->direction;
|
||||
gPlayerEntity.animationState = super->animationState << 1;
|
||||
gPlayerEntity.direction = super->direction;
|
||||
gPlayerEntity.flags |= PL_MINISH;
|
||||
sub_08004168(this);
|
||||
InitAnimationForceUpdate(this, this->animationState + 0xc);
|
||||
sub_08004168(super);
|
||||
InitAnimationForceUpdate(super, super->animationState + 0xc);
|
||||
SoundReq(SFX_PLY_VO4);
|
||||
SoundReq(SFX_139);
|
||||
return;
|
||||
@@ -177,21 +194,135 @@ void sub_080919AC(Entity* this) {
|
||||
case 0x6d:
|
||||
case 0x6e:
|
||||
case 0x6f:
|
||||
if (uVar3 == GetTileUnderEntity(this)) {
|
||||
if (uVar3 == GetTileUnderEntity(super)) {
|
||||
sub_08091C0C(this);
|
||||
gPlayerEntity.animationState = this->animationState << 1;
|
||||
gPlayerEntity.animationState = super->animationState << 1;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
gPlayerEntity.animationState = this->animationState << 1;
|
||||
if (this->animIndex == this->animationState) {
|
||||
UpdateAnimationSingleFrame(this);
|
||||
gPlayerEntity.animationState = super->animationState << 1;
|
||||
if (super->animIndex == super->animationState) {
|
||||
UpdateAnimationSingleFrame(super);
|
||||
} else {
|
||||
InitAnimationForceUpdate(this, this->animationState);
|
||||
InitAnimationForceUpdate(super, super->animationState);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08091C0C(MinecartEntity* this) {
|
||||
sub_08004168(super);
|
||||
CopyPosition(super, &gPlayerEntity);
|
||||
switch (GetTileUnderEntity(super)) {
|
||||
case 0x67:
|
||||
if (super->direction == DirectionWest) {
|
||||
super->direction = DirectionNorth;
|
||||
super->animationState = 0;
|
||||
} else {
|
||||
super->direction = DirectionEast;
|
||||
super->animationState = 1;
|
||||
}
|
||||
break;
|
||||
case 0x68:
|
||||
if (super->direction == DirectionEast) {
|
||||
super->direction = DirectionSouth;
|
||||
super->animationState = 2;
|
||||
} else {
|
||||
super->direction = DirectionWest;
|
||||
super->animationState = 3;
|
||||
}
|
||||
break;
|
||||
case 0x69:
|
||||
if (super->direction == DirectionEast) {
|
||||
super->direction = DirectionNorth;
|
||||
super->animationState = 0;
|
||||
} else {
|
||||
super->direction = DirectionWest;
|
||||
super->animationState = 3;
|
||||
}
|
||||
break;
|
||||
case 0x6a:
|
||||
if (super->direction == DirectionWest) {
|
||||
super->direction = DirectionSouth;
|
||||
super->animationState = 2;
|
||||
} else {
|
||||
super->direction = DirectionEast;
|
||||
super->animationState = 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
super->action = 3;
|
||||
return;
|
||||
}
|
||||
|
||||
super->action = 3;
|
||||
gPlayerEntity.animationState = super->animationState << 1;
|
||||
}
|
||||
|
||||
void sub_08091C98(MinecartEntity* this) {
|
||||
LinearMoveUpdate(super);
|
||||
CopyPosition(super, &gPlayerEntity);
|
||||
if (gRoomControls.reload_flags == 0) {
|
||||
super->action = 3;
|
||||
super->speed = 0x700;
|
||||
gRoomControls.camera_target = &gPlayerEntity;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08091CC8(MinecartEntity* this) {
|
||||
struct_030010EC* minecartData;
|
||||
|
||||
if (gPlayerState.jump_status == 0) {
|
||||
super->action = 1;
|
||||
super->direction = DirectionTurnAround(super->direction);
|
||||
super->animationState ^= 2;
|
||||
gPlayerState.flags ^= PL_ENTER_MINECART;
|
||||
minecartData = this->minecartData;
|
||||
minecartData->tilePos = COORD_TO_TILE(super);
|
||||
minecartData->room = gRoomControls.room;
|
||||
minecartData->animationState = super->animationState;
|
||||
InitAnimationForceUpdate(super, super->animationState + 0x10);
|
||||
SetTile(0x4022, COORD_TO_TILE(super), super->collisionLayer);
|
||||
} else {
|
||||
UpdateAnimationSingleFrame(super);
|
||||
gPlayerEntity.spritePriority.b0 = super->spritePriority.b0 - 1;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08091D90(MinecartEntity* this) {
|
||||
if (super->zVelocity < 0) {
|
||||
UpdateAnimationSingleFrame(super);
|
||||
}
|
||||
if (((super->frame & 0x7f) == 0) && GravityUpdate(super, 0x2000) == 0) {
|
||||
super->type2 ^= 4;
|
||||
super->action = 1;
|
||||
this->minecartData->field_0x6 = super->type2;
|
||||
SoundReq(SFX_13C);
|
||||
}
|
||||
}
|
||||
|
||||
bool32 sub_08091DDC(MinecartEntity* this) {
|
||||
static const s8 gUnk_081223D0[] = { 0, -8, 8, 0, 0, 8, -8, 0 };
|
||||
if ((sub_080B1AF0(super, gUnk_081223D0[super->animationState * 2], gUnk_081223D0[super->animationState * 2 + 1]) ==
|
||||
0xff) &&
|
||||
(sub_0807BD14(&gPlayerEntity, super->animationState))) {
|
||||
super->updatePriority = 6;
|
||||
super->action = 5;
|
||||
switch (super->direction) {
|
||||
case 0:
|
||||
case 8:
|
||||
case 0x10:
|
||||
case 0x18:
|
||||
super->speed = 0xa0;
|
||||
break;
|
||||
}
|
||||
gPlayerEntity.direction = super->direction;
|
||||
gRoomControls.camera_target = super;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@ void sub_0808F3DC(Entity* this) {
|
||||
|
||||
if (this->type == 5 && (this->frame & 1)) {
|
||||
Entity* entity = CreateObjectWithParent(this->child, 0x49, 8, 0);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
entity->parent = this->parent;
|
||||
entity->child = this->parent->parent;
|
||||
}
|
||||
@@ -262,19 +262,19 @@ void sub_0808F554(Entity* this) {
|
||||
|
||||
void sub_0808F5EC(Entity* this) {
|
||||
Entity* entity = CreateObjectWithParent(this->child, 0x49, 5, 0);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
entity->parent = this;
|
||||
entity->child = this->child;
|
||||
}
|
||||
|
||||
entity = CreateObjectWithParent(this->child, 0x49, 6, 0);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
entity->parent = this;
|
||||
entity->child = this->child;
|
||||
}
|
||||
|
||||
entity = CreateObjectWithParent(this->child, 0x49, 7, 0);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
entity->parent = this;
|
||||
entity->child = this->child;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "player.h"
|
||||
#include "asm.h"
|
||||
#include "functions.h"
|
||||
#include "sound.h"
|
||||
#include "item.h"
|
||||
#include "flags.h"
|
||||
#include "effects.h"
|
||||
|
||||
typedef struct _struct_gUnk_08123FB0 {
|
||||
void (*const funcEnt)(Entity*);
|
||||
bool32 (*const func)(Entity*, const struct _struct_gUnk_08123FB0*);
|
||||
s8 unk08;
|
||||
s8 unk09;
|
||||
u8 unk0a;
|
||||
u8 unk0b;
|
||||
u8 unk0c;
|
||||
u8 type;
|
||||
u8 unk0e;
|
||||
u8 unk0f;
|
||||
s32 zVelocity;
|
||||
u32 unk14;
|
||||
s16 speed;
|
||||
s16 y;
|
||||
u16 flag;
|
||||
u8 actionDelay;
|
||||
u8 unk1f;
|
||||
} struct_gUnk_08123FB0;
|
||||
|
||||
static_assert(sizeof(struct_gUnk_08123FB0) == 0x20);
|
||||
|
||||
void sub_0809D91C(Entity*);
|
||||
bool32 sub_0809D93C(Entity*, const struct_gUnk_08123FB0*);
|
||||
void Object96_Init(Entity*, const struct_gUnk_08123FB0*);
|
||||
void Object96_Action1(Entity*, const struct_gUnk_08123FB0*);
|
||||
void Object96_Action2(Entity*, const struct_gUnk_08123FB0*);
|
||||
void Object96_Action3(Entity*, const struct_gUnk_08123FB0*);
|
||||
|
||||
static const struct_gUnk_08123FB0 gUnk_08123FB0[] = {
|
||||
{ sub_0809D91C, sub_0809D93C, 0, 0, 0x30, 0x30, 0x1, 0x3c, 0x3c, 0x13, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1,
|
||||
0x0 },
|
||||
{ sub_0809D91C, NULL, 0, 0, 0, 0, 0, 0x63, 0x63, 0x10, 0, 0x1800, 0, 0x18,
|
||||
#if defined(JP) || defined(DEMO_JP) || defined(EU)
|
||||
0xCD,
|
||||
#else
|
||||
0xd0,
|
||||
#endif
|
||||
0, 0 },
|
||||
{ sub_0809D91C, NULL, 0, 0, 0, 0, 0, 0x3c, 0x3c, 0xf, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, 0x0 },
|
||||
{ sub_0809D91C, NULL, 0, 0, 0, 0, 0, 0x3c, 0x3c, 0x2, 0x10000, 0x1800, 0x140, 0x40, 0x4021, 0x1, 0x0 },
|
||||
{ sub_0809D91C, NULL, 0, 0, 0, 0, 0x0, 0x3c, 0x3c, 0xd, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, 0x0 },
|
||||
{ sub_0809D91C, NULL, 0, 0, 0, 0, 0x0, 0x3c, 0x3c, 0x1a, 0x10000, 0x1800, 0x100, 0x40, 0x4021, 0x1, 0x0 },
|
||||
{ sub_0809D91C, NULL, 0, 0, 0, 0, 0x0, 0x3c, 0x3c, 0x13, 0x10000, 0x1800, 0x60, 0x40, 0x4021, 0x1, 0x0 },
|
||||
{ NULL, NULL, 0, 0, 0, 0, 0x0, 0x5c, 0x5c, 0x81, 0, 0x1800, 0x100, 0x20, 0x0, 0x1, 0x0 },
|
||||
};
|
||||
|
||||
void Object96(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*, const struct_gUnk_08123FB0*) = {
|
||||
Object96_Init,
|
||||
Object96_Action1,
|
||||
Object96_Action2,
|
||||
Object96_Action3,
|
||||
};
|
||||
actionFuncs[this->action](this, &gUnk_08123FB0[this->type]);
|
||||
}
|
||||
|
||||
void Object96_Init(Entity* this, const struct_gUnk_08123FB0* param_2) {
|
||||
u32 type;
|
||||
u32 dir;
|
||||
|
||||
this->action++;
|
||||
this->collisionLayer = 2;
|
||||
this->spriteRendering.b3 = 1;
|
||||
this->zVelocity = param_2->zVelocity;
|
||||
this->direction = param_2->unk0f;
|
||||
this->speed = param_2->speed;
|
||||
this->y.HALF.HI -= param_2->y;
|
||||
this->z.WORD = 0;
|
||||
this->actionDelay = param_2->actionDelay;
|
||||
if ((this->direction & 0x80)) {
|
||||
dir = this->direction;
|
||||
if (dir == 0x81) {
|
||||
this->direction = (((gPlayerEntity.animationState * 4 + (Random() & 3)) - 2) & 0x1f) ^ 0x10;
|
||||
}
|
||||
}
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
type = this->type;
|
||||
sub_08080CB4(this);
|
||||
this->type = type;
|
||||
}
|
||||
|
||||
void Object96_Action1(Entity* this, const struct_gUnk_08123FB0* param_2) {
|
||||
u32 type;
|
||||
s32 iVar3;
|
||||
|
||||
iVar3 = 1;
|
||||
if (param_2->func != NULL) {
|
||||
iVar3 = param_2->func(this, param_2);
|
||||
}
|
||||
if (iVar3 != 0) {
|
||||
this->action++;
|
||||
this->y.HALF.HI += param_2->y;
|
||||
this->z.HALF.HI -= param_2->y;
|
||||
}
|
||||
type = this->type;
|
||||
this->type = param_2->type;
|
||||
sub_08080CB4(this);
|
||||
this->type = type;
|
||||
}
|
||||
|
||||
void Object96_Action2(Entity* this, const struct_gUnk_08123FB0* param_2) {
|
||||
u8 type;
|
||||
|
||||
LinearMoveUpdate(this);
|
||||
if (sub_080044EC(this, param_2->unk14) < 2) {
|
||||
if (this->actionDelay) {
|
||||
this->actionDelay--;
|
||||
this->zVelocity = param_2->unk14 << 3;
|
||||
} else {
|
||||
this->action++;
|
||||
this->collisionLayer = gPlayerEntity.collisionLayer;
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
if (param_2->funcEnt != NULL) {
|
||||
param_2->funcEnt(this);
|
||||
}
|
||||
}
|
||||
SoundReq(SFX_RUPEE_BOUNCE);
|
||||
}
|
||||
type = this->type;
|
||||
this->type = param_2->type;
|
||||
sub_08080CB4(this);
|
||||
this->type = type;
|
||||
}
|
||||
|
||||
void Object96_Action3(Entity* this, const struct_gUnk_08123FB0* param_2) {
|
||||
u8 type;
|
||||
|
||||
if (gPlayerState.flags & 0x80) {
|
||||
sub_0800445C(this);
|
||||
} else {
|
||||
if (IsCollidingPlayer(this)) {
|
||||
CreateItemEntity(param_2->type, this->type2, 0);
|
||||
if (param_2->flag) {
|
||||
SetFlag(param_2->flag);
|
||||
}
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
type = this->type;
|
||||
this->type = param_2->type;
|
||||
sub_08080CB4(this);
|
||||
this->type = type;
|
||||
}
|
||||
|
||||
void sub_0809D91C(Entity* this) {
|
||||
Entity* fxEnt;
|
||||
|
||||
fxEnt = CreateFx(this, FX_DASH, 0);
|
||||
if (fxEnt != NULL) {
|
||||
SortEntityBelow(this, fxEnt);
|
||||
}
|
||||
SoundReq(SFX_SECRET);
|
||||
}
|
||||
|
||||
bool32 sub_0809D93C(Entity* this, const struct_gUnk_08123FB0* param_2) {
|
||||
u32 uVar1;
|
||||
|
||||
if (gPlayerEntity.action == 6 && ((param_2->unk0c >> gPlayerEntity.animationState & 1) != 0)) {
|
||||
uVar1 = (gPlayerEntity.x.HALF.HI - this->x.HALF.HI) + param_2->unk08 + param_2->unk0a;
|
||||
if (param_2->unk0a * 2 <= (u16)uVar1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uVar1 = (gPlayerEntity.y.HALF.HI - (this->y.HALF.HI + param_2->y)) + param_2->unk09 + param_2->unk0b;
|
||||
if (param_2->unk0b * 2 > (u16)uVar1) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "projectile.h"
|
||||
#include "room.h"
|
||||
#include "functions.h"
|
||||
|
||||
typedef struct {
|
||||
Entity base;
|
||||
u8 filler[0xC];
|
||||
u16 unk74;
|
||||
u16 unk76;
|
||||
u8 filler2[0x6];
|
||||
u8 unk7e;
|
||||
} Object98Entity;
|
||||
|
||||
void sub_0809E360(Object98Entity*);
|
||||
void sub_0809E3E4(Object98Entity*);
|
||||
|
||||
void Object98(Entity* this) {
|
||||
static void (*const actionFuncs[])(Object98Entity*) = {
|
||||
sub_0809E360,
|
||||
sub_0809E3E4,
|
||||
};
|
||||
|
||||
actionFuncs[this->action]((Object98Entity*)this);
|
||||
}
|
||||
|
||||
void sub_0809E360(Object98Entity* this) {
|
||||
u32 bVar1;
|
||||
Entity* projEnt;
|
||||
u32 index;
|
||||
|
||||
if (8 < super->actionDelay) {
|
||||
super->actionDelay = 8;
|
||||
}
|
||||
|
||||
if (0x48 - super->actionDelay > gEntCount) {
|
||||
for (index = 0; index < super->actionDelay; index++) {
|
||||
projEnt = CreateProjectile(GURUGURU_BAR_PROJECTILE);
|
||||
projEnt->actionDelay = 14 + 12 * index;
|
||||
projEnt->parent = super;
|
||||
}
|
||||
|
||||
super->action = 1;
|
||||
bVar1 = this->unk7e;
|
||||
this->unk76 = bVar1 << 8;
|
||||
super->animationState = bVar1 << 6;
|
||||
SetDefaultPriority(super, 0);
|
||||
if (super->type != 0) {
|
||||
super->child = (Entity*)GetCurrentRoomProperty(super->type);
|
||||
sub_080A2CC0(super, (u16**)&super->child, &this->unk74);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_0809E3E4(Object98Entity* this) {
|
||||
this->unk76 += super->type2;
|
||||
super->animationState = this->unk76 >> 2;
|
||||
if (super->type != 0) {
|
||||
if ((super->direction & 0x80) == 0) {
|
||||
LinearMoveUpdate(super);
|
||||
}
|
||||
|
||||
if (--this->unk74 == 0) {
|
||||
sub_080A2CC0(super, (u16**)&super->child, &this->unk74);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
#include "entity.h"
|
||||
#include "coord.h"
|
||||
|
||||
void Object99(Entity* this) {
|
||||
Entity* parent;
|
||||
|
||||
parent = this->parent;
|
||||
if (parent->next == NULL) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
|
||||
if (this->action == 0) {
|
||||
this->action = 1;
|
||||
this->field_0x76.HALF.LO = parent->animationState;
|
||||
this->field_0x74.HALF.LO = this->spriteOffsetX;
|
||||
this->field_0x74.HALF.HI = this->spriteOffsetY;
|
||||
InitializeAnimation(this, this->animationState);
|
||||
}
|
||||
|
||||
if (parent->animationState != this->field_0x76.HALF.LO) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
this->spriteSettings.draw = parent->spriteSettings.draw;
|
||||
CopyPositionAndSpriteOffset(parent, this);
|
||||
this->spriteOffsetX += this->field_0x74.HALF.LO;
|
||||
this->spriteOffsetY += this->field_0x74.HALF.HI;
|
||||
if (this->animationState != 2) {
|
||||
this->y.HALF.HI++;
|
||||
this->spriteOffsetY--;
|
||||
} else {
|
||||
this->y.HALF.HI--;
|
||||
this->spriteOffsetY++;
|
||||
}
|
||||
|
||||
GetNextFrame(this);
|
||||
if (this->frame & 0x80) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "flags.h"
|
||||
#include "hitbox.h"
|
||||
#include "effects.h"
|
||||
|
||||
typedef struct {
|
||||
Entity base;
|
||||
u8 filler[0x1E];
|
||||
u16 objFlags;
|
||||
} ObjectA6Entity;
|
||||
|
||||
void sub_0809F920(ObjectA6Entity*);
|
||||
void sub_0809F964(ObjectA6Entity*);
|
||||
|
||||
void ObjectA6(Entity* this) {
|
||||
static void (*const actionFuncs[])(ObjectA6Entity*) = {
|
||||
sub_0809F920,
|
||||
sub_0809F964,
|
||||
};
|
||||
|
||||
actionFuncs[this->action]((ObjectA6Entity*)this);
|
||||
}
|
||||
|
||||
void sub_0809F920(ObjectA6Entity* this) {
|
||||
if (CheckFlags(this->objFlags)) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
|
||||
super->action = 1;
|
||||
COLLISION_ON(super);
|
||||
super->field_0x3c = 7;
|
||||
super->hurtType = 0x48;
|
||||
super->hitType = 1;
|
||||
super->flags2 = 2;
|
||||
super->hitbox = (Hitbox*)&gHitbox_0;
|
||||
}
|
||||
|
||||
void sub_0809F964(ObjectA6Entity* this) {
|
||||
Entity* fxEnt;
|
||||
|
||||
if (super->bitfield == 0xa1) {
|
||||
fxEnt = CreateFx(super, FX_MAGIC_STORM, 0);
|
||||
if (fxEnt != NULL) {
|
||||
fxEnt->spritePriority.b0 = 3;
|
||||
fxEnt->spriteOffsetY = -5;
|
||||
}
|
||||
SetFlag(this->objFlags);
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "sound.h"
|
||||
|
||||
void sub_0809FEF8(Entity*);
|
||||
void sub_0809FF28(Entity*);
|
||||
|
||||
void ObjectA9(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
sub_0809FEF8,
|
||||
sub_0809FF28,
|
||||
DeleteEntity,
|
||||
};
|
||||
|
||||
actionFuncs[this->action]((Entity*)this);
|
||||
}
|
||||
|
||||
void sub_0809FEF8(Entity* this) {
|
||||
static const u8 typeAnimationStates[] = { 0x2, 0x0, 0x43, 0x0 };
|
||||
static const u16 typeSounds[] = { SFX_124, SFX_197, SFX_11D, SFX_NONE };
|
||||
this->action = 1;
|
||||
InitializeAnimation(this, typeAnimationStates[this->type]);
|
||||
SoundReq(typeSounds[this->type]);
|
||||
}
|
||||
|
||||
void sub_0809FF28(Entity* this) {
|
||||
Entity* pEVar1;
|
||||
|
||||
GetNextFrame(this);
|
||||
if (this->frame & 0x80) {
|
||||
this->action = 2;
|
||||
pEVar1 = this->parent;
|
||||
pEVar1->flags = this->actionDelay;
|
||||
pEVar1->spriteSettings.draw = this->field_0xf;
|
||||
((GenericEntity*)pEVar1)->field_0x6c.HALF.HI &= 0xef;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "flags.h"
|
||||
#include "asm.h"
|
||||
#include "player.h"
|
||||
#include "coord.h"
|
||||
|
||||
extern void sub_0805B390(u32);
|
||||
|
||||
void ObjectAB_Init(Entity*);
|
||||
void ObjectAB_Action1(Entity*);
|
||||
void ObjectAB_Action2(Entity*);
|
||||
void sub_080A0190(Entity*);
|
||||
|
||||
void ObjectAB(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
ObjectAB_Init,
|
||||
ObjectAB_Action1,
|
||||
ObjectAB_Action2,
|
||||
};
|
||||
|
||||
actionFuncs[this->action]((Entity*)this);
|
||||
}
|
||||
|
||||
void ObjectAB_Init(Entity* this) {
|
||||
this->action++;
|
||||
this->collisionLayer = 1;
|
||||
this->spriteRendering.b3 = 3;
|
||||
this->spritePriority.b0 = 7;
|
||||
this->subAction = 0;
|
||||
InitializeAnimation(this, 0);
|
||||
}
|
||||
|
||||
void ObjectAB_Action1(Entity* this) {
|
||||
if (CheckRoomFlag(0)) {
|
||||
GetNextFrame(this);
|
||||
if (this->frame & 0x80) {
|
||||
this->action++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectAB_Action2(Entity* this) {
|
||||
if (CheckRoomFlag(1)) {
|
||||
sub_080A0190(this);
|
||||
RequestPriorityDuration(this, 0x1e);
|
||||
if (EntityInRectRadius(this, &gPlayerEntity, 0x10, 0x10)) {
|
||||
sub_0805B390(0x37);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_080A0190(Entity* this) {
|
||||
this->subAction = 1;
|
||||
CopyPosition(this, &gPlayerEntity);
|
||||
gPlayerState.queued_action = 3;
|
||||
gPlayerState.field_0x38 = 0;
|
||||
gPlayerState.flags |= PL_PIT_IS_EXIT;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "functions.h"
|
||||
#include "screen.h"
|
||||
|
||||
void sub_080A04A4(Entity*);
|
||||
void sub_080A04E0(Entity*);
|
||||
void sub_080A04E8();
|
||||
|
||||
void ObjectAD(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
sub_080A04A4,
|
||||
sub_080A04E0,
|
||||
};
|
||||
|
||||
actionFuncs[this->action]((Entity*)this);
|
||||
}
|
||||
|
||||
void sub_080A04A4(Entity* this) {
|
||||
this->action = 1;
|
||||
this->frameIndex = 4;
|
||||
this->actionDelay = 0;
|
||||
this->spriteRendering.b3 = 3;
|
||||
this->spritePriority.b0 = 7;
|
||||
this->z.WORD = 0;
|
||||
this->spriteRendering.alphaBlend = 1;
|
||||
sub_080A04E8();
|
||||
}
|
||||
|
||||
void sub_080A04E0(Entity* this) {
|
||||
sub_080A04E8();
|
||||
}
|
||||
|
||||
void sub_080A04E8(Entity* this) {
|
||||
int iVar2;
|
||||
u32 uVar3;
|
||||
|
||||
iVar2 = (this->parent->z.HALF.HI < 0 ? -this->parent->z.HALF.HI : this->parent->z.HALF.HI) + 0x100;
|
||||
SetAffineInfo(this, iVar2, iVar2, 0);
|
||||
iVar2 = ((0x1c0 - iVar2) * 10) / iVar2;
|
||||
if (this->parent->type == 0x41) {
|
||||
uVar3 = iVar2 * 2;
|
||||
if (0xc < uVar3) {
|
||||
uVar3 = 0xc;
|
||||
}
|
||||
iVar2 = (0x10 - iVar2) * 0x100;
|
||||
iVar2 |= uVar3;
|
||||
iVar2 &= 0xffff;
|
||||
} else {
|
||||
iVar2 |= (0x10 - iVar2) * 0x100;
|
||||
iVar2 &= 0xffff;
|
||||
}
|
||||
gScreen.controls.alphaBlend = iVar2;
|
||||
}
|
||||
@@ -124,7 +124,7 @@ void ObjectB_Action2(ObjectBEntity* this) {
|
||||
break;
|
||||
}
|
||||
MessageFromTarget(messageIndex);
|
||||
gMessage.field_0x10 = super->type2;
|
||||
gMessage.rupees = super->type2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "menu.h"
|
||||
#include "coord.h"
|
||||
#include "object.h"
|
||||
|
||||
extern void sub_0806FB00(Entity*, u32, u32, u32);
|
||||
extern bool32 sub_0806FB38(Entity*);
|
||||
|
||||
void ObjectB4_Type0(Entity*);
|
||||
void ObjectB4_Type1(Entity*);
|
||||
void ObjectB4_Type2(Entity*);
|
||||
void ObjectB4_Type3(Entity*);
|
||||
|
||||
const u16 gUnk_08124B10[] = { 0x40, 0x58, 0x68, 0x80, 0x94, 0xA8, 0xB0, 0x0 };
|
||||
|
||||
void ObjectB4(Entity* this) {
|
||||
static void (*const typeFuncs[])(Entity*) = {
|
||||
ObjectB4_Type0,
|
||||
ObjectB4_Type1,
|
||||
ObjectB4_Type2,
|
||||
ObjectB4_Type3,
|
||||
};
|
||||
|
||||
typeFuncs[this->type]((Entity*)this);
|
||||
}
|
||||
|
||||
void ObjectB4_Type0(Entity* this) {
|
||||
Entity* pEVar3;
|
||||
|
||||
switch (this->action) {
|
||||
case 0:
|
||||
this->action = 1;
|
||||
this->spriteSettings.draw = 2;
|
||||
this->frameIndex = 9;
|
||||
this->actionDelay = 8;
|
||||
this->field_0xf = 0;
|
||||
this->spriteRendering.b3 = 1;
|
||||
this->spritePriority.b0 = 4;
|
||||
this->spriteOrientation.flipY = 1;
|
||||
sub_0806FB00(this, 0xbf, 0x48, 0x1e);
|
||||
break;
|
||||
case 1:
|
||||
if ((this->field_0xf < 7) && (--this->actionDelay == 0)) {
|
||||
this->actionDelay = 1;
|
||||
pEVar3 = CreateObject(OBJECT_B4, 1, this->field_0xf);
|
||||
if (pEVar3 != NULL) {
|
||||
CopyPosition(this, pEVar3);
|
||||
pEVar3->y.HALF.HI = 0x68;
|
||||
SortEntityBelow(this, pEVar3);
|
||||
}
|
||||
this->field_0xf++;
|
||||
}
|
||||
|
||||
if (sub_0806FB38(this) || (1 < gMenu.menuType)) {
|
||||
this->x.HALF.HI = 0xbf;
|
||||
this->y.HALF.HI = 0x48;
|
||||
this->frameIndex = 10;
|
||||
this->action = 2;
|
||||
while (this->field_0xf < 7) {
|
||||
pEVar3 = CreateObject(OBJECT_B4, 1, this->field_0xf);
|
||||
if (pEVar3 != NULL) {
|
||||
CopyPosition(this, pEVar3);
|
||||
pEVar3->y.HALF.HI = 0x68;
|
||||
SortEntityBelow(this, pEVar3);
|
||||
}
|
||||
this->field_0xf++;
|
||||
}
|
||||
|
||||
pEVar3 = CreateObject(OBJECT_B4, 2, 0);
|
||||
if (pEVar3 != NULL) {
|
||||
pEVar3->x.HALF.HI = 0xc4;
|
||||
pEVar3->y.HALF.HI = 0x2c;
|
||||
SortEntityAbove(this, pEVar3);
|
||||
}
|
||||
|
||||
pEVar3 = CreateObject(OBJECT_B4, 3, 0);
|
||||
if (pEVar3 != NULL) {
|
||||
pEVar3->x.HALF.HI = 0xb4;
|
||||
pEVar3->y.HALF.HI = 0x19;
|
||||
SortEntityAbove(this, pEVar3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectB4_Type1(Entity* this) {
|
||||
switch (this->action) {
|
||||
case 0:
|
||||
this->action = 1;
|
||||
this->spriteSettings.draw = 2;
|
||||
this->frameIndex = this->type2 + 2;
|
||||
sub_0806FB00(this, gUnk_08124B10[this->type2], 0x68, 0x14);
|
||||
break;
|
||||
case 1:
|
||||
if (sub_0806FB38(this) || 1 < gMenu.menuType) {
|
||||
this->x.HALF.HI = gUnk_08124B10[this->type2];
|
||||
this->y.HALF.HI = 0x68;
|
||||
this->spritePriority.b0 = 7 - this->type2;
|
||||
this->action = 2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectB4_Type2(Entity* this) {
|
||||
static const u8 gUnk_08124B30[] = { 9, 10, 11, 12, 11, 10, 9, -1 };
|
||||
if (this->action == 0) {
|
||||
this->action = 1;
|
||||
this->spriteSettings.draw = 2;
|
||||
this->spriteRendering.b3 = 1;
|
||||
this->spritePriority.b0 = 0;
|
||||
this->spriteOrientation.flipY = 1;
|
||||
this->frameIndex = 11;
|
||||
this->actionDelay = (Random() & 0x3f) + 0x40;
|
||||
this->field_0xf = 0;
|
||||
}
|
||||
|
||||
if (--this->actionDelay == 0) {
|
||||
this->actionDelay = 4;
|
||||
this->frameIndex = gUnk_08124B30[this->field_0xf++] + 2;
|
||||
if (gUnk_08124B30[this->field_0xf] == 0xff) {
|
||||
this->actionDelay = (Random() & 0x3f) + 0x40;
|
||||
this->field_0xf = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectB4_Type3(Entity* this) {
|
||||
if (this->action == 0) {
|
||||
this->action = 1;
|
||||
this->spriteSettings.draw = 2;
|
||||
this->frameIndex = 15;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,350 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "flags.h"
|
||||
#include "sound.h"
|
||||
#include "functions.h"
|
||||
#include "asm.h"
|
||||
#include "object.h"
|
||||
#include "effects.h"
|
||||
|
||||
typedef struct {
|
||||
Entity base;
|
||||
u8 filler[0x10];
|
||||
u16 tilePos;
|
||||
u8 unk7a;
|
||||
u8 unk7b;
|
||||
u8 filler2[0xA];
|
||||
u16 objFlags;
|
||||
} ObjectBlockingStairsEntity;
|
||||
|
||||
extern const Hitbox gUnk_080FD288;
|
||||
|
||||
void ObjectBlockingStairs_Init(ObjectBlockingStairsEntity*);
|
||||
void ObjectBlockingStairs_Action1(ObjectBlockingStairsEntity*);
|
||||
void ObjectBlockingStairs_Action2(ObjectBlockingStairsEntity*);
|
||||
void ObjectBlockingStairs_Action3(ObjectBlockingStairsEntity*);
|
||||
void sub_080932A8(ObjectBlockingStairsEntity*);
|
||||
void sub_08093248(ObjectBlockingStairsEntity*);
|
||||
void sub_08093280(ObjectBlockingStairsEntity*);
|
||||
void sub_08093334(ObjectBlockingStairsEntity*);
|
||||
void sub_08093364(ObjectBlockingStairsEntity*);
|
||||
void ObjectBlockingStairs_Action4(ObjectBlockingStairsEntity*);
|
||||
u32 sub_080932D8(u32);
|
||||
void sub_080931A4(ObjectBlockingStairsEntity*, u32);
|
||||
|
||||
void ObjectBlockingStairs(Entity* this) {
|
||||
static void (*const actionFuncs[])(ObjectBlockingStairsEntity*) = {
|
||||
ObjectBlockingStairs_Init, ObjectBlockingStairs_Action1, ObjectBlockingStairs_Action2,
|
||||
ObjectBlockingStairs_Action3, ObjectBlockingStairs_Action4,
|
||||
};
|
||||
|
||||
actionFuncs[this->action]((ObjectBlockingStairsEntity*)this);
|
||||
}
|
||||
|
||||
void ObjectBlockingStairs_Init(ObjectBlockingStairsEntity* this) {
|
||||
int iVar1;
|
||||
u32 uVar2;
|
||||
|
||||
switch (sub_080932D8(super->type)) {
|
||||
case 1:
|
||||
super->action = 4;
|
||||
super->x.HALF.HI -= 0x20;
|
||||
uVar2 = 2;
|
||||
break;
|
||||
case 2:
|
||||
super->action = 4;
|
||||
super->x.HALF.HI += 0x20;
|
||||
uVar2 = 3;
|
||||
break;
|
||||
default:
|
||||
super->action = 1;
|
||||
super->speed = 0x80;
|
||||
super->field_0x16 = 1;
|
||||
super->actionDelay = 0;
|
||||
super->field_0xf = 0;
|
||||
this->unk7a = 0x20;
|
||||
this->unk7b = 0x80;
|
||||
if (super->type == 0) {
|
||||
super->hitbox = (Hitbox*)&gUnk_080FD288;
|
||||
}
|
||||
uVar2 = 0;
|
||||
if ((this->objFlags) && !CheckFlags(this->objFlags)) {
|
||||
uVar2 = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
sub_080931A4(this, uVar2);
|
||||
}
|
||||
|
||||
void ObjectBlockingStairs_Action1(ObjectBlockingStairsEntity* this) {
|
||||
u32 tileType;
|
||||
int xDist;
|
||||
Entity* ent;
|
||||
|
||||
xDist = (int)gPlayerEntity.x.HALF.HI - super->x.HALF.HI;
|
||||
|
||||
if (this->objFlags) {
|
||||
if (!CheckFlags(this->objFlags)) {
|
||||
return;
|
||||
}
|
||||
if (this->unk7a != 0) {
|
||||
sub_080932A8(this);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if ((this->unk7b & 0x3f) == 0) {
|
||||
this->unk7b |= 0xf;
|
||||
sub_080931A4(this, 0);
|
||||
if (xDist < 0) {
|
||||
this->unk7b |= 0x40;
|
||||
}
|
||||
}
|
||||
|
||||
if (this->unk7b & 0x40) {
|
||||
tileType = (u32)GetTileType(this->tilePos - 1, super->collisionLayer);
|
||||
} else {
|
||||
tileType = (u32)GetTileType(this->tilePos + 1, super->collisionLayer);
|
||||
}
|
||||
|
||||
switch (tileType) {
|
||||
case 0x4030:
|
||||
case 0x4031:
|
||||
super->action = 3;
|
||||
super->direction = Direction8FromAnimationState(gPlayerEntity.animationState);
|
||||
super->speed = 0x80;
|
||||
super->actionDelay = 0x40;
|
||||
RequestPriorityDuration(super, 0x50);
|
||||
EnqueueSFX(SFX_10F);
|
||||
sub_08093248(this);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((gPlayerEntity.animationState & 2) == 0) {
|
||||
return;
|
||||
}
|
||||
RegisterCarryEntity(super);
|
||||
|
||||
if (this->unk7b & 0x80) {
|
||||
this->unk7b &= ~0x80;
|
||||
if ((this->unk7b & 0x40) != 0) {
|
||||
SetTile(0x402c, this->tilePos - 1, super->collisionLayer);
|
||||
SetTile(0x403d, this->tilePos + 1, super->collisionLayer);
|
||||
} else {
|
||||
SetTile(0x403d, this->tilePos - 1, super->collisionLayer);
|
||||
SetTile(0x402d, this->tilePos + 1, super->collisionLayer);
|
||||
}
|
||||
} else if (this->unk7b & 0x40) {
|
||||
if (xDist >= 5) {
|
||||
this->unk7b &= ~(0x40 | 0x80);
|
||||
SetTile(0x403d, this->tilePos - 1, super->collisionLayer);
|
||||
SetTile(0x402d, this->tilePos + 1, super->collisionLayer);
|
||||
}
|
||||
} else {
|
||||
if (-xDist > 4) {
|
||||
this->unk7b |= 0x40;
|
||||
SetTile(0x402c, this->tilePos - 1, super->collisionLayer);
|
||||
SetTile(0x403d, this->tilePos + 1, super->collisionLayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectBlockingStairs_Action2(ObjectBlockingStairsEntity* this) {
|
||||
if (super->actionDelay) {
|
||||
sub_08093280(this);
|
||||
} else {
|
||||
if (gPlayerState.heldObject == 0x12) {
|
||||
if ((gPlayerEntity.frame & 2) != 0 && ++super->field_0xf > 8) {
|
||||
gPlayerState.queued_action = 16;
|
||||
gPlayerState.field_0x38 = 0x40;
|
||||
gPlayerState.flags |= PL_BUSY;
|
||||
gPlayerEntity.x.HALF.LO = 0;
|
||||
gPlayerEntity.y.HALF.LO = 0;
|
||||
super->direction = (gPlayerEntity.animationState ^ 4) << 2;
|
||||
super->actionDelay = 0x40;
|
||||
EnqueueSFX(SFX_10F);
|
||||
sub_08093248(this);
|
||||
}
|
||||
} else if (super->subAction == 6) {
|
||||
super->action = 1;
|
||||
super->field_0xf = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectBlockingStairs_Action3(ObjectBlockingStairsEntity* this) {
|
||||
sub_0800445C(super);
|
||||
LinearMoveUpdate(super);
|
||||
if (--super->actionDelay == 0) {
|
||||
sub_08093334(this);
|
||||
}
|
||||
sub_08093364(this);
|
||||
}
|
||||
|
||||
void ObjectBlockingStairs_Action4(ObjectBlockingStairsEntity* this) {
|
||||
}
|
||||
|
||||
void sub_080931A4(ObjectBlockingStairsEntity* this, u32 param_2) {
|
||||
static const u16 gUnk_08122850[] = { 0x4027, 0x4023, 0x4028, 0x402c, 0x402b, 0x402d, 0x4029, 0x4026, 0x402a };
|
||||
static const u16 gUnk_08122862[] = { 0x4027, 0x4023, 0x4028, 0x4024, 0x4022, 0x4025, 0x4029, 0x4026, 0x402a };
|
||||
static const u16 gUnk_08122874[] = { 0x4027, 0x4023, 0x4023, 0x4024, 0x4022, 0x4022, 0x4029, 0x4026, 0x4026 };
|
||||
static const u16 gUnk_08122886[] = { 0x4023, 0x4023, 0x4028, 0x4022, 0x4022, 0x4025, 0x4026, 0x4026, 0x402a };
|
||||
|
||||
u32 collisionLayer;
|
||||
const u16* pTileTypes;
|
||||
u32 index;
|
||||
u32 tilePos;
|
||||
int iVar5;
|
||||
|
||||
this->tilePos = COORD_TO_TILE(super);
|
||||
tilePos = this->tilePos - 0x40;
|
||||
collisionLayer = super->collisionLayer;
|
||||
|
||||
switch (param_2) {
|
||||
case 1:
|
||||
pTileTypes = gUnk_08122862;
|
||||
break;
|
||||
case 2:
|
||||
pTileTypes = gUnk_08122874;
|
||||
break;
|
||||
case 3:
|
||||
pTileTypes = gUnk_08122886;
|
||||
break;
|
||||
default:
|
||||
case 0:
|
||||
pTileTypes = gUnk_08122850;
|
||||
break;
|
||||
}
|
||||
|
||||
for (index = 0, iVar5 = 0; index < 9; index++) {
|
||||
u32 pos = tilePos + iVar5 + index - 1;
|
||||
SetTile(pTileTypes[index], pos, collisionLayer);
|
||||
switch (index) {
|
||||
case 2:
|
||||
iVar5 = 0x3d;
|
||||
break;
|
||||
case 5:
|
||||
iVar5 = 0x7a;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08093248(ObjectBlockingStairsEntity* this) {
|
||||
u32 collisionLayer;
|
||||
u32 tilePos;
|
||||
u32 index;
|
||||
int iVar4;
|
||||
|
||||
tilePos = this->tilePos - 0x40;
|
||||
collisionLayer = super->collisionLayer;
|
||||
for (index = 0, iVar4 = 0; index < 9; index++) {
|
||||
sub_0807BA8C(tilePos + iVar4 + index - 1, collisionLayer);
|
||||
switch (index) {
|
||||
case 2:
|
||||
iVar4 = 0x3d;
|
||||
break;
|
||||
case 5:
|
||||
iVar4 = 0x7a;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08093280(ObjectBlockingStairsEntity* this) {
|
||||
sub_0800445C(super);
|
||||
LinearMoveUpdate(super);
|
||||
if (--super->actionDelay == 0) {
|
||||
sub_08093334(this);
|
||||
}
|
||||
sub_08093364(this);
|
||||
}
|
||||
|
||||
void sub_080932A8(ObjectBlockingStairsEntity* this) {
|
||||
this->unk7a--;
|
||||
switch (this->unk7a & 3) {
|
||||
case 1:
|
||||
super->spriteOffsetX = 1;
|
||||
break;
|
||||
case 3:
|
||||
super->spriteOffsetX = -1;
|
||||
break;
|
||||
default:
|
||||
super->spriteOffsetX = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
u32 flagBank;
|
||||
u16 unk4;
|
||||
u16 unk6;
|
||||
} struct_gUnk_08122898;
|
||||
|
||||
const struct_gUnk_08122898 gUnk_08122898[] = {
|
||||
{ 0x200, 0xa1, 0xa2 },
|
||||
{ 0x8c0, 0x6f, 0x70 },
|
||||
};
|
||||
|
||||
u32 sub_080932D8(u32 param_1) {
|
||||
const struct_gUnk_08122898* ptr = gUnk_08122898 + param_1;
|
||||
|
||||
if (CheckLocalFlagByBank(ptr->flagBank, ptr->unk4)) {
|
||||
return 1;
|
||||
} else {
|
||||
if (CheckLocalFlagByBank(ptr->flagBank, ptr->unk6)) {
|
||||
return 2;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08093308(u32 param_1, u32 param_2) {
|
||||
const struct_gUnk_08122898* ptr = gUnk_08122898 + param_1;
|
||||
if (param_2 == 1) {
|
||||
SetLocalFlagByBank(ptr->flagBank, ptr->unk4);
|
||||
} else if (param_2 == 2) {
|
||||
SetLocalFlagByBank(ptr->flagBank, ptr->unk6);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08093334(ObjectBlockingStairsEntity* this) {
|
||||
u32 uVar1;
|
||||
|
||||
super->action = 4;
|
||||
if (super->direction & 0x10) {
|
||||
uVar1 = 1;
|
||||
} else {
|
||||
uVar1 = 2;
|
||||
}
|
||||
sub_080931A4(this, uVar1 + 1);
|
||||
sub_08093308(super->type, uVar1);
|
||||
EnqueueSFX(SFX_SECRET);
|
||||
}
|
||||
|
||||
void sub_08093364(ObjectBlockingStairsEntity* this) {
|
||||
s32 sVar1;
|
||||
Entity* dashEffectEnt;
|
||||
|
||||
if ((super->actionDelay & 3) == 0) {
|
||||
dashEffectEnt = CreateObject(SPECIAL_FX, FX_DASH, 0);
|
||||
if (dashEffectEnt != NULL) {
|
||||
dashEffectEnt->parent = super;
|
||||
CopyPosition(super, dashEffectEnt);
|
||||
if (super->direction & 0x10) {
|
||||
dashEffectEnt->x.HALF.HI += 0x12;
|
||||
} else {
|
||||
dashEffectEnt->x.HALF.HI -= 0x12;
|
||||
}
|
||||
|
||||
sVar1 = dashEffectEnt->y.HALF.HI;
|
||||
if (super->actionDelay & 8) {
|
||||
dashEffectEnt->y.HALF.HI = sVar1 + 8;
|
||||
} else {
|
||||
dashEffectEnt->y.HALF.HI = sVar1 - 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "asm.h"
|
||||
#include "sound.h"
|
||||
|
||||
void PicoBloom_Init(Entity*);
|
||||
void PicoBloom_Action1(Entity*);
|
||||
void PicoBloom_Action2(Entity*);
|
||||
|
||||
void PicoBloom(Entity* this) {
|
||||
static void (*const actionFuncs[])(Entity*) = {
|
||||
PicoBloom_Init,
|
||||
PicoBloom_Action1,
|
||||
PicoBloom_Action2,
|
||||
};
|
||||
|
||||
actionFuncs[this->action](this);
|
||||
}
|
||||
|
||||
void PicoBloom_Init(Entity* this) {
|
||||
static const u8 typeAnimationStates[] = { 3, 0, 3, 3, 3, 3 };
|
||||
u32 nextAction;
|
||||
|
||||
nextAction = this->type2;
|
||||
if (nextAction != 1) {
|
||||
nextAction = 2;
|
||||
}
|
||||
this->action = nextAction;
|
||||
this->actionDelay = (Random() & 0x7f) + 0x7f;
|
||||
this->collisionLayer = 1;
|
||||
UpdateSpriteForCollisionLayer(this);
|
||||
InitializeAnimation(this, typeAnimationStates[this->type] + this->type2);
|
||||
}
|
||||
|
||||
void PicoBloom_Action1(Entity* this) {
|
||||
if (--this->actionDelay == 0) {
|
||||
this->action++;
|
||||
}
|
||||
}
|
||||
|
||||
void PicoBloom_Action2(Entity* this) {
|
||||
GetNextFrame(this);
|
||||
if (this->frame & 1) {
|
||||
this->frame &= ~1;
|
||||
EnqueueSFX(SFX_21B);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
#define NENT_DEPRECATED
|
||||
#include "entity.h"
|
||||
#include "collision.h"
|
||||
#include "room.h"
|
||||
#include "asm.h"
|
||||
#include "sound.h"
|
||||
@@ -49,7 +50,12 @@ void PlayerClone_Init(PlayerCloneEntity* this) {
|
||||
SoundReq(SFX_112);
|
||||
}
|
||||
|
||||
const u16 PlayerCloneCollisions[] = { 0x2206, 0x6044, 0x4460, 0x622 };
|
||||
const u16 PlayerCloneCollisions[] = {
|
||||
COL_NORTH_FULL | COL_WEST_SOUTH | COL_EAST_SOUTH,
|
||||
COL_NORTH_EAST | COL_SOUTH_EAST | COL_EAST_FULL,
|
||||
COL_SOUTH_FULL | COL_WEST_NORTH | COL_EAST_NORTH,
|
||||
COL_NORTH_WEST | COL_SOUTH_WEST | COL_WEST_FULL,
|
||||
};
|
||||
|
||||
void PlayerClone_Action1(PlayerCloneEntity* this) {
|
||||
static const Hitbox PlayerCloneHitbox = { 0, -3, { 5, 3, 3, 5 }, 6, 6 };
|
||||
@@ -104,7 +110,8 @@ void PlayerClone_Action2(PlayerCloneEntity* this) {
|
||||
super->y.HALF.HI = gPlayerEntity.y.HALF.HI + this->unk7a;
|
||||
sub_08084CAC(this);
|
||||
sub_080085B0(super);
|
||||
if ((super->collisions & 0x6666) != 0x6666) {
|
||||
if ((super->collisions & (COL_NORTH_FULL | COL_SOUTH_FULL | COL_EAST_FULL | COL_WEST_FULL)) !=
|
||||
(COL_NORTH_FULL | COL_SOUTH_FULL | COL_EAST_FULL | COL_WEST_FULL)) {
|
||||
for (index = 0; index <= 3; index++) {
|
||||
if (PlayerCloneCollisions[index] == (PlayerCloneCollisions[index] & super->collisions)) {
|
||||
break;
|
||||
|
||||
+1
-1
@@ -283,7 +283,7 @@ u32 sub_0808288C(Entity* this, u32 form, u32 arg2, u32 arg3) {
|
||||
break;
|
||||
default:
|
||||
entity = CreateObjectWithParent(this, GROUND_ITEM, form, arg2);
|
||||
if (entity) {
|
||||
if (entity != NULL) {
|
||||
if (arg3 == 2) {
|
||||
entity->actionDelay = 5;
|
||||
entity->field_0x86.HWORD = this->field_0x86.HWORD;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#define NENT_DEPRECATED
|
||||
#include "global.h"
|
||||
#include "collision.h"
|
||||
#include "object.h"
|
||||
#include "functions.h"
|
||||
#include "hitbox.h"
|
||||
@@ -204,7 +205,7 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) {
|
||||
|
||||
uVar3 = sub_0800442E(super);
|
||||
if (uVar3 != 0) {
|
||||
return 0;
|
||||
return FALSE;
|
||||
}
|
||||
ProcessMovement2(super);
|
||||
sub_0800445C(super);
|
||||
@@ -216,17 +217,17 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) {
|
||||
}
|
||||
switch (super->direction >> 3) {
|
||||
case 0:
|
||||
if ((super->collisions & 0xe) == 0) {
|
||||
return 0;
|
||||
if ((super->collisions & COL_NORTH_ANY) == COL_NONE) {
|
||||
return FALSE;
|
||||
}
|
||||
if ((u32)(super->y.HALF.HI & 0xf) - 7 < 3) {
|
||||
super->y.HALF.HI = (super->y.HALF.HI & 0xfff0) + 8;
|
||||
return 1;
|
||||
return TRUE;
|
||||
}
|
||||
sub_0809969C(this);
|
||||
break;
|
||||
case 1:
|
||||
if ((super->collisions & 0xe000) == 0) {
|
||||
if ((super->collisions & COL_EAST_ANY) == COL_NONE) {
|
||||
return FALSE;
|
||||
}
|
||||
if ((u32)(super->x.HALF.HI & 0xf) - 7 < 3) {
|
||||
@@ -236,7 +237,7 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) {
|
||||
sub_0809969C(this);
|
||||
break;
|
||||
case 2:
|
||||
if ((super->collisions & 0xe0) == 0) {
|
||||
if ((super->collisions & COL_SOUTH_ANY) == COL_NONE) {
|
||||
return FALSE;
|
||||
}
|
||||
if ((u32)(super->y.HALF.HI & 0xf) - 7 < 3) {
|
||||
@@ -246,7 +247,7 @@ bool32 sub_0809953C(SmallIceBlockEntity* this) {
|
||||
sub_0809969C(this);
|
||||
break;
|
||||
default:
|
||||
if ((super->collisions & 0xe00) != 0) {
|
||||
if ((super->collisions & COL_WEST_ANY) != COL_NONE) {
|
||||
if ((u32)(super->x.HALF.HI & 0xf) - 7 < 3) {
|
||||
super->x.HALF.HI = (super->x.HALF.HI & 0xfff0) + 8;
|
||||
return TRUE;
|
||||
|
||||
@@ -144,6 +144,7 @@ void sub_080844E0(SpecialFxObject* this) {
|
||||
static const u8 gUnk_0811FAC8[] = { 0x03, 0x37, 0x38, 0x39 };
|
||||
static const u8 gUnk_0811FACC[] = { 0x17, 0x3e, 0x3f, 0x40 };
|
||||
const struct_0811F960* ptr;
|
||||
|
||||
super->action = 1;
|
||||
super->flags &= ~0x80;
|
||||
super->spriteSettings.draw = 1;
|
||||
@@ -219,7 +220,7 @@ void sub_08084680(SpecialFxObject* this) {
|
||||
}
|
||||
|
||||
void sub_08084694(SpecialFxObject* this) {
|
||||
if (!super->parent || !super->parent->next) {
|
||||
if ((super->parent == NULL) || (super->parent->next == NULL)) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
GetNextFrame(super);
|
||||
@@ -253,12 +254,15 @@ void sub_080846B0(SpecialFxObject* this) {
|
||||
|
||||
void sub_0808471C(SpecialFxObject* this) {
|
||||
static const s8 gUnk_0811FB08[] = { -8, -8, 8, -8, -8, 8, 8, 8 };
|
||||
|
||||
GetNextFrame(super);
|
||||
if (super->frame & ANIM_DONE) {
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
Entity* fx = CreateFx(super, 0x24, 0);
|
||||
if (fx) {
|
||||
|
||||
if (fx != NULL) {
|
||||
const s8* ptr = &gUnk_0811FB08[2 * i];
|
||||
fx->x.HALF.HI += ptr[0];
|
||||
fx->y.HALF.HI += ptr[1];
|
||||
@@ -280,7 +284,7 @@ void sub_08084784(SpecialFxObject* this) {
|
||||
|
||||
void sub_08084798(SpecialFxObject* this) {
|
||||
GetNextFrame(super);
|
||||
if ((super->frame & ANIM_DONE) || !super->child->next) {
|
||||
if ((super->frame & ANIM_DONE) || (super->child->next == NULL)) {
|
||||
DeleteThisEntity();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user