diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 698b5e42..bfe92bd4 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -331,6 +331,10 @@ ac_t_cracker.c: .text: [0x804A81F0, 0x804A8454] .rodata: [0x80645EA8, 0x80645EB0] .data: [0x8068EBC8, 0x8068EC28] +ac_t_flag.c: + .text: [0x804A8454, 0x804A8834] + .rodata: [0x80645EB0, 0x80645EC8] + .data: [0x8068EC28, 0x8068EC50] ac_t_pistol.c: .text: [0x804A95F4, 0x804A9858] .rodata: [0x80645EF8, 0x80645F00] diff --git a/include/ac_t_flag.h b/include/ac_t_flag.h index 842eec5e..6cbf75c0 100644 --- a/include/ac_t_flag.h +++ b/include/ac_t_flag.h @@ -3,6 +3,7 @@ #include "types.h" #include "m_actor.h" +#include "ac_tools.h" #ifdef __cplusplus extern "C" { @@ -10,6 +11,17 @@ extern "C" { extern ACTOR_PROFILE T_Flag_Profile; +typedef struct t_flag_s{ + TOOLS_ACTOR tools_class; + u32 unk1C4; + u32 unk1C8; + s16 angle; + s16 addendedang; + int unk1D0; + xyz_t work; +}FLAG_ACTOR; + + #ifdef __cplusplus } #endif diff --git a/include/m_actor.h b/include/m_actor.h index 0303dbed..ac10b78a 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -33,6 +33,7 @@ typedef void (*mActor_proc)(ACTOR*, GAME*); #define ACTOR_OBJ_BANK_NONE 0 #define ACTOR_OBJ_BANK_3 3 /* TODO: rename, also likely an enum */ +#define ACTOR_OBJ_BANK_6 6 #define ACTOR_OBJ_BANK_7 7 #define ACTOR_OBJ_BANK_10 10 #define ACTOR_OBJ_BANK_11 11 diff --git a/rel/ac_t_flag.c b/rel/ac_t_flag.c new file mode 100644 index 00000000..f43be835 --- /dev/null +++ b/rel/ac_t_flag.c @@ -0,0 +1,154 @@ +#include "ac_t_flag.h" + +#include "m_rcp.h" +#include "evw_anime.h" +#include "sys_matrix.h" +#include "m_name_table.h" + +static void aTFL_actor_draw(ACTOR*, GAME*); + +ACTOR_PROFILE T_Flag_Profile = { + mAc_PROFILE_T_FLAG, + ACTOR_PART_BG, + ACTOR_STATE_NO_MOVE_WHILE_CULLED | ACTOR_STATE_NO_DRAW_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_6, + sizeof(FLAG_ACTOR), + NONE_ACTOR_PROC, + NONE_ACTOR_PROC, + NONE_ACTOR_PROC, + aTFL_actor_draw, + NULL, +}; + +extern Vtx tol_hata_01_v[15]; +extern Gfx tol_hata_e_model[]; +extern Gfx tol_hata_hataT_model[]; +extern EVW_ANIME_DATA tol_hata_01_evw_anime[]; + +static void aTFL_calc_angl(s16* dst, s16 fact, s16* addend, s16 addval){ + + if(fact < *dst){ + *addend -= 0x3C0; + if(*addend < -addval){ + *addend = -addval; + } + } + else{ + *addend += 0x1E0; + if(*addend > addval){ + *addend = addval; + } + + } + + *dst += *addend; +} + + +static void aTFL_make_vtx(Vtx* v, ACTOR* actor){ + FLAG_ACTOR* flag = (FLAG_ACTOR*)actor; + TOOLS_ACTOR* tools = (TOOLS_ACTOR*)actor; + + xyz_t pos; + s16 fact; + + s16 obx; + f32 sins; + s16 pre; + s16 t; + + + fact = 0; + if(tools->enable == 1){ + Matrix_put(&flag->tools_class.matrix_work); + Matrix_translate(0.0f,0.0f,48.0999984741f,1); + Matrix_Position_Zero(&pos); + if(flag->unk1D0 == 0){ + xyz_t_move(&flag->work, &pos); + flag->unk1D0 = 1; + } + else{ + fact = atans_table( pos.y - flag->work.y, -(pos.x - flag->work.x)); + xyz_t_move(&flag->work, &pos); + } + } + + mem_copy((u8*)v, (u8*)tol_hata_01_v, sizeof(tol_hata_01_v)); + aTFL_calc_angl(&flag->angle, fact, &flag->addendedang, 0x9C4); + obx = (v[9].v.ob[0] * cos_s(flag->angle)); + sins = sin_s(flag->angle); + pre = v[9].v.ob[0]; + + v[9].v.ob[0] = obx; + t = pre * sins; + v[9].v.ob[1] = t; + v[12].v.ob[0] = obx; + v[12].v.ob[1] = t; + + obx = (v[10].v.ob[0] * cos_s(flag->angle)); + sins = sin_s(flag->angle); + pre = v[10].v.ob[0]; + + v[10].v.ob[0] = obx; + t = pre * sins; + v[10].v.ob[1] = t; + v[11].v.ob[0] = obx; + v[11].v.ob[1] = t; +} + +static void aTFL_actor_draw(ACTOR* actor, GAME* game){ + FLAG_ACTOR* flag = (FLAG_ACTOR*)actor; + TOOLS_ACTOR* tools = (TOOLS_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; + GRAPH* graph = game->graph; + + Vtx* buf; + + buf = GRAPH_ALLOC_TYPE(graph, Vtx, 15); + + if(buf != NULL){ + aTFL_make_vtx(buf, &tools->actor_class); + } + else{ + buf = tol_hata_01_v; + } + + if(tools->enable == 1){ + Matrix_put(&flag->tools_class.matrix_work); + Matrix_Position_Zero(&actor->world.position); + tools->enable = 0; + } + else{ + Matrix_translate(actor->world.position.x, actor->world.position.y, + actor->world.position.z, FALSE); + Matrix_scale(0.01f, 0.01f, 0.01f, TRUE); + } + + OPEN_DISP(graph); + { + Gfx* gfxp; + + _texture_z_light_fog_prim_npc(graph); + gfxp = NOW_POLY_OPA_DISP; + gSPMatrix(gfxp++, _Matrix_to_Mtx_new(graph),G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfxp++, tol_hata_e_model); + SET_POLY_OPA_DISP(gfxp); + + Evw_Anime_Set(play, tol_hata_01_evw_anime); + } + { + Gfx* gfxp; + _texture_z_light_fog_prim_xlu(graph); + gfxp = NOW_POLY_XLU_DISP; + gSPMatrix(gfxp++, _Matrix_to_Mtx_new(graph),G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + gSPSegment(gfxp++, 0x0A, buf); + gSPDisplayList(gfxp++, tol_hata_hataT_model); + + SET_POLY_XLU_DISP(gfxp); + + } + CLOSE_DISP(graph); + +} \ No newline at end of file