From 3e1ea2569ef4db0f2de07d8974d49ee1c0ad3014 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Mon, 30 Oct 2023 20:15:35 +0100 Subject: [PATCH] link m_player_call --- config/rel_slices.yml | 4 +++ include/m_actor.h | 3 ++ include/m_player.h | 5 ++++ include/m_submenu.h | 2 ++ rel/m_player_call.c | 68 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 rel/m_player_call.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 2d7bf35f..26ab6766 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -195,6 +195,10 @@ m_olib.c: .rodata: [0x80642A00, 0x80642A10] m_pause.c: .text: [0x803D8A34, 0x803D8AEC] +m_player_call.c: + .text: [0x803D8AEC, 0x803D8CEC] + .data: [0x8065B9A0, 0x8065B9C8] + .bss: [0x8129CC98, 0x8129CCA8] m_police_box.c: .text: [0x803DE8A0, 0x803DEE38] .rodata: [0x806431C8, 0x806431D8] diff --git a/include/m_actor.h b/include/m_actor.h index 4a64d51d..f8c90101 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -21,6 +21,8 @@ typedef void (*mActor_proc)(ACTOR*, GAME*); #define mAc_MAX_ACTORS 200 #define ACTOR_STATE_NONE 0 +#define ACTOR_STATE_0 (1 << 0) +#define ACTOR_STATE_2 (1 << 2) #define ACTOR_STATE_NO_MOVE_WHILE_CULLED (1 << 4) #define ACTOR_STATE_NO_DRAW_WHILE_CULLED (1 << 5) #define ACTOR_STATE_NO_CULL (1 << 6) @@ -29,6 +31,7 @@ typedef void (*mActor_proc)(ACTOR*, GAME*); #define ACTOR_STATE_LIGHTING (1 << 22) // does lighting NOT affect this actor? #define ACTOR_STATE_24 (1 << 24) #define ACTOR_STATE_25 (1 << 25) +#define ACTOR_STATE_26 (1 << 26) #define ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES (1 << 29) diff --git a/include/m_player.h b/include/m_player.h index 278f0293..9f618e90 100644 --- a/include/m_player.h +++ b/include/m_player.h @@ -80,6 +80,11 @@ struct player_actor_s { /* TODO: finish */ }; +void Player_actor_ct(ACTOR*, GAME*); +void Player_actor_dt(ACTOR*, GAME*); +void Player_actor_move(ACTOR*, GAME*); +void Player_actor_draw(ACTOR*, GAME*); + #ifdef __cplusplus } #endif diff --git a/include/m_submenu.h b/include/m_submenu.h index 8ed7c7d4..dc76f102 100644 --- a/include/m_submenu.h +++ b/include/m_submenu.h @@ -104,6 +104,8 @@ struct submenu_s { }; extern void mSM_open_submenu(Submenu* submenu, int menu_type, int arg0, int arg1); +extern void load_player(Submenu* submenu); +extern void* mSM_ovlptr_dllcnv(void* vram, Submenu* submenu, int); extern void mSM_submenu_dt(Submenu*); extern void mSM_submenu_ovlptr_cleanup(Submenu*); extern void mSM_submenu_ovlptr_init(GAME_PLAY*); diff --git a/rel/m_player_call.c b/rel/m_player_call.c new file mode 100644 index 00000000..1b010915 --- /dev/null +++ b/rel/m_player_call.c @@ -0,0 +1,68 @@ +#include "m_player_call.h" + +#include "m_player.h" +#include "m_name_table.h" +#include "m_play.h" + +mActor_proc Player_actor_ct_func; +mActor_proc Player_actor_dt_func; +mActor_proc Player_actor_move_func; +mActor_proc Player_actor_draw_func; + +void Player_actor_ct_call(ACTOR* actor, GAME* game); +void Player_actor_dt_call(ACTOR* actor, GAME* game); +void Player_actor_move_call(ACTOR* actor, GAME* game); +void Player_actor_draw_call(ACTOR* actor, GAME* game); + +ACTOR_PROFILE Player_Profile = { + mAc_PROFILE_PLAYER, + ACTOR_PART_PLAYER, + ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES | ACTOR_STATE_26 | ACTOR_STATE_25 | + ACTOR_STATE_NO_MOVE_WHILE_CULLED | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_2 | ACTOR_STATE_0, + EMPTY_NO, + ACTOR_OBJ_BANK_KEEP, + sizeof(PLAYER_ACTOR), + Player_actor_ct_call, + Player_actor_dt_call, + Player_actor_move_call, + Player_actor_draw_call, + NULL, +}; + +void initfunc(GAME_PLAY* play){ + Submenu* submenu = &play->submenu; + + Player_actor_ct_func = mSM_ovlptr_dllcnv(&Player_actor_ct, submenu , 1); + Player_actor_dt_func = mSM_ovlptr_dllcnv(&Player_actor_dt, submenu, 1); + Player_actor_move_func = mSM_ovlptr_dllcnv(&Player_actor_move, submenu,1); + Player_actor_draw_func = mSM_ovlptr_dllcnv(&Player_actor_draw, submenu,1); +} + +static void Player_actor_ct_call(ACTOR* actor, GAME* game){ + GAME_PLAY* play = (GAME_PLAY*)game; + + load_player(&play->submenu); + initfunc(play); + Player_actor_ct_func(actor, game); +} + +static void Player_actor_dt_call(ACTOR* actor, GAME* game){ + GAME_PLAY* play = (GAME_PLAY*)game; + + load_player(&play->submenu); + Player_actor_dt_func(actor, game); +} + +static void Player_actor_move_call(ACTOR* actor, GAME* game){ + GAME_PLAY* play = (GAME_PLAY*)game; + + load_player(&play->submenu); + Player_actor_move_func(actor, game); +} + +static void Player_actor_draw_call(ACTOR* actor, GAME* game){ + GAME_PLAY* play = (GAME_PLAY*)game; + + load_player(&play->submenu); + Player_actor_draw_func(actor, game); +}