Effect EnIce OK (#976)

* Ok

* Material/Model

* Cleanup

* format

* IceFragment Assets

* PR
This commit is contained in:
Derek Hensley 2022-08-07 16:29:03 -07:00 committed by GitHub
parent bc3883d098
commit d0313fa766
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 162 additions and 34 deletions

View File

@ -1087,7 +1087,7 @@
<Texture Name="gameplay_keep_Tex_0443B0" OutName="tex_0443B0" Format="i8" Width="32" Height="32" Offset="0x443B0" />
<Texture Name="gameplay_keep_Tex_0447B0" OutName="tex_0447B0" Format="i8" Width="32" Height="32" Offset="0x447B0" />
<Texture Name="gameplay_keep_Tex_044BB0" OutName="tex_044BB0" Format="i8" Width="32" Height="32" Offset="0x44BB0" />
<Texture Name="gFrozenIceTex" OutName="frozen_ice" Format="i8" Width="32" Height="32" Offset="0x44FB0" />
<Texture Name="gEffIceFragmentTex" OutName="eff_ice_fragment" Format="i8" Width="32" Height="32" Offset="0x44FB0" />
<Texture Name="gameplay_keep_Tex_0453B0" OutName="tex_0453B0" Format="i8" Width="32" Height="32" Offset="0x453B0" />
<DList Name="gameplay_keep_DL_048DF0" Offset="0x48DF0" />
<Texture Name="gameplay_keep_TLUT_04A460" OutName="tlut_04A460" Format="rgba16" Width="16" Height="16" Offset="0x4A460" />
@ -1112,10 +1112,10 @@
<Texture Name="gameplay_keep_Tex_04E220" OutName="tex_04E220" Format="i8" Width="64" Height="64" Offset="0x4E220" />
<DList Name="gameplay_keep_DL_04F250" Offset="0x4F250" />
<Texture Name="gameplay_keep_Tex_04F2C0" OutName="tex_04F2C0" Format="ia16" Width="32" Height="64" Offset="0x4F2C0" />
<DList Name="gEffIceFragmentDL" Offset="0x50550" />
<DList Name="gFrozenIceDL" Offset="0x50648" />
<DList Name="gFrozenIceVtxDL" Offset="0x506E0" />
<DList Name="gameplay_keep_DL_050D10" Offset="0x50D10" />
<DList Name="gEffIceFragment1DL" Offset="0x50550" />
<DList Name="gEffIceFragment2MaterialDL" Offset="0x50648" />
<DList Name="gEffIceFragment2ModelDL" Offset="0x506E0" />
<DList Name="gEffIceFragment3DL" Offset="0x50D10" />
<Texture Name="gEffIceSmokeTex" OutName="eff_ice_smoke" Format="i4" Width="32" Height="32" Offset="0x50E80" />
<DList Name="gEffIceSmokeDL" Offset="0x510B0" />
<DList Name="gFrozenSteamDL" Offset="0x51180" />

View File

@ -562,7 +562,6 @@ void EffectSsSolderSrchBall_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity,
void EffectSsKakera_Spawn(PlayState* play, Vec3f* pos, Vec3f* velocity, Vec3f* arg3, s16 gravity, s16 arg5, s16 arg6, s16 arg7, s16 arg8, s16 scale, s16 arg10, s16 arg11, s32 life, s16 colorIdx, s16 objId, Gfx* dList);
// void EffectSsIcePiece_Spawn(UNK_TYPE4 uParm1, Vec3f* pzParm2, UNK_TYPE4 uParm3, Vec3f* pzParm4, Vec3f* param_5, UNK_TYPE4 param_6);
// void EffectSsIcePiece_SpawnBurst(void);
// void EffectSsEnIce_SpawnFlyingVec3f(UNK_TYPE4 uParm1, Actor* pzParm2, Vec3f* pzParm3, Color_RGBA8* pzParm4, Color_RGBA8* param_5, UNK_TYPE4 param_6);
void func_800B2B44(PlayState* play, Actor* actor, Vec3f* arg2, f32 arg3);
// void func_800B2B7C(void);
void EffectSsEnIce_Spawn(PlayState* play, Vec3f* pos, f32 scale, Vec3f* velocity, Vec3f* accel, Color_RGBA8* primColor, Color_RGBA8* envColor, s32 life);

3
spec
View File

@ -1908,8 +1908,7 @@ beginseg
name "ovl_Effect_Ss_En_Ice"
compress
include "build/src/overlays/effects/ovl_Effect_Ss_En_Ice/z_eff_ss_en_ice.o"
include "build/data/ovl_Effect_Ss_En_Ice/ovl_Effect_Ss_En_Ice.data.o"
include "build/data/ovl_Effect_Ss_En_Ice/ovl_Effect_Ss_En_Ice.reloc.o"
include "build/src/overlays/effects/ovl_Effect_Ss_En_Ice/ovl_Effect_Ss_En_Ice_reloc.o"
endseg
beginseg

View File

@ -4544,7 +4544,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, gameplayFrames & 0xFF, 32, 16, 1, 0,
(gameplayFrames * 2) & 0xFF, 64, 32));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 170, 255, 255, 255);
gSPDisplayList(POLY_XLU_DISP++, gFrozenIceDL);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment2MaterialDL);
effectAlphaScaled = effectAlpha * 255.0f;
@ -4575,7 +4575,7 @@ void Actor_DrawDamageEffects(PlayState* play, Actor* actor, Vec3f limbPos[], s16
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx),
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(POLY_XLU_DISP++, gFrozenIceVtxDL);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment2ModelDL);
}
limbPos = limbPosStart; // reset limbPos

