En_Bom_Bowl_Man (#616)

* En_Bom_Bowl_Man

* sAnimations

* Fixup data

* PR
This commit is contained in:
Maide 2022-02-19 20:45:21 +00:00 committed by GitHub
parent c91423abae
commit e2d546c8f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 681 additions and 39 deletions

View File

@ -0,0 +1,6 @@
<Root>
<File Name="ovl_En_Bom_Bowl_Man" BaseAddress="0x809C4790" RangeStart="0x1A50" RangeEnd="0x1A70">
<DList Name="gEnBomBowlMan_D_809C61E0" Offset="0x1A50"/>
<DList Name="gEnBomBowlMan_D_809C61F0" Offset="0x1A60"/>
</File>
</Root>

View File

@ -299,6 +299,7 @@ typedef enum {
/* 0x3C */ GI_KEY_SMALL = 0x3C, /* 0x3C */ GI_KEY_SMALL = 0x3C,
/* 0x3E */ GI_MAP = 0x3E, /* 0x3E */ GI_MAP = 0x3E,
/* 0x3F */ GI_COMPASS, /* 0x3F */ GI_COMPASS,
/* 0x50 */ GI_50 = 0x50,
/* 0x52 */ GI_SCALE_GOLD = 0x52, // Assumed, used in En_Fishing /* 0x52 */ GI_SCALE_GOLD = 0x52, // Assumed, used in En_Fishing
/* 0x59 */ GI_BOTTLE_POTION_RED = 0x59, /* 0x59 */ GI_BOTTLE_POTION_RED = 0x59,
/* 0x5B */ GI_POTION_RED = 0x5B, /* 0x5B */ GI_POTION_RED = 0x5B,

3
spec
View File

@ -2435,8 +2435,7 @@ beginseg
name "ovl_En_Bom_Bowl_Man" name "ovl_En_Bom_Bowl_Man"
compress compress
include "build/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.o" include "build/src/overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.o"
include "build/data/ovl_En_Bom_Bowl_Man/ovl_En_Bom_Bowl_Man.data.o" include "build/src/overlays/actors/ovl_En_Bom_Bowl_Man/ovl_En_Bom_Bowl_Man_reloc.o"
include "build/data/ovl_En_Bom_Bowl_Man/ovl_En_Bom_Bowl_Man.reloc.o"
endseg endseg
beginseg beginseg

View File

@ -5,8 +5,9 @@
*/ */
#include "z_en_bom_bowl_man.h" #include "z_en_bom_bowl_man.h"
#include "objects/object_cs/object_cs.h"
#define FLAGS 0x00000009 #define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
#define THIS ((EnBomBowlMan*)thisx) #define THIS ((EnBomBowlMan*)thisx)
@ -15,18 +16,27 @@ void EnBomBowlMan_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnBomBowlMan_Update(Actor* thisx, GlobalContext* globalCtx); void EnBomBowlMan_Update(Actor* thisx, GlobalContext* globalCtx);
void EnBomBowlMan_Draw(Actor* thisx, GlobalContext* globalCtx); void EnBomBowlMan_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_809C4BC4(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C4DA4(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C4DA4(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C51B4(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C51B4(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C52B4(EnBomBowlMan* this);
void func_809C5310(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5310(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C53A4(EnBomBowlMan* this);
void func_809C5408(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5408(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C5524(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C5598(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5598(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C5738(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5738(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C59A4(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C59F0(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C59F0(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C5AA4(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5AA4(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C5B1C(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5B1C(EnBomBowlMan* this, GlobalContext* globalCtx);
void func_809C5BA0(EnBomBowlMan* this);
void func_809C5BF4(EnBomBowlMan* this, GlobalContext* globalCtx); void func_809C5BF4(EnBomBowlMan* this, GlobalContext* globalCtx);
#if 0 s32 D_809C6100 = 0;
s32 D_809C6104 = 0;
const ActorInit En_Bom_Bowl_Man_InitVars = { const ActorInit En_Bom_Bowl_Man_InitVars = {
ACTOR_EN_BOM_BOWL_MAN, ACTOR_EN_BOM_BOWL_MAN,
ACTORCAT_NPC, ACTORCAT_NPC,
@ -39,56 +49,644 @@ const ActorInit En_Bom_Bowl_Man_InitVars = {
(ActorFunc)EnBomBowlMan_Draw, (ActorFunc)EnBomBowlMan_Draw,
}; };
#endif static AnimationHeader* sAnimations[] = {
&object_cs_Anim_0064B8, &object_cs_Anim_00FAF4, &object_cs_Anim_0057C8, &object_cs_Anim_0053F4,
&object_cs_Anim_002044, &object_cs_Anim_01007C, &object_cs_Anim_00349C, &object_cs_Anim_004960,
&object_cs_Anim_005128, &object_cs_Anim_004C1C, &object_cs_Anim_001A1C, &object_cs_Anim_003EE4,
&object_cs_Anim_00478C, &object_cs_Anim_00433C, &object_cs_Anim_0060E8, &object_cs_Anim_001708,
&object_cs_Anim_005DC4, &object_cs_Anim_0026B0, &object_cs_Anim_0036B0, &object_cs_Anim_0031C4,
};
extern UNK_TYPE D_060064B8; u8 D_809C6178[] = {
0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 2, 0, 0,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/EnBomBowlMan_Init.s") u16 D_809C618C[] = { 0x710, 0x711, 0x715, 0x716, 0x717, 0x718 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/EnBomBowlMan_Destroy.s") u16 D_809C6198[] = { 0x74F, 0x750, 0x751, 0x752 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C493C.s") Vec3f D_809C61A0[] = {
{ -730.0f, 200.0f, -2350.0f }, { -690.0f, 200.0f, -2350.0f }, { -650.0f, 200.0f, -2350.0f },
{ -610.0f, 200.0f, -2350.0f }, { -570.0f, 200.0f, -2350.0f },
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C49CC.s") void EnBomBowlMan_Init(Actor* thisx, GlobalContext* globalCtx) {
EnBomBowlMan* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C4B50.s") this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
this->actor.gravity = -3.0f;
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_cs_Skel_00F82C, &object_cs_Anim_0064B8, this->jointTable,
this->morphTable, 21);
this->unk_2F6 = ENBOMBOWLMAN_GET_F0(&this->actor);
this->unk_2F4 = ENBOMBOWLMAN_GET_F(&this->actor);
this->actor.targetMode = 6;
Actor_SetScale(&this->actor, 0.01f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C4B6C.s") if (this->unk_2F6 == ENBOMBOWLMAN_F0_0) {
if (this->unk_2F4 == 0) {
func_809C4BC4(this, globalCtx);
} else {
this->unk_2F4--;
func_809C5BA0(this);
}
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C4BC4.s") this->unk_29A = ENBOMBOWLMAN_GET_FF00(&this->actor);
this->path = func_8013D648(globalCtx, this->unk_29A, 0x3F);
this->unk_2C8 = 80.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C4DA4.s") if ((gSaveContext.entranceIndex == 0xD220) && (gSaveContext.weekEventReg[73] & 0x80) &&
!CHECK_QUEST_ITEM(ITEM_BOTTLE)) {
this->unk_2D6 = this->actor.cutscene;
if (this->unk_2D6 == 0) {
Actor_MarkForDeath(&this->actor);
}
func_809C52B4(this);
} else {
Actor_MarkForDeath(&this->actor);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C51B4.s") void EnBomBowlMan_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C52B4.s") void func_809C493C(EnBomBowlMan* this, s32 arg1, f32 arg2) {
this->unk_2F8 = arg1;
this->unk_2C4 = Animation_GetLastFrame(sAnimations[arg1]);
Animation_Change(&this->skelAnime, sAnimations[this->unk_2F8], arg2, 0.0f, this->unk_2C4, D_809C6178[this->unk_2F8],
-4.0f);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5310.s") void func_809C49CC(EnBomBowlMan* this) {
if ((this->unk_2F8 == 5) &&
(Animation_OnFrame(&this->skelAnime, 9.0f) || Animation_OnFrame(&this->skelAnime, 10.0f) ||
Animation_OnFrame(&this->skelAnime, 17.0f) || Animation_OnFrame(&this->skelAnime, 18.0f))) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C53A4.s") if ((this->unk_2F8 == 0xB) &&
(Animation_OnFrame(&this->skelAnime, 4.0f) || Animation_OnFrame(&this->skelAnime, 8.0f) ||
Animation_OnFrame(&this->skelAnime, 12.0f))) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5408.s") if ((this->unk_2F8 == 0x12) &&
(Animation_OnFrame(&this->skelAnime, 0.0f) || Animation_OnFrame(&this->skelAnime, 2.0f) ||
Animation_OnFrame(&this->skelAnime, 4.0f) || Animation_OnFrame(&this->skelAnime, 6.0f))) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_WALK);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5524.s") if ((this->unk_2F8 == 0xF) && Animation_OnFrame(&this->skelAnime, 15.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5598.s") if ((this->unk_2F8 == 6) && Animation_OnFrame(&this->skelAnime, 8.0f)) {
Actor_PlaySfxAtPos(&this->actor, NA_SE_EV_BOMBERS_LAND);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5738.s") void func_809C4B50(EnBomBowlMan* this) {
this->unk_2B8 = 0;
this->unk_2BC = 0;
this->unk_2BA = 0;
this->unk_29E = 0;
this->unk_290 = 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C59A4.s") void func_809C4B6C(EnBomBowlMan* this) {
if ((this->unk_29A != ENBOMBOWLMAN_FF00_MINUS1) && (this->path != NULL)) {
if (!func_8013D68C(this->path, this->unk_298, &this->unk_2A0)) {
Actor_MarkForDeath(&this->actor);
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C59F0.s") void func_809C4BC4(EnBomBowlMan* this, GlobalContext* globalCtx) {
s32 pad;
s32 i;
Vec3f sp7C;
EnBomBowlMan* bomBowlMan;
s8 code;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5AA4.s") func_809C4B50(this);
func_809C493C(this, 0, 1.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5B1C.s") for (i = 0; i < ARRAY_COUNT(gSaveContext.bomberCode); i++) {
Math_Vec3f_Copy(&sp7C, &this->actor.home.pos);
code = gSaveContext.bomberCode[i];
if (code == 1) {
Math_Vec3f_Copy(&this->actor.world.pos, &D_809C61A0[i]);
this->unk_2D8[code] = this;
} else {
Math_Vec3f_Copy(&sp7C, &D_809C61A0[i]);
bomBowlMan =
(EnBomBowlMan*)Actor_SpawnAsChild(&globalCtx->actorCtx, &this->actor, globalCtx, ACTOR_EN_BOM_BOWL_MAN,
sp7C.x, sp7C.y, sp7C.z, 0, this->actor.world.rot.y, 0, code);
if (bomBowlMan != NULL) {
if (i == 2) {
this->unk_2D8[0] = bomBowlMan;
}
this->unk_2D8[code] = bomBowlMan;
}
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5BA0.s") if (ActorCutscene_GetCurrentIndex() == 0x7C) {
ActorCutscene_Stop(0x7C);
ActorCutscene_SetIntentToPlay(this->unk_2D0);
} else if (!ActorCutscene_GetCanPlayNext(this->unk_2D0)) {
ActorCutscene_SetIntentToPlay(this->unk_2D0);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5BF4.s") func_809C493C(this, 3, 1.0f);
this->unk_2D4 = this->actor.yawTowardsPlayer;
this->unk_290 = this->actor.yawTowardsPlayer;
gSaveContext.weekEventReg[73] &= (u8)~0x10;
gSaveContext.weekEventReg[85] &= (u8)~2;
this->unk_29C = 0;
this->actionFunc = func_809C4DA4;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/EnBomBowlMan_Update.s") void func_809C4DA4(EnBomBowlMan* this, GlobalContext* globalCtx) {
Math_SmoothStepToS(&this->unk_290, this->unk_2D4, 1, 5000, 0);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/func_809C5F44.s") if (this->unk_2B8 == 0) {
Player* player = GET_PLAYER(globalCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bom_Bowl_Man/EnBomBowlMan_Draw.s") if (ActorCutscene_GetCurrentIndex() == 0x7C) {
ActorCutscene_Stop(0x7C);
ActorCutscene_SetIntentToPlay(this->unk_2D0);
return;
}
if (!ActorCutscene_GetCanPlayNext(this->unk_2D0)) {
ActorCutscene_SetIntentToPlay(this->unk_2D0);
return;
}
ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D0, &this->actor);
this->unk_2B8 = 1;
this->unk_2C0 = 0;
this->unk_2D4 = this->actor.yawTowardsPlayer;
this->unk_290 = this->actor.yawTowardsPlayer;
if (player->transformation == PLAYER_FORM_HUMAN) {
func_801518B0(globalCtx, D_809C618C[0], &this->actor);
} else {
func_801518B0(globalCtx, D_809C6198[0], &this->actor);
}
}
if ((this->unk_2BC == 0) && (Message_GetState(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
Player* player = GET_PLAYER(globalCtx);
s32 pad;
s32 sp28 = false;
func_801477B4(globalCtx);
switch (this->unk_2C0) {
case 0:
this->unk_2C0 = 1;
D_809C6104 = 1;
func_800E0308(Play_GetCamera(globalCtx, ActorCutscene_GetCurrentCamera(this->unk_2D0)),
&this->unk_2D8[0]->actor);
this->unk_2D4 = 0;
this->unk_2BC = 10;
func_809C493C(this, 17, 1.0f);
break;
case 1:
D_809C6104 = 0;
func_809C493C(this, 3, 1.0f);
this->unk_2D4 = this->actor.yawTowardsPlayer;
this->unk_2C0 = 2;
if ((player->transformation == PLAYER_FORM_HUMAN) && CHECK_QUEST_ITEM(ITEM_BOTTLE)) {
this->unk_2C0 = 4;
}
break;
case 2:
if (player->transformation == PLAYER_FORM_HUMAN) {
this->unk_2B8 = 2;
ActorCutscene_Stop(this->unk_2D0);
func_809C59A4(this, globalCtx);
sp28 = true;
} else {
this->unk_2C0 = 3;
globalCtx->msgCtx.unk11F10 = 0;
func_809C493C(this, 1, 1.0f);
D_809C6100 = 1;
if (ActorCutscene_GetCurrentIndex() == 0x7C) {
ActorCutscene_Stop(0x7C);
ActorCutscene_SetIntentToPlay(this->unk_2D2);
} else if (!ActorCutscene_GetCanPlayNext(this->unk_2D2)) {
ActorCutscene_SetIntentToPlay(this->unk_2D2);
}
ActorCutscene_Stop(this->unk_2D0);
this->actionFunc = func_809C5B1C;
sp28 = true;
}
break;
case 3:
if (player->transformation == PLAYER_FORM_HUMAN) {
this->unk_2C0 = 4;
} else {
this->actionFunc = func_809C51B4;
return;
}
break;
case 4:
if (this->unk_2B8 != 2) {
ActorCutscene_Stop(this->unk_2D0);
}
globalCtx->msgCtx.unk11F10 = 0;
func_809C493C(this, 1, 1.0f);
D_809C6100 = 1;
this->actionFunc = func_809C5B1C;
sp28 = true;
break;
case 5:
func_80151BB4(globalCtx, 0x24);
func_80151BB4(globalCtx, 0x25);
func_80151BB4(globalCtx, 0);
this->actionFunc = func_809C51B4;
sp28 = true;
break;
}
if (!sp28) {
if (player->transformation == PLAYER_FORM_HUMAN) {
func_80151938(globalCtx, D_809C618C[this->unk_2C0]);
} else {
func_80151938(globalCtx, D_809C6198[this->unk_2C0]);
}
}
}
}
void func_809C51B4(EnBomBowlMan* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if ((globalCtx->msgCtx.unk120B1 == 0) &&
((globalCtx->msgCtx.msgMode == 0) || (Message_GetState(&globalCtx->msgCtx) == 6))) {
globalCtx->nextEntranceIndex = Entrance_CreateIndexFromSpawn(6);
gSaveContext.nextCutsceneIndex = 0;
globalCtx->sceneLoadFlag = 0x14;
globalCtx->unk_1887F = 0x56;
gSaveContext.nextTransition = 3;
gSaveContext.weekEventReg[75] &= (u8)~0x40;
if (player->transformation == PLAYER_FORM_HUMAN) {
gSaveContext.weekEventReg[84] |= 0x80;
gSaveContext.weekEventReg[77] &= (u8)~2;
} else {
gSaveContext.weekEventReg[73] |= 0x20;
gSaveContext.weekEventReg[85] &= (u8)~1;
}
}
}
void func_809C52B4(EnBomBowlMan* this) {
this->actor.draw = NULL;
this->actor.flags |= ACTOR_FLAG_10;
this->actor.flags |= ACTOR_FLAG_8000000;
this->actor.flags &= ~ACTOR_FLAG_1;
this->actor.world.pos.x = 1340.0f;
this->actor.world.pos.z = -1795.0f;
this->unk_29C = 3;
this->actionFunc = func_809C5310;
}
void func_809C5310(EnBomBowlMan* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
if (player->actor.world.pos.x < 1510.0f) {
if (player->transformation != PLAYER_FORM_DEKU) {
if (this->actor.xzDistToPlayer < this->unk_2C8) {
func_800B7298(globalCtx, &this->actor, 7);
func_809C53A4(this);
}
} else {
Actor_MarkForDeath(&this->actor);
}
}
}
void func_809C53A4(EnBomBowlMan* this) {
this->actor.draw = EnBomBowlMan_Draw;
this->actor.world.pos.x = 1360.0f;
this->actor.world.pos.z = -1870.0f;
func_809C493C(this, 18, 1.0f);
this->unk_29C = 3;
this->actionFunc = func_809C5408;
}
void func_809C5408(EnBomBowlMan* this, GlobalContext* globalCtx) {
s32 pad[2];
Player* player = GET_PLAYER(globalCtx);
Math_SmoothStepToS(&this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &player->actor.world.pos), 1,
0x1388, 0);
Math_SmoothStepToS(&player->actor.shape.rot.y, Math_Vec3f_Yaw(&player->actor.world.pos, &this->actor.world.pos), 1,
0x1388, 0);
player->actor.world.rot.y = player->actor.shape.rot.y;
Math_ApproachF(&this->actor.world.pos.x, 1350.0f, 0.3f, 2.0f);
Math_ApproachF(&this->actor.world.pos.z, -1800.0f, 0.3f, 2.0f);
if (sqrtf(SQ(this->actor.world.pos.x - 1350.0f) + SQ(this->actor.world.pos.z + 1800.0f)) < 4.0f) {
func_809C5524(this, globalCtx);
}
}
void func_809C5524(EnBomBowlMan* this, GlobalContext* globalCtx) {
this->actor.textId = 0x730;
if (!(gSaveContext.weekEventReg[85] & 2)) {
this->actor.textId = 0x72F;
}
func_809C493C(this, 3, 1.0f);
func_801518B0(globalCtx, this->actor.textId, &this->actor);
this->actionFunc = func_809C5598;
}
void func_809C5598(EnBomBowlMan* this, GlobalContext* globalCtx) {
if ((Message_GetState(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
func_801477B4(globalCtx);
if ((this->actor.textId == 0x72F) || (this->actor.textId == 0x730)) {
this->actor.textId = 0x731;
} else if (this->actor.textId == 0x731) {
this->actor.textId = 0x732;
} else if (this->actor.textId == 0x732) {
this->actor.textId = 0x733;
} else if (this->actor.textId == 0x733) {
this->actor.textId = 0x734;
} else if (this->actor.textId == 0x734) {
this->actor.textId = 0x715;
} else if (this->actor.textId == 0x715) {
func_800B7298(globalCtx, &this->actor, 6);
func_809C493C(this, 17, 1.0f);
func_809C59A4(this, globalCtx);
return;
} else if (this->actor.textId == 0x716) {
this->actor.textId = 0x735;
} else if (this->actor.textId == 0x735) {
this->unk_2C2 = 0;
func_809C493C(this, 17, 1.0f);
func_80151BB4(globalCtx, 0x24);
func_80151BB4(globalCtx, 0x25);
func_80151BB4(globalCtx, 0);
func_800B7298(globalCtx, &this->actor, 7);
this->actionFunc = func_809C5738;
return;
}
func_80151938(globalCtx, this->actor.textId);
}
}
void func_809C5738(EnBomBowlMan* this, GlobalContext* globalCtx) {
s32 pad[3];
s16 yaw = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_2A0);
if (this->unk_2C2 == 0) {
if ((globalCtx->msgCtx.unk120B1 == 0) &&
((globalCtx->msgCtx.msgMode == 0) || (Message_GetState(&globalCtx->msgCtx) == 6))) {
this->unk_2C2 = 1;
func_809C4B6C(this);
if (ActorCutscene_GetCurrentIndex() == 0x7C) {
ActorCutscene_Stop(0x7C);
ActorCutscene_SetIntentToPlay(this->unk_2D6);
} else if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
ActorCutscene_SetIntentToPlay(this->unk_2D6);
} else {
ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->actor);
this->unk_2C2 = 2;
func_809C493C(this, 18, 1.0f);
}
}
} else if (this->unk_2C2 == 1) {
if (ActorCutscene_GetCurrentIndex() == 0x7C) {
ActorCutscene_Stop(0x7C);
ActorCutscene_SetIntentToPlay(this->unk_2D6);
} else if (!ActorCutscene_GetCanPlayNext(this->unk_2D6)) {
ActorCutscene_SetIntentToPlay(this->unk_2D6);
} else {
ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D6, &this->actor);
this->unk_2C2 = 2;
func_809C493C(this, 18, 1.0f);
}
} else {
Math_SmoothStepToS(&this->actor.world.rot.y, yaw, 1, 2000, 10);
Math_ApproachF(&this->actor.world.pos.x, this->unk_2A0.x, 0.5f, 6.0f);
Math_ApproachF(&this->actor.world.pos.z, this->unk_2A0.z, 0.5f, 6.0f);
if ((sqrtf(SQ(this->actor.world.pos.x - this->unk_2A0.x) + SQ(this->actor.world.pos.z - this->unk_2A0.z)) <
4.0f) &&
(this->path != NULL)) {
this->unk_298++;
if (this->unk_298 >= this->path->count) {
gSaveContext.weekEventReg[84] |= 0x80;
gSaveContext.weekEventReg[83] &= (u8)~4;
ActorCutscene_Stop(this->unk_2D6);
Actor_MarkForDeath(&this->actor);
} else {
func_809C4B6C(this);
}
}
}
}
void func_809C59A4(EnBomBowlMan* this, GlobalContext* globalCtx) {
Actor_PickUp(&this->actor, globalCtx, GI_50, 300.0f, 300.0f);
this->unk_29C = 1;
this->actionFunc = func_809C59F0;
}
void func_809C59F0(EnBomBowlMan* this, GlobalContext* globalCtx) {
if (Actor_HasParent(&this->actor, globalCtx)) {
this->actor.parent = NULL;
if (this->unk_2F6 == ENBOMBOWLMAN_F0_0) {
this->unk_2C0 = 3;
this->actor.textId = D_809C618C[this->unk_2C0];
} else {
this->actor.textId = 0x716;
}
func_800B8500(&this->actor, globalCtx, 400.0f, 400.0f, -1);
this->actionFunc = func_809C5AA4;
} else {
Actor_PickUp(&this->actor, globalCtx, GI_50, 300.0f, 300.0f);
}
}
void func_809C5AA4(EnBomBowlMan* this, GlobalContext* globalCtx) {
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
if (this->unk_2F6 == ENBOMBOWLMAN_F0_0) {
this->actionFunc = func_809C4DA4;
} else {
this->actionFunc = func_809C5598;
}
} else {
func_800B8500(&this->actor, globalCtx, 400.0f, 400.0f, -1);
}
}
void func_809C5B1C(EnBomBowlMan* this, GlobalContext* globalCtx) {
if (ActorCutscene_GetCurrentIndex() == 0x7C) {
ActorCutscene_Stop(0x7C);
ActorCutscene_SetIntentToPlay(this->unk_2D2);
} else if (!ActorCutscene_GetCanPlayNext(this->unk_2D2)) {
ActorCutscene_SetIntentToPlay(this->unk_2D2);
} else {
ActorCutscene_StartAndSetUnkLinkFields(this->unk_2D2, &this->actor);
func_809C5BA0(this);
}
}
void func_809C5BA0(EnBomBowlMan* this) {
if (this->unk_2F4 != 0) {
func_809C493C(this, 0, 1.0f);
} else {
this->unk_2F8 = 0;
}
this->unk_29C = 2;
this->actionFunc = func_809C5BF4;
}
void func_809C5BF4(EnBomBowlMan* this, GlobalContext* globalCtx) {
f32 sp2C = this->skelAnime.curFrame;
s32 sp28;
if ((D_809C6104 != 0) && (this->unk_2F8 != 15)) {
func_809C493C(this, 15, 1.0f);
}
if ((this->unk_2F8 == 15) && (this->unk_2C4 <= sp2C)) {
func_809C493C(this, 0, 1.0f);
}
if (D_809C6100 != 0) {
if ((this->unk_2F8 == 0) && (D_809C6100 == (this->unk_2F4 + 1))) {
func_809C493C(this, 11, 1.0f);
}
if ((this->unk_2F8 == 11) && (this->unk_2C4 <= sp2C)) {
func_809C493C(this, 12, 1.0f);
D_809C6100++;
}
if (this->unk_2F4 == 0) {
sp28 = Play_GetCamera(globalCtx, ActorCutscene_GetCurrentCamera(this->unk_2D2));
if (D_809C6100 > 5) {
Player* player = GET_PLAYER(globalCtx);
func_801477B4(globalCtx);
func_800E0308(sp28, &this->unk_2D8[0]->actor);
func_809C493C(this, 13, 1.0f);
D_809C6100 = 0;
if (player->transformation == PLAYER_FORM_HUMAN) {
this->unk_2C0 = 5;
func_801518B0(globalCtx, D_809C618C[this->unk_2C0], &this->actor);
} else {
this->unk_2C0 = 3;
func_801518B0(globalCtx, D_809C6198[this->unk_2C0], &this->actor);
}
this->unk_29C = 0;
this->actionFunc = func_809C4DA4;
} else {
s32 idx = D_809C6100 - 1;
func_800E0308(sp28, &this->unk_2D8[1 + idx]->actor);
}
}
}
}
void EnBomBowlMan_Update(Actor* thisx, GlobalContext* globalCtx) {
EnBomBowlMan* this = THIS;
if (this->unk_2BA != 0) {
this->unk_2BA--;
}
if (this->unk_2BC != 0) {
this->unk_2BC--;
}
SkelAnime_Update(&this->skelAnime);
this->actor.shape.rot.y = this->actor.world.rot.y;
func_809C49CC(this);
Actor_SetFocus(&this->actor, 20.0f);
this->actionFunc(this, globalCtx);
Actor_MoveWithGravity(&this->actor);
Math_SmoothStepToS(&this->unk_28A, this->unk_290, 1, 0x1388, 0);
Math_SmoothStepToS(&this->unk_288, this->unk_28E, 1, 0x3E8, 0);
if (this->unk_2F2 == 0) {
this->unk_2F0++;
if (this->unk_2F0 >= 3) {
this->unk_2F0 = 0;
this->unk_2F2 = (s32)Rand_ZeroFloat(60.0f) + 20;
}
}
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
}
s32 EnBomBowlMan_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
Actor* thisx) {
EnBomBowlMan* this = THIS;
if (limbIndex == 15) {
*dList = NULL;
}
if (limbIndex == 17) {
rot->x += this->unk_28A;
}
if ((limbIndex == 19) && (this->unk_2F6 == ENBOMBOWLMAN_F0_2)) {
*dList = NULL;
}
if ((limbIndex == 20) && (this->unk_2F6 == ENBOMBOWLMAN_F0_0)) {
*dList = NULL;
}
return false;
}
#include "overlays/ovl_En_Bom_Bowl_Man/ovl_En_Bom_Bowl_Man.c"
TexturePtr D_809C6200[] = {
gEnBomBowlMan_D_809C61E0, gEnBomBowlMan_D_809C61F0, gEnBomBowlMan_D_809C61F0,
gEnBomBowlMan_D_809C61F0, gEnBomBowlMan_D_809C61F0,
};
TexturePtr D_809C6214[] = {
object_cs_Tex_00C520,
object_cs_Tex_00CD20,
object_cs_Tex_00D520,
};
TexturePtr D_809C6220[] = {
object_cs_Tex_00E620, object_cs_Tex_00EA20, object_cs_Tex_00EE20, object_cs_Tex_00DD20, object_cs_Tex_00F220,
};
void EnBomBowlMan_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnBomBowlMan* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
func_8012C2DC(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_809C6214[this->unk_2F0]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_809C6220[this->unk_2F4]));
gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(D_809C6200[this->unk_2F4]));
Scene_SetRenderModeXlu(globalCtx, 0, 1);
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnBomBowlMan_OverrideLimbDraw, NULL, &this->actor);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -7,11 +7,54 @@ struct EnBomBowlMan;
typedef void (*EnBomBowlManActionFunc)(struct EnBomBowlMan*, GlobalContext*); typedef void (*EnBomBowlManActionFunc)(struct EnBomBowlMan*, GlobalContext*);
#define ENBOMBOWLMAN_GET_F(thisx) ((thisx)->params & 0xF)
#define ENBOMBOWLMAN_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
#define ENBOMBOWLMAN_GET_FF00(thisx) (((thisx)->params >> 8) & 0xFF)
#define ENBOMBOWLMAN_F0_0 0
#define ENBOMBOWLMAN_F0_2 2
#define ENBOMBOWLMAN_FF00_MINUS1 -1
typedef struct EnBomBowlMan { typedef struct EnBomBowlMan {
/* 0x0000 */ Actor actor; /* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x140]; /* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ Vec3s jointTable[21];
/* 0x0206 */ Vec3s morphTable[21];
/* 0x0284 */ EnBomBowlManActionFunc actionFunc; /* 0x0284 */ EnBomBowlManActionFunc actionFunc;
/* 0x0288 */ char unk_288[0x74]; /* 0x0288 */ s16 unk_288;
/* 0x028A */ s16 unk_28A;
/* 0x028C */ UNK_TYPE1 unk28C[2];
/* 0x028E */ s16 unk_28E;
/* 0x0290 */ s16 unk_290;
/* 0x0292 */ UNK_TYPE1 unk292[2];
/* 0x0294 */ Path* path;
/* 0x0298 */ s16 unk_298;
/* 0x029A */ s16 unk_29A;
/* 0x029C */ s16 unk_29C;
/* 0x029E */ s16 unk_29E;
/* 0x02A0 */ Vec3f unk_2A0;
/* 0x02AC */ UNK_TYPE1 unk2AC[0xC];
/* 0x02B8 */ s16 unk_2B8;
/* 0x02BA */ s16 unk_2BA;
/* 0x02BC */ s16 unk_2BC;
/* 0x02BE */ UNK_TYPE1 unk2BE[2];
/* 0x02C0 */ s16 unk_2C0;
/* 0x02C2 */ s16 unk_2C2;
/* 0x02C4 */ f32 unk_2C4;
/* 0x02C8 */ f32 unk_2C8;
/* 0x02CC */ UNK_TYPE1 unk2CC[4];
/* 0x02D0 */ s16 unk_2D0;
/* 0x02D2 */ s16 unk_2D2;
/* 0x02D4 */ s16 unk_2D4;
/* 0x02D6 */ s16 unk_2D6;
/* 0x02D8 */ struct EnBomBowlMan* unk_2D8[5];
/* 0x02EC */ UNK_TYPE1 unk2EC[0x4];
/* 0x02F0 */ s16 unk_2F0;
/* 0x02F2 */ s16 unk_2F2;
/* 0x02F4 */ s16 unk_2F4;
/* 0x02F6 */ s16 unk_2F6;
/* 0x02F8 */ s32 unk_2F8;
} EnBomBowlMan; // size = 0x2FC } EnBomBowlMan; // size = 0x2FC
extern const ActorInit En_Bom_Bowl_Man_InitVars; extern const ActorInit En_Bom_Bowl_Man_InitVars;

View File

@ -9078,7 +9078,7 @@
0x809C5BA0:("func_809C5BA0",), 0x809C5BA0:("func_809C5BA0",),
0x809C5BF4:("func_809C5BF4",), 0x809C5BF4:("func_809C5BF4",),
0x809C5E14:("EnBomBowlMan_Update",), 0x809C5E14:("EnBomBowlMan_Update",),
0x809C5F44:("func_809C5F44",), 0x809C5F44:("EnBomBowlMan_OverrideLimbDraw",),
0x809C5FC4:("EnBomBowlMan_Draw",), 0x809C5FC4:("EnBomBowlMan_Draw",),
0x809C64C0:("func_809C64C0",), 0x809C64C0:("func_809C64C0",),
0x809C6578:("EnSyatekiMan_Init",), 0x809C6578:("EnSyatekiMan_Init",),

View File

@ -1210,11 +1210,6 @@ D_06000530 = 0x06000530;
D_060064B8 = 0x060064B8; D_060064B8 = 0x060064B8;
D_0600F82C = 0x0600F82C; D_0600F82C = 0x0600F82C;
// ovl_En_Bom_Bowl_Man
D_060064B8 = 0x060064B8;
D_0600F82C = 0x0600F82C;
// ovl_En_Box // ovl_En_Box
D_0600043C = 0x0600043C; D_0600043C = 0x0600043C;