summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2024-09-26 16:39:38 +0200
committerGitHub <noreply@github.com>2024-09-26 07:39:38 -0700
commitbd553a1ca83a6135604920e8f073ebe29122bc5a (patch)
treea84c34487578cfae9ddab32c4e43ea83fc932e60
parent5fb92a5079f8e2ccf67d5593236a62dff6cd3638 (diff)
m_player controller functions (#217)
* player work1 * m_player_controller * format
-rw-r--r--include/m_actor.h1
-rw-r--r--include/m_common_data.h3
-rw-r--r--include/m_name_table.h9
-rw-r--r--include/m_player_lib.h3
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt2
-rw-r--r--linker_scripts/jp/symbol_addrs_overlays.txt34
-rw-r--r--src/overlays/actors/player_actor/m_player.c228
-rw-r--r--src/overlays/actors/player_actor/m_player.h59
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);