View File

@ -780,15 +780,15 @@ void EffectSsIcePiece_SpawnBurst(PlayState* play, Vec3f* refPos, f32 scale) {
// EffectSsEnIce Spawn Functions
void EffectSsEnIce_SpawnFlyingVec3f(PlayState* play, Actor* actor, Vec3f* pos, Color_RGBA8* prim, Color_RGBA8* env,
f32 scale) {
void EffectSsEnIce_SpawnFlying(PlayState* play, Actor* actor, Vec3f* pos, Color_RGBA8* prim, Color_RGBA8* env,
f32 scale) {
EffectSsEnIceInitParams initParams;
initParams.actor = actor;
Math_Vec3f_Copy(&initParams.pos, pos);
Color_RGBA8_Copy(&initParams.primColor, prim);
Color_RGBA8_Copy(&initParams.envColor, env);
initParams.type = 0;
initParams.type = ENICE_TYPE_FLYING;
initParams.scale = scale;
if (actor != NULL) {
@ -802,7 +802,7 @@ void func_800B2B44(PlayState* play, Actor* actor, Vec3f* pos, f32 scale) {
static Color_RGBA8 primColor = { 150, 150, 150, 250 };
static Color_RGBA8 envColor = { 235, 245, 255, 255 };
EffectSsEnIce_SpawnFlyingVec3f(play, actor, pos, &primColor, &envColor, scale);
EffectSsEnIce_SpawnFlying(play, actor, pos, &primColor, &envColor, scale);
}
void func_800B2B7C(PlayState* play, Actor* actor, Vec3s* arg2, f32 scale) {
@ -823,7 +823,7 @@ void EffectSsEnIce_Spawn(PlayState* play, Vec3f* pos, f32 scale, Vec3f* velocity
Color_RGBA8_Copy(&initParams.envColor, envColor);
initParams.scale = scale;
initParams.life = life;
initParams.type = 1;
initParams.type = ENICE_TYPE_NORMAL;
EffectSs_Spawn(play, EFFECT_SS_EN_ICE, 128, &initParams);
}

View File

@ -1082,7 +1082,7 @@ void func_80A137C0(EnGo* this, PlayState* play, f32 arg2, f32 arg3) {
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, frames1, 0x20, 0x10, 1, 0, frames2, 0x40, 0x20));
gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, (u8)arg3);
gSPDisplayList(POLY_XLU_DISP++, &gameplay_keep_DL_050D10);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
CLOSE_DISPS(play->state.gfxCtx);

View File

@ -354,7 +354,7 @@ void ObjIcePoly_Draw(Actor* thisx, PlayState* play) {
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, play->gameplayFrames % 256, 0x20, 0x10, 1, 0,
(play->gameplayFrames * 2) % 256, 0x40, 0x20));
gDPSetEnvColor(POLY_XLU_DISP++, 0, 50, 100, this->unk_148);
gSPDisplayList(POLY_XLU_DISP++, gameplay_keep_DL_050D10);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment3DL);
CLOSE_DISPS(play->state.gfxCtx);
}

