En_Wiz_Fire (#406)

* En_Wiz_Fire

* Remove padding

* PR

* PR

* Object

* Undef

* PR
This commit is contained in:
Maide 2022-01-04 03:51:11 +00:00 committed by GitHub
parent 0b45e0f87a
commit 934c562471
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 870 additions and 47 deletions

View File

@ -3,7 +3,7 @@
<Animation Name="object_wiz_Anim_0007B0" Offset="0x7B0" />
<Texture Name="object_wiz_Tex_0007C0" OutName="tex_0007C0" Format="i4" Width="32" Height="64" Offset="0x7C0" />
<Texture Name="object_wiz_Tex_000BC0" OutName="tex_000BC0" Format="i4" Width="32" Height="32" Offset="0xBC0" />
<!-- <Blob Name="object_wiz_Blob_000DC0" Size="0x80" Offset="0xDC0" /> -->
<Texture Name="object_wiz_Tex_000DC0" OutName="tex_000DC0" Format="i4" Width="16" Height="16" Offset="0xDC0" />
<DList Name="object_wiz_DL_000E70" Offset="0xE70" />
<DList Name="object_wiz_DL_000F28" Offset="0xF28" />
<DList Name="object_wiz_DL_000FD8" Offset="0xFD8" />

View File

@ -2160,7 +2160,7 @@ void func_80123F2C(GlobalContext* globalCtx, s32 arg1);
// void func_80124020(void);
u8 Player_GetMask(GlobalContext* globalCtx);
void Player_RemoveMask(GlobalContext* globalCtx);
// void func_8012405C(void);
s32 func_8012405C(GlobalContext* globalCtx);
// void func_80124088(void);
s32 func_801240C8(Player* player);
// void func_801240DC(void);

3
spec
View File

@ -2933,8 +2933,7 @@ beginseg
name "ovl_En_Wiz_Fire"
compress
include "build/src/overlays/actors/ovl_En_Wiz_Fire/z_en_wiz_fire.o"
include "build/data/ovl_En_Wiz_Fire/ovl_En_Wiz_Fire.data.o"
include "build/data/ovl_En_Wiz_Fire/ovl_En_Wiz_Fire.reloc.o"
include "build/src/overlays/actors/ovl_En_Wiz_Fire/ovl_En_Wiz_Fire_reloc.o"
endseg
beginseg

View File

@ -11,9 +11,13 @@ typedef struct EnWiz {
/* 0x0000 */ Actor actor;
/* 0x0144 */ char unk_144[0x268];
/* 0x03AC */ EnWizActionFunc actionFunc;
/* 0x03B0 */ char unk_3B0[0x98];
/* 0x03B0 */ char unk_3B0[0xA];
/* 0x03BA */ s16 unk_3BA;
/* 0x03BC */ char unk_3BC[0x8C];
/* 0x0448 */ s32 unk_448;
/* 0x044C */ char unk_44C[0x934];
/* 0x044C */ char unk_44C[0x2FE];
/* 0x074A */ s16 unk_74A;
/* 0x074C */ char unk_74C[0x634];
} EnWiz; // size = 0xD80
extern const ActorInit En_Wiz_InitVars;

View File

@ -5,6 +5,8 @@
*/
#include "z_en_wiz_fire.h"
#include "overlays/actors/ovl_En_Wiz/z_en_wiz.h"
#include "objects/object_wiz/object_wiz.h"
#define FLAGS 0x08000015
@ -21,8 +23,13 @@ void func_80A49F38(EnWizFire* this, GlobalContext* globalCtx);
void func_80A49FD8(EnWizFire* this, GlobalContext* globalCtx);
void func_80A4A11C(EnWizFire* this, GlobalContext* globalCtx);
void func_80A4A608(EnWizFire* this, GlobalContext* globalCtx);
void func_80A4BAB4(Actor* thisx, GlobalContext* globalCtx);
void func_80A4BC74(EnWizFire* this, Vec3f* arg1, Vec3f* arg2);
void func_80A4BDDC(EnWizFire* this, GlobalContext* globalCtx);
void func_80A4BF78(EnWizFire* this, GlobalContext* globalCtx);
static s32 D_80A4C1C0 = 0;
#if 0
const ActorInit En_Wiz_Fire_InitVars = {
ACTOR_EN_WIZ_FIRE,
ACTORCAT_ENEMY,
@ -35,51 +42,838 @@ const ActorInit En_Wiz_Fire_InitVars = {
(ActorFunc)EnWizFire_Draw,
};
// static ColliderCylinderInit sCylinderInit = {
static ColliderCylinderInit D_80A4C1E4 = {
{ COLTYPE_NONE, AT_ON | AT_TYPE_ENEMY, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_TYPE_1, COLSHAPE_CYLINDER, },
{ ELEMTYPE_UNK0, { 0xF7CFFFFF, 0x09, 0x10 }, { 0x01001202, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, },
static ColliderCylinderInit sCylinderInit = {
{
COLTYPE_NONE,
AT_ON | AT_TYPE_ENEMY,
AC_ON | AC_TYPE_PLAYER,
OC1_NONE,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK0,
{ 0xF7CFFFFF, 0x09, 0x10 },
{ 0x01001202, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_NORMAL,
BUMP_ON,
OCELEM_NONE,
},
{ 0, 0, 0, { 0, 0, 0 } },
};
#endif
void EnWizFire_Init(Actor* thisx, GlobalContext* globalCtx) {
EnWizFire* this = THIS;
extern ColliderCylinderInit D_80A4C1E4;
Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
this->unk_162 = this->actor.params;
this->actor.targetMode = 3;
this->unk_172 = 10;
this->unk_1FC = 255.0f;
this->actor.flags &= ~1;
extern UNK_TYPE D_06000FD8;
extern UNK_TYPE D_06002630;
extern UNK_TYPE D_06002B40;
extern UNK_TYPE D_06003120;
extern UNK_TYPE D_06005190;
if (!func_8012405C(globalCtx)) {
this->collider.info.toucher.dmgFlags = 0x20000000;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/EnWizFire_Init.s")
switch (this->unk_162) {
case 4:
this->unk_166 = 1;
this->collider.info.toucher.damage = 8;
this->collider.info.toucher.effect = 2;
this->collider.info.bumper.dmgFlags = (0x1000000 | 0x800 | 0x200 | 0x2);
this->unk_162 = 0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/EnWizFire_Destroy.s")
case 0:
if (this->unk_162 == 4) {
this->unk_162 = 0;
this->collider.info.toucher.damage = 8;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4984C.s")
case 1:
case 3:
this->actionFunc = func_80A4984C;
break;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A49A44.s")
case 2:
this->actor.draw = func_80A4BAB4;
this->unk_170 = Rand_S16Offset(0, 10000);
this->unk_160 = 1;
this->collider.info.toucher.damage = 2;
this->actionFunc = func_80A49F38;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A49F38.s")
void EnWizFire_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnWizFire* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A49FD8.s")
if (this->unk_162 == 0) {
globalCtx->envCtx.unk_8C.fogColor[2] = 0;
globalCtx->envCtx.unk_8C.fogColor[1] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.fogColor[0] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.diffuseColor2[2] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.diffuseColor2[1] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.diffuseColor2[0] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.diffuseColor1[2] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.diffuseColor1[1] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.diffuseColor1[0] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.ambientColor[2] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.ambientColor[1] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.ambientColor[0] = globalCtx->envCtx.unk_8C.fogColor[2];
globalCtx->envCtx.unk_8C.fogNear = globalCtx->envCtx.unk_8C.fogColor[2];
}
Collider_DestroyCylinder(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4A11C.s")
void func_80A4984C(EnWizFire* this, GlobalContext* globalCtx) {
Vec3f sp44 = { 0.0f, 0.0f, 0.0f };
s32 i;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4A608.s")
for (i = 0; i < ARRAY_COUNT(this->unk_178); i++) {
this->unk_178[i] = this->actor.world.pos;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/EnWizFire_Update.s")
this->unk_16E = 0;
Matrix_StatePush();
Matrix_RotateY(this->actor.world.rot.y, MTXMODE_NEW);
Matrix_InsertXRotation_s(this->actor.world.rot.x, MTXMODE_APPLY);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4B0C8.s")
if (this->unk_162 != 0) {
sp44.z = randPlusMinusPoint5Scaled(2.0f) + 8.0f;
} else {
sp44.z = 12.0f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4B33C.s")
Matrix_MultiplyVector3fByState(&sp44, &this->actor.velocity);
Matrix_StatePop();
this->actor.world.rot.x = this->actor.world.rot.y = this->actor.world.rot.z = 0;
this->unk_168 = 50;
if (this->unk_162 != 0) {
this->actor.velocity.y = 10.0f;
this->actor.gravity = -1.0f;
this->unk_150 = 0.01f;
} else {
this->unk_150 = 0.02f;
this->unk_168 = 100;
}
this->unk_160 = 0;
this->actionFunc = func_80A49A44;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/EnWizFire_Draw.s")
void func_80A49A44(EnWizFire* this, GlobalContext* globalCtx) {
Vec3f sp54 = { 0.0f, 0.0f, 0.0f };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4BAB4.s")
this->actor.world.rot.z += 5000;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4BC74.s")
if (this->unk_162 != 0) {
this->unk_150 = 0.01f;
} else {
this->unk_150 = 0.02f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4BDDC.s")
if ((this->unk_168 == 0) && (this->unk_14C < 0.001f)) {
Math_Vec3f_Copy(&this->actor.velocity, &gZeroVec3f);
this->unk_160 = 3;
this->unk_16A = 0;
this->actionFunc = func_80A4A608;
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Wiz_Fire/func_80A4BF78.s")
if (this->unk_168 == 0) {
this->unk_150 = 0.0f;
}
Math_ApproachF(&this->unk_14C, this->unk_150, 0.2f, 0.01f);
if (this->unk_172 == 0) {
if ((this->actor.bgCheckFlags & 8) && (this->unk_162 == 0) && (this->unk_168 != 0) &&
(this->actor.bgCheckFlags & 8)) {
D_80A4C1C0 = 0;
this->unk_168 = 0;
this->unk_150 = 0.0f;
}
}
if ((this->actor.bgCheckFlags & 1) && (this->unk_16A == 0)) {
s32 i;
s16 phi_s0;
s32 temp;
if (this->unk_162 == 1) {
this->unk_16A = 10;
Matrix_StatePush();
Matrix_RotateY((s16)randPlusMinusPoint5Scaled(0x100) + this->actor.world.rot.y, MTXMODE_NEW);
sp54.z = randPlusMinusPoint5Scaled(2.0f) + 8.0f;
Matrix_MultiplyVector3fByState(&sp54, &this->actor.velocity);
Matrix_StatePop();
this->actor.velocity.y = 6.0f;
this->actor.gravity = -0.7f;
if (this->unk_164 == 0) {
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_WIZ_FIRE, this->actor.world.pos.x,
this->actor.world.pos.y - 10.0f, this->actor.world.pos.z, 0, 0, 0, 2);
this->unk_164 = 1;
}
this->unk_168 = 0;
this->unk_14C = 0.0f;
Math_Vec3f_Copy(&this->actor.velocity, &gZeroVec3f);
this->unk_160 = 3;
this->unk_16A = 0;
this->actionFunc = func_80A4A608;
return;
}
if ((this->unk_162 == 0) && (this->unk_168 != 0)) {
if (this->actor.floorBgId == BGCHECK_SCENE) {
this->unk_16A = 100;
if (this->unk_166 == 0) {
phi_s0 = 0;
for (i = 0; i < 5; i++) {
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_WIZ_FIRE, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, phi_s0, 0, 1);
phi_s0 += BINANG_ADD((s32)randPlusMinusPoint5Scaled(0x1000), 0x3333);
}
Audio_PlayActorSound2(&this->actor, NA_SE_IT_BOMB_EXPLOSION);
this->unk_16A = Rand_S16Offset(70, 30);
if (this->unk_16A != 0) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_WIZ_EXP - SFX_FLAG);
}
} else if (this->unk_16A != 0) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
}
Math_Vec3f_Copy(&this->actor.velocity, &gZeroVec3f);
this->unk_168 = 0;
this->unk_160 = 2;
this->unk_14C = 0.0f;
this->actionFunc = func_80A4A11C;
}
return;
}
}
if ((this->unk_162 != 3) && (this->unk_168 != 0)) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
if (this->collider.info.acHitInfo->toucher.dmgFlags == 0x1000) {
this->unk_168 = 0;
this->unk_148 = 1;
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 50, NA_SE_EV_ICE_MELT);
}
}
if (func_8012405C(globalCtx) && (this->collider.base.atFlags & AT_BOUNCED)) {
Audio_PlayActorSound2(&this->actor, NA_SE_IT_SHIELD_REFLECT_MG);
this->collider.base.atFlags &= ~(AT_TYPE_ENEMY | AT_BOUNCED | AT_HIT);
this->collider.base.atFlags |= AT_TYPE_PLAYER;
this->collider.info.toucher.dmgFlags = 0x20;
this->collider.info.toucher.damage = 2;
this->unk_168 = 100;
this->unk_162 = 3;
this->actor.velocity.x *= -1.0f;
this->actor.velocity.y *= -0.5f;
this->actor.velocity.z *= -1.0f;
if ((this->actor.parent != NULL) && (this->actor.parent->id == ACTOR_EN_WIZ) &&
(this->actor.parent->update != NULL)) {
((EnWiz*)this->actor.parent)->unk_3BA = 0;
}
}
}
}
void func_80A49F38(EnWizFire* this, GlobalContext* globalCtx) {
this->unk_150 = 0.02f;
this->unk_168 = Rand_S16Offset(50, 50);
this->unk_154 = randPlusMinusPoint5Scaled(1.0f) * 0.007f;
this->unk_158 = randPlusMinusPoint5Scaled(1.0f) * 0.005f;
this->unk_15C = randPlusMinusPoint5Scaled(1.0f) * 0.007f;
this->actionFunc = func_80A49FD8;
}
void func_80A49FD8(EnWizFire* this, GlobalContext* globalCtx) {
if (this->unk_168 > 10) {
Math_ApproachF(&this->unk_14C, this->unk_150, 0.3f, 0.01f);
} else {
Math_ApproachF(&this->unk_14C, 2.0f * this->unk_150, 0.2f, 0.002f);
Math_ApproachZeroF(&this->unk_1FC, 1.0f, 35.0f);
if ((this->unk_168 == 0) && (this->unk_1FC < 2.0f)) {
Actor_MarkForDeath(&this->actor);
}
return;
}
if (this->collider.base.acFlags & AC_HIT) {
if (this->unk_168 != 0) {
this->collider.base.acFlags &= ~AC_HIT;
if (this->unk_168 > 10) {
this->unk_168 -= 10;
}
if (this->collider.info.acHitInfo->toucher.dmgFlags == 0x1000) {
this->unk_168 = 0;
this->unk_148 = 1;
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 50, NA_SE_EV_ICE_MELT);
}
}
}
if (this->unk_168 != 0) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_BURN_OUT - SFX_FLAG);
}
}
void func_80A4A11C(EnWizFire* this, GlobalContext* globalCtx) {
s32 pad;
if ((this->actor.parent != NULL) && (this->actor.parent->id == ACTOR_EN_WIZ) &&
(this->actor.parent->update != NULL) && (this->actor.parent->colChkInfo.health == 0)) {
this->unk_16A = 0;
this->unk_174 = 1;
}
this->unk_16E++;
if (this->unk_16E > 10) {
this->unk_16E = 10;
}
if (this->unk_16A != 0) {
Math_ApproachF(&this->unk_200, 60.0f, 0.5f, 10.0f);
if (this->unk_166 == 1) {
Vec3f sp40 = { 0.0f, 0.0f, 0.0f };
Vec3f sp34;
sp40.x = randPlusMinusPoint5Scaled(3.0f) / 10.0f;
sp40.y = 0.23f;
sp40.z = randPlusMinusPoint5Scaled(3.0f) / 10.0f;
Math_Vec3f_Copy(&sp34, &this->actor.world.pos);
sp34.x += randPlusMinusPoint5Scaled(150.0f);
sp34.z += randPlusMinusPoint5Scaled(150.0f);
Math_ApproachF(&this->unk_1F0, 0.022f, 0.3f, 0.01f);
this->collider.dim.radius = this->unk_1F0 * 4300.0f;
this->collider.dim.height = 30;
this->collider.dim.yShift = 15;
func_80A4BC74(this, &sp34, &sp40);
Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
return;
}
Math_ApproachF(&this->unk_1F0, 0.02f, 0.3f, 0.002f);
Math_ApproachF(&this->unk_1F8, 0.02f, 0.3f, 0.002f);
Math_ApproachF(&this->unk_1F4, 0.02f, 0.3f, 0.2f);
this->collider.dim.radius = this->unk_1F0 * 4000.0f;
this->collider.dim.height = this->unk_1F4 * 1850.0f;
this->collider.dim.yShift = -15;
if (this->collider.dim.height < 2) {
this->collider.dim.height = 2;
}
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
if ((D_80A4C1C0 == 0) && (this->collider.info.acHitInfo->toucher.dmgFlags == 0x1000)) {
D_80A4C1C0 = 1;
this->unk_148 = 1;
this->unk_16A = 0;
Audio_PlaySoundAtPosition(globalCtx, &this->actor.world.pos, 50, NA_SE_EV_ICE_MELT);
}
}
this->actor.world.pos.y = this->actor.floorHeight + 10.0f;
Actor_SetHeight(&this->actor, 0.0f);
return;
}
Math_ApproachZeroF(&this->unk_200, 0.2f, 3.0f);
if (this->unk_166 == 1) {
Math_ApproachZeroF(&this->unk_1F0, 0.046f, 0.001f);
Audio_PlayActorSound2(&this->actor, NA_SE_EV_ICE_FREEZE - SFX_FLAG);
if (this->unk_164 == 0) {
if ((this->actor.parent != NULL) && (this->actor.parent->id == ACTOR_EN_WIZ) && (this->unk_1F0 < 0.05f)) {
EnWiz* wiz = (EnWiz*)this->actor.parent;
this->collider.dim.yShift = -15;
this->unk_164 = 1;
wiz->unk_3BA = 0;
}
}
if ((this->unk_164 != 0) && (this->unk_1F0 < 0.05f)) {
Math_ApproachZeroF(&this->unk_1FC, 1.0f, 5.0f);
}
if ((this->unk_1F0 < 0.001f) && (this->unk_204 < 0.001f)) {
D_80A4C1C0 = 0;
Actor_MarkForDeath(&this->actor);
}
return;
}
Math_ApproachZeroF(&this->unk_1F4, 0.1f, 0.01f);
if (this->unk_1F4 < 0.01f) {
Math_ApproachZeroF(&this->unk_1FC, 1.0f, 10.0f);
if ((this->unk_1FC < 10.0f) && (this->unk_204 < 0.001f)) {
D_80A4C1C0 = 0;
if ((this->actor.parent != NULL) && (this->unk_162 == 0) && (this->actor.parent->id == ACTOR_EN_WIZ) &&
(this->actor.parent->update != NULL)) {
EnWiz* wiz = (EnWiz*)this->actor.parent;
wiz->unk_3BA = 0;
}
Actor_MarkForDeath(&this->actor);
}
}
}
void func_80A4A608(EnWizFire* this, GlobalContext* globalCtx) {
if (this->unk_16A == 0) {
this->unk_16A = 2;
this->unk_16E++;
if (this->unk_16E >= 6) {
if ((this->actor.parent != NULL) && (this->unk_162 == 0) && (this->actor.parent->id == ACTOR_EN_WIZ)) {
EnWiz* wiz = (EnWiz*)this->actor.parent;
D_80A4C1C0 = 0;
if (wiz->actor.update != NULL) {
wiz->unk_3BA = 0;
}
}
Actor_MarkForDeath(&this->actor);
}
}
}
void EnWizFire_Update(Actor* thisx, GlobalContext* globalCtx2) {
static Color_RGB8 D_80A4C234[] = {
{ 100, 40, 40 }, { 180, 0x78, 80 }, { 155, 80, 80 }, { 125, 20, 0 },
{ 0, 0, 0 }, { 200, 250, 250 }, { 100, 250, 250 }, { 225, 255, 235 },
};
static Color_RGBA8 D_80A4C24C = { 250, 250, 250, 255 };
static Color_RGBA8 D_80A4C250 = { 180, 180, 180, 255 };
GlobalContext* globalCtx = globalCtx2;
EnWizFire* this = THIS;
Player* player = GET_PLAYER(globalCtx);
s32 j;
s16 temp_s0;
s16 idx;
Actor_SetScale(&this->actor, this->unk_14C);
func_80A4BDDC(this, globalCtx);
this->unk_204 = this->unk_200 / 60.0f;
if (this->unk_162 == 0) {
Actor* wiz = this->actor.parent;
if ((wiz != NULL) && (wiz->id == ACTOR_EN_WIZ) && (wiz->update != NULL) && (((EnWiz*)wiz)->unk_74A != 2)) {
f32 phi_f0;
idx = this->unk_166 * 4;
phi_f0 = 970.0f;
if (this->unk_166 == 0) {
phi_f0 = 968.0f;
}
globalCtx->envCtx.unk_8C.fogNear = (phi_f0 - (s16)globalCtx->envCtx.unk_C4.fogNear) * this->unk_204;
globalCtx->envCtx.unk_8C.ambientColor[0] =
((f32)D_80A4C234[idx].r - globalCtx->envCtx.unk_C4.ambientColor[0]) * this->unk_204;
globalCtx->envCtx.unk_8C.ambientColor[1] =
((f32)D_80A4C234[idx].g - globalCtx->envCtx.unk_C4.ambientColor[1]) * this->unk_204;
globalCtx->envCtx.unk_8C.ambientColor[2] =
((f32)D_80A4C234[idx].b - globalCtx->envCtx.unk_C4.ambientColor[2]) * this->unk_204;
idx++;
globalCtx->envCtx.unk_8C.diffuseColor1[0] =
((f32)D_80A4C234[idx].r - globalCtx->envCtx.unk_C4.diffuseColor1[0]) * this->unk_204;
globalCtx->envCtx.unk_8C.diffuseColor1[1] =
((f32)D_80A4C234[idx].g - globalCtx->envCtx.unk_C4.diffuseColor1[1]) * this->unk_204;
globalCtx->envCtx.unk_8C.diffuseColor1[2] =
((f32)D_80A4C234[idx].b - globalCtx->envCtx.unk_C4.diffuseColor1[2]) * this->unk_204;
idx++;
globalCtx->envCtx.unk_8C.diffuseColor2[0] =
((f32)D_80A4C234[idx].r - globalCtx->envCtx.unk_C4.diffuseColor[0]) * this->unk_204;
globalCtx->envCtx.unk_8C.diffuseColor2[1] =
((f32)D_80A4C234[idx].g - globalCtx->envCtx.unk_C4.diffuseColor[1]) * this->unk_204;
globalCtx->envCtx.unk_8C.diffuseColor2[2] =
((f32)D_80A4C234[idx].b - globalCtx->envCtx.unk_C4.diffuseColor[2]) * this->unk_204;
idx++;
globalCtx->envCtx.unk_8C.fogColor[0] =
((f32)D_80A4C234[idx].r - globalCtx->envCtx.unk_C4.fogColor[0]) * this->unk_204;
globalCtx->envCtx.unk_8C.fogColor[1] =
((f32)D_80A4C234[idx].g - globalCtx->envCtx.unk_C4.fogColor[1]) * this->unk_204;
globalCtx->envCtx.unk_8C.fogColor[2] =
((f32)D_80A4C234[idx].b - globalCtx->envCtx.unk_C4.fogColor[2]) * this->unk_204;
}
}
this->unk_170++;
this->actionFunc(this, globalCtx);
this->actor.shape.yOffset = 10.0f;
Actor_ApplyMovement(&this->actor);
this->unk_178[0] = this->actor.world.pos;
for (j = 8; j >= 0; j--) {
this->unk_178[j + 1] = this->unk_178[j];
}
this->actor.velocity.y += this->actor.gravity;
if (this->unk_172 != 0) {
this->unk_172--;
}
if (this->unk_168 != 0) {
this->unk_168--;
}
if (this->unk_16C != 0) {
this->unk_16C--;
}
if (this->unk_16A != 0) {
this->unk_16A--;
}
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 5.0f, 10, 0x1D);
if (((this->unk_148 != 0) || (D_80A4C1C0 != 0)) && (this->unk_16C == 0)) {
Vec3f sp70;
Vec3f sp64;
Vec3f sp58;
f32 sp54;
s32 i;
sp70.x = 0.0f;
sp70.y = 1.0f;
sp70.z = 0.0f;
sp64.x = 0.0f;
sp64.y = 1.0f;
sp64.z = 0.0f;
sp54 = Rand_S16Offset(20, 10);
if (this->unk_162 == 0) {
sp54 = Rand_S16Offset(40, 20);
}
this->unk_16C = Rand_S16Offset(2, 2);
for (i = 0; i < 2; i++) {
temp_s0 = Rand_S16Offset(20, 20);
sp58.x = ((f32)((Rand_ZeroOne() < 0.5f) ? -1 : 1) * temp_s0) + this->actor.world.pos.x;
sp58.y = (Rand_ZeroOne() * 20.0f) + this->actor.floorHeight;
temp_s0 = Rand_S16Offset(20, 20);
sp58.z = ((f32)((Rand_ZeroOne() < .5f) ? -1 : 1) * temp_s0) + this->actor.world.pos.z;
func_800B0DE0(globalCtx, &sp58, &sp64, &sp70, &D_80A4C24C, &D_80A4C250, Rand_S16Offset(350, 100), sp54);
}
}
if (this->unk_160 < 2) {
this->collider.dim.radius = (this->unk_14C * 15.0f) + 25.0f;
this->collider.dim.height = (this->unk_14C * 15.0f) + 25.0f;
this->collider.dim.yShift = (this->unk_14C * -0.75f) - 5.0f;
}
if (this->unk_162 == 2) {
this->collider.dim.radius = 10;
this->collider.dim.height = this->unk_14C * 5000.0f;
this->collider.dim.yShift = 0;
}
if (this->collider.base.atFlags & AT_HIT) {
this->collider.base.atFlags &= ~AT_HIT;
if (this->unk_162 == 0) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_WIZ_LAUGH2);
if (player->invincibilityTimer > 0) {
player->invincibilityTimer += 40;
if (this->unk_166 != 0) {
player->invincibilityTimer += 50;
this->unk_174 = 1;
}
}
}
}
if ((player->stateFlags2 & 0x4000) && (player->unk_AE8 < 90)) {
player->unk_AE8 = 90;
}
if ((this->unk_148 == 0) && (D_80A4C1C0 == 0) && ((this->unk_162 != 0) || (this->unk_1FC > 200.0f))) {
Collider_UpdateCylinder(&this->actor, &this->collider);
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
if (player->invincibilityTimer == 0) {
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
}
}
void func_80A4B0C8(EnWizFire* this, GlobalContext* globalCtx) {
s32 pad;
OPEN_DISPS(globalCtx->state.gfxCtx);
if ((this->unk_162 == 0) && (this->unk_160 == 2)) {
func_8012C28C(globalCtx->state.gfxCtx);
func_8012C2DC(globalCtx->state.gfxCtx);
Matrix_InsertTranslation(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z,
MTXMODE_NEW);
Matrix_Scale(this->unk_1F0, this->unk_1F0, this->unk_1F0, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (s8)this->unk_1FC);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 40, 30, 80);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_005190);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 215, 215, 215, (s8)this->unk_1FC);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 128);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, -globalCtx->state.frames & 0x7F,
-globalCtx->state.frames & 0x7F, 0x20, 0x40, 1, globalCtx->state.frames & 0xFF,
globalCtx->state.frames & 0xFF, 0x10, 0x10));
Matrix_RotateY(0, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_005750);
}
func_80A4BF78(this, globalCtx);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void func_80A4B33C(EnWizFire* this, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
OPEN_DISPS(globalCtx->state.gfxCtx);
if ((this->unk_162 == 0) && (this->unk_160 == 2)) {
func_8012C28C(globalCtx->state.gfxCtx);
func_8012C2DC(globalCtx->state.gfxCtx);
Matrix_StatePush();
Matrix_InsertTranslation(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z,
MTXMODE_NEW);
Matrix_Scale(this->unk_1F0, this->unk_1F0, this->unk_1F0, MTXMODE_APPLY);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, -globalCtx->state.frames % 128, 0, 0x20, 0x20, 1,
(globalCtx->state.frames * 2) % 128, 0, 0x20, 0x20));
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 100, 40, 0, (s8)this->unk_1FC);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 245, 255, 128);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_003120);
Matrix_StatePop();
Matrix_StatePush();
Matrix_InsertTranslation(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z,
MTXMODE_NEW);
Matrix_NormalizeXYZ(&globalCtx->billboardMtxF);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, globalCtx->state.frames % 128,
(-globalCtx->state.frames * 6) % 256, 0x20, 0x40, 1,
(globalCtx->state.frames * 2) % 128, (-globalCtx->state.frames * 6) % 256, 0x20,
0x40));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 80, 0, 0, (s8)this->unk_1FC);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, 100);
Matrix_Scale(this->unk_1F8, this->unk_1F8, this->unk_1F8, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_003640);
Matrix_StatePop();
Matrix_InsertTranslation(this->actor.world.pos.x, this->actor.floorHeight, this->actor.world.pos.z, 0);
Matrix_NormalizeXYZ(&globalCtx->billboardMtxF);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, (-globalCtx->state.frames * 3) % 128, 0, 0x20, 0x20, 1,
0, (-globalCtx->state.frames * 10) % 256, 0x20, 0x40));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 100, 50, 0, 255);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 235, 240, 128);
Matrix_Scale(this->unk_1F4, this->unk_1F4, this->unk_1F4, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_003FC0);
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void EnWizFire_Draw(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnWizFire* this = THIS;
s32 i;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
func_8012C2DC(globalCtx->state.gfxCtx);
Matrix_StatePush();
for (i = 9; i >= this->unk_16E; i--) {
f32 temp_f20 = this->actor.scale.x - (i * -0.0019f);
if (temp_f20 > 0.0f) {
if (this->unk_166 == 0) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255 - (i * 25), 0, 255 - (i * 25));
gDPSetEnvColor(POLY_XLU_DISP++, 255 - (i * 25), 0, 0, 0);
} else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255 - (i * 7), 255 - (i * 3), 255 - (i * 3), 255 - (i * 25));
gDPSetEnvColor(POLY_XLU_DISP++, 220, 255, 235, 0);
}
Matrix_InsertTranslation(this->unk_178[i].x, this->unk_178[i].y + this->actor.shape.yOffset,
this->unk_178[i].z, MTXMODE_NEW);
Matrix_Scale(temp_f20, temp_f20, temp_f20, MTXMODE_APPLY);
Matrix_NormalizeXYZ(&globalCtx->billboardMtxF);
Matrix_InsertZRotation_s(this->actor.world.rot.z, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_002B40);
}
}
Matrix_StatePop();
CLOSE_DISPS(globalCtx->state.gfxCtx);
if (this->unk_166 == 0) {
func_80A4B33C(this, globalCtx);
} else {
func_80A4B0C8(this, globalCtx);
}
}
void func_80A4BAB4(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnWizFire* this = THIS;
OPEN_DISPS(globalCtx->state.gfxCtx);
Matrix_InsertTranslation(this->actor.world.pos.x, this->actor.floorHeight + 20.0f, this->actor.world.pos.z,
MTXMODE_NEW);
Matrix_Scale(this->unk_14C + this->unk_154, this->unk_14C + this->unk_158, this->unk_14C + this->unk_15C,
MTXMODE_APPLY);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, 0, 0x20, 0x20, 1, this->unk_170 & 0x7F,
(-this->unk_170 * 10) & 0x7F, 0x20, 0x20));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 100, 50, 0, (s8)this->unk_1FC);
gDPSetEnvColor(POLY_XLU_DISP++, 200, 235, 245, 255);
Matrix_InsertMatrix(&globalCtx->billboardMtxF, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_002630);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
void func_80A4BC74(EnWizFire* this, Vec3f* arg1, Vec3f* arg2) {
s16 i;
EnWizFireStruct* ptr = this->unk_254;
for (i = 0; i < ARRAY_COUNT(this->unk_254); i++, ptr++) {
if (ptr->unk_00 == 0) {
ptr->unk_00 = 1;
Math_Vec3f_Copy(&ptr->unk_1C, &gZeroVec3f);
ptr->unk_01 = Rand_ZeroFloat(100.0f);
ptr->unk_10 = *arg1;
ptr->unk_28 = *arg2;
ptr->unk_0C = (Rand_ZeroFloat(5.0f) + 20.0f) * 0.001f;
ptr->unk_08 = 0;
ptr->unk_06 = 0;
break;
}
}
}
void func_80A4BDDC(EnWizFire* this, GlobalContext* globalCtx) {
s32 i;
EnWizFireStruct* ptr = &this->unk_254[0];
for (i = 0; i < ARRAY_COUNT(this->unk_254); i++, ptr++) {
if (ptr->unk_00 != 0) {
ptr->unk_01++;
ptr->unk_10.x += ptr->unk_1C.x;
ptr->unk_10.y += ptr->unk_1C.y;
ptr->unk_10.z += ptr->unk_1C.z;
ptr->unk_1C.x += ptr->unk_28.x;
ptr->unk_1C.y += ptr->unk_28.y;
ptr->unk_1C.z += ptr->unk_28.z;
if (ptr->unk_08 == 0) {
ptr->unk_06 += 10;
if (ptr->unk_06 >= 100) {
ptr->unk_08 = 1;
}
} else {
ptr->unk_06 -= 8;
if (ptr->unk_06 <= 0) {
ptr->unk_06 = 0;
ptr->unk_00 = 0;
}
}
}
}
}
void func_80A4BF78(EnWizFire* this, GlobalContext* globalCtx) {
s16 i;
u8 flag;
EnWizFireStruct* ptr = &this->unk_254[0];
GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
OPEN_DISPS(gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
func_8012C2DC(globalCtx->state.gfxCtx);
flag = false;
for (i = 0; i < ARRAY_COUNT(this->unk_254); i++, ptr++) {
if (ptr->unk_00 != 0) {
if (!flag) {
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_000E70);
flag++;
}
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 195, 225, 235, ptr->unk_06);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, (ptr->unk_01 * 3) & 0x7F,
(ptr->unk_01 * 0xF) & 0xFF, 0x20, 0x40, 1, 0, 0, 0x20, 0x20));
Matrix_InsertTranslation(ptr->unk_10.x, ptr->unk_10.y, ptr->unk_10.z, MTXMODE_NEW);
Matrix_NormalizeXYZ(&globalCtx->billboardMtxF);
Matrix_Scale(ptr->unk_0C, ptr->unk_0C, 1.0f, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gDPSetRenderMode(POLY_XLU_DISP++, G_RM_PASS, G_RM_AA_ZB_XLU_SURF2);
gSPClearGeometryMode(POLY_XLU_DISP++, G_CULL_BACK | G_FOG);
gSPDisplayList(POLY_XLU_DISP++, object_wiz_DL_000FD8);
}
}
CLOSE_DISPS(gfxCtx);
}

