* Dai

* Stuff

* NBS
This commit is contained in:
Maide 2021-08-04 23:41:40 +01:00 committed by GitHub
parent 51111676c4
commit ee2344bc8a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 747 additions and 43 deletions

View File

@ -2093,7 +2093,7 @@ void func_8010A33C(GlobalContext* globalCtx, s16 param_2);
// void func_8010BEBC(void);
// void func_8010BEF0(void);
// void func_8010BF24(void);
// void func_8010BF58(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
s32 func_8010BF58(Actor* actor, GlobalContext* globalCtx, s32* param_2, s32 param_3, s32 param_4);
// void Nmi_Init(void);
// void Nmi_SetPrenmiStart(void);
// s32 Nmi_GetPrenmiHasStarted(void);
@ -2688,7 +2688,7 @@ s16 func_8013A504(s16 val);
s32 func_8013A530(GlobalContext* globalCtx, Actor* actor, s32 flag, Vec3f* pos, Vec3s* rot, f32 distanceMin, f32 distanceMax, s16 angleError);
// void func_8013A7C0(void);
// void func_8013A860(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
// void func_8013AB00(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9);
Gfx* func_8013AB00(GlobalContext *globalCtx, void** skeleton, Vec3s* limbDrawTable, s32 dListCount, void* func1, void* func2, void* func3, Actor* actor, Gfx* gfx);
s32 func_8013AD6C(GlobalContext* globalCtx);
// void func_8013AD9C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
void func_8013AED4(u16* param_1, u16 param_2, u16 param_3);
@ -2706,7 +2706,7 @@ UNK_TYPE func_8013BC6C(SkelAnime* skelAnime, ActorAnimationEntryS* arg1, s32 arg
// void func_8013C068(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5);
// void func_8013C624(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_8013C8B8(void);
// void func_8013C964(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE4 param_6);
void func_8013C964(Actor* actor, GlobalContext* globalCtx, f32 arg2, f32 arg3, s32 arg4, s32 arg5);
// void func_8013CC2C(void);
// void func_8013CD64(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE1 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7);
// void func_8013CF04(void);

3
spec
View File

@ -4199,8 +4199,7 @@ beginseg
name "ovl_En_Dai"
compress
include "build/src/overlays/actors/ovl_En_Dai/z_en_dai.o"
include "build/data/ovl_En_Dai/ovl_En_Dai.data.o"
include "build/data/ovl_En_Dai/ovl_En_Dai.reloc.o"
include "build/src/overlays/actors/ovl_En_Dai/ovl_En_Dai_reloc.o"
endseg
beginseg

View File

@ -1,3 +1,9 @@
/*
* File: z_en_dai.c
* Overlay: ovl_En_Dai
* Description: Biggoron
*/
#include "z_en_dai.h"
#define FLAGS 0x02000039
@ -9,11 +15,28 @@ void EnDai_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnDai_Update(Actor* thisx, GlobalContext* globalCtx);
void EnDai_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_80B3EE8C(EnDai* this, GlobalContext* globalCtx);
void func_80B3EF90(EnDai* this, GlobalContext* globalCtx);
void func_80B3F00C(EnDai* this, GlobalContext* globalCtx);
void func_80B3EEDC(EnDai* this, GlobalContext* globalCtx);
void func_80B3EF90(EnDai* this, GlobalContext* globalCtx);
extern AnimationHeader D_060107B0;
extern AnimationHeader D_06010FB0;
extern AnimationHeader D_060117B0;
extern AnimationHeader D_06010FB0;
extern AnimationHeader D_06011FB0;
extern AnimationHeader D_060127B0;
extern AnimationHeader D_060079E4;
extern AnimationHeader D_06007354;
extern AnimationHeader D_06000CEC;
extern AnimationHeader D_060069DC;
extern AnimationHeader D_0600563C;
extern AnimationHeader D_06002E58;
extern AnimationHeader D_06006590;
extern FlexSkeletonHeader D_060130D0;
extern Gfx D_06000230[];
extern Gfx D_060002E8[];
extern Gfx D_0600C538[];
#if 0
const ActorInit En_Dai_InitVars = {
ACTOR_EN_DAI,
ACTORCAT_NPC,
@ -26,62 +49,701 @@ const ActorInit En_Dai_InitVars = {
(ActorFunc)EnDai_Draw,
};
#endif
static Vec3f D_80B3FBF0 = { 1.0f, 1.0f, 1.0f };
extern UNK_TYPE D_060002E8;
extern UNK_TYPE D_0600C538;
extern UNK_TYPE D_060130D0;
EnDaiParticle* func_80B3DFF0(EnDaiParticle* particle, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32 arg4, f32 arg5,
s32 arg6) {
s32 i;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3DFF0.s")
for (i = 0; i < 32; i++, particle++) {
if (!particle->isEnabled) {
particle->isEnabled = true;
particle->unk_01 = (Rand_ZeroOne() * (2.0f * (arg6 / 3.0f))) + (arg6 / 3.0f);
particle->unk_02 = particle->unk_01;
particle->unk_10 = arg1;
particle->unk_1C = arg2;
particle->unk_28 = arg3;
particle->unk_34 = arg4;
particle->unk_38 = arg5;
return particle;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E168.s")
return NULL;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E460.s")
void func_80B3E168(EnDaiParticle* particle, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
s32 pad;
s32 isDisplayListSet = false;
s32 i;
f32 alpha;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E5B4.s")
OPEN_DISPS(globalCtx->state.gfxCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E5DC.s")
func_8012C2DC(globalCtx->state.gfxCtx);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E69C.s")
for (i = 0; i < 32; i++, particle++) {
if (particle->isEnabled == true) {
gDPPipeSync(POLY_XLU_DISP++);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E7C8.s")
if (!isDisplayListSet) {
gSPDisplayList(POLY_XLU_DISP++, D_06000230);
isDisplayListSet = true;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E834.s")
SysMatrix_StatePush();
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E8BC.s")
alpha = (particle->unk_02 / (f32)particle->unk_01);
alpha *= 255.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3E96C.s")
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, (u8)alpha);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3EC10.s")
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, (particle->unk_02 + (i * 3)) * 3,
(particle->unk_02 + (i * 3)) * 15, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3EC84.s")
SysMatrix_InsertTranslation(particle->unk_10.x, particle->unk_10.y, particle->unk_10.z, MTXMODE_NEW);
SysMatrix_NormalizeXYZ(&globalCtx->mf_187FC);
Matrix_Scale(particle->unk_34, particle->unk_34, 1.0f, MTXMODE_APPLY);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3ED88.s")
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_060002E8);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3EE8C.s")
SysMatrix_StatePop();
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3EEDC.s")
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3EF90.s")
s32 func_80B3E460(EnDai* this) {
EnDaiParticle* particle = &this->particles[0];
s32 i;
s32 count;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F00C.s")
for (i = 0, count = 0; i < ARRAY_COUNT(this->particles); i++, particle++) {
if (particle->isEnabled && particle->unk_02) {
particle->unk_10.x += particle->unk_28.x;
particle->unk_02--;
particle->unk_10.y += particle->unk_28.y;
particle->unk_10.z += particle->unk_28.z;
particle->unk_28.x += particle->unk_1C.x;
particle->unk_28.y += particle->unk_1C.y;
particle->unk_28.z += particle->unk_1C.z;
particle->unk_34 += particle->unk_38;
count++;
} else if (particle->isEnabled) {
particle->isEnabled = false;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F044.s")
return count;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/EnDai_Init.s")
s32 func_80B3E5B4(EnDai* this, GlobalContext* globalCtx) {
func_80B3E168(this->particles, globalCtx);
return 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/EnDai_Destroy.s")
s32 func_80B3E5DC(EnDai* this, s32 arg1) {
static ActorAnimationEntryS D_80B3FBFC[] = {
{ &D_060079E4, 1.0f, 0, -1, 0, 0 }, { &D_060079E4, 1.0f, 0, -1, 0, -4 }, { &D_06007354, 1.0f, 0, -1, 2, -4 },
{ &D_06000CEC, 1.0f, 0, -1, 2, -4 }, { &D_060069DC, 1.0f, 0, -1, 2, -4 }, { &D_0600563C, 1.0f, 0, -1, 2, 0 },
{ &D_0600563C, 1.0f, 0, -1, 2, -4 }, { &D_06002E58, 1.0f, 0, -1, 0, -4 }, { &D_06006590, 1.0f, 0, -1, 2, -4 },
};
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/EnDai_Update.s")
s32 phi_v1 = false;
s32 ret = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F598.s")
switch (arg1) {
case 0:
case 1:
if ((this->unk_A70 != 0) && (this->unk_A70 != 1)) {
phi_v1 = true;
}
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F614.s")
case 5:
case 6:
if ((this->unk_A70 != 5) && (this->unk_A70 != 6)) {
phi_v1 = true;
}
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F6EC.s")
default:
if (arg1 != this->unk_A70) {
phi_v1 = true;
}
break;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F78C.s")
if (phi_v1) {
this->unk_A70 = arg1;
ret = func_8013BC6C(&this->skelAnime, D_80B3FBFC, arg1);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/func_80B3F920.s")
return ret;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dai/EnDai_Draw.s")
s32 func_80B3E69C(EnDai* this, GlobalContext* globalCtx) {
s32 ret = false;
if ((globalCtx->csCtx.state != 0) && (globalCtx->sceneNum == SCENE_12HAKUGINMAE) &&
(globalCtx->csCtx.unk_12 == 0) && !(gSaveContext.weekEventReg[30] & 1)) {
if (!(this->unk_1CE & 0x10)) {
Actor_SetSwitchFlag(globalCtx, 20);
this->unk_1CE |= (0x80 | 0x10);
this->unk_1CE &= ~(0x100 | 0x20);
this->unk_1CC = 0xFF;
this->unk_1DC = 0;
this->unk_1CD = 0;
this->unk_1F0 = D_80B3FBF0;
this->unk_1FC = D_80B3FBF0;
}
ret = true;
} else if (this->unk_1CE & 0x10) {
this->unk_1CE &= ~0x10;
this->unk_1CE |= 0x200;
gSaveContext.weekEventReg[30] |= 1;
this->actionFunc = func_80B3F00C;
}
return ret;
}
s32 func_80B3E7C8(EnDai* this, GlobalContext* globalCtx) {
s32 ret = false;
if (this->unk_1CE & 7) {
if (func_800B84D0(&this->actor, globalCtx)) {
func_8013AED4(&this->unk_1CE, 0, 7);
this->actionFunc = func_80B3EF90;
ret = true;
}
}
return ret;
}
void func_80B3E834(EnDai* this) {
s16 phi_v1;
if (this->unk_1CE & 0x80) {
if (this->unk_1D8 == 0) {
phi_v1 = 0;
} else {
this->unk_1D8--;
phi_v1 = this->unk_1D8;
}
if (phi_v1 == 0) {
this->unk_1D6++;
if (this->unk_1D6 >= 5) {
this->unk_1D8 = Rand_S16Offset(20, 20);
this->unk_1D6 = 0;
}
}
}
}
// Some kind of struct?
static s32 D_80B3FC8C[] = {
0x0100060E, 0x0C900C12, 0x10005520, 0x00110E0C, 0x910C0F0C,
0x920C0F0C, 0x930C1211, 0x5520100E, 0x0C940C12, 0x10000000,
};
s16 func_80B3E8BC(EnDai* this, s32 arg1) {
static f32 D_80B3FCB4[] = {
1.0f, 6.0f, 16.0f, 19.0f, 46.0f, 48.0f, 50.0f, 52.0f, 54.0f, 1.0f, 6.0f, 36.0f,
};
static f32 D_80B3FCE4[] = {
5.0f, 15.0f, 18.0f, 45.0f, 47.0f, 49.0f, 51.0f, 53.0f, 55.0f, 5.0f, 35.0f, 45.0f,
};
static s16 D_80B3FD14[] = {
4, 5, 2, 0, 4, 5, 2, 5, 4, 4, 5, 2,
};
s32 i;
s32 end;
if (arg1 == 3) {
end = 9;
i = 0;
} else if (arg1 == 4) {
end = 12;
i = 9;
} else {
return 2;
}
while (i < end) {
if ((D_80B3FCB4[i] <= this->skelAnime.animCurrentFrame) &&
(D_80B3FCE4[i] >= this->skelAnime.animCurrentFrame)) {
return D_80B3FD14[i];
}
i++;
}
return this->unk_1D6;
}
s32 func_80B3E96C(EnDai* this, GlobalContext* globalCtx) {
Vec3f sp74;
Vec3f sp68;
Vec3f sp5C;
Vec3f sp50;
if ((DECR(this->unk_1DA) == 0) &&
((this->unk_1DC == 0) || func_801378B8(&this->skelAnime, this->skelAnime.animFrameCount))) {
switch (this->unk_1DC) {
case 0:
func_80B3E5DC(this, 2);
this->unk_1DC++;
break;
case 1:
Audio_PlayActorSound2(&this->actor, NA_SE_EV_SNOWSTORM_HARD);
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_WEATHER_TAG, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0x1388, 0x708, 0x3E8, 0);
func_80B3E5DC(this, 3);
this->unk_1DC++;
break;
case 2:
func_80B3E5DC(this, 4);
this->unk_1DC++;
break;
case 3:
func_80B3E5DC(this, 1);
this->unk_1F0 = D_80B3FBF0;
this->unk_1FC = D_80B3FBF0;
this->unk_1DC = 0;
this->unk_1DA = Rand_S16Offset(20, 20);
break;
}
} else if (this->unk_1DC == 2) {
sp50.x = sp50.y = 0.0f;
sp50.z = 200.0f;
sp68.x = sp68.z = 0.0f;
sp68.y = 6.0f;
sp5C.x = Math_SinS(this->unk_1D4) * 80.0f;
sp5C.z = Math_CosS(this->unk_1D4) * 80.0f;
sp5C.y = -40.0f;
Lib_Vec3f_TranslateAndRotateY(&this->unk_1E4, this->unk_1D4, &sp50, &sp74);
func_80B3DFF0(this->particles, sp74, sp68, sp5C, 0.03f, 0.04f, 0x10);
}
return 0;
}
void func_80B3EC10(f32 arg0, Vec3f arg1, f32 arg2, Vec3f arg3, f32 arg4, Vec3f* arg5) {
f32 temp_f0 = (arg4 - arg0) / (arg2 - arg0);
arg5->x = ((arg3.x - arg1.x) * temp_f0) + arg1.x;
arg5->y = ((arg3.y - arg1.y) * temp_f0) + arg1.y;
arg5->z = ((arg3.z - arg1.z) * temp_f0) + arg1.z;
}
s32 func_80B3EC84(EnDai* this) {
static f32 D_80B3FD2C[] = {
6.0f, 11.0f, 15.0f, 0.0f, 12.0f, 17.0f, 0.0f, 3.0f,
};
static f32 D_80B3FD4C[] = {
8.0f, 15.0f, 24.0f, 4.0f, 17.0f, 26.0f, 3.0f, 7.0f,
};
static s16 D_80B3FD6C[] = {
1, 1, 1, 2, 2, 2, 3, 3,
};
static Vec3f D_80B3FD7C[] = {
{ 1.0f, 1.0f, 1.0f }, { 1.0f, 0.8, 0.8 }, { 1.0f, 1.1f, 1.1f }, { 1.0f, 1.3f, 1.3f }, { 1.0f, 0.7f, 0.9f },
{ 1.0f, 0.8, 0.9f }, { 1.0f, 0.7f, 0.9f }, { 1.0f, 0.8, 0.9f }, { 1.0f, 1.0f, 1.0f },
};
s32 i;
s32 ret = false;
for (i = 0; i < ARRAY_COUNT(D_80B3FD6C); i++) {
if ((this->unk_1DC == D_80B3FD6C[i]) && (D_80B3FD2C[i] < this->skelAnime.animCurrentFrame) &&
(D_80B3FD4C[i] >= this->skelAnime.animCurrentFrame)) {
func_80B3EC10(D_80B3FD2C[i], D_80B3FD7C[i], D_80B3FD4C[i], D_80B3FD7C[i + 1],
this->skelAnime.animCurrentFrame, &this->unk_1F0);
ret = true;
break;
}
}
return ret;
}
s32 func_80B3ED88(EnDai* this) {
static f32 D_80B3FDE8[] = { 22.0f, 0.0f, 0.0f };
static f32 D_80B3FDF4[] = { 29.0f, 3.0f, 9.0f };
static s16 D_80B3FE00[] = { 1, 2, 3 };
static Vec3f D_80B3FE08[] = {
1.0f, 1.0f, 1.0f, 1.0f, 1.2f, 1.2f, 1.0f, 0.7f, 0.8f, 1.0f, 1.0f, 1.0f,
};
s32 i;
s32 ret = false;
for (i = 0; i < ARRAY_COUNT(D_80B3FE00); i++) {
if ((this->unk_1DC == D_80B3FE00[i]) && (D_80B3FDE8[i] < this->skelAnime.animCurrentFrame) &&
(D_80B3FDF4[i] >= this->skelAnime.animCurrentFrame)) {
func_80B3EC10(D_80B3FDE8[i], D_80B3FE08[i], D_80B3FDF4[i], D_80B3FE08[i + 1],
this->skelAnime.animCurrentFrame, &this->unk_1FC);
ret = true;
break;
}
}
return ret;
}
void func_80B3EE8C(EnDai* this, GlobalContext* globalCtx) {
s16 cutscene = this->actor.cutscene;
if (ActorCutscene_GetCanPlayNext(cutscene)) {
ActorCutscene_StartAndSetUnkLinkFields(cutscene, &this->actor);
} else {
ActorCutscene_SetIntentToPlay(cutscene);
}
}
void func_80B3EEDC(EnDai* this, GlobalContext* globalCtx) {
Player* player = PLAYER;
if ((player->transformation == PLAYER_FORM_GORON) && (globalCtx->msgCtx.unk1202A == 3) &&
(globalCtx->msgCtx.unk1202E == 1)) {
func_80B3E5DC(this, 1);
this->actionFunc = func_80B3EE8C;
} else if (!(player->stateFlags2 & 0x08000000)) {
func_80B3E96C(this, globalCtx);
this->unk_A6C = 0;
} else if (this->unk_A6C == 0) {
play_sound(NA_SE_SY_TRE_BOX_APPEAR);
this->unk_A6C = 1;
}
}
void func_80B3EF90(EnDai* this, GlobalContext* globalCtx) {
if (func_8010BF58(&this->actor, globalCtx, D_80B3FC8C, 0, &this->unk_1D0)) {
func_8013AED4(&this->unk_1CE, 3, 7);
this->unk_1D0 = 0;
this->actionFunc = func_80B3F00C;
} else {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 4, 0x2AA8);
}
}
void func_80B3F00C(EnDai* this, GlobalContext* globalCtx) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.world.rot.y, 3, 0x2AA8);
}
void func_80B3F044(EnDai* this, GlobalContext* globalCtx) {
static s32 D_80B3FE38[] = {
0, 0, 6, 7, 8,
};
s32 sp2C = 0;
s32 sp28;
if (func_800EE29C(globalCtx, 0x1D8)) {
sp2C = func_800EE200(globalCtx, 0x1D8);
sp28 = globalCtx->csCtx.npcActions[sp2C]->unk0;
if (this->unk_1CC != (u8)sp28) {
func_80B3E5DC(this, D_80B3FE38[sp28]);
switch (sp28) {
case 1:
this->unk_1E0 = 0.0f;
break;
case 2:
Audio_PlayActorSound2(&this->actor, NA_SE_EV_ROLL_AND_FALL);
break;
case 3:
this->unk_1CE &= ~0x80;
break;
}
}
this->unk_1CC = sp28;
}
switch (this->unk_1CC) {
case 1:
this->unk_1E0 += 1.0f;
if (this->unk_1E0 < 30.0f) {
this->unk_1CD = (this->unk_1E0 / 30.0f) * 255.0f;
} else {
this->unk_1CD = 0xFF;
}
break;
case 2:
if (globalCtx->csCtx.frames == 360) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIGOLON_SLEEP3 - SFX_FLAG);
}
if (func_801378B8(&this->skelAnime, 43.0f)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_GORON_BOUND_1);
}
this->unk_1D6 = func_80B3E8BC(this, this->unk_1CC);
break;
case 3:
if (func_801378B8(&this->skelAnime, 6.0f)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIGOLON_SLEEP1);
}
this->unk_1D6 = func_80B3E8BC(this, this->unk_1CC);
break;
case 4:
if (func_801378B8(&this->skelAnime, 30.0f)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIGOLON_SLEEP2);
}
if (func_801378B8(&this->skelAnime, 35.0f)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_GORON_BOUND_0);
}
this->unk_1D6 = func_80B3E8BC(this, this->unk_1CC);
break;
}
func_800EDF24(&this->actor, globalCtx, sp2C);
}
void EnDai_Init(Actor* thisx, GlobalContext* globalCtx) {
EnDai* this = THIS;
ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 0.0f);
SkelAnime_InitSV(globalCtx, &this->skelAnime, &D_060130D0, NULL, this->jointTable, this->morphTable, 19);
this->unk_A70 = -1;
func_80B3E5DC(this, 0);
Actor_SetScale(&this->actor, 0.2f);
this->actor.targetMode = 10;
this->unk_1F0 = D_80B3FBF0;
this->unk_1FC = D_80B3FBF0;
this->unk_1CE = 0;
this->unk_1D6 = 0;
if (gSaveContext.weekEventReg[33] & 0x80) {
func_8013AED4(&this->unk_1CE, 3, 7);
this->unk_1CE |= 0x80;
this->unk_1CD = 0xFF;
this->actionFunc = func_80B3F00C;
return;
}
if (gSaveContext.weekEventReg[30] & 1) {
Actor_MarkForDeath(&this->actor);
return;
}
this->unk_1CD = 0;
this->actor.flags &= ~1;
this->unk_1CE |= (0x100 | 0x20);
this->unk_1CE |= 0x80;
this->actionFunc = func_80B3EEDC;
}
void EnDai_Destroy(Actor* thisx, GlobalContext* globalCtx) {
}
void EnDai_Update(Actor* thisx, GlobalContext* globalCtx) {
EnDai* this = THIS;
s32 pad;
Player* player = PLAYER;
if (!func_80B3E7C8(this, globalCtx) && func_80B3E69C(this, globalCtx)) {
func_80B3F044(this, globalCtx);
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
func_80B3E834(this);
func_80B3E460(this);
} else {
this->actionFunc(this, globalCtx);
if (!(player->stateFlags2 & 0x8000000)) {
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
func_80B3E834(this);
if (!(this->unk_1CE & 0x200)) {
func_8013C964(&this->actor, globalCtx, 0.0f, 0.0f, 0, this->unk_1CE & 7);
}
func_80B3E460(this);
}
}
}
s32 func_80B3F598(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx,
Gfx** gfx) {
EnDai* this = THIS;
if (!(this->unk_1CE & 0x40)) {
*dList = NULL;
}
if (limbIndex == 11) {
SysMatrix_MultiplyVector3fByState(&D_801D15B0, &this->unk_1E4);
}
if (limbIndex == 10) {
*dList = NULL;
}
return 0;
}
void func_80B3F614(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx, Gfx** gfx) {
static Vec3f D_80B3FE4C = { 0.0f, 0.0f, 0.0f };
EnDai* this = THIS;
Vec3s sp64;
MtxF sp24;
switch (limbIndex) {
case 11:
D_80B3FE4C.x = sREG(0);
D_80B3FE4C.y = sREG(1);
D_80B3FE4C.z = sREG(2);
SysMatrix_MultiplyVector3fByState(&D_80B3FE4C, &this->actor.focus.pos);
Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot);
SysMatrix_CopyCurrentState(&sp24);
func_8018219C(&sp24, &sp64, 0);
this->unk_1D4 = BINANG_SUB(sp64.y, 0x4000);
break;
case 10:
SysMatrix_CopyCurrentState(&this->unk_18C);
break;
}
}
void func_80B3F6EC(GlobalContext* globalCtx, s32 arg1, Actor* thisx, Gfx** gfx) {
EnDai* this = THIS;
switch (arg1) {
case 9:
if (this->unk_1CE & 0x100) {
func_80B3EC84(this);
}
Matrix_Scale(this->unk_1F0.x, this->unk_1F0.y, this->unk_1F0.z, MTXMODE_APPLY);
break;
case 2:
if (this->unk_1CE & 0x100) {
func_80B3ED88(this);
}
Matrix_Scale(this->unk_1FC.x, this->unk_1FC.y, this->unk_1FC.z, MTXMODE_APPLY);
break;
}
}
void func_80B3F78C(EnDai* this, GlobalContext* globalCtx) {
static AnimationHeader* D_80B3FE58[] = {
&D_060107B0, &D_06010FB0, &D_060117B0, &D_06010FB0, &D_06011FB0, &D_060127B0,
};
s32 pad;
if (globalCtx->actorCtx.unkB != 0) {
this->unk_1CE |= 0x40;
} else {
Actor_RecordUndrawnActor(globalCtx, &this->actor);
this->unk_1CE &= ~0x40;
}
func_8012C2DC(globalCtx->state.gfxCtx);
OPEN_DISPS(globalCtx->state.gfxCtx);
Scene_SetRenderModeXlu(globalCtx, 2, 2);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 255);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B3FE58[this->unk_1D6]));
POLY_XLU_DISP =
func_8013AB00(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount,
func_80B3F598, func_80B3F614, func_80B3F6EC, &this->actor, POLY_XLU_DISP);
if (this->unk_1CE & 0x40) {
SysMatrix_SetCurrentState(&this->unk_18C);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_0600C538);
}
func_80B3E5B4(this, globalCtx);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void func_80B3F920(EnDai* this, GlobalContext* globalCtx) {
static AnimationHeader* D_80B3FE70[] = {
&D_060107B0, &D_06010FB0, &D_060117B0, &D_06010FB0, &D_06011FB0, &D_060127B0,
};
s32 pad;
this->unk_1CE |= 0x40;
if (this->unk_1CD == 0xFF) {
func_8012C28C(globalCtx->state.gfxCtx);
OPEN_DISPS(globalCtx->state.gfxCtx);
Scene_SetRenderModeXlu(globalCtx, 0, 1);
gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B3FE70[this->unk_1D6]));
POLY_OPA_DISP =
func_8013AB00(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount,
func_80B3F598, func_80B3F614, func_80B3F6EC, &this->actor, POLY_OPA_DISP);
SysMatrix_SetCurrentState(&this->unk_18C);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_OPA_DISP++, D_0600C538);
CLOSE_DISPS(globalCtx->state.gfxCtx);
} else {
func_8012C2DC(globalCtx->state.gfxCtx);
OPEN_DISPS(globalCtx->state.gfxCtx);
Scene_SetRenderModeXlu(globalCtx, 2, 2);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->unk_1CD);
gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80B3FE70[this->unk_1D6]));
POLY_XLU_DISP =
func_8013AB00(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, this->skelAnime.dListCount,
func_80B3F598, func_80B3F614, func_80B3F6EC, &this->actor, POLY_XLU_DISP);
SysMatrix_SetCurrentState(&this->unk_18C);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, D_0600C538);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
func_80B3E5B4(this, globalCtx);
}
void EnDai_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnDai* this = THIS;
if (!(this->unk_1CE & 0x200)) {
if (this->unk_1CE & 0x20) {
func_80B3F78C(this, globalCtx);
} else {
func_80B3F920(this, globalCtx);
}
}
}