View File

@ -1,30 +1,157 @@
/*
* File: z_eff_ss_en_ice.c
* Overlay: ovl_Effect_Ss_En_Ice
* Description:
* Description: Ice clumps
*/
#include "z_eff_ss_en_ice.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#define rLifespan regs[0]
#define rYaw regs[1]
#define rPitch regs[2]
#define rRotSpeed regs[3]
#define rPrimColorR regs[4]
#define rPrimColorG regs[5]
#define rPrimColorB regs[6]
#define rPrimColorA regs[7]
#define rEnvColorR regs[8]
#define rEnvColorG regs[9]
#define rEnvColorB regs[10]
#define rAlphaMode regs[11]
#define rScale regs[12]
#define PARAMS ((EffectSsEnIceInitParams*)initParamsx)
s32 EffectSsEnIce_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void func_8097F62C(PlayState* play, u32 index, EffectSs* this);
void func_8097F7EC(PlayState* play, u32 index, EffectSs* this);
u32 EffectSsEnIce_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx);
void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this);
void EffectSsEnIce_Update(PlayState* play, u32 index, EffectSs* this);
void EffectSsEnIce_Draw(PlayState* play, u32 index, EffectSs* this);
#if 0
const EffectSsInit Effect_Ss_En_Ice_InitVars = {
EFFECT_SS_EN_ICE,
EffectSsEnIce_Init,
};
#endif
u32 EffectSsEnIce_Init(PlayState* play, u32 index, EffectSs* this, void* initParamsx) {
EffectSsEnIceInitParams* initParams = PARAMS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_En_Ice/EffectSsEnIce_Init.s")
if (initParams->type == ENICE_TYPE_FLYING) {
Math_Vec3f_Copy(&this->pos, &initParams->pos);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_En_Ice/EffectSsEnIce_Draw.s")
if (initParams->actor != NULL) {
Math_Vec3f_Diff(&this->pos, &initParams->actor->world.pos, &this->vec);
} else {
Math_Vec3f_Copy(&this->vec, &initParams->pos);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_En_Ice/func_8097F62C.s")
Math_Vec3f_Copy(&this->velocity, &gZeroVec3f);
Math_Vec3f_Copy(&this->accel, &gZeroVec3f);
this->life = 10;
this->actor = initParams->actor;
this->draw = EffectSsEnIce_Draw;
this->update = EffectSsEnIce_UpdateFlying;
this->rScale = initParams->scale * 100.0f;
this->rPrimColorR = initParams->primColor.r;
this->rPrimColorG = initParams->primColor.g;
this->rPrimColorB = initParams->primColor.b;
this->rPrimColorA = initParams->primColor.a;
this->rEnvColorR = initParams->envColor.r;
this->rEnvColorG = initParams->envColor.g;
this->rEnvColorB = initParams->envColor.b;
this->rAlphaMode = 1;
this->rPitch = randPlusMinusPoint5Scaled(0x10000);
} else if (initParams->type == ENICE_TYPE_NORMAL) {
Math_Vec3f_Copy(&this->pos, &initParams->pos);
Math_Vec3f_Copy(&this->vec, &initParams->pos);
Math_Vec3f_Copy(&this->velocity, &initParams->velocity);
Math_Vec3f_Copy(&this->accel, &initParams->accel);
this->life = initParams->life;
this->draw = EffectSsEnIce_Draw;
this->update = EffectSsEnIce_Update;
this->rLifespan = initParams->life;
this->rScale = initParams->scale * 100.0f;
this->rYaw = Math_FAtan2F(initParams->velocity.z, initParams->velocity.x);
this->rPitch = 0;
this->rPrimColorR = initParams->primColor.r;
this->rPrimColorG = initParams->primColor.g;
this->rPrimColorB = initParams->primColor.b;
this->rPrimColorA = initParams->primColor.a;
this->rEnvColorR = initParams->envColor.r;
this->rEnvColorG = initParams->envColor.g;
this->rEnvColorB = initParams->envColor.b;
this->rAlphaMode = 0;
} else {
return 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Effect_Ss_En_Ice/func_8097F7EC.s")
return 1;
}
void EffectSsEnIce_Draw(PlayState* play, u32 index, EffectSs* this) {
GraphicsContext* gfxCtx = play->state.gfxCtx;
s32 pad;
f32 scale = this->rScale * 0.01f;
u32 gameplayFrames = play->gameplayFrames;
f32 alpha;
OPEN_DISPS(gfxCtx);
if (this->rAlphaMode != 0) {
alpha = this->life * 12.0f;
} else if ((this->rLifespan > 0) && (this->life < (this->rLifespan >> 1))) {
alpha = (this->life * 2.0f) / this->rLifespan;
alpha *= 255.0f;
} else {
alpha = 255.0f;
}
Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW);
Matrix_Scale(scale, scale, scale, MTXMODE_APPLY);
Matrix_RotateYS(this->rYaw, MTXMODE_APPLY);
Matrix_RotateXS(this->rPitch, MTXMODE_APPLY);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
func_8012C2DC(play->state.gfxCtx);
func_800BCC68(&this->pos, play);
gSPSegment(POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, gameplayFrames & 0xFF, 0x20, 0x10, 1, 0,
(gameplayFrames * 2) & 0xFF, 0x40, 0x20));
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, this->rPrimColorR, this->rPrimColorG, this->rPrimColorB,
this->rPrimColorA);
gDPSetEnvColor(POLY_XLU_DISP++, this->rEnvColorR, this->rEnvColorG, this->rEnvColorB, (u32)alpha);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment2MaterialDL);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment2ModelDL);
CLOSE_DISPS(gfxCtx);
}
void EffectSsEnIce_UpdateFlying(PlayState* play, u32 index, EffectSs* this) {
s16 rand;
if ((this->actor != NULL) && (this->actor->update != NULL)) {
if ((this->life >= 9) && (this->actor->colorFilterTimer != 0) && (!(this->actor->colorFilterParams & 0xC000))) {
Math_Vec3f_Sum(&this->actor->world.pos, &this->vec, &this->pos);
this->life++;
} else if (this->life == 9) {
this->accel.x = Math_SinS(Math_Vec3f_Yaw(&this->actor->world.pos, &this->pos)) * (Rand_ZeroOne() + 1.0f);
this->accel.z = Math_CosS(Math_Vec3f_Yaw(&this->actor->world.pos, &this->pos)) * (Rand_ZeroOne() + 1.0f);
this->accel.y = -1.5f;
this->velocity.y = 5.0f;
}
} else {
this->actor = NULL;
if (this->life >= 9) {
rand = randPlusMinusPoint5Scaled(0xFFFF);
this->accel.x = Math_SinS(rand) * (Rand_ZeroOne() + 1.0f);
this->accel.z = Math_CosS(rand) * (Rand_ZeroOne() + 1.0f);
this->life = 8;
this->accel.y = -1.5f;
this->velocity.y = 5.0f;
}
}
}
void EffectSsEnIce_Update(PlayState* play, u32 index, EffectSs* this) {
this->rPitch += this->rRotSpeed; // rRotSpeed is not initialized so this does nothing
}