View File

@ -7,10 +7,48 @@ struct EnWizFire;
typedef void (*EnWizFireActionFunc)(struct EnWizFire*, GlobalContext*);
typedef struct {
/* 0x00 */ u8 unk_00;
/* 0x01 */ u8 unk_01;
/* 0x02 */ UNK_TYPE1 unk02[0x4];
/* 0x06 */ s16 unk_06;
/* 0x08 */ s16 unk_08;
/* 0x0A */ UNK_TYPE1 unk0A[0x2];
/* 0x0C */ f32 unk_0C;
/* 0x10 */ Vec3f unk_10;
/* 0x1C */ Vec3f unk_1C;
/* 0x28 */ Vec3f unk_28;
} EnWizFireStruct; // size = 0x34
typedef struct EnWizFire {
/* 0x0000 */ Actor actor;
/* 0x0144 */ EnWizFireActionFunc actionFunc;
/* 0x0148 */ char unk_148[0x29AC];
/* 0x0148 */ u8 unk_148;
/* 0x014C */ f32 unk_14C;
/* 0x0150 */ f32 unk_150;
/* 0x0154 */ f32 unk_154;
/* 0x0158 */ f32 unk_158;
/* 0x015C */ f32 unk_15C;
/* 0x0160 */ s16 unk_160;
/* 0x0162 */ s16 unk_162;
/* 0x0164 */ u8 unk_164;
/* 0x0166 */ s16 unk_166;
/* 0x0168 */ s16 unk_168;
/* 0x016A */ s16 unk_16A;
/* 0x016C */ s16 unk_16C;
/* 0x016E */ s16 unk_16E;
/* 0x0170 */ s16 unk_170;
/* 0x0172 */ s16 unk_172;
/* 0x0174 */ s8 unk_174;
/* 0x0178 */ Vec3f unk_178[10];
/* 0x01F0 */ f32 unk_1F0;
/* 0x01F4 */ f32 unk_1F4;
/* 0x01F8 */ f32 unk_1F8;
/* 0x01FC */ f32 unk_1FC;
/* 0x0200 */ f32 unk_200;
/* 0x0204 */ f32 unk_204;
/* 0x0208 */ ColliderCylinder collider;
/* 0x0254 */ EnWizFireStruct unk_254[200];
} EnWizFire; // size = 0x2AF4
extern const ActorInit En_Wiz_Fire_InitVars;

View File

@ -3797,18 +3797,6 @@ D_06001690 = 0x06001690;
D_06005870 = 0x06005870;
D_06005C64 = 0x06005C64;
// ovl_En_Wiz_Fire
D_06000E70 = 0x06000E70;
D_06000FD8 = 0x06000FD8;
D_06002630 = 0x06002630;
D_06002B40 = 0x06002B40;
D_06003120 = 0x06003120;
D_06003640 = 0x06003640;
D_06003FC0 = 0x06003FC0;
D_06005190 = 0x06005190;
D_06005750 = 0x06005750;
// ovl_En_Wood02
D_06000700 = 0x06000700;