diff options
| author | Prakxo <87568477+Prakxo@users.noreply.github.com> | 2024-09-26 16:39:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-26 07:39:38 -0700 |
| commit | bd553a1ca83a6135604920e8f073ebe29122bc5a (patch) | |
| tree | a84c34487578cfae9ddab32c4e43ea83fc932e60 | |
| parent | 5fb92a5079f8e2ccf67d5593236a62dff6cd3638 (diff) | |
m_player controller functions (#217)
* player work1
* m_player_controller
* format
| -rw-r--r-- | include/m_actor.h | 1 | ||||
| -rw-r--r-- | include/m_common_data.h | 3 | ||||
| -rw-r--r-- | include/m_name_table.h | 9 | ||||
| -rw-r--r-- | include/m_player_lib.h | 3 | ||||
| -rw-r--r-- | linker_scripts/jp/symbol_addrs_code.txt | 2 | ||||
| -rw-r--r-- | linker_scripts/jp/symbol_addrs_overlays.txt | 34 | ||||
| -rw-r--r-- | src/overlays/actors/player_actor/m_player.c | 228 | ||||
| -rw-r--r-- | src/overlays/actors/player_actor/m_player.h | 59 |
8 files changed, 287 insertions, 52 deletions
diff --git a/include/m_actor.h b/include/m_actor.h index 819d7dc..1c17587 100644 --- a/include/m_actor.h +++ b/include/m_actor.h @@ -42,6 +42,7 @@ typedef enum ActorFootIndex { typedef enum FgNameF000 { /* 0x0 */ FGNAME_F000_0 = 0x0, /* 0x0 */ FGNAME_F000_1 = 0x1, + /* 0x4 */ FGNAME_F000_4 = 0x4, /* 0x5 */ FGNAME_F000_5 = 0x5, /* 0x8 */ FGNAME_F000_8 = 0x8, /* 0xD */ FGNAME_F000_D = 0xD, diff --git a/include/m_common_data.h b/include/m_common_data.h index fb351af..3116d8a 100644 --- a/include/m_common_data.h +++ b/include/m_common_data.h @@ -157,7 +157,8 @@ typedef struct CommonData { /* 0x10750 */ s16 moneyPower; /* 0x10752 */ s16 goodsPower; /* 0x10754 */ DoorData doorData; - /* 0x10768 */ s8 unk_10768[0x38]; + /* 0x10764 */ DoorData structureExitDoorData; + /* 0x1077C */ UNK_TYPE1 unk_1077C[0x24]; /* 0x107A0 */ DoorData famicomEmuDoorData; /* 0x107B4 */ s16 unk_107B4; /* 0x107B6 */ s16 unk_107B6; // named "demo_profile" in AC GCN decomp (though it's an array of two s16s in that game) diff --git a/include/m_name_table.h b/include/m_name_table.h index 7269003..2c037cf 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -45,6 +45,15 @@ NameTableOffsetTable* obj_hight_table_item0_nogrow(u16 item); #define ITM_FOOD_COCONUT (ITM_FOOD_CANDY + 1) #define ITM_FOOD_END 0x2808 + +#define DOOR_START 0x4000 +#define DOOR0 DOOR_START /* 0x4000 */ +#define DOOR1 (DOOR0 + 1) /* 0x4001 */ + +#define EXIT_DOOR 0x4080 +#define EXIT_DOOR1 (EXIT_DOOR + 1) /* 0x4081 */ + + /* begin environmental/nature objects */ #define ENV_START 0x0800 /* tree */ diff --git a/include/m_player_lib.h b/include/m_player_lib.h index 9cbdc99..99c7847 100644 --- a/include/m_player_lib.h +++ b/include/m_player_lib.h @@ -6,6 +6,7 @@ struct Player; struct Game_Play; struct PrivateInfo; +struct PlayerControllerData; // void func_800B1160_jp(); // void func_800B11B0_jp(); @@ -158,7 +159,7 @@ s32 func_800B5718_jp(void); // void func_800B5880_jp(); // void func_800B58C4_jp(); // void func_800B5910_jp(); -// void func_800B593C_jp(); +struct PlayerControllerData* mPlib_Get_controller_data_for_title_demo_p(void); void func_800B594C_jp(void); // void func_800B5980_jp(); // void func_800B5AA0_jp(); diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt index 4841f94..8291a7b 100644 --- a/linker_scripts/jp/symbol_addrs_code.txt +++ b/linker_scripts/jp/symbol_addrs_code.txt @@ -2653,7 +2653,7 @@ func_800B5830_jp = 0x800B5830; // type:func func_800B5880_jp = 0x800B5880; // type:func func_800B58C4_jp = 0x800B58C4; // type:func func_800B5910_jp = 0x800B5910; // type:func -func_800B593C_jp = 0x800B593C; // type:func +mPlib_Get_controller_data_for_title_demo_p = 0x800B593C; // type:func func_800B594C_jp = 0x800B594C; // type:func func_800B5980_jp = 0x800B5980; // type:func func_800B5AA0_jp = 0x800B5AA0; // type:func diff --git a/linker_scripts/jp/symbol_addrs_overlays.txt b/linker_scripts/jp/symbol_addrs_overlays.txt index d7b0779..78443e4 100644 --- a/linker_scripts/jp/symbol_addrs_overlays.txt +++ b/linker_scripts/jp/symbol_addrs_overlays.txt @@ -2404,22 +2404,22 @@ D_808B2B30_jp = 0x808B2B30; // // .text -func_808B2D50_jp = 0x808B2D50; // type:func -func_808B2DE4_jp = 0x808B2DE4; // type:func -func_808B2E4C_jp = 0x808B2E4C; // type:func -func_808B2EB8_jp = 0x808B2EB8; // type:func -func_808B2F24_jp = 0x808B2F24; // type:func -func_808B2F90_jp = 0x808B2F90; // type:func -func_808B3010_jp = 0x808B3010; // type:func -func_808B30B4_jp = 0x808B30B4; // type:func -func_808B30EC_jp = 0x808B30EC; // type:func -func_808B312C_jp = 0x808B312C; // type:func -func_808B3170_jp = 0x808B3170; // type:func -func_808B31B4_jp = 0x808B31B4; // type:func -func_808B31F8_jp = 0x808B31F8; // type:func -func_808B323C_jp = 0x808B323C; // type:func -func_808B3280_jp = 0x808B3280; // type:func -func_808B32C4_jp = 0x808B32C4; // type:func +Player_actor_CheckController_forPickup = 0x808B2D50; // type:func +Player_actor_CheckController_forAxe = 0x808B2DE4; // type:func +Player_actor_CheckController_forNet = 0x808B2E4C; // type:func +Player_actor_CheckController_forRod = 0x808B2EB8; // type:func +Player_actor_CheckController_forScoop = 0x808B2F24; // type:func +Player_actor_CheckController_forUmbrella = 0x808B2F90; // type:func +Player_actor_CheckController_forShake_tree = 0x808B3010; // type:func +Player_actor_CheckController_forStruggle_pitfall = 0x808B30B4; // type:func +Player_actor_CheckController_forDush = 0x808B30EC; // type:func +Player_actor_GetController_move_percentX = 0x808B312C; // type:func +Player_actor_GetController_move_percentY = 0x808B3170; // type:func +Player_actor_GetController_move_percentR = 0x808B31B4; // type:func +Player_actor_GetController_move_angle = 0x808B31F8; // type:func +Player_actor_GetController_old_move_angle = 0x808B323C; // type:func +Player_actor_GetController_recognize_percentR = 0x808B3280; // type:func +Player_actor_GetController_old_recognize_percentR = 0x808B32C4; // type:func func_808B3308_jp = 0x808B3308; // type:func func_808B3334_jp = 0x808B3334; // type:func func_808B3370_jp = 0x808B3370; // type:func @@ -2703,7 +2703,7 @@ func_808BD380_jp = 0x808BD380; // type:func func_808BD3D8_jp = 0x808BD3D8; // type:func func_808BD3F8_jp = 0x808BD3F8; // type:func func_808BD584_jp = 0x808BD584; // type:func -func_808BD5C4_jp = 0x808BD5C4; // type:func +Player_actor_Get_ItemKind = 0x808BD5C4; // type:func func_808BD668_jp = 0x808BD668; // type:func func_808BD690_jp = 0x808BD690; // type:func func_808BD6B8_jp = 0x808BD6B8; // type:func diff --git a/src/overlays/actors/player_actor/m_player.c b/src/overlays/actors/player_actor/m_player.c index 4945bab..a17917e 100644 --- a/src/overlays/actors/player_actor/m_player.c +++ b/src/overlays/actors/player_actor/m_player.c @@ -1,4 +1,7 @@ #include "m_player.h" +#include "m_player_lib.h" +#include "game.h" +#include "overlays/gamestates/ovl_play/m_play.h" extern ClObjPipe_Init Player_actor_OcInfoData_forStand; #if 0 @@ -21,37 +24,198 @@ ClObjTrisElem_Init Player_actor_pclobj_tris_base_forItem[] = { ClObjTris_Init Player_actor_pclobj_tris_data_forItem = { { OC1_TYPE_10 | OC1_TYPE_20, OC2_2, COLSHAPE_TRIS }, ARRAY_COUNT(Player_actor_pclobj_tris_base_forItem), Player_actor_pclobj_tris_base_forItem }; #endif -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B2D50_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B2DE4_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B2E4C_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B2EB8_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B2F24_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B2F90_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B3010_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B30B4_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B30EC_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B312C_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B3170_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B31B4_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B31F8_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B323C_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B3280_jp.s") - -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B32C4_jp.s") +s8 Player_actor_Get_ItemKind(Actor* actor, s32 kind); + +// m_player_controller + +s32 Player_actor_CheckController_forPickup(Game* game) { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + return !Player_ITEM_IS_VALID(kind) && (data->triggerButtonA != 0) && (data->buttonB != 0); + } + + return chkTrigger(B_BUTTON); +} + +s32 Player_actor_CheckController_forAxe(Game* game) { + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + if (Player_ITEM_IS_AXE(kind)) { + if (mEv_CheckTitleDemo() > 0) { + return mPlib_Get_controller_data_for_title_demo_p()->triggerButtonA; + } + return chkTrigger(A_BUTTON); + } + + return FALSE; +} + +s32 Player_actor_CheckController_forNet(Game* game) { + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + if (Player_ITEM_IS_NET(kind)) { + if (mEv_CheckTitleDemo() > 0) { + return mPlib_Get_controller_data_for_title_demo_p()->buttonA; + } + return chkButton(A_BUTTON); + } + + return FALSE; +} + +s32 Player_actor_CheckController_forRod(Game* game) { + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + if (Player_ITEM_IS_ROD(kind)) { + if (mEv_CheckTitleDemo() > 0) { + return mPlib_Get_controller_data_for_title_demo_p()->triggerButtonA; + } + return chkTrigger(A_BUTTON); + } + + return FALSE; +} + +s32 Player_actor_CheckController_forScoop(Game* game) { + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + if (Player_ITEM_IS_SCOOP(kind)) { + if (mEv_CheckTitleDemo() > 0) { + return mPlib_Get_controller_data_for_title_demo_p()->triggerButtonA; + } + return chkTrigger(A_BUTTON); + } + + return FALSE; +} + +s32 Player_actor_CheckController_forUmbrella(Game* game) { + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + if (Player_ITEM_IS_UMBRELLA(kind) != FALSE) { + if (mEv_CheckTitleDemo() > 0) { + return mPlib_Get_controller_data_for_title_demo_p()->triggerButtonA; + } + return chkTrigger(A_BUTTON); + } + + return FALSE; +} + +int Player_actor_CheckController_forShake_tree(Game* game) { + Actor* actor = (Actor*)get_player_actor_withoutCheck((Game_Play*)game); + Player* player = (Player*)actor; + s8 kind = Player_actor_Get_ItemKind(actor, player->unk_0CF0); + + if (!Player_ITEM_KIND_CHECK(kind, 0, Player_ITEM_KIND_SCOOP) || Player_ITEM_IS_UMBRELLA(kind) != FALSE) { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + return (data->triggerButtonA != 0) && (data->buttonB == 0); + } else { + return chkTrigger(A_BUTTON); + } + } + return FALSE; +} + +f32 Player_actor_CheckController_forStruggle_pitfall() { + if (chkTrigger(A_BUTTON) != 0) { + return 1.0f; + } else { + return 0.0f; + } +} + +s32 Player_actor_CheckController_forDush() { + if (mEv_CheckTitleDemo() > 0) { + return mPlib_Get_controller_data_for_title_demo_p()->buttonB; + } else { + return chkButton(Z_TRIG); + } +} + +f32 Player_actor_GetController_move_percentX() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + return data->controller.moveX; + } else { + return gamePT->controller.moveX; + } +} + +f32 Player_actor_GetController_move_percentY() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + + return data->controller.moveY; + } else { + return gamePT->controller.moveY; + } +} + +f32 Player_actor_GetController_move_percentR() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + + return data->controller.moveR; + } else { + return gamePT->controller.moveR; + } +} + +s16 Player_actor_GetController_move_angle() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + + return data->controller.moveAngle; + } else { + return gamePT->controller.moveAngle; + } +} + +s16 Player_actor_GetController_old_move_angle() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + + return data->controller.lastMoveAngle; + } else { + return gamePT->controller.lastMoveAngle; + } +} + +f32 Player_actor_GetController_recognize_percentR() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + + return data->controller.adjustedR; + } else { + return gamePT->controller.adjustedR; + } +} + +f32 Player_actor_GetController_old_recognize_percentR() { + if (mEv_CheckTitleDemo() > 0) { + PlayerControllerData* data = mPlib_Get_controller_data_for_title_demo_p(); + + return data->controller.lastAdjustedR; + } else { + return gamePT->controller.lastAdjustedR; + } +} #pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808B3308_jp.s") @@ -619,7 +783,7 @@ ClObjTris_Init Player_actor_pclobj_tris_data_forItem = { { OC1_TYPE_10 | OC1_TYP #pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808BD584_jp.s") -#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808BD5C4_jp.s") +#pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/Player_actor_Get_ItemKind.s") #pragma GLOBAL_ASM("asm/jp/nonmatchings/overlays/actors/player_actor/m_player/func_808BD668_jp.s") diff --git a/src/overlays/actors/player_actor/m_player.h b/src/overlays/actors/player_actor/m_player.h index 444b92d..43fe690 100644 --- a/src/overlays/actors/player_actor/m_player.h +++ b/src/overlays/actors/player_actor/m_player.h @@ -4,12 +4,71 @@ #include "ultra64.h" #include "m_actor.h" #include "m_collision_obj.h" +#include "m_controller.h" #include "unk.h" struct Game; struct Game_Play; struct Player; +typedef enum Player_ItemKind { + Player_ITEM_KIND_START, + Player_ITEM_KIND_AXE = Player_ITEM_KIND_START, + Player_ITEM_KIND_NET, + Player_ITEM_KIND_UMBRELLA00, + Player_ITEM_KIND_UMBRELLA01, + Player_ITEM_KIND_UMBRELLA02, + Player_ITEM_KIND_UMBRELLA03, + Player_ITEM_KIND_UMBRELLA04, + Player_ITEM_KIND_UMBRELLA05, + Player_ITEM_KIND_UMBRELLA06, + Player_ITEM_KIND_UMBRELLA07, + Player_ITEM_KIND_UMBRELLA08, + Player_ITEM_KIND_UMBRELLA09, + Player_ITEM_KIND_UMBRELLA10, + Player_ITEM_KIND_UMBRELLA11, + Player_ITEM_KIND_UMBRELLA12, + Player_ITEM_KIND_UMBRELLA13, + Player_ITEM_KIND_UMBRELLA14, + Player_ITEM_KIND_UMBRELLA15, + Player_ITEM_KIND_UMBRELLA16, + Player_ITEM_KIND_UMBRELLA17, + Player_ITEM_KIND_UMBRELLA18, + Player_ITEM_KIND_UMBRELLA19, + Player_ITEM_KIND_UMBRELLA20, + Player_ITEM_KIND_UMBRELLA21, + Player_ITEM_KIND_UMBRELLA22, + Player_ITEM_KIND_UMBRELLA23, + Player_ITEM_KIND_UMBRELLA24, + Player_ITEM_KIND_UMBRELLA25, + Player_ITEM_KIND_UMBRELLA26, + Player_ITEM_KIND_UMBRELLA27, + Player_ITEM_KIND_UMBRELLA28, + Player_ITEM_KIND_UMBRELLA29, + Player_ITEM_KIND_UMBRELLA30, + Player_ITEM_KIND_UMBRELLA31, + Player_ITEM_KIND_ROD, + Player_ITEM_KIND_SCOOP +} Player_ItemKind; + +#define Player_ITEM_KIND_CHECK(kind, min, max) (kind >= min && kind < max + 1) +#define Player_ITEM_IS_AXE(kind) (kind == Player_ITEM_KIND_AXE) +#define Player_ITEM_IS_NET(kind) (kind == Player_ITEM_KIND_NET) +#define Player_ITEM_IS_ROD(kind) (kind == Player_ITEM_KIND_ROD) +#define Player_ITEM_IS_SCOOP(kind) (kind == Player_ITEM_KIND_SCOOP) +#define Player_ITEM_IS_UMBRELLA(kind) \ + (Player_ITEM_KIND_CHECK(kind, Player_ITEM_KIND_UMBRELLA00, Player_ITEM_KIND_UMBRELLA31)) +#define Player_ITEM_IS_VALID(kind) (Player_ITEM_KIND_CHECK(kind, Player_ITEM_KIND_START, Player_ITEM_KIND_SCOOP)) + +typedef struct PlayerControllerData { + /* 0x00 */ Controller controller; + /* 0x38 */ s8 triggerButtonA; + /* 0x39 */ s8 buttonA; + /* 0x3A */ s8 triggerButtonB; + /* 0x3B */ s8 buttonB; + /* 0x3C */ u16 equippedItem; +} PlayerControllerData; // size = 0x40; + typedef void (*PlayerUnk1230Func)(struct Player*, struct Game_Play*, Actor*, s32, xyz_t*, f32); typedef f32 (*PlayerUnk1234Func)(struct Player*, struct Game_Play*); typedef void (*PlayerUnk1238Func)(struct Player*, struct Game_Play*, Actor*, s32); |