View File

@ -3,6 +3,11 @@
#include "global.h"
typedef enum EffectSsEnIceType {
/* 0 */ ENICE_TYPE_FLYING,
/* 1 */ ENICE_TYPE_NORMAL
} EffectSsEnIceType;
typedef struct {
/* 0x00 */ Actor* actor;
/* 0x04 */ Vec3f pos;

View File

@ -71,7 +71,7 @@ void EffectSsIcePiece_Draw(PlayState* play, u32 index, EffectSs* this) {
gSPSegment(
POLY_XLU_DISP++, 0x08,
Gfx_TwoTexScroll(play->state.gfxCtx, 0, 0, frames % 256, 0x20, 0x10, 1, 0, (2 * frames) % 256, 0x40, 0x20));
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragmentDL);
gSPDisplayList(POLY_XLU_DISP++, gEffIceFragment1DL);
CLOSE_DISPS(gfxCtx);
}

View File

@ -635,7 +635,7 @@
0x800B2810:("EffectSsKakera_Spawn",),
0x800B28C8:("EffectSsIcePiece_Spawn",),
0x800B2930:("EffectSsIcePiece_SpawnBurst",),
0x800B2AC4:("EffectSsEnIce_SpawnFlyingVec3f",),
0x800B2AC4:("EffectSsEnIce_SpawnFlying",),
0x800B2B44:("func_800B2B44",),
0x800B2B7C:("func_800B2B7C",),
0x800B2BC0:("EffectSsEnIce_Spawn",),
@ -8221,8 +8221,8 @@
0x8097F020:("EffectSsIcePiece_Update",),
0x8097F0D0:("EffectSsEnIce_Init",),
0x8097F2F0:("EffectSsEnIce_Draw",),
0x8097F62C:("func_8097F62C",),
0x8097F7EC:("func_8097F7EC",),
0x8097F62C:("EffectSsEnIce_UpdateFlying",),
0x8097F7EC:("EffectSsEnIce_Update",),
0x8097F880:("EffectSsFireTail_Init",),
0x8097F99C:("EffectSsFireTail_Draw",),
0x8097FE8C:("EffectSsFireTail_Update",),

