En_Hint_Skb (#554)

* En_Hint_Skb

* Merge

* Actorfixer fail

* Merge

* PR
This commit is contained in:
Maide 2022-01-30 20:13:46 +00:00 committed by GitHub
parent 5f425bf73c
commit 5eb1b417de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 799 additions and 76 deletions

3
spec
View File

@ -5382,8 +5382,7 @@ beginseg
name "ovl_En_Hint_Skb"
compress
include "build/src/overlays/actors/ovl_En_Hint_Skb/z_en_hint_skb.o"
include "build/data/ovl_En_Hint_Skb/ovl_En_Hint_Skb.data.o"
include "build/data/ovl_En_Hint_Skb/ovl_En_Hint_Skb.reloc.o"
include "build/src/overlays/actors/ovl_En_Hint_Skb/ovl_En_Hint_Skb_reloc.o"
endseg
beginseg

View File

@ -5,8 +5,9 @@
*/
#include "z_en_hint_skb.h"
#include "objects/object_skb/object_skb.h"
#define FLAGS 0x00000019
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
#define THIS ((EnHintSkb*)thisx)
@ -15,19 +16,28 @@ void EnHintSkb_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnHintSkb_Update(Actor* thisx, GlobalContext* globalCtx);
void EnHintSkb_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80C1FE0C(EnHintSkb* this);
void func_80C1FE20(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C1FE80(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C1FF30(EnHintSkb* this);
void func_80C1FF88(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C2003C(EnHintSkb* this);
void func_80C200B8(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C2016C(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C20334(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C20484(EnHintSkb* this);
void func_80C204F0(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C20590(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C2069C(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C2077C(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C208BC(EnHintSkb* this);
void func_80C208D0(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C20B88(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C20C24(EnHintSkb* this, GlobalContext* globalCtx);
s32 func_80C21414(EnHintSkb* this);
void func_80C21468(EnHintSkb* this, GlobalContext* globalCtx);
void func_80C215E4(GlobalContext* globalCtx, EnHintSkb* this, Vec3f* arg2);
#if 0
const ActorInit En_Hint_Skb_InitVars = {
ACTOR_EN_HINT_SKB,
ACTORCAT_NPC,
@ -40,29 +50,47 @@ const ActorInit En_Hint_Skb_InitVars = {
(ActorFunc)EnHintSkb_Draw,
};
// static ColliderJntSphElementInit sJntSphElementsInit[2] = {
static ColliderJntSphElementInit D_80C21C80[2] = {
static ColliderJntSphElementInit sJntSphElementsInit[2] = {
{
{ ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x00, 0x04 }, { 0x00000000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_NONE, },
{
ELEMTYPE_UNK0,
{ 0xF7CFFFFF, 0x00, 0x04 },
{ 0x00000000, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_NORMAL,
BUMP_NONE,
OCELEM_NONE,
},
{ 15, { { 0, 0, 0 }, 10 }, 100 },
},
{
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, },
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_ON | BUMP_HOOKABLE,
OCELEM_ON,
},
{ 1, { { 0, 0, 0 }, 20 }, 100 },
},
};
// static ColliderJntSphInit sJntSphInit = {
static ColliderJntSphInit D_80C21CC8 = {
{ COLTYPE_HIT6, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
2, D_80C21C80, // sJntSphElementsInit,
static ColliderJntSphInit sJntSphInit = {
{
COLTYPE_HIT6,
AT_ON | AT_TYPE_ENEMY,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_JNTSPH,
},
2,
sJntSphElementsInit,
};
// sColChkInfoInit
static CollisionCheckInfoInit2 D_80C21CD8 = { 2, 0, 0, 0, MASS_IMMOVABLE };
static CollisionCheckInfoInit2 sColChkInfoInit = { 2, 0, 0, 0, MASS_IMMOVABLE };
// static DamageTable sDamageTable = {
static DamageTable D_80C21CE4 = {
static DamageTable sDamageTable = {
/* Deku Nut */ DMG_ENTRY(0, 0x1),
/* Deku Stick */ DMG_ENTRY(1, 0xD),
/* Horse trample */ DMG_ENTRY(0, 0x0),
@ -97,96 +125,781 @@ static DamageTable D_80C21CE4 = {
/* Powder Keg */ DMG_ENTRY(1, 0xF),
};
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_80C21E3C[] = {
static ActorAnimationEntry sAnimations[] = {
{ &object_skb_Anim_0064E0, 0.96f, 0.0f, 0.0f, 0, -4.0f }, { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, 2, -1.0f },
{ &object_skb_Anim_002190, 0.6f, 0.0f, 0.0f, 3, 4.0f }, { &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, 2, -4.0f },
{ &object_skb_Anim_00270C, 1.0f, 0.0f, 0.0f, 2, -4.0f }, { &object_skb_Anim_00697C, 1.0f, 0.0f, 0.0f, 0, -4.0f },
{ &object_skb_Anim_006D90, 1.0f, 0.0f, 0.0f, 0, -4.0f }, { &object_skb_Anim_001D1C, 1.0f, 0.0f, 0.0f, 0, -4.0f },
{ &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, 2, -8.0f }, { &object_skb_Anim_003584, 1.0f, 0.0f, 0.0f, 2, -16.0f },
{ &object_skb_Anim_002AC8, 1.0f, 0.0f, 0.0f, 2, -8.0f }, { &object_skb_Anim_0015EC, 1.0f, 0.0f, 0.0f, 2, -8.0f },
{ &object_skb_Anim_0009E4, 1.0f, 0.0f, 0.0f, 0, -8.0f },
};
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_F32_DIV1000(gravity, -2000, ICHAIN_STOP),
};
#endif
void EnHintSkb_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnHintSkb* this = THIS;
extern ColliderJntSphElementInit D_80C21C80[2];
extern ColliderJntSphInit D_80C21CC8;
extern CollisionCheckInfoInit2 D_80C21CD8;
extern DamageTable D_80C21CE4;
extern InitChainEntry D_80C21E3C[];
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 36.0f);
SkelAnime_Init(globalCtx, &this->skelAnime, &object_skb_Skel_005EF8, &object_skb_Anim_00697C, this->jointTable,
this->morphtable, 20);
Collider_InitJntSph(globalCtx, &this->collider);
Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sJntSphInit, this->colliderElement);
CollisionCheck_SetInfo2(&this->actor.colChkInfo, &sDamageTable, &sColChkInfoInit);
Actor_ProcessInitChain(&this->actor, sInitChain);
this->actor.hintId = 0x55;
this->unk_3E4 = 0;
this->unk_3DE = 0;
this->unk_3E0 = 0;
this->unk_3DC = 0;
this->unk_3E9 = 0;
func_80C1FE0C(this);
}
extern UNK_TYPE D_06002190;
extern UNK_TYPE D_06003584;
extern UNK_TYPE D_0600697C;
void EnHintSkb_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnHintSkb* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/EnHintSkb_Init.s")
Collider_DestroyJntSph(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/EnHintSkb_Destroy.s")
void func_80C1FE0C(EnHintSkb* this) {
this->actionFunc = func_80C1FE20;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C1FE0C.s")
void func_80C1FE20(EnHintSkb* this, GlobalContext* globalCtx) {
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C1FE20.s")
void func_80C1FE30(EnHintSkb* this) {
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 0);
this->actor.speedXZ = 1.6f;
this->actionFunc = func_80C1FE80;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C1FE30.s")
void func_80C1FE80(EnHintSkb* this, GlobalContext* globalCtx) {
if (Animation_OnFrame(&this->skelAnime, 8.0f) || Animation_OnFrame(&this->skelAnime, 15.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_WALK);
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 750, 0);
this->actor.world.rot.y = this->actor.shape.rot.y;
if (Actor_IsFacingPlayer(&this->actor, 0x11C7) && (this->actor.xzDistToPlayer < 60.0f)) {
func_80C1FF30(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C1FE80.s")
void func_80C1FF30(EnHintSkb* this) {
this->collider.base.atFlags &= ~AT_BOUNCED;
this->actor.speedXZ = 0.0f;
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 2);
this->actionFunc = func_80C1FF88;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C1FF30.s")
void func_80C1FF88(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->collider.base.atFlags & AT_BOUNCED) {
this->collider.base.atFlags &= ~(AT_BOUNCED | AT_HIT);
func_80C2003C(this);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C1FF88.s")
if (Animation_OnFrame(&this->skelAnime, 3.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_ATTACK);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2003C.s")
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (func_80C21414(this) && (Player_GetMask(globalCtx) != PLAYER_MASK_CAPTAIN)) {
func_80C1FF30(this);
} else {
func_80C1FE30(this);
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C200B8.s")
void func_80C2003C(EnHintSkb* this) {
Animation_Change(&this->skelAnime, &object_skb_Anim_002190, -0.4f, this->skelAnime.curFrame - 1.0f, 0.0f, 3, 0.0f);
this->collider.base.atFlags &= ~AT_BOUNCED;
this->actionFunc = func_80C200B8;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2011C.s")
void func_80C200B8(EnHintSkb* this, GlobalContext* globalCtx) {
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
if (func_80C21414(this)) {
func_80C1FF30(this);
} else {
func_80C1FE30(this);
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2016C.s")
void func_80C2011C(EnHintSkb* this) {
if (this->actor.bgCheckFlags & 1) {
this->actor.speedXZ = 0.0f;
}
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_80C2016C;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20274.s")
void func_80C2016C(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->actor.bgCheckFlags & 2) {
this->actor.speedXZ = 0.0f;
} else if (this->actor.bgCheckFlags & 1) {
if (this->actor.speedXZ < 0.0f) {
this->actor.speedXZ += 0.05f;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20334.s")
if ((this->actor.colorFilterTimer == 0) && (this->actor.bgCheckFlags & 1)) {
if (this->actor.colChkInfo.health == 0) {
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
} else if (this->skelAnime.animation == &object_skb_Anim_00697C) {
func_80C1FE0C(this);
} else if (func_80C21414(this)) {
func_80C1FF30(this);
} else {
func_80C1FE30(this);
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20484.s")
void func_80C20274(EnHintSkb* this) {
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 8);
this->actor.gravity = -1.0f;
this->actor.speedXZ = 1.0f;
} else {
this->actor.world.rot.y = this->actor.yawTowardsPlayer;
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 3);
if (this->actor.bgCheckFlags & 1) {
this->actor.speedXZ = -4.0f;
}
}
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->actionFunc = func_80C20334;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C204F0.s")
void func_80C20334(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->actor.bgCheckFlags & 2) {
s32 i;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20540.s")
for (i = 0; i < 10; i++) {
func_80C215E4(globalCtx, this, &this->actor.world.pos);
}
this->actor.speedXZ = 0.0f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20590.s")
if (this->actor.bgCheckFlags & 1) {
if (this->actor.speedXZ < 0.0f) {
this->actor.speedXZ += 0.05f;
} else if (this->actor.speedXZ != 0.0f) {
this->actor.speedXZ -= 0.05f;
}
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 2500, 0);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2066C.s")
Math_SmoothStepToS(&this->actor.shape.rot.x, 0, 16, 2000, 100);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2069C.s")
if (Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame) && (this->actor.bgCheckFlags & 1)) {
this->actor.world.rot = this->actor.shape.rot;
func_80C1FE30(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2075C.s")
void func_80C20484(EnHintSkb* this) {
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 4);
this->unk_3E8 |= 4;
if (this->actor.bgCheckFlags & 1) {
this->actor.speedXZ = -6.0f;
}
this->actionFunc = func_80C204F0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C2077C.s")
void func_80C204F0(EnHintSkb* this, GlobalContext* globalCtx) {
if (!(this->unk_3E8 & 8)) {
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C208BC.s")
Item_DropCollectibleRandom(globalCtx, &this->actor, &this->actor.world.pos, 0x10);
Actor_MarkForDeath(&this->actor);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C208D0.s")
void func_80C20540(EnHintSkb* this) {
if (this->actor.bgCheckFlags & 1) {
this->actor.speedXZ = 0.0f;
}
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_COMMON_FREEZE);
this->actionFunc = func_80C20590;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20A74.s")
void func_80C20590(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->unk_3E2 == 0) {
this->unk_3E2 = 0;
this->unk_2D8 = 0.0f;
this->unk_2D4 = 0.0f;
if (this->actor.colChkInfo.health != 0) {
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 3);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E8 |= 1;
func_80C20274(this);
} else {
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
}
} else if (this->unk_3E2 == 1) {
func_80C21468(this, globalCtx);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20B88.s")
void func_80C2066C(EnHintSkb* this) {
if (this->actor.bgCheckFlags & 1) {
this->actor.speedXZ = 0.0f;
}
this->actionFunc = func_80C2069C;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20C24.s")
void func_80C2069C(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->unk_3E2 == 0) {
this->unk_3E2 = 0;
this->unk_2D8 = 0.0f;
this->unk_2D4 = 0.0f;
if (this->actor.colChkInfo.health != 0) {
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 3);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E8 |= 1;
func_80C20274(this);
} else {
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20D64.s")
void func_80C2075C(EnHintSkb* this) {
this->unk_3E0 = 0;
this->actor.speedXZ = 0.0f;
this->actionFunc = func_80C2077C;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C20E90.s")
void func_80C2077C(EnHintSkb* this, GlobalContext* globalCtx) {
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
this->unk_3E0 = 1;
if (this->unk_3DC == 0) {
this->unk_3DC = 1;
func_801518B0(globalCtx, 0x1147, &this->actor);
this->unk_3E6 = 0x1147;
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
globalCtx->msgCtx.unk11F22 = 0x44;
this->actor.speedXZ = 2.4f;
this->actor.gravity = -1.0f;
this->actor.velocity.y = 3.0f;
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 8);
}
} else {
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 11);
func_801518B0(globalCtx, 0x1148, &this->actor);
this->unk_3E6 = 0x1148;
}
func_80C208BC(this);
} else if ((this->actor.xzDistToPlayer < 100.0f) && !(this->collider.base.acFlags & AC_HIT)) {
func_800B8614(&this->actor, globalCtx, 100.0f);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C21250.s")
void func_80C208BC(EnHintSkb* this) {
this->actionFunc = func_80C208D0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C21320.s")
void func_80C208D0(EnHintSkb* this, GlobalContext* globalCtx) {
this->unk_3DE = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C21414.s")
switch (Message_GetState(&globalCtx->msgCtx)) {
case 3:
if ((globalCtx->gameplayFrames % 2) != 0) {
this->unk_3DE = 1;
}
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C21468.s")
case 4:
func_80C20B88(this, globalCtx);
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C215E4.s")
case 5:
func_80C20C24(this, globalCtx);
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/EnHintSkb_Update.s")
case 6:
if (func_80147624(globalCtx)) {
func_80C2075C(this);
}
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C21858.s")
case 0:
case 1:
case 2:
break;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/func_80C219D4.s")
if (this->unk_3E6 == 0x1147) {
if (this->actor.bgCheckFlags & 2) {
s32 i;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Hint_Skb/EnHintSkb_Draw.s")
this->actor.speedXZ = 0.0f;
for (i = 0; i < 10; i++) {
func_80C215E4(globalCtx, this, &this->actor.world.pos);
}
}
if ((this->skelAnime.animation == &object_skb_Anim_003584) &&
Animation_OnFrame(&this->skelAnime, this->skelAnime.endFrame)) {
func_801518B0(globalCtx, 0x1147, &this->actor);
this->unk_3E6 = 0x1147;
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 0);
}
}
if (this->actor.bgCheckFlags & 1) {
Math_SmoothStepToS(&this->actor.world.rot.y, this->actor.yawTowardsPlayer, 5, 0x71C, 0xB6);
this->actor.shape.rot.y = this->actor.world.rot.y;
}
}
void func_80C20A74(EnHintSkb* this, GlobalContext* globalCtx) {
s32 params = ENHINTSKB_GET_FF(&this->actor);
switch (params) {
case 1:
func_801518B0(globalCtx, 0x1149, &this->actor);
this->unk_3E6 = 0x1149;
break;
case 2:
func_801518B0(globalCtx, 0x114A, &this->actor);
this->unk_3E6 = 0x114A;
break;
case 3:
func_801518B0(globalCtx, 0x114B, &this->actor);
this->unk_3E6 = 0x114B;
break;
case 4:
func_801518B0(globalCtx, 0x114C, &this->actor);
this->unk_3E6 = 0x114C;
break;
case 5:
func_801518B0(globalCtx, 0x114D, &this->actor);
this->unk_3E6 = 0x114D;
break;
case 6:
func_801518B0(globalCtx, 0x114E, &this->actor);
this->unk_3E6 = 0x114E;
break;
default:
func_801518B0(globalCtx, 0x1149, &this->actor);
this->unk_3E6 = 0x1149;
break;
}
}
void func_80C20B88(EnHintSkb* this, GlobalContext* globalCtx) {
if (func_80147624(globalCtx)) {
if (globalCtx->msgCtx.choiceIndex == 0) {
func_8019F208();
this->unk_3E8 |= 0x10;
func_801518B0(globalCtx, 0x1150, &this->actor);
this->unk_3E6 = 0x1150;
} else {
func_8019F230();
func_801518B0(globalCtx, 0x1152, &this->actor);
this->unk_3E6 = 0x1152;
}
}
}
void func_80C20C24(EnHintSkb* this, GlobalContext* globalCtx) {
if (!func_80147624(globalCtx)) {
return;
}
switch (this->unk_3E6) {
case 0x1147:
func_801518B0(globalCtx, 0x1148, &this->actor);
this->unk_3E6 = 0x1148;
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 11);
break;
case 0x1148:
func_80C20A74(this, globalCtx);
break;
case 0x1149:
case 0x114A:
case 0x114B:
case 0x114C:
case 0x114D:
case 0x114E:
func_801518B0(globalCtx, 0x114F, &this->actor);
this->unk_3E6 = 0x114F;
break;
case 0x1152:
func_801518B0(globalCtx, 0x1151, &this->actor);
this->unk_3E6 = 0x1151;
break;
case 0x1150:
func_801518B0(globalCtx, 0x1151, &this->actor);
this->unk_3E6 = 0x1151;
break;
case 0x1151:
func_801477B4(globalCtx);
if (this->unk_3E8 & 0x10) {
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
} else {
func_80C2075C(this);
}
break;
}
}
void func_80C20D64(EnHintSkb* this, GlobalContext* globalCtx) {
if ((this->actionFunc == func_80C1FE20) || (this->actionFunc == func_80C2077C) ||
(this->actionFunc == func_80C1FE80)) {
if (this->actionFunc != func_80C2077C) {
if (Player_GetMask(globalCtx) == PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.hintId = 255;
this->actor.textId = 0;
if (this->actionFunc == func_80C1FE80) {
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 12);
}
func_80C2075C(this);
}
} else if (Player_GetMask(globalCtx) != PLAYER_MASK_CAPTAIN) {
this->actor.flags &= ~(ACTOR_FLAG_1 | ACTOR_FLAG_8);
this->actor.flags |= (ACTOR_FLAG_1 | ACTOR_FLAG_4);
this->actor.hintId = 0x55;
this->actor.textId = 0;
if (this->skelAnime.animation == &object_skb_Anim_00697C) {
func_80C1FE0C(this);
} else {
func_80C1FE30(this);
}
}
}
}
void func_80C20E90(EnHintSkb* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if ((this->actor.bgCheckFlags & 0x60) && (this->actor.depthInWater >= 40.0f)) {
this->actor.colChkInfo.health = 0;
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
func_80C20484(this);
return;
}
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
if (this->actionFunc == func_80C20590) {
switch (this->actor.colChkInfo.damageEffect) {
case 1:
case 3:
case 4:
case 12:
case 13:
return;
default:
case 2:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
if (this->unk_3E2 >= 2) {
func_80C21468(this, globalCtx);
}
this->unk_3E2 = 0;
break;
}
}
if (!Actor_ApplyDamage(&this->actor)) {
if ((this->actor.colChkInfo.damageEffect != 3) && (this->actor.colChkInfo.damageEffect != 4)) {
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 40, NA_SE_EN_STALKID_DEAD);
this->unk_3E8 |= 4;
func_80C20484(this);
return;
}
}
switch (this->actor.colChkInfo.damageEffect) {
case 11:
this->unk_3E9 = 30;
this->unk_3E2 = 40;
this->unk_2D4 = 1.0f;
this->unk_2D8 = 0.0f;
Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
func_80C2011C(this);
break;
case 1:
Actor_SetColorFilter(&this->actor, 0, 120, 0, 40);
func_80C2011C(this);
break;
case 2:
this->unk_3E2 = 80;
this->unk_3E9 = 0;
this->unk_2D4 = 1.0f;
this->unk_2D8 = 0.0f;
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E8 |= 1;
func_80C20274(this);
break;
case 3:
if (this->actor.colChkInfo.health != 0) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
this->unk_3E2 = 80;
} else {
this->unk_3E2 = 3;
}
this->unk_3E9 = 11;
this->unk_2D4 = 1.0f;
this->unk_2D8 = 0.5f;
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
func_80C20540(this);
break;
case 4:
this->unk_3E2 = 40;
this->unk_3E9 = 20;
this->unk_2D4 = 1.0f;
this->unk_2D8 = 0.5f;
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 3);
func_80C2066C(this);
break;
case 12:
case 14:
this->unk_3E8 |= 1;
case 15:
if ((player->swordAnimation == 4) || (player->swordAnimation == 11) || (player->swordAnimation == 22) ||
(player->swordAnimation == 23)) {
this->unk_3E8 |= 1;
}
case 13:
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 8);
Actor_PlaySfxAtPos(&this->actor, NA_SE_EN_STALKID_DAMAGE);
Actor_ChangeAnimation(&this->skelAnime, sAnimations, 3);
func_80C20274(this);
break;
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
break;
}
}
}
void func_80C21250(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->unk_3E0 != 1) {
func_80C20E90(this, globalCtx);
if (this->actionFunc == func_80C1FF88) {
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
if ((this->actionFunc != func_80C200B8) && (this->actionFunc != func_80C20334) &&
(this->actionFunc != func_80C204F0)) {
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
}
void func_80C21320(EnHintSkb* this, GlobalContext* globalCtx) {
if (this->unk_3E2 > 0) {
this->unk_3E2--;
}
if (this->actionFunc != func_80C20590) {
if (this->unk_3E2 < 20) {
if (this->actionFunc == func_80C2069C) {
Math_SmoothStepToF(&this->unk_2D8, 0.0f, 0.5f, 0.03f, 0.0f);
} else {
Math_SmoothStepToF(&this->unk_2D8, 0.0f, 0.5f, 0.01f, 0.0f);
}
this->unk_2D4 = this->unk_3E2 * 0.05f;
} else {
Math_SmoothStepToF(&this->unk_2D8, 0.5f, 0.1f, 0.02f, 0.0f);
}
}
}
s32 func_80C21414(EnHintSkb* this) {
if (Actor_IsFacingPlayer(&this->actor, 0x11C7) && (this->actor.xzDistToPlayer < 60.0f)) {
return true;
}
return false;
}
void func_80C21468(EnHintSkb* this, GlobalContext* globalCtx) {
static Color_RGBA8 D_80C21E44 = { 170, 255, 255, 255 };
static Color_RGBA8 D_80C21E48 = { 200, 200, 255, 255 };
static Vec3f D_80C21E4C = { 0.0f, -1.0f, 0.0f };
Vec3f sp84;
s32 phi_s4;
s16 temp_s1;
s32 i;
if (this->unk_3E8 & 2) {
phi_s4 = ARRAY_COUNT(this->unk_22C) - 1;
} else {
phi_s4 = ARRAY_COUNT(this->unk_22C);
}
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 30, NA_SE_EV_ICE_BROKEN);
for (i = 0; i < phi_s4; i++) {
temp_s1 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_22C[i]);
sp84.x = Math_SinS(temp_s1) * 3.0f;
sp84.z = Math_CosS(temp_s1) * 3.0f;
sp84.y = (Rand_ZeroOne() * 4.0f) + 4.0f;
EffectSsEnIce_Spawn(globalCtx, &this->unk_22C[i], 0.6f, &sp84, &D_80C21E4C, &D_80C21E44, &D_80C21E48, 30);
}
}
void func_80C215E4(GlobalContext* globalCtx, EnHintSkb* this, Vec3f* arg2) {
Vec3f sp5C;
Vec3f sp50 = { 0.0f, 8.0f, 0.0f };
Vec3f sp44 = { 0.0f, -1.5f, 0.0f };
f32 sp40 = (Rand_ZeroOne() - 0.5f) * 6.28f;
s32 pad;
sp5C.y = this->actor.floorHeight;
sp5C.x = (sin_rad(sp40) * 15.0f) + arg2->x;
sp5C.z = (cos_rad(sp40) * 15.0f) + arg2->z;
sp44.x = randPlusMinusPoint5Scaled(1.0f);
sp44.z = randPlusMinusPoint5Scaled(1.0f);
sp50.y += (Rand_ZeroOne() - 0.5f) * 4.0f;
EffectSsHahen_Spawn(globalCtx, &sp5C, &sp50, &sp44, 0, ((Rand_ZeroOne() * 5.0f) + 12.0f) * 0.8f, -1, 10, NULL);
func_800BBFB0(globalCtx, &sp5C, 10.0f, 1, 150, 0, 1);
}
void EnHintSkb_Update(Actor* thisx, GlobalContext* globalCtx) {
EnHintSkb* this = THIS;
this->actionFunc(this, globalCtx);
if ((this->actionFunc != func_80C2016C) && (this->actionFunc != func_80C20590) &&
(this->actionFunc != func_80C2069C)) {
SkelAnime_Update(&this->skelAnime);
}
Actor_MoveWithGravity(&this->actor);
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 15.0f, 30.0f, 60.0f, 0x1D);
func_80C21250(this, globalCtx);
func_80C20D64(this, globalCtx);
func_80C21320(this, globalCtx);
}
s32 EnHintSkb_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
Actor* thisx) {
EnHintSkb* this = THIS;
f32 temp_f10;
if (limbIndex == 11) {
OPEN_DISPS(globalCtx->state.gfxCtx);
temp_f10 = fabsf(Math_SinS(globalCtx->state.frames * 6000) * 95.0f) + 160.0f;
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, (s16)temp_f10, (s16)temp_f10, (s16)temp_f10, 255);
CLOSE_DISPS(globalCtx->state.gfxCtx);
} else if (limbIndex == 10) {
Matrix_GetStateTranslation(&this->actor.focus.pos);
} else if ((limbIndex == 12) && (this->unk_3DE == 1)) {
Matrix_InsertZRotation_s(0x71C, MTXMODE_APPLY);
}
if (((limbIndex == 11) || (limbIndex == 12)) && (this->unk_3E8 & 2)) {
*dList = NULL;
}
return false;
}
void EnHintSkb_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
static Vec3f D_80C21E70 = { 800.0f, 1200.0f, 0.0f };
EnHintSkb* this = THIS;
if (!(this->unk_3E8 & 8)) {
Collider_UpdateSpheres(limbIndex, &this->collider);
if ((limbIndex == 11) && (this->unk_3E8 & 1) && !(this->unk_3E8 & 2)) {
Actor_SpawnBodyParts(&this->actor, globalCtx, 1, dList);
this->unk_3E8 |= 2;
} else if ((this->unk_3E8 & 4) && !(this->unk_3E8 & 8) && ((limbIndex != 11) || !(this->unk_3E8 & 1)) &&
(limbIndex != 12)) {
Actor_SpawnBodyParts(&this->actor, globalCtx, 1, dList);
}
if (this->unk_3E2 != 0) {
if ((limbIndex == 2) || (limbIndex == 4) || (limbIndex == 5) || (limbIndex == 6) || (limbIndex == 7) ||
(limbIndex == 8) || (limbIndex == 9) || (limbIndex == 13) || (limbIndex == 14) || (limbIndex == 15) ||
(limbIndex == 16) || (limbIndex == 17) || (limbIndex == 18)) {
Matrix_GetStateTranslation(&this->unk_22C[this->unk_2DC]);
this->unk_2DC++;
} else if ((limbIndex == 11) && !(this->unk_3E8 & 2)) {
Matrix_MultiplyVector3fByState(&D_80C21E70, &this->unk_22C[this->unk_2DC]);
this->unk_2DC++;
}
}
}
}
void EnHintSkb_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnHintSkb* this = THIS;
this->unk_2DC = 0;
func_8012C28C(globalCtx->state.gfxCtx);
SkelAnime_DrawOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, EnHintSkb_OverrideLimbDraw,
EnHintSkb_PostLimbDraw, &this->actor);
if (this->unk_3E2 > 0) {
func_800BE680(globalCtx, &this->actor, this->unk_22C, this->unk_2DC, this->unk_2D8, 0.5f, this->unk_2D4,
this->unk_3E9);
}
if (this->unk_3E8 & 4) {
this->unk_3E8 |= 8;
}
}

View File

@ -7,11 +7,29 @@ struct EnHintSkb;
typedef void (*EnHintSkbActionFunc)(struct EnHintSkb*, GlobalContext*);
#define ENHINTSKB_GET_FF(thisx) ((thisx)->params & 0xFF)
typedef struct EnHintSkb {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0xE4];
/* 0x0144 */ ColliderJntSph collider;
/* 0x0164 */ ColliderJntSphElement colliderElement[2];
/* 0x01E4 */ SkelAnime skelAnime;
/* 0x0228 */ EnHintSkbActionFunc actionFunc;
/* 0x022C */ char unk_22C[0x1C0];
/* 0x022C */ Vec3f unk_22C[14];
/* 0x02D4 */ f32 unk_2D4;
/* 0x02D8 */ f32 unk_2D8;
/* 0x02DC */ s32 unk_2DC;
/* 0x02E0 */ Vec3s jointTable[20];
/* 0x0358 */ Vec3s morphtable[20];
/* 0x03D0 */ UNK_TYPE1 unk3D0[0xC];
/* 0x03DC */ s16 unk_3DC;
/* 0x03DE */ s16 unk_3DE;
/* 0x03E0 */ s16 unk_3E0;
/* 0x03E2 */ s16 unk_3E2;
/* 0x03E4 */ s16 unk_3E4;
/* 0x03E6 */ u16 unk_3E6;
/* 0x03E8 */ u8 unk_3E8;
/* 0x03E9 */ u8 unk_3E9;
} EnHintSkb; // size = 0x3EC
extern const ActorInit En_Hint_Skb_InitVars;

View File

@ -17046,8 +17046,8 @@
0x80C21468:("func_80C21468",),
0x80C215E4:("func_80C215E4",),
0x80C21790:("EnHintSkb_Update",),
0x80C21858:("func_80C21858",),
0x80C219D4:("func_80C219D4",),
0x80C21858:("EnHintSkb_OverrideLimbDraw",),
0x80C219D4:("EnHintSkb_PostLimbDraw",),
0x80C21B9C:("EnHintSkb_Draw",),
0x80C22350:("func_80C22350",),
0x80C22400:("func_80C22400",),

View File

@ -1530,13 +1530,6 @@ D_06012A58 = 0x06012A58;
D_060023B8 = 0x060023B8;
D_060024CC = 0x060024CC;
// ovl_En_Hint_Skb
D_06002190 = 0x06002190;
D_06003584 = 0x06003584;
D_06005EF8 = 0x06005EF8;
D_0600697C = 0x0600697C;
// ovl_En_Horse
D_06008C68 = 0x06008C68;