diff --git a/configure.py b/configure.py index 6e4eaac5..44f0de09 100644 --- a/configure.py +++ b/configure.py @@ -1284,7 +1284,7 @@ config.libs = [ Object(Matching, "effect/ef_kigae_light.c"), Object(Matching, "effect/ef_kikuzu.c"), Object(Matching, "effect/ef_killer.c"), - Object(NonMatching, "effect/ef_kisha_kemuri.c"), + Object(Matching, "effect/ef_kisha_kemuri.c"), Object(NonMatching, "effect/ef_konpu.c"), Object(NonMatching, "effect/ef_kpun.c"), Object(Matching, "effect/ef_kyousou_onpu.c"), diff --git a/src/effect/ef_kisha_kemuri.c b/src/effect/ef_kisha_kemuri.c index f83fa2b5..e703812c 100644 --- a/src/effect/ef_kisha_kemuri.c +++ b/src/effect/ef_kisha_kemuri.c @@ -1,5 +1,9 @@ #include "ef_effect_control.h" +#include "m_common_data.h" + +extern Gfx ef_kisha_kemuri01_modelT[]; + static void eKishaK_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1); static void eKishaK_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg); static void eKishaK_mv(eEC_Effect_c* effect, GAME* game); @@ -18,17 +22,53 @@ eEC_PROFILE_c iam_ef_kisha_kemuri = { }; static void eKishaK_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1) { - // TODO + eEC_CLIP->make_effect_proc(eEC_EFFECT_KISHA_KEMURI, pos, NULL, game, NULL, item_name, prio, arg0, angle); } static void eKishaK_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg) { - // TODO + f32 x, y; + + effect->scale.x = 0.0f; + effect->scale.y = 0.0f; + effect->scale.z = 0.0f; + + effect->timer = 80; + + x = RANDOM_F(5.0f) - 2.5f; + y = RANDOM_F(5.0f) - 2.5f; + effect->position.x += x; + effect->position.z += y; + + if (effect->arg0 == 1) { + effect->acceleration.x = sin_s(effect->arg1) * 0.2f; + effect->acceleration.z = cos_s(effect->arg1) * 0.2f; + } } static void eKishaK_mv(eEC_Effect_c* effect, GAME* game) { - // TODO + effect->position.y += eEC_CLIP->calc_adjust_proc(80 - effect->timer, 0, 20, 2.2f, 0.5f); + if (effect->arg0 == 1) { + effect->position.x += effect->acceleration.x; + effect->position.z += effect->acceleration.z; + } } static void eKishaK_dw(eEC_Effect_c* effect, GAME* game) { - // TODO + s16 timer = 80 - effect->timer; + xyz_t* scale = &effect->scale; + u8 alpha = (int)eEC_CLIP->calc_adjust_proc(timer, 40, 80, 200.0f, 4.0f); + f32 new_scale = eEC_CLIP->calc_adjust_proc(timer, 0, 40, 0.003f, 0.027f); + + scale->x = new_scale; + scale->y = new_scale; + scale->z = new_scale; + + OPEN_DISP(game->graph); + + eEC_CLIP->auto_matrix_xlu_proc(game, &effect->position, scale); + + gDPSetPrimColor(NEXT_POLY_XLU_DISP, 0, 128, 30, 30, 30, alpha); + gSPDisplayList(NEXT_POLY_XLU_DISP, ef_kisha_kemuri01_modelT); + + CLOSE_DISP(game->graph); }