View File

@ -149,7 +149,7 @@ asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsSolderSrchBall_Spaw
asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsKakera_Spawn.s,EffectSsKakera_Spawn,0x800B2810,0x2E
asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsIcePiece_Spawn.s,EffectSsIcePiece_Spawn,0x800B28C8,0x1A
asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsIcePiece_SpawnBurst.s,EffectSsIcePiece_SpawnBurst,0x800B2930,0x65
asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsEnIce_SpawnFlyingVec3f.s,EffectSsEnIce_SpawnFlyingVec3f,0x800B2AC4,0x20
asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsEnIce_SpawnFlying.s,EffectSsEnIce_SpawnFlying,0x800B2AC4,0x20
asm/non_matchings/code/z_effect_soft_sprite_old_init/func_800B2B44.s,func_800B2B44,0x800B2B44,0xE
asm/non_matchings/code/z_effect_soft_sprite_old_init/func_800B2B7C.s,func_800B2B7C,0x800B2B7C,0x11
asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsEnIce_Spawn.s,EffectSsEnIce_Spawn,0x800B2BC0,0x22

1 asm/non_matchings/code/z_en_a_keep/EnAObj_Init.s EnAObj_Init 0x800A5AC0 0x2B
149 asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsKakera_Spawn.s EffectSsKakera_Spawn 0x800B2810 0x2E
150 asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsIcePiece_Spawn.s EffectSsIcePiece_Spawn 0x800B28C8 0x1A
151 asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsIcePiece_SpawnBurst.s EffectSsIcePiece_SpawnBurst 0x800B2930 0x65
152 asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsEnIce_SpawnFlyingVec3f.s asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsEnIce_SpawnFlying.s EffectSsEnIce_SpawnFlyingVec3f EffectSsEnIce_SpawnFlying 0x800B2AC4 0x20
153 asm/non_matchings/code/z_effect_soft_sprite_old_init/func_800B2B44.s func_800B2B44 0x800B2B44 0xE
154 asm/non_matchings/code/z_effect_soft_sprite_old_init/func_800B2B7C.s func_800B2B7C 0x800B2B7C 0x11
155 asm/non_matchings/code/z_effect_soft_sprite_old_init/EffectSsEnIce_Spawn.s EffectSsEnIce_Spawn 0x800B2BC0 0x22

View File

@ -431,8 +431,6 @@ D_0403F230 = 0x0403F230;
D_04044300 = 0x04044300;
D_0404F250 = 0x0404F250;
D_04050550 = 0x04050550;
D_04050648 = 0x04050648;
D_040506E0 = 0x040506E0;
D_04050D10 = 0x04050D10;
D_040510B0 = 0x040510B0;
D_04051180 = 0x04051180;