From b23f4bd984fdf699804dfbdf2bcd78590715c062 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Tue, 5 Nov 2024 10:34:47 -0500 Subject: [PATCH] Implement & link ac_kamakura_indoor --- configure.py | 2 +- include/ac_kamakura_indoor.h | 32 ++- include/audio_defs.h | 2 + include/m_actor.h | 2 +- include/m_kankyo.h | 2 +- src/actor/ac_arrange_room.c | 2 +- src/actor/ac_field_draw.c | 4 +- src/actor/ac_house_clock.c | 3 +- src/actor/ac_kamakura_indoor.c | 347 ++++++++++++++++++++++++++ src/actor/ac_my_indoor.c | 13 +- src/actor/ac_shop_indoor.c | 9 +- src/effect/ef_room_sunshine_minsect.c | 4 +- src/game/m_kankyo.c | 6 +- 13 files changed, 401 insertions(+), 27 deletions(-) create mode 100644 src/actor/ac_kamakura_indoor.c diff --git a/configure.py b/configure.py index 9bad599d..066060dc 100644 --- a/configure.py +++ b/configure.py @@ -991,7 +991,7 @@ config.libs = [ Object(Matching, "actor/ac_intro_demo.c"), Object(Matching, "actor/ac_kago.c"), Object(Matching, "actor/ac_kamakura.c"), - Object(NonMatching, "actor/ac_kamakura_indoor.c"), + Object(Matching, "actor/ac_kamakura_indoor.c"), Object(Matching, "actor/ac_koinobori.c"), Object(NonMatching, "actor/ac_lighthouse_switch.c"), Object(Matching, "actor/ac_lotus.c"), diff --git a/include/ac_kamakura_indoor.h b/include/ac_kamakura_indoor.h index 47c14434..b84e65ce 100644 --- a/include/ac_kamakura_indoor.h +++ b/include/ac_kamakura_indoor.h @@ -8,6 +8,37 @@ extern "C" { #endif +#define aKI_CANDLE_NUM 2 + +typedef struct kamakura_indoor_candle_ring_s { + rgba_t color; + f32 scale; +} aKI_candle_ring_c; + +typedef struct kamakura_indoor_candle_fire_s { + u8* tex_p; + rgba_t color; +} aKI_candle_fire_c; + +typedef struct kamakura_indoor_mochi_s { + int move_bg_idx; + mCoBG_bg_regist_c bg_regist; + xyz_t pos; + xyz_t old_pos; + s16 angle_y; + f32 scale_rate; +} aKI_mochi_c; + +typedef struct kamakura_indoor_actor_s KAMAKURA_INDOOR_ACTOR; + +struct kamakura_indoor_actor_s { + ACTOR actor_class; + aKI_candle_ring_c candle_ring[aKI_CANDLE_NUM]; + aKI_candle_fire_c candle_fire[aKI_CANDLE_NUM]; + aKI_mochi_c mochi; + u8 _1E0[0x200 - 0x1E0]; +}; + extern ACTOR_PROFILE Kamakura_Indoor_Profile; #ifdef __cplusplus @@ -15,4 +46,3 @@ extern ACTOR_PROFILE Kamakura_Indoor_Profile; #endif #endif - diff --git a/include/audio_defs.h b/include/audio_defs.h index f509a266..a4b53056 100644 --- a/include/audio_defs.h +++ b/include/audio_defs.h @@ -74,6 +74,8 @@ typedef enum audio_sound_effects { NA_SE_51 = 0x51, NA_SE_52 = 0x52, + NA_SE_54 = 0x54, + NA_SE_ITEM_HORIDASHI = 0x57, NA_SE_CLEAN_UP_FTR = 0x58, diff --git a/include/m_actor.h b/include/m_actor.h index ff2b93f5..df500ddc 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -62,7 +62,7 @@ typedef enum bank_id { ACTOR_OBJ_BANK_19, ACTOR_OBJ_BANK_20, ACTOR_OBJ_BANK_21, - ACTOR_OBJ_BANK_22, + ACTOR_OBJ_BANK_KAMAKURA_INDOOR, ACTOR_OBJ_BANK_23, ACTOR_OBJ_BANK_24, ACTOR_OBJ_BANK_PSNOWMAN, diff --git a/include/m_kankyo.h b/include/m_kankyo.h index 99e469ab..49c0d55d 100644 --- a/include/m_kankyo.h +++ b/include/m_kankyo.h @@ -124,7 +124,7 @@ extern void mEnv_regist_nature(Kankyo* kankyo, NATURE_PROC nature_proc, void* ar extern int mEnv_unregist_nature(Kankyo* kankyo, NATURE_PROC nature_proc); extern void Global_kankyo_ct(GAME* game, Kankyo* kankyo); extern void mEnv_GetRoomPrimColor(u8* r, u8* g, u8* b, GAME_PLAY* play); -extern void Global_kankyo_set_room_prim(GAME_PLAY* play); +extern void Global_kankyo_set_room_prim(GAME* game); extern int mEnv_RequestChangeLightON(GAME_PLAY* play, int light_on_type, int play_sfx); extern int mEnv_RequestChangeLightOFF(GAME_PLAY* play, int light_off_type, f32 step); extern void mEnv_ManagePointLight(GAME_PLAY* play, Kankyo* kankyo, Global_light* global_light); diff --git a/src/actor/ac_arrange_room.c b/src/actor/ac_arrange_room.c index 8488ab06..3e779a67 100644 --- a/src/actor/ac_arrange_room.c +++ b/src/actor/ac_arrange_room.c @@ -167,7 +167,7 @@ static void Arrange_Room_Actor_draw(ACTOR* actor, GAME* game) { ARRANGE_ROOM_ACTOR* arrange_room = (ARRANGE_ROOM_ACTOR*)actor; GAME_PLAY* play = (GAME_PLAY*)game; - Global_kankyo_set_room_prim((GAME_PLAY*)game); + Global_kankyo_set_room_prim(game); aAR_DrawFloor(&arrange_room->actor_class, &play->game); aAR_DrawWall(&arrange_room->actor_class, &play->game); } diff --git a/src/actor/ac_field_draw.c b/src/actor/ac_field_draw.c index ff086773..40f89cc3 100644 --- a/src/actor/ac_field_draw.c +++ b/src/actor/ac_field_draw.c @@ -425,7 +425,7 @@ static void aFD_DrawXluBg(Gfx* gfx, int exists, GAME* game) { } } -typedef void (*aFD_DRAW_PROC)(GAME_PLAY* play); +typedef void (*aFD_DRAW_PROC)(GAME* game); static void aFD_DrawBlock(aFD_block_c* block, ACTOR* actorx, GAME* game) { static aFD_DRAW_PROC draw_proc[] = { @@ -461,7 +461,7 @@ static void aFD_DrawBlock(aFD_block_c* block, ACTOR* actorx, GAME* game) { CLOSE_DISP(game->graph); aFD_SetViewerData(anime_data, play); - (*draw_proc[Common_Get(field_draw_type)])(play); + (*draw_proc[Common_Get(field_draw_type)])(game); if (aFD_SetBeachColorOpaSegment(actorx, game, block->bx, block->bz)) { u32 kind = mFI_BkNum2BlockKind(block->bx, block->bz); diff --git a/src/actor/ac_house_clock.c b/src/actor/ac_house_clock.c index d8c3a36f..31b666c7 100644 --- a/src/actor/ac_house_clock.c +++ b/src/actor/ac_house_clock.c @@ -261,13 +261,12 @@ static int aHC_DrawClockBefore(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int j static int aHC_DrawClockAfter(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) { HOUSE_CLOCK_ACTOR* house_clock = (HOUSE_CLOCK_ACTOR*)arg; - GAME_PLAY* play = (GAME_PLAY*)game; s16 clock_num = house_clock->clock.clock_num; xyz_t pos; xyz_t ofs = { 0.0f, 0.0f, 0.0f }; if (clock_num == aHC_TYPE_MUSEUM) { - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); } if (joint_idx == aHC_draw_data[clock_num].short_joint_no) { diff --git a/src/actor/ac_kamakura_indoor.c b/src/actor/ac_kamakura_indoor.c new file mode 100644 index 00000000..06c71a33 --- /dev/null +++ b/src/actor/ac_kamakura_indoor.c @@ -0,0 +1,347 @@ +#include "ac_kamakura_indoor.h" + +#include "m_name_table.h" +#include "sys_matrix.h" +#include "m_rcp.h" +#include "m_play.h" +#include "audio.h" +#include "m_common_data.h" + +static void Kamakura_Indoor_Actor_ct(ACTOR* actorx, GAME* game); +static void Kamakura_Indoor_Actor_dt(ACTOR* actorx, GAME* game); +static void Kamakura_Indoor_Actor_move(ACTOR* actorx, GAME* game); +static void Kamakura_Indoor_Actor_draw(ACTOR* actorx, GAME* game); + +// clang-format off +ACTOR_PROFILE Kamakura_Indoor_Profile = { + mAc_PROFILE_KAMAKURA_INDOOR, + ACTOR_PART_FG, + ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_KAMAKURA_INDOOR, + sizeof(KAMAKURA_INDOOR_ACTOR), + &Kamakura_Indoor_Actor_ct, + &Kamakura_Indoor_Actor_dt, + &Kamakura_Indoor_Actor_move, + &Kamakura_Indoor_Actor_draw, + NULL, +}; +// clang-format on + +static mCoBG_bg_size_c aKI_mochi_collision_info = { 25.0f, 25.0f, 25.0f, 25.0f }; + +static void Kamakura_Indoor_Actor_ct(ACTOR* actorx, GAME* game) { + static xyz_t mochi_pos = { 160.0f, 40.0f, 160.0f }; + KAMAKURA_INDOOR_ACTOR* k_indoor = (KAMAKURA_INDOOR_ACTOR*)actorx; + + k_indoor->mochi.pos = mochi_pos; + k_indoor->mochi.old_pos = mochi_pos; + k_indoor->mochi.angle_y = 0; + k_indoor->mochi.move_bg_idx = mCoBG_RegistMoveBg(&k_indoor->mochi.bg_regist, &k_indoor->mochi.pos, &k_indoor->mochi.old_pos, &k_indoor->mochi.angle_y, 35.0f, &aKI_mochi_collision_info, NULL, NULL, NULL, mCoBG_FTR_TYPE_NUM, mCoBG_ATTRIBUTE_STONE, 100.0f); +} + +static void Kamakura_Indoor_Actor_dt(ACTOR* actorx, GAME* game) { + KAMAKURA_INDOOR_ACTOR* k_indoor = (KAMAKURA_INDOOR_ACTOR*)actorx; + + mCoBG_CrossOffMoveBg(k_indoor->mochi.move_bg_idx); +} + +extern Gfx rom_kamakura_ring_modelT[]; + +static void aKI_DrawKamakuraIndoorCandleRing(KAMAKURA_INDOOR_ACTOR* k_indoor, GAME* game) { + static xyz_t candle_ring_pos[] = { { 142.0f, 106.0f, 38.0f }, { 178.0f, 106.0f, 38.0f } }; + GAME_PLAY* play = (GAME_PLAY*)game; + f32 scale; + int i; + + _texture_z_light_fog_prim_xlu(game->graph); + Global_kankyo_set_room_prim(game); + for (i = 0; i < aKI_CANDLE_NUM; i++) { + Mtx* mtx = GRAPH_ALLOC_TYPE(game->graph, Mtx, 1); + + scale = k_indoor->candle_ring[i].scale * 0.0001f; + + OPEN_DISP(game->graph); + + gDPPipeSync(NEXT_POLY_XLU_DISP); + suMtxMakeTS(mtx, scale, scale, scale, candle_ring_pos[i].x, candle_ring_pos[i].y, candle_ring_pos[i].z); + gSPMatrix(NEXT_POLY_XLU_DISP, mtx, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(NEXT_POLY_XLU_DISP, play->billboard_mtx_p, G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW); + gDPSetPrimColor(NEXT_POLY_XLU_DISP, 0, 255, k_indoor->candle_ring[i].color.r, k_indoor->candle_ring[i].color.g, k_indoor->candle_ring[i].color.b, k_indoor->candle_ring[i].color.a); + gSPDisplayList(NEXT_POLY_XLU_DISP, rom_kamakura_ring_modelT); + + CLOSE_DISP(game->graph); + } +} + +static Gfx* aKI_MakePrimEnvColorXluDisp(u8 r, u8 g, u8 b, u8 a, u8 f, u8 env_r, u8 env_g, u8 env_b, u8 env_a, GAME* game) { + Gfx* gfx = GRAPH_ALLOC_TYPE(game->graph, Gfx, 4); + + if (gfx != NULL) { + gDPPipeSync(&gfx[0]); + gDPSetPrimColor(&gfx[1], 0, f, r, g, b, a); + gDPSetEnvColor(&gfx[2], env_r, env_g, env_b, env_a); + gSPEndDisplayList(&gfx[3]); + return gfx; + } else { + return NULL; + } +} + +extern u8 rom_kamakura_a1[]; +extern u8 rom_kamakura_a2_rgb_ci4[]; + +static u8* rom_kamakura_evw_anime_4_tex_table[] = { rom_kamakura_a1, rom_kamakura_a2_rgb_ci4 }; + +extern Gfx rom_kamakura_model[]; +extern Gfx rom_kamakura_modelT[]; + +static void aKI_DrawKamakuraIndoorBG(KAMAKURA_INDOOR_ACTOR* k_indoor, GAME* game) { + Gfx* gfx0 = aKI_MakePrimEnvColorXluDisp(k_indoor->candle_fire[0].color.r, k_indoor->candle_fire[0].color.g, k_indoor->candle_fire[0].color.b, k_indoor->candle_fire[0].color.a, 128, 255, 50, 0, 255, game); + Gfx* gfx1 = aKI_MakePrimEnvColorXluDisp(k_indoor->candle_fire[1].color.r, k_indoor->candle_fire[1].color.g, k_indoor->candle_fire[1].color.b, k_indoor->candle_fire[1].color.a, 128, 255, 50, 0, 255, game); + Gfx* scroll_gfx; + + if (gfx0 == NULL || gfx1 == NULL) { + return; + } + + _texture_z_light_fog_prim(game->graph); + _texture_z_light_fog_prim_xlu(game->graph); + Global_kankyo_set_room_prim(game); + + OPEN_DISP(game->graph); + + Matrix_translate(0.0f, 0.0f, 0.0f, 0); + Matrix_scale(0.0625f, 0.0625f, 0.0625f, 1); + + gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPSegment(NEXT_POLY_XLU_DISP, ANIME_2_TXT_SEG, k_indoor->candle_fire[0].tex_p); + gSPSegment(NEXT_POLY_XLU_DISP, ANIME_1_TXT_SEG, gfx0); + gSPSegment(NEXT_POLY_XLU_DISP, ANIME_3_TXT_SEG, k_indoor->candle_fire[1].tex_p); + gSPSegment(NEXT_POLY_XLU_DISP, ANIME_5_TXT_SEG, gfx1); + gSPSegment(NEXT_POLY_OPA_DISP, ANIME_4_TXT_SEG, rom_kamakura_evw_anime_4_tex_table[(game->frame_counter / 6) & 1]); + scroll_gfx = two_tex_scroll_dolphin(game->graph, 0, -game->frame_counter, 0, 32, 16, 1, -game->frame_counter * -1, -(-game->frame_counter * 2), 32, 16); + gSPSegment(NEXT_POLY_XLU_DISP, ANIME_6_TXT_SEG, scroll_gfx); + gSPDisplayList(NEXT_POLY_OPA_DISP, rom_kamakura_model); + gSPDisplayList(NEXT_POLY_XLU_DISP, rom_kamakura_modelT); + + CLOSE_DISP(game->graph); +} + +static void Kamakura_Indoor_Actor_draw(ACTOR* actorx, GAME* game) { + KAMAKURA_INDOOR_ACTOR* k_indoor = (KAMAKURA_INDOOR_ACTOR*)actorx; + + aKI_DrawKamakuraIndoorBG(k_indoor, game); + aKI_DrawKamakuraIndoorCandleRing(k_indoor, game); +} + +// @unused - only used in DnM and DnM+, necessary for float ordering +static f32 aKI_MakeSinPointSquare(void) { + f32 f = cos_s(1); + s16 t = RAD2SHORT_ANGLE2(f); + f32 a = t; + a += (3.14f); + return a; +} + +static f32 aKI_MakeSinPointHalf(s16 start_frame, f32 start, s16 end_frame, f32 end, s16 now_frame) { + if (start_frame > end_frame || start_frame == end_frame) { + return start; + } + + if (now_frame <= start_frame) { + return start; + } + + if (now_frame >= end_frame) { + return end; + } else { + f32 sf = (f32)start_frame; + f32 ef = (f32)end_frame; + f32 m = ef - sf; + f32 midpoint = (start + end) * 0.5f; + f32 nf = (f32)now_frame; + f32 halfpoint = ABS(end - midpoint); + f32 percent = ((nf - sf) * 3.14f) / m; + + if (start >= end) { + return midpoint + cos_s(RAD2SHORT_ANGLE2(percent)) * halfpoint; + } else { + return midpoint + cos_s(RAD2SHORT_ANGLE2(percent)) * -halfpoint; + } + } +} + +typedef struct candle_color_data_s { + s16 frame; + f32 scale; + f32 g; + f32 a; +} aKI_candle_color_data_c; + +typedef struct candle_ring_data_s { + aKI_candle_color_data_c start_col; + aKI_candle_color_data_c end_col; +} aKI_candle_ring_data_c; + +static aKI_candle_ring_data_c aKI_candle_ring_anime_data[] = { + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 0, 95.0f, 230.0f, 100.0f }, { 9, 105.0f, 250.0f, 60.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 9, 105.0f, 250.0f, 60.0f }, { 17, 100.0f, 230.0f, 80.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 17, 100.0f, 230.0f, 80.0f }, { 25, 105.0f, 210.0f, 50.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, + { { 25, 105.0f, 210.0f, 50.0f }, { 33, 95.0f, 230.0f, 100.0f } }, +}; + +typedef struct mochi_anim_s { + s16 frame; + xyz_t scale; + f32 ofs_y; +} aKI_mochi_anim_c; + +typedef struct mochi_anim_data_s { + int type; + aKI_mochi_anim_c start; + aKI_mochi_anim_c end; +} aKI_mochi_anim_data_c; + +static aKI_mochi_anim_data_c aKI_mochi_anime_data[] = { + { 2, { 0, { 70.0f, 40.0f, 70.0f}, -9.0f }, { 240, { 70.0f, 40.0f, 70.0f }, -9.0f } }, + { 0, { 240, { 70.0f, 40.0f, 70.0f}, -9.0f }, { 380, { 85.0f, 75.0f, 85.0f }, -4.5 } }, + { 2, { 380, { 85.0f, 75.0f, 85.0f}, -4.5 }, { 420, { 85.0f, 75.0f, 85.0f }, -4.5 } }, + { 0, { 420, { 85.0f, 75.0f, 85.0f}, -4.5 }, { 600, { 100.0f, 100.0f, 100.0f }, 0.0f } }, + { 2, { 600, { 100.0f, 100.0f, 100.0f}, 0.0f }, { 760, { 100.0f, 100.0f, 100.0f }, 0.0f } }, + { 1, { 760, { 100.0f, 100.0f, 100.0f}, 0.0f }, { 810, { 70.0f, 40.0f, 70.0f }, -9.0f } }, + { 2, { 810, { 70.0f, 40.0f, 70.0f}, -9.0f }, { 970, { 70.0f, 40.0f, 70.0f }, -9.0f } }, + { 0, { 970, { 70.0f, 40.0f, 70.0f}, -9.0f }, { 1210, { 100.0f, 100.0f, 100.0f }, 0.0f } }, + { 2, { 1210, { 100.0f, 100.0f, 100.0f}, 0.0f }, { 1330, { 100.0f, 100.0f, 100.0f }, 0.0f } }, + { 1, { 1330, { 100.0f, 100.0f, 100.0f}, 0.0f }, { 1400, { 70.0f, 40.0f, 70.0f }, -9.0f } }, +}; + +// clang-format off +static rgba_t aKI_candle_fire_rgba_data[] = { + { 255, 220, 0, 180 }, + { 255, 220, 0, 180 }, + { 255, 225, 0, 165 }, + { 255, 225, 0, 165 }, + { 255, 230, 0, 150 }, + { 255, 230, 0, 150 }, + { 255, 225, 0, 165 }, + { 255, 225, 0, 165 }, + { 255, 220, 0, 180 }, + { 255, 220, 0, 180 }, + { 255, 215, 0, 202 }, + { 255, 215, 0, 202 }, + { 255, 210, 0, 225 }, + { 255, 210, 0, 225 }, + { 255, 215, 0, 235 }, + { 255, 215, 0, 235 }, + { 255, 220, 0, 245 }, + { 255, 220, 0, 245 }, + { 255, 225, 0, 222 }, + { 255, 225, 0, 222 }, + { 255, 230, 0, 200 }, + { 255, 230, 0, 200 }, + { 255, 210, 0, 190 }, + { 255, 210, 0, 190 }, +}; +// clang-format on + +extern u8 rom_kamakura_fire1_rgb_i4[]; +extern u8 rom_kamakura_fire2_rgb_i4[]; +extern u8 rom_kamakura_fire3_rgb_i4[]; + +// clang-format off +static u8* aKI_candle_fire_anime_data[] = { + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire3_rgb_i4, + rom_kamakura_fire3_rgb_i4, + rom_kamakura_fire3_rgb_i4, + rom_kamakura_fire3_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire2_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire1_rgb_i4, + rom_kamakura_fire1_rgb_i4, +}; +// clang-format on + +static void Kamakura_Indoor_Actor_move(ACTOR* actorx, GAME* game) { + KAMAKURA_INDOOR_ACTOR* k_indoor = (KAMAKURA_INDOOR_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + aKI_candle_ring_c* ring_p = k_indoor->candle_ring; + aKI_candle_fire_c* fire_p = k_indoor->candle_fire; + u32 counter = game->frame_counter; + static u32 candle_ring_late_frame[] = { 0, 7 }; + static u32 candle_fire_late_frame[] = { 0, 6 }; + int i; + s16 timer; + + sAdo_OngenPos((u32)actorx, NA_SE_54, &k_indoor->mochi.pos); + if ((play->game_frame & 7) == 0) { + xyz_t soba_yuge_pos = k_indoor->mochi.pos; + + soba_yuge_pos.y += 42.0f; + eEC_CLIP->effect_make_proc(eEC_EFFECT_SOBA_YUGE, soba_yuge_pos, 1, 0, game, RSV_NO, 14, 1); + } + + for (i = 0; i < aKI_CANDLE_NUM; i++) { + s16 type; + + type = (counter - candle_ring_late_frame[i & 1]) % 34; + ring_p->color.r = 255; + ring_p->color.g = ABS(aKI_MakeSinPointHalf(aKI_candle_ring_anime_data[type].start_col.frame, aKI_candle_ring_anime_data[type].start_col.g, aKI_candle_ring_anime_data[type].end_col.frame, aKI_candle_ring_anime_data[type].end_col.g, type)); + ring_p->color.b = 0; + ring_p->color.a = ABS(aKI_MakeSinPointHalf(aKI_candle_ring_anime_data[type].start_col.frame, aKI_candle_ring_anime_data[type].start_col.a, aKI_candle_ring_anime_data[type].end_col.frame, aKI_candle_ring_anime_data[type].end_col.a, type)); + ring_p->scale = aKI_MakeSinPointHalf(aKI_candle_ring_anime_data[type].start_col.frame, aKI_candle_ring_anime_data[type].start_col.scale, aKI_candle_ring_anime_data[type].end_col.frame, aKI_candle_ring_anime_data[type].end_col.scale, type); + ring_p++; + + type = (counter - candle_fire_late_frame[i & 1]) % 24; + fire_p->tex_p = aKI_candle_fire_anime_data[type]; + fire_p->color = aKI_candle_fire_rgba_data[type]; + fire_p++; + } +} diff --git a/src/actor/ac_my_indoor.c b/src/actor/ac_my_indoor.c index a438ed1f..11fd0d32 100644 --- a/src/actor/ac_my_indoor.c +++ b/src/actor/ac_my_indoor.c @@ -405,10 +405,9 @@ static void aMI_DrawMyStep(ACTOR* actorx, GAME* game) { }; MY_INDOOR_ACTOR* my_indoor = (MY_INDOOR_ACTOR*)actorx; - GAME_PLAY* play = (GAME_PLAY*)game; int i; - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); _texture_z_light_fog_prim(game->graph); for (i = 0; i < aMI_STEP_TYPE_NUM; i++) { @@ -436,7 +435,6 @@ static void aMI_DrawMyStep(ACTOR* actorx, GAME* game) { static void aMI_DrawMyFloor(ACTOR* actorx, GAME* game) { MY_INDOOR_ACTOR* my_indoor = (MY_INDOOR_ACTOR*)actorx; - GAME_PLAY* play = (GAME_PLAY*)game; GRAPH* graph; aMI_bank_c* bank = &my_indoor->banks[my_indoor->floor_bank_idx]; u8* data_p = bank->floor_data_p; @@ -446,7 +444,7 @@ static void aMI_DrawMyFloor(ACTOR* actorx, GAME* game) { u8* tex3 = data_p + aMI_PAL_SIZE + 3 * aMI_TEX_SIZE; aMI_disp_wall_floor_c* disp_info = &aMI_size_dsp_table[my_indoor->room_kind].main; - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); if (disp_info->floor_model != NULL) { graph = game->graph; @@ -596,7 +594,7 @@ static void aMI_DrawMyOriginalFloor(ACTOR* actorx, GAME* game) { disp = &aMI_size_dsp_table[my_indoor->room_kind].new2; } - Global_kankyo_set_room_prim((GAME_PLAY*)game); + Global_kankyo_set_room_prim(game); if (disp->floor_model != NULL) { graph = game->graph; @@ -627,7 +625,6 @@ static void aMI_DrawMyOriginalFloor(ACTOR* actorx, GAME* game) { static void aMI_DrawMyWall(ACTOR* actorx, GAME* game) { MY_INDOOR_ACTOR* my_indoor = (MY_INDOOR_ACTOR*)actorx; - GAME_PLAY* play = (GAME_PLAY*)game; GRAPH* graph; aMI_bank_c* bank = &my_indoor->banks[my_indoor->wall_bank_idx]; u8* data_p = bank->wall_data_p; @@ -636,7 +633,7 @@ static void aMI_DrawMyWall(ACTOR* actorx, GAME* game) { u8* tex1 = data_p + aMI_PAL_SIZE + 1 * aMI_TEX_SIZE; aMI_disp_wall_floor_c* disp_info = &aMI_size_dsp_table[my_indoor->room_kind].main; - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); if (disp_info->wall_model != NULL) { graph = game->graph; @@ -678,7 +675,7 @@ static void aMI_DrawMyOriginalWall(ACTOR* actorx, GAME* game) { disp = &aMI_size_dsp_table[my_indoor->room_kind].new2; } - Global_kankyo_set_room_prim((GAME_PLAY*)game); + Global_kankyo_set_room_prim(game); if (disp->wall_model != NULL) { graph = game->graph; diff --git a/src/actor/ac_shop_indoor.c b/src/actor/ac_shop_indoor.c index 82ab4638..af06714a 100644 --- a/src/actor/ac_shop_indoor.c +++ b/src/actor/ac_shop_indoor.c @@ -286,7 +286,6 @@ static void aSI_DrawShopFloor(ACTOR* actorx, GAME* game) { u8* tex1; u8* tex2; u8* tex3; - GAME_PLAY* play = (GAME_PLAY*)game; pal = (u16*)shop_indoor->floor_data_p[data_idx]; tex0 = (u8*)(shop_indoor->floor_data_p[data_idx] + aMI_PAL_SIZE); @@ -296,7 +295,7 @@ static void aSI_DrawShopFloor(ACTOR* actorx, GAME* game) { _texture_z_light_fog_prim_xlu(game->graph); _texture_z_light_fog_prim(game->graph); - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); if (shop_indoor->floor_data_p[data_idx] != NULL) { if (aSI_disp_data_table[shop_level].floor_gfx != NULL) { @@ -359,7 +358,7 @@ static void aSI_DrawShopFukubiki(ACTOR* actorx, GAME* game) { Matrix_scale(0.0625f, 0.0625f, 0.0625f, 1); gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); gSPDisplayList(NEXT_POLY_OPA_DISP, aSI_disp_data_table[shop_level].fukubiki_gfx); CLOSE_DISP(game->graph); @@ -409,7 +408,7 @@ static void aSI_DrawShopWall(ACTOR* actorx, GAME* game) { Matrix_scale(0.0625f, 0.0625f, 0.0625f, 1); gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); gSPDisplayList(NEXT_POLY_OPA_DISP, aSI_disp_data_table[shop_level].wall_gfx); CLOSE_DISP(game->graph); @@ -431,7 +430,7 @@ static void aSI_DrawShopWall(ACTOR* actorx, GAME* game) { Matrix_scale(0.0625f, 0.0625f, 0.0625f, 1); gSPMatrix(NEXT_POLY_XLU_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim(game); gSPDisplayList(NEXT_POLY_XLU_DISP, aSI_disp_data_table[shop_level].wall_xlu_gfx); CLOSE_DISP(game->graph); diff --git a/src/effect/ef_room_sunshine_minsect.c b/src/effect/ef_room_sunshine_minsect.c index 5e88f9db..980ee1d7 100644 --- a/src/effect/ef_room_sunshine_minsect.c +++ b/src/effect/ef_room_sunshine_minsect.c @@ -209,7 +209,7 @@ static void BG_draw_Minsect(ACTOR* actor, GAME_PLAY* play) { graph = play->game.graph; Matrix_scale(0.0625f, 0.0625f, 0.0625f, 0); - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim((GAME*)play); OPEN_DISP(graph); gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(play->game.graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(NEXT_POLY_OPA_DISP, rom_museum4_ue_model); @@ -222,7 +222,7 @@ static void BG_draw_Minsect_niwa(ACTOR* actor, GAME_PLAY* play) { graph = play->game.graph; Matrix_scale(0.0625f, 0.0625f, 0.0625f, 0); - Global_kankyo_set_room_prim(play); + Global_kankyo_set_room_prim((GAME*)play); OPEN_DISP(graph); gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(play->game.graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(NEXT_POLY_OPA_DISP, rom_museum4_model); diff --git a/src/game/m_kankyo.c b/src/game/m_kankyo.c index fb857523..a4f64953 100644 --- a/src/game/m_kankyo.c +++ b/src/game/m_kankyo.c @@ -1929,16 +1929,16 @@ extern void mEnv_GetRoomPrimColor(u8* r, u8* g, u8* b, GAME_PLAY* play) { b[0] = color[2]; } -extern void Global_kankyo_set_room_prim(GAME_PLAY* play) { +extern void Global_kankyo_set_room_prim(GAME* game) { u8 r; u8 g; u8 b; GRAPH* graph; - mEnv_GetRoomPrimColor(&r, &g, &b, play); + mEnv_GetRoomPrimColor(&r, &g, &b, (GAME_PLAY*)game); { - graph = play->game.graph; + graph = game->graph; OPEN_DISP(graph); gDPPipeSync(NOW_POLY_OPA_DISP++);