En_Bombers (#684)

* En_Bombers

* No need for this >:

* Override

* PR
This commit is contained in:
Maide 2022-03-25 02:21:14 +00:00 committed by GitHub
parent 984a5061c2
commit 9a54ec9e0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 533 additions and 40 deletions

View File

@ -0,0 +1,6 @@
<Root>
<File Name="ovl_En_Bombers" BaseAddress="0x80C03530" RangeStart="0x12C8" RangeEnd="0x12E8">
<DList Name="ovl_En_Bombers_DL_12C8" Offset="0x12C8" />
<DList Name="ovl_En_Bombers_DL_12D8" Offset="0x12D8" />
</File>
</Root>

3
spec
View File

@ -5014,8 +5014,7 @@ beginseg
name "ovl_En_Bombers"
compress
include "build/src/overlays/actors/ovl_En_Bombers/z_en_bombers.o"
include "build/data/ovl_En_Bombers/ovl_En_Bombers.data.o"
include "build/data/ovl_En_Bombers/ovl_En_Bombers.reloc.o"
include "build/src/overlays/actors/ovl_En_Bombers/ovl_En_Bombers_reloc.o"
endseg
beginseg

View File

@ -43,7 +43,7 @@ typedef struct EnBomBowlMan {
/* 0x02C2 */ s16 unk_2C2;
/* 0x02C4 */ f32 unk_2C4;
/* 0x02C8 */ f32 unk_2C8;
/* 0x02CC */ UNK_TYPE1 unk2CC[4];
/* 0x02CC */ s16 unk_2CC[2];
/* 0x02D0 */ s16 unk_2D0;
/* 0x02D2 */ s16 unk_2D2;
/* 0x02D4 */ s16 unk_2D4;

View File

@ -5,6 +5,8 @@
*/
#include "z_en_bombers.h"
#include "overlays/actors/ovl_En_Bom_Bowl_Man/z_en_bom_bowl_man.h"
#include "objects/object_cs/object_cs.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8)
@ -15,12 +17,14 @@ void EnBombers_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnBombers_Update(Actor* thisx, GlobalContext* globalCtx);
void EnBombers_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80C03ACC(EnBombers* this);
void func_80C03AF4(EnBombers* this, GlobalContext* globalCtx);
void func_80C03F64(EnBombers* this);
void func_80C03FAC(EnBombers* this, GlobalContext* globalCtx);
void func_80C042F8(EnBombers* this);
void func_80C04354(EnBombers* this, GlobalContext* globalCtx);
void func_80C043C8(EnBombers* this, GlobalContext* globalCtx);
#if 0
const ActorInit En_Bombers_InitVars = {
ACTOR_EN_BOMBERS,
ACTORCAT_NPC,
@ -33,45 +37,495 @@ const ActorInit En_Bombers_InitVars = {
(ActorFunc)EnBombers_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80C04770 = {
{ COLTYPE_NONE, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_PLAYER, OC2_TYPE_2, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_NONE,
AC_NONE,
OC1_ON | OC1_TYPE_PLAYER,
OC2_TYPE_2,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_NONE,
OCELEM_ON,
},
{ 10, 30, 0, { 0, 0, 0 } },
};
#endif
AnimationHeader* D_80C0479C[] = {
&object_cs_Anim_0064B8, &object_cs_Anim_0053F4, &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 ColliderCylinderInit D_80C04770;
u8 D_80C047E0[] = {
ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP,
ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_ONCE, ANIMMODE_LOOP,
ANIMMODE_ONCE, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP, ANIMMODE_LOOP,
};
extern UNK_TYPE D_060064B8;
#include "overlays/ovl_En_Bombers/ovl_En_Bombers.c"
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/EnBombers_Init.s")
Gfx* D_80C04818[] = {
ovl_En_Bombers_DL_12C8, ovl_En_Bombers_DL_12D8, ovl_En_Bombers_DL_12D8,
ovl_En_Bombers_DL_12D8, ovl_En_Bombers_DL_12D8,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/EnBombers_Destroy.s")
TexturePtr D_80C0482C[] = {
object_cs_Tex_00C520,
object_cs_Tex_00CD20,
object_cs_Tex_00D520,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C03824.s")
TexturePtr D_80C04838[] = {
object_cs_Tex_00E620, object_cs_Tex_00EA20, object_cs_Tex_00EE20, object_cs_Tex_00DD20, object_cs_Tex_00F220,
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C038B4.s")
void EnBombers_Init(Actor* thisx, GlobalContext* globalCtx) {
EnBombers* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C039A8.s")
this->actor.colChkInfo.mass = MASS_IMMOVABLE;
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawCircle, 19.0f);
this->actor.gravity = -1.0f;
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_cs_Skel_00F82C, &object_cs_Anim_0064B8, this->jointTable,
this->morphtable, 21);
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
this->actor.targetMode = 0;
Actor_SetScale(&this->actor, 0.01f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C03ACC.s")
this->unk_2BC = ENBOMBERS_GET_F0(&this->actor);
this->unk_2BE = ENBOMBERS_GET_F(&this->actor);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C03AF4.s")
if (this->unk_2BC == ENBOMBERS_F0_0) {
if ((gSaveContext.weekEventReg[73] & 0x10) || (gSaveContext.weekEventReg[85] & 2)) {
Actor_MarkForDeath(&this->actor);
} else {
this->unk_2BE++;
func_80C03ACC(this);
}
} else if (((gSaveContext.weekEventReg[73] & 0x10) || (gSaveContext.weekEventReg[85] & 2)) &&
(((this->unk_2BE == ENBOMBERS_F_0) && (gSaveContext.weekEventReg[76] & 1)) ||
((this->unk_2BE == ENBOMBERS_F_1) && (gSaveContext.weekEventReg[76] & 2)) ||
((this->unk_2BE == ENBOMBERS_F_2) && (gSaveContext.weekEventReg[76] & 4)) ||
((this->unk_2BE == ENBOMBERS_F_3) && (gSaveContext.weekEventReg[76] & 8)) ||
((this->unk_2BE == ENBOMBERS_F_4) && (gSaveContext.weekEventReg[76] & 0x10)))) {
if (gSaveContext.weekEventReg[75] & 0x40) {
if (this->unk_2BE == ENBOMBERS_F_0) {
EnBomBowlMan* bomBowlMan = (EnBomBowlMan*)Actor_Spawn(
&globalCtx->actorCtx, globalCtx, ACTOR_EN_BOM_BOWL_MAN, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, this->actor.world.rot.y, 0, 0);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C03F64.s")
if (bomBowlMan != NULL) {
s32 cs = this->actor.cutscene;
s32 i = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C03FAC.s")
// clang-format off
while (cs != -1) { bomBowlMan->unk_2CC[i] = cs; cs = ActorCutscene_GetAdditionalCutscene(cs); i++; }
// clang-format on
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C042F8.s")
gSaveContext.weekEventReg[76] &= (u8)~1;
gSaveContext.weekEventReg[76] &= (u8)~2;
gSaveContext.weekEventReg[76] &= (u8)~4;
gSaveContext.weekEventReg[76] &= (u8)~8;
gSaveContext.weekEventReg[76] &= (u8)~0x10;
}
}
Actor_MarkForDeath(&this->actor);
} else {
func_80C042F8(this);
}
} else {
Actor_MarkForDeath(&this->actor);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C04354.s")
void EnBombers_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnBombers* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C043C8.s")
Collider_DestroyCylinder(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/EnBombers_Update.s")
void func_80C03824(EnBombers* this, s32 arg1, f32 arg2) {
this->unk_2C4 = arg1;
this->unk_2B0 = Animation_GetLastFrame(D_80C0479C[arg1]);
Animation_Change(&this->skelAnime, D_80C0479C[this->unk_2C4], arg2, 0.0f, this->unk_2B0, D_80C047E0[this->unk_2C4],
-10.0f);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Bombers/func_80C045B4.s")
void func_80C038B4(EnBombers* this) {
if ((this->unk_2C4 == 2) &&
(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_Bombers/EnBombers_Draw.s")
if ((this->unk_2C4 == 15) &&
(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);
}
}
void func_80C039A8(EnBombers* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
this->unk_2A6 = 5;
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
this->actor.textId = 0x73D;
if (gSaveContext.weekEventReg[84] & 0x80) {
this->actor.textId = 0x74B;
}
break;
case PLAYER_FORM_GORON:
this->actor.textId = 0x73E;
break;
case PLAYER_FORM_ZORA:
this->actor.textId = 0x73F;
break;
case PLAYER_FORM_DEKU:
if (gSaveContext.weekEventReg[73] & 0x20) {
this->actor.textId = 0x75A;
} else if (gSaveContext.weekEventReg[73] & 0x40) {
this->actor.textId = 0x749;
if (((this->unk_2BE == ENBOMBERS_F_1) && (gSaveContext.weekEventReg[74] & 1)) ||
((this->unk_2BE == ENBOMBERS_F_2) && (gSaveContext.weekEventReg[74] & 2)) ||
((this->unk_2BE == ENBOMBERS_F_3) && (gSaveContext.weekEventReg[74] & 4)) ||
((this->unk_2BE == ENBOMBERS_F_4) && (gSaveContext.weekEventReg[74] & 8))) {
this->actor.textId = 0x74A;
}
} else {
this->actor.textId = 0x744;
}
break;
}
}
void func_80C03ACC(EnBombers* this) {
this->collider.dim.radius = 10;
this->collider.dim.height = 30;
this->unk_2C0 = 0;
this->actionFunc = func_80C03AF4;
}
void func_80C03AF4(EnBombers* this, GlobalContext* globalCtx) {
CollisionPoly* colPoly;
f32 curFrame = this->skelAnime.curFrame;
Vec3f sp6C;
Vec3f sp60;
Vec3f sp54;
f32 x;
f32 z;
s32 sp48;
s16 abs;
switch (this->unk_2A0) {
case 0:
if (this->unk_2A8 == 0) {
Math_Vec3f_Copy(&sp60, &this->actor.home.pos);
sp60.x += randPlusMinusPoint5Scaled(150.0f);
sp60.z += randPlusMinusPoint5Scaled(150.0f);
abs = ABS_ALT(BINANG_SUB(this->actor.world.rot.y, Math_Vec3f_Yaw(&this->actor.world.pos, &sp60)));
if ((abs < 0x4000) && !BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp60, &sp6C,
&colPoly, true, false, false, true, &sp48)) {
func_80C03824(this, 2, 1.0f);
Math_Vec3f_Copy(&this->unk_294, &sp60);
this->unk_2AA = Rand_S16Offset(30, 50);
this->unk_2A0++;
}
}
break;
case 1:
if (curFrame >= 0.0f) {
this->unk_2A4 = Math_Vec3f_Yaw(&this->actor.world.pos, &this->unk_294);
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2A4, 0xA, 0x7D0, 0x14);
}
if ((s16)ABS_ALT(BINANG_SUB(this->actor.world.rot.y, this->unk_2A4)) < 0x100) {
Math_Vec3f_Copy(&sp54, &this->actor.world.pos);
sp54.x += Math_SinS(this->actor.world.rot.y) * 60.0f;
sp54.z += Math_CosS(this->actor.world.rot.y) * 60.0f;
if (BgCheck_EntityLineTest1(&globalCtx->colCtx, &this->actor.world.pos, &sp54, &sp6C, &colPoly, true,
false, false, true, &sp48)) {
this->unk_2A8 = 0;
if (Rand_ZeroOne() < 0.5f) {
func_80C03824(this, 16, 1.0f);
} else {
func_80C03824(this, 0, 1.0f);
}
this->unk_2A0 = 0;
this->unk_2B4 = 0.0f;
break;
}
}
x = this->unk_294.x - this->actor.world.pos.x;
z = this->unk_294.z - this->actor.world.pos.z;
if ((this->unk_2AA == 0) || (sqrtf(SQ(x) + SQ(z)) < 4.0f)) {
this->unk_2A8 = Rand_S16Offset(20, 20);
if (!(this->unk_2A8 & 1)) {
func_80C03824(this, 16, 1.0f);
} else {
func_80C03824(this, 0, 1.0f);
}
this->unk_2A0 = 0;
this->unk_2B4 = 0.0f;
} else if (curFrame >= 0.0f) {
Math_ApproachF(&this->actor.world.pos.x, this->unk_294.x, 0.3f, this->unk_2B4);
Math_ApproachF(&this->actor.world.pos.z, this->unk_294.z, 0.3f, this->unk_2B4);
Math_ApproachF(&this->unk_2B4, 1.0f, 0.3f, 0.5f);
}
break;
}
if (!Text_GetFaceReaction(globalCtx, 0x12)) {
func_80C039A8(this, globalCtx);
} else {
this->unk_2A6 = 5;
this->actor.textId = Text_GetFaceReaction(globalCtx, 0x12);
}
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
this->unk_2A4 = this->actor.yawTowardsPlayer;
this->collider.dim.radius = 20;
this->collider.dim.height = 60;
func_80C03F64(this);
} else {
func_800B8614(&this->actor, globalCtx, 70.0f);
}
}
void func_80C03F64(EnBombers* this) {
this->unk_2A4 = this->actor.yawTowardsPlayer;
func_80C03824(this, 1, 1.0f);
this->unk_2C0 = 1;
this->actionFunc = func_80C03FAC;
}
void func_80C03FAC(EnBombers* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
s16 sp2A;
Math_SmoothStepToS(&this->actor.world.rot.y, this->unk_2A4, 1, 0x1388, 0);
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
this->unk_28E = -0xFA0;
break;
case PLAYER_FORM_GORON:
case PLAYER_FORM_ZORA:
this->unk_28E = -0x1770;
break;
}
if ((this->unk_2A6 == Message_GetState(&globalCtx->msgCtx)) && func_80147624(globalCtx)) {
sp2A = 0;
func_801477B4(globalCtx);
this->unk_2A6 = 5;
if ((this->actor.textId == 0x73D) || (this->actor.textId == 0x73E) || (this->actor.textId == 0x73F)) {
this->actor.textId = 0x740;
this->unk_2A6 = 4;
sp2A = 1;
} else if (this->actor.textId == 0x740) {
if (globalCtx->msgCtx.choiceIndex == 0) {
func_8019F208();
this->actor.textId = 0x742;
sp2A = 1;
} else {
func_8019F230();
this->actor.textId = 0x741;
sp2A = 1;
}
} else if (this->actor.textId == 0x742) {
this->actor.textId = 0x737;
sp2A = 1;
} else if (this->actor.textId == 0x737) {
this->actor.textId = 0x743;
sp2A = 1;
} else if (this->actor.textId == 0x74B) {
this->actor.textId = 0x74C;
this->unk_2A6 = 4;
sp2A = 1;
} else if (this->actor.textId == 0x74C) {
if (globalCtx->msgCtx.choiceIndex == 1) {
func_8019F230();
this->actor.textId = 0x737;
sp2A = 1;
} else {
func_8019F208();
this->actor.textId = 0x74D;
func_80C03824(this, 14, 1.0f);
sp2A = 1;
}
} else if (this->actor.textId == 0x744) {
s32 day = gSaveContext.day - 1;
if (day == 2) {
this->actor.textId = 0x746;
sp2A = 1;
} else {
this->actor.textId = 0x745;
sp2A = 1;
}
} else if ((this->actor.textId == 0x745) || (this->actor.textId == 0x746)) {
this->actor.textId = 0x747;
sp2A = 1;
} else if (this->actor.textId == 0x747) {
this->actor.textId = 0x748;
sp2A = 1;
} else if (this->actor.textId == 0x748) {
switch (this->unk_2BE) {
case ENBOMBERS_F_1:
gSaveContext.weekEventReg[74] |= 1;
break;
case ENBOMBERS_F_2:
gSaveContext.weekEventReg[74] |= 2;
break;
case ENBOMBERS_F_3:
gSaveContext.weekEventReg[74] |= 4;
break;
case ENBOMBERS_F_4:
gSaveContext.weekEventReg[74] |= 8;
break;
}
gSaveContext.weekEventReg[73] |= 0x40;
}
switch (sp2A) {
case 0:
this->unk_28E = 0;
func_80C03ACC(this);
break;
case 1:
func_80151938(globalCtx, this->actor.textId);
break;
}
}
}
void func_80C042F8(EnBombers* this) {
if (this->unk_2C4 != 6) {
func_80C03824(this, 6, 1.0f);
}
this->actor.textId = 0x72D;
this->unk_28E = 0x1F40;
this->unk_2C0 = 2;
this->actionFunc = func_80C04354;
}
void func_80C04354(EnBombers* this, GlobalContext* globalCtx) {
Math_SmoothStepToS(&this->unk_288, this->unk_28E, 1, 0x3E8, 0);
if (Actor_ProcessTalkRequest(&this->actor, &globalCtx->state)) {
this->unk_28E = 0;
this->actionFunc = func_80C043C8;
} else {
func_800B8614(&this->actor, globalCtx, 70.0f);
}
}
void func_80C043C8(EnBombers* this, GlobalContext* globalCtx) {
Math_SmoothStepToS(&this->unk_288, this->unk_28E, 1, 0x3E8, 0);
if ((Message_GetState(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {
func_801477B4(globalCtx);
func_80C042F8(this);
}
}
void EnBombers_Update(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnBombers* this = THIS;
if (this->unk_2AA != 0) {
this->unk_2AA--;
}
if (this->unk_2A8 != 0) {
this->unk_2A8--;
}
if (this->unk_2AC != 0) {
this->unk_2AC--;
}
SkelAnime_Update(&this->skelAnime);
this->actor.shape.rot.y = this->actor.world.rot.y;
func_80C038B4(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, 0x1388, 0);
if (this->unk_2BA == 0) {
this->unk_2B8++;
if (this->unk_2B8 >= 3) {
this->unk_2B8 = 0;
this->unk_2BA = (s16)Rand_ZeroFloat(60.0f) + 20;
}
}
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D);
this->actor.uncullZoneForward = 500.0f;
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
s32 EnBombers_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
Actor* thisx) {
EnBombers* this = THIS;
if (limbIndex == OBJECT_CS_LIMB_0F) {
*dList = NULL;
}
if (limbIndex == OBJECT_CS_LIMB_11) {
rot->x += this->unk_28A;
rot->z += this->unk_288;
}
if (limbIndex == OBJECT_CS_LIMB_13) {
*dList = NULL;
}
return false;
}
void EnBombers_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnBombers* 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_80C0482C[this->unk_2B8]));
gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C04838[this->unk_2BE]));
gSPSegment(POLY_OPA_DISP++, 0x0A, Lib_SegmentedToVirtual(D_80C04818[this->unk_2BE]));
Scene_SetRenderModeXlu(globalCtx, 0, 1);
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
EnBombers_OverrideLimbDraw, NULL, &this->actor);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -7,11 +7,47 @@ struct EnBombers;
typedef void (*EnBombersActionFunc)(struct EnBombers*, GlobalContext*);
#define ENBOMBERS_GET_F(thisx) ((thisx)->params & 0xF)
#define ENBOMBERS_GET_F0(thisx) (((thisx)->params >> 4) & 0xF)
enum {
/* 0 */ ENBOMBERS_F_0,
/* 1 */ ENBOMBERS_F_1,
/* 2 */ ENBOMBERS_F_2,
/* 3 */ ENBOMBERS_F_3,
/* 4 */ ENBOMBERS_F_4,
};
#define ENBOMBERS_F0_0 0
typedef struct EnBombers {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x140];
/* 0x0144 */ SkelAnime skelAnime;
/* 0x0188 */ Vec3s jointTable[21];
/* 0x0206 */ Vec3s morphtable[21];
/* 0x0284 */ EnBombersActionFunc actionFunc;
/* 0x0288 */ char unk_288[0x8C];
/* 0x0288 */ s16 unk_288;
/* 0x028A */ s16 unk_28A;
/* 0x028C */ UNK_TYPE1 unk28C[2];
/* 0x028E */ s16 unk_28E;
/* 0x0290 */ s16 unk_290;
/* 0x0294 */ Vec3f unk_294;
/* 0x02A0 */ s16 unk_2A0;
/* 0x02A2 */ UNK_TYPE1 unk2A2[2];
/* 0x02A4 */ s16 unk_2A4;
/* 0x02A6 */ s16 unk_2A6;
/* 0x02A8 */ s16 unk_2A8;
/* 0x02AA */ s16 unk_2AA;
/* 0x02AC */ s16 unk_2AC;
/* 0x02B0 */ f32 unk_2B0;
/* 0x02B4 */ f32 unk_2B4;
/* 0x02B8 */ s16 unk_2B8;
/* 0x02BA */ s16 unk_2BA;
/* 0x02BC */ s16 unk_2BC;
/* 0x02BE */ s16 unk_2BE;
/* 0x02C0 */ s16 unk_2C0;
/* 0x02C4 */ s32 unk_2C4;
/* 0x02C8 */ ColliderCylinder collider;
} EnBombers; // size = 0x314
extern const ActorInit En_Bombers_InitVars;

View File

@ -905,12 +905,15 @@ void func_80C00284(EnBomjima* this, GlobalContext* globalCtx) {
this->unk_2BC &= 1;
}
if ((player->transformation != PLAYER_FORM_GORON) && (player->transformation != PLAYER_FORM_ZORA)) {
if (player->transformation == PLAYER_FORM_HUMAN) {
this->unk_28E = -4000;
}
} else {
this->unk_28E = -6000;
switch (player->transformation) {
case PLAYER_FORM_HUMAN:
this->unk_28E = -0xFA0;
break;
case PLAYER_FORM_GORON:
case PLAYER_FORM_ZORA:
this->unk_28E = -0x1770;
break;
}
if ((Message_GetState(&globalCtx->msgCtx) == 5) && func_80147624(globalCtx)) {

View File

@ -16530,7 +16530,7 @@
0x80C04354:("func_80C04354",),
0x80C043C8:("func_80C043C8",),
0x80C0443C:("EnBombers_Update",),
0x80C045B4:("func_80C045B4",),
0x80C045B4:("EnBombers_OverrideLimbDraw",),
0x80C04614:("EnBombers_Draw",),
0x80C04930:("EnBombers2_Init",),
0x80C04A80:("EnBombers2_Destroy",),

View File

@ -1130,11 +1130,6 @@ D_06002390 = 0x06002390;
D_06000A00 = 0x06000A00;
D_06000D78 = 0x06000D78;
// ovl_En_Bombers
D_060064B8 = 0x060064B8;
D_0600F82C = 0x0600F82C;
// ovl_En_Bombers2
D_060064B8 = 0x060064B8;