View File

@ -7,11 +7,41 @@ struct EnDai;
typedef void (*EnDaiActionFunc)(struct EnDai* this, GlobalContext* globalCtx);
typedef struct EnDaiParticle {
/* 0x00 */ u8 isEnabled;
/* 0x01 */ u8 unk_01;
/* 0x02 */ u8 unk_02;
/* 0x03 */ UNK_TYPE1 unk_03[0xD];
/* 0x10 */ Vec3f unk_10;
/* 0x1C */ Vec3f unk_1C;
/* 0x28 */ Vec3f unk_28;
/* 0x34 */ f32 unk_34;
/* 0x38 */ f32 unk_38;
} EnDaiParticle; // size = 0x3C
typedef struct EnDai {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x44];
/* 0x0188 */ EnDaiActionFunc actionFunc;
/* 0x018C */ char unk_18C[0x8E8];
/* 0x000 */ Actor actor;
/* 0x144 */ SkelAnime skelAnime;
/* 0x188 */ EnDaiActionFunc actionFunc;
/* 0x18C */ MtxF unk_18C;
/* 0x1CC */ u8 unk_1CC;
/* 0x1CD */ u8 unk_1CD;
/* 0x1CE */ u16 unk_1CE;
/* 0x1D0 */ s32 unk_1D0;
/* 0x1D4 */ s16 unk_1D4;
/* 0x1D6 */ s16 unk_1D6;
/* 0x1D8 */ s16 unk_1D8;
/* 0x1DA */ s16 unk_1DA;
/* 0x1DC */ s16 unk_1DC;
/* 0x1E0 */ f32 unk_1E0;
/* 0x1E4 */ Vec3f unk_1E4;
/* 0x1F0 */ Vec3f unk_1F0;
/* 0x1FC */ Vec3f unk_1FC;
/* 0x208 */ Vec3s jointTable[19];
/* 0x27A */ Vec3s morphTable[19];
/* 0x2EC */ EnDaiParticle particles[32];
/* 0xA6C */ s32 unk_A6C;
/* 0xA70 */ s32 unk_A70;
} EnDai; // size = 0xA74
extern const ActorInit En_Dai_InitVars;

View File

@ -1694,6 +1694,19 @@ D_06000230 = 0x06000230;
D_060002E8 = 0x060002E8;
D_0600C538 = 0x0600C538;
D_060130D0 = 0x060130D0;
D_060107B0 = 0x060107B0;
D_06010FB0 = 0x06010FB0;
D_060117B0 = 0x060117B0;
D_06010FB0 = 0x06010FB0;
D_06011FB0 = 0x06011FB0;
D_060127B0 = 0x060127B0;
D_060079E4 = 0x060079E4;
D_06007354 = 0x06007354;
D_06000CEC = 0x06000CEC;
D_060069DC = 0x060069DC;
D_0600563C = 0x0600563C;
D_06002E58 = 0x06002E58;
D_06006590 = 0x06006590;
// ovl_En_Daiku