From 9660c18903ca59bde0ad9accaab379081dedd814 Mon Sep 17 00:00:00 2001 From: Norgesnerd <5824576+Norgesnerd@users.noreply.github.com> Date: Sun, 15 Jun 2025 00:10:21 +0200 Subject: [PATCH] Implement & link ef_ongen --- configure.py | 2 +- src/effect/ef_ongen.c | 43 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/configure.py b/configure.py index 901ae5f9..7800bff4 100644 --- a/configure.py +++ b/configure.py @@ -1303,7 +1303,7 @@ config.libs = [ Object(Matching, "effect/ef_neboke_awa.c"), Object(Matching, "effect/ef_night13_moon.c"), Object(Matching, "effect/ef_night15_moon.c"), - Object(NonMatching, "effect/ef_ongen.c"), + Object(Matching, "effect/ef_ongen.c"), Object(NonMatching, "effect/ef_otikomi.c"), Object(Matching, "effect/ef_otosiana.c"), Object(Matching, "effect/ef_pun.c"), diff --git a/src/effect/ef_ongen.c b/src/effect/ef_ongen.c index ce4d1e01..e9dac5c1 100644 --- a/src/effect/ef_ongen.c +++ b/src/effect/ef_ongen.c @@ -1,5 +1,12 @@ #include "ef_effect_control.h" +#include "m_common_data.h" +#include "m_rcp.h" +#include "sys_matrix.h" + +extern Gfx ef_ongen_mouth_model[]; +extern Gfx ef_ongen_mic_model[]; + static void eOngen_init(xyz_t pos, int prio, s16 angle, GAME* game, u16 item_name, s16 arg0, s16 arg1); static void eOngen_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg); static void eOngen_mv(eEC_Effect_c* effect, GAME* game); @@ -18,17 +25,45 @@ eEC_PROFILE_c iam_ef_ongen = { }; static void eOngen_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_ONGEN, pos, NULL, game, NULL, item_name, prio, arg0, arg1); } static void eOngen_ct(eEC_Effect_c* effect, GAME* game, void* ct_arg) { - // TODO + static s16 timer_table[] = { 2, 1, 10 }; + effect->timer = timer_table[effect->arg0]; } static void eOngen_mv(eEC_Effect_c* effect, GAME* game) { - // TODO + return; +} + +static void eOngen_TidyArgData(s16* arg0) { + if (*arg0 < 0) { + *arg0 = 0; + } else if (*arg0 >= 3) { + *arg0 = 2; + } } static void eOngen_dw(eEC_Effect_c* effect, GAME* game) { - // TODO + static f32 scale_table[] = { 0.027f, 0.0139999999f, 0.027f }; + static Gfx* disp_table[] = { ef_ongen_mouth_model, ef_ongen_mic_model, ef_ongen_mouth_model }; + f32 scale; + + OPEN_DISP(game->graph); + + eOngen_TidyArgData(&effect->arg0); + scale = scale_table[effect->arg0]; + + _texture_z_light_fog_prim_xlu(game->graph); + + Matrix_translate(effect->position.x, effect->position.y, effect->position.z, FALSE); + Matrix_mult(&((GAME_PLAY*)game)->billboard_matrix, TRUE); + Matrix_scale(scale, scale, scale, TRUE); + + gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(NEXT_POLY_XLU_DISP, 0, 128, 255, 255, 255, 190); + gSPDisplayList(NEXT_POLY_XLU_DISP, disp_table[effect->arg0]); + + CLOSE_DISP(game->graph); }