From 2116c81aacfc69b1fa524db45cdfbed4468e2035 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Mon, 30 Oct 2023 11:53:05 +0000 Subject: [PATCH] link ac_dump --- config/rel_slices.yml | 4 + include/ac_dump.h | 14 +++ rel/ac_dump.c | 217 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 rel/ac_dump.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index a5ee8922..2d7bf35f 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -487,6 +487,10 @@ ac_douzou.c: .text: [0x805AD6D8, 0x805AE704] .rodata: [0x8064A7C0, 0x8064A7E8] .data: [0x806C4DF0, 0x806C5018] +ac_dump.c: + .text: [0x805AE704, 0x805AECE8] + .rodata: [0x8064A7E8,0x8064A808] + .data: [0x806C5018, 0x806C5120] ac_radio.c: .text: [0x805B887C,0x805B8C7C] .rodata: [0x8064AB58,0x8064AB68] diff --git a/include/ac_dump.h b/include/ac_dump.h index 0310f0f7..5d05cfe5 100644 --- a/include/ac_dump.h +++ b/include/ac_dump.h @@ -10,6 +10,20 @@ extern "C" { extern ACTOR_PROFILE Dump_Profile; +typedef struct actor_dump_s DUMP_ACTOR; + +typedef void (*DUMP_PROC)(DUMP_ACTOR*, GAME_PLAY*); + +struct actor_dump_s{ + ACTOR actor_class; + u8 pad[0x2A0 - 0x174]; + DUMP_PROC proc; + u8 pad2[0x2B4 - 0x2A4]; + int current_action; + u8 pad3[0x2D8 - 0x2B8]; + int season; +}; + #ifdef __cplusplus } #endif diff --git a/rel/ac_dump.c b/rel/ac_dump.c new file mode 100644 index 00000000..e1e1fc23 --- /dev/null +++ b/rel/ac_dump.c @@ -0,0 +1,217 @@ +#include "ac_dump.h" + +#include "m_name_table.h" +#include "m_rcp.h" +#include "sys_matrix.h" +#include "m_player_lib.h" +#include "m_common_data.h" + +extern Gfx dump_s_DL_model[]; +extern Gfx dump_w_DL_model[]; + +extern Vtx obj_dump_shadow_v[]; +extern Gfx obj_dump_shadowT_model[]; + +static void aDUM_actor_ct(ACTOR* actor, GAME* game); +static void aDUM_actor_dt(ACTOR* actor, GAME* game); +static void aDUM_actor_init(ACTOR* actor, GAME* game); +static void aDUM_actor_draw(ACTOR* actor, GAME* game); + +ACTOR_PROFILE Dump_Profile = { + mAc_PROFILE_DUMP, + ACTOR_PART_ITEM, + ACTOR_STATE_TA_SET | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + DUMP, + ACTOR_OBJ_BANK_KEEP, + sizeof(DUMP_ACTOR), + aDUM_actor_ct, + aDUM_actor_dt, + aDUM_actor_init, + aDUM_actor_draw, + NULL, +}; + +u8 aDUM_shadow_vtx_fix_flg_table[] = { + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, + 1,0,0,1, +}; + +bIT_ShadowData_c aDUM_shadow_data = { + 48, + aDUM_shadow_vtx_fix_flg_table, + 60.0f, + obj_dump_shadow_v, + obj_dump_shadowT_model, +}; + +static void aDUM_set_bgOffset(DUMP_ACTOR*, int); +static void aDUM_setup_action(DUMP_ACTOR*, int); + +static void aDUM_actor_ct(ACTOR* actor, GAME* game){ + DUMP_ACTOR* dump = (DUMP_ACTOR*)actor; + + dump->season = Common_Get(time.season); + aDUM_set_bgOffset(dump,1); + aDUM_setup_action(dump,0); + actor->world.position.x -= 40.0f; +} + +static void aDUM_actor_dt(ACTOR* actor, GAME* game){ + + actor->world.position.x += 40.0f; +} + +static void aDUM_set_bgOffset_sub(DUMP_ACTOR* dump, int x, int z, s16 mode){ + static int flag_tbl[6][6] = { + 1,1,0,0,1,1, + 1,0,0,0,0,1, + 1,0,0,0,0,1, + 1,0,0,0,0,1, + 1,0,0,0,0,1, + 1,1,1,1,1,1, + }; + xyz_t pos; + + pos.x = dump->actor_class.home.position.x - (x * 40); + pos.y = dump->actor_class.home.position.y; + pos.z = dump->actor_class.home.position.z - (z * 40); + + if(flag_tbl[z][x] != 0){ + mCoBG_SetPlussOffset(pos, mode, 100); + } +} + + +static void aDUM_set_bgOffset(DUMP_ACTOR* dump, int s){ + s16 mode = s ? 4 : 4; + int i; + for (i = 0; i < 6; i++) { + aDUM_set_bgOffset_sub(dump,0,i,mode); + aDUM_set_bgOffset_sub(dump,1,i,mode); + aDUM_set_bgOffset_sub(dump,2,i,mode); + aDUM_set_bgOffset_sub(dump,3,i,mode); + aDUM_set_bgOffset_sub(dump,4,i,mode); + aDUM_set_bgOffset_sub(dump,5,i,mode); + } +} + +static void aDUM_set_talk_info(ACTOR* actor){ + rgba_t color; + + mDemo_Set_msg_num(0x136A); + mDemo_Set_talk_display_name(0); + mDemo_Set_camera(1); + mPlib_Set_able_hand_all_item_in_demo(1); + mDemo_Set_ListenAble(); + + color.r = 185; + color.g = 60; + color.b = 40; + color.a = 255; + mDemo_Set_talk_window_color(&color); +} + + +static void aDUM_wait(DUMP_ACTOR* dump, GAME_PLAY* play){ + ACTOR* actor = &dump->actor_class; + + PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); + xyz_t pos; + + xyz_t_move(&pos, &actor->world.position); + + if ((mDemo_Check(7, actor) != 1) && (player != NULL) && (mDemo_Get_talk_actor() == NULL)) { + + if(player->actor_class.world.position.z >= pos.z){ + + if(ABS(actor->player_angle_y) < 0x2000){ + mDemo_Request(7, actor, aDUM_set_talk_info); + } + } + } +} + +static void aDUM_setup_action(DUMP_ACTOR* dump, int action){ + static DUMP_PROC process[] = {aDUM_wait}; + + dump->proc = process[action]; + dump->current_action = action; +} + + +static void aDUM_actor_move(ACTOR* actor, GAME* game){ + GAME_PLAY* play = (GAME_PLAY*)game; + DUMP_ACTOR* dump = (DUMP_ACTOR*) actor; + + PLAYER_ACTOR* player = get_player_actor_withoutCheck(play); + + int dbx, dbz, pbx, pbz; + + mFI_Wpos2BlockNum(&dbx, &dbz, actor->world.position); + mFI_Wpos2BlockNum(&pbx, &pbz, player->actor_class.world.position); + + if ((mDemo_Check(1, &player->actor_class) == 0) && (mDemo_Check(5, &player->actor_class) == 0) && (mDemo_Check(0x10, &player->actor_class) == 0) && ((dbx != pbx) || (dbz != pbz))) { + Actor_delete(actor); + } + else{ + dump->proc(dump, play); + } +} + +static void aDUM_actor_init(ACTOR* actor, GAME* game){ + DUMP_ACTOR* dump = (DUMP_ACTOR*)actor; + + mFI_SetFG_common(0xF115, actor->home.position, 0); + aDUM_actor_move(actor, game); + actor->mv_proc = aDUM_actor_move; +} + + + +static void aDUM_actor_draw(ACTOR* actor, GAME* game){ + static Gfx* model[] = {dump_s_DL_model, dump_w_DL_model}; + DUMP_ACTOR* dump = (DUMP_ACTOR*)actor; + + GRAPH* graph = game->graph; + u16* pal; + int type; + Gfx* gfx; + Mtx* cur; + + type = dump->season == mTM_SEASON_WINTER; + pal = Common_Get(clip.structure_clip)->get_pal_segment_proc(aSTR_PAL_DUMP); + + _texture_z_light_fog_prim_npc(graph); + + OPEN_DISP(graph); + + gfx = NOW_POLY_OPA_DISP; + gSPSegment(gfx++, 0x8, pal); + + + Matrix_translate(-6000.0f, 0.0f,-10000.0f, 1); + + cur =_Matrix_to_Mtx_new(graph); + + if(cur != NULL){ + gSPMatrix(gfx++, cur,G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, model[type]); + SET_POLY_OPA_DISP(gfx); + } + + (*Common_Get(clip).bg_item_clip->draw_shadow_proc)(game, &aDUM_shadow_data, FALSE); + + CLOSE_DISP(graph); + + +} \ No newline at end of file