From 6f1c8931b2faaae1d77ac7e18ec63574d0bceae7 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Thu, 7 Dec 2023 18:21:42 -0500 Subject: [PATCH] Implement & link ac_t_tumbler --- config/rel_slices.yml | 4 ++ include/ac_t_tumbler.h | 14 +++++ include/m_actor.h | 2 +- rel/ac_t_tumbler.c | 120 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 rel/ac_t_tumbler.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index aecd51fb..73505ad8 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -460,6 +460,10 @@ ac_t_pistol.c: .text: [0x804A95F4, 0x804A9858] .rodata: [0x80645EF8, 0x80645F00] .data: [0x8068EE98, 0x8068EEF8] +ac_t_tumbler.c: + .text: [0x804A9CC4, 0x804A9F24] + .rodata: [0x80645F10, 0x80645F18] + .data: [0x8068EFE0, 0x8068F040] ac_tools.c: .text: [0x804AC034, 0x804AC2D8] .rodata: [0x80645F90, 0x80645F98] diff --git a/include/ac_t_tumbler.h b/include/ac_t_tumbler.h index b2dbf466..ae396c69 100644 --- a/include/ac_t_tumbler.h +++ b/include/ac_t_tumbler.h @@ -3,11 +3,25 @@ #include "types.h" #include "m_actor.h" +#include "ac_tools.h" #ifdef __cplusplus extern "C" { #endif +typedef struct tool_tumbler_s TOOL_TUMBLER_ACTOR; +typedef void (*aTTB_ACTION_PROC)(TOOL_TUMBLER_ACTOR*); + +struct tool_tumbler_s { + TOOLS_ACTOR tools_class; + aTTB_ACTION_PROC action_proc; + int action; +}; + +extern void aTTB_actor_ct(ACTOR* actorx, GAME* game); +extern void aTTB_actor_move(ACTOR* actorx, GAME* game); +extern void aTTB_actor_draw(ACTOR* actorx, GAME* game); + extern ACTOR_PROFILE T_Tumbler_Profile; #ifdef __cplusplus diff --git a/include/m_actor.h b/include/m_actor.h index 5418d0ad..8c3ae3a4 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -410,7 +410,7 @@ typedef enum bank_id { ACTOR_OBJ_BANK_368, ACTOR_OBJ_BANK_369, ACTOR_OBJ_BANK_NPC_SAO, - ACTOR_OBJ_BANK_371, + ACTOR_OBJ_BANK_TUMBLER, ACTOR_OBJ_BANK_372, ACTOR_OBJ_BANK_373, ACTOR_OBJ_BANK_374, diff --git a/rel/ac_t_tumbler.c b/rel/ac_t_tumbler.c new file mode 100644 index 00000000..8560ee08 --- /dev/null +++ b/rel/ac_t_tumbler.c @@ -0,0 +1,120 @@ +#include "ac_t_tumbler.h" + +#include "m_name_table.h" +#include "sys_matrix.h" + +ACTOR_PROFILE T_Tumbler_Profile = { + mAc_PROFILE_T_TUMBLER, + ACTOR_PART_BG, + ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_TUMBLER, + sizeof(TOOL_TUMBLER_ACTOR), + &aTTB_actor_ct, + NONE_ACTOR_PROC, + &aTTB_actor_move, + &aTTB_actor_draw, + NULL +}; + +static void aTTB_setupAction(TOOL_TUMBLER_ACTOR* tumbler_actor, int action); + +extern void aTTB_actor_ct(ACTOR* actorx, GAME* game) { + TOOL_TUMBLER_ACTOR* tumbler = (TOOL_TUMBLER_ACTOR*)actorx; + + aTTB_setupAction(tumbler, 1); +} + +static void aTTB_calc_scale(TOOL_TUMBLER_ACTOR* tumbler_actor, int goal_idx) { + static f32 aim[] = { 1.0f, 0.0f }; + + f32 scale = tumbler_actor->tools_class.actor_class.scale.x; + + chase_f(&scale, aim[goal_idx], 0.05f); + tumbler_actor->tools_class.actor_class.scale.x = scale; + tumbler_actor->tools_class.actor_class.scale.y = scale; + tumbler_actor->tools_class.actor_class.scale.z = scale; +} + +static void aTTB_takeout(TOOL_TUMBLER_ACTOR* tumbler_actor) { + aTTB_calc_scale(tumbler_actor, 0); +} + +static void aTTB_putaway(TOOL_TUMBLER_ACTOR* tumbler_actor) { + aTTB_calc_scale(tumbler_actor, 1); +} + +static void aTTB_destruct(TOOL_TUMBLER_ACTOR* tumbler_actor) { + Actor_delete((ACTOR*)tumbler_actor); +} + +static void aTTB_setupAction(TOOL_TUMBLER_ACTOR* tumbler_actor, int action) { + static aTTB_ACTION_PROC process[] = { + (aTTB_ACTION_PROC)&none_proc1, + &aTTB_takeout, + &aTTB_putaway, + &aTTB_destruct, + (aTTB_ACTION_PROC)&none_proc1, + NULL + }; + + static f32 start_scale[] = { + 0.0f, + 0.0f, + 1.0f, + 1.0f, + 1.0f, + 0.0f + }; + + f32 scale; + + tumbler_actor->action_proc = process[action]; + tumbler_actor->action = action; + + scale = start_scale[action]; + tumbler_actor->tools_class.actor_class.scale.x = scale; + tumbler_actor->tools_class.actor_class.scale.y = scale; + tumbler_actor->tools_class.actor_class.scale.z = scale; +} + +extern void aTTB_actor_move(ACTOR* actorx, GAME* game) { + TOOL_TUMBLER_ACTOR* tumbler = (TOOL_TUMBLER_ACTOR*)actorx; + + if (tumbler->tools_class.work0 != tumbler->action) { + aTTB_setupAction(tumbler, tumbler->tools_class.work0); + } + + (*tumbler->action_proc)(tumbler); +} + +extern Gfx tol_kamicup_1T_model[]; + +extern void aTTB_actor_draw(ACTOR* actorx, GAME* game) { + TOOL_TUMBLER_ACTOR* tumbler = (TOOL_TUMBLER_ACTOR*)actorx; + GRAPH* graph = game->graph; + + Gfx* gfx; + + if (tumbler->tools_class.init_matrix == TRUE) { + Matrix_put(&tumbler->tools_class.matrix_work); + Matrix_Position_Zero(&actorx->world.position); + tumbler->tools_class.init_matrix = FALSE; + } + else { + Matrix_translate(actorx->world.position.x, actorx->world.position.y, actorx->world.position.z, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + } + + Matrix_scale(actorx->scale.x, actorx->scale.y, actorx->scale.z, 1); + _texture_z_light_fog_prim_npc(graph); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, tol_kamicup_1T_model); + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +}