summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/6A5B00.h4
-rw-r--r--include/6A83A0.h2
-rw-r--r--include/6B8A70.h28
-rw-r--r--include/6C05A0.h8
-rw-r--r--include/6DA460.h5
-rw-r--r--include/6DB420.h110
-rw-r--r--include/6DE300.h74
-rw-r--r--include/6E30B0.h4
-rw-r--r--include/6E7AD0.h2
-rw-r--r--include/alignment.h1
-rw-r--r--include/code_variables.h4
-rw-r--r--include/lb_rtc.h2
-rw-r--r--include/libc64/malloc.h2
-rw-r--r--include/m_actor.h1
-rw-r--r--include/m_collision_bg.h2
-rw-r--r--include/m_common_data.h32
-rw-r--r--include/m_event.h2
-rw-r--r--include/m_field_info.h25
-rw-r--r--include/m_field_make.h29
-rw-r--r--include/m_handbill.h27
-rw-r--r--include/m_home.h8
-rw-r--r--include/m_item_name.h2
-rw-r--r--include/m_land.h24
-rw-r--r--include/m_mail.h98
-rw-r--r--include/m_mail_check.h10
-rw-r--r--include/m_name_table.h2
-rw-r--r--include/m_npc.h577
-rw-r--r--include/m_npc_base.h48
-rw-r--r--include/m_private.h126
-rw-r--r--include/m_private_internals.h51
-rw-r--r--include/m_quest.h116
-rw-r--r--include/m_submenu.h2
-rw-r--r--include/segment_symbols.h5
-rw-r--r--include/sys_math.h6
34 files changed, 862 insertions, 577 deletions
diff --git a/include/6A5B00.h b/include/6A5B00.h
index 6dab5c8..54cd3d5 100644
--- a/include/6A5B00.h
+++ b/include/6A5B00.h
@@ -22,9 +22,9 @@
// void func_80082910_jp();
// void func_800829D4_jp();
// void func_80082B4C_jp();
-// void func_80082BD8_jp();
+void func_80082BD8_jp(u16*, s32, s32, s32);
// void func_80082C30_jp();
-// void func_80082CC8_jp();
+s32 mEvNM_CheckJointEvent(u16);
// void func_80082DA0_jp();
// void func_80082E40_jp();
diff --git a/include/6A83A0.h b/include/6A83A0.h
index 803d3de..60c2823 100644
--- a/include/6A83A0.h
+++ b/include/6A83A0.h
@@ -16,7 +16,7 @@
// void func_80084CD8_jp();
// void func_80084D08_jp();
void func_80084DA4_jp(void);
-// void func_80084DE0_jp();
+s32 mFAs_GetFieldRank(void);
// void mFAs_PrintFieldAssessment();
#endif
diff --git a/include/6B8A70.h b/include/6B8A70.h
deleted file mode 100644
index 4f4a3d1..0000000
--- a/include/6B8A70.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef C_6B8A70_H
-#define C_6B8A70_H
-
-#include "ultra64.h"
-#include "unk.h"
-
-typedef struct LandName {
- /* 0x0 */ UNK_TYPE1 unk_0[0x6];
-} LandName; // size = 0x6
-
-// void func_80094DD0_jp();
-// void func_80094E10_jp();
-// void func_80094E38_jp();
-// void func_80094E90_jp();
-// void func_80094EE0_jp();
-void mLd_CopyLandName(LandName* arg0, LandName* arg1);
-// void func_80094F24_jp();
-// void func_80094F84_jp();
-// void func_8009504C_jp();
-// void func_800950D8_jp();
-// void func_800950E8_jp();
-// void func_8009519C_jp();
-// void mLd_PlayerManKindCheck();
-// void func_800951E4_jp();
-// void func_80095218_jp();
-void mLd_LandDataInit(void);
-
-#endif
diff --git a/include/6C05A0.h b/include/6C05A0.h
deleted file mode 100644
index 254df1d..0000000
--- a/include/6C05A0.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef C_6C05A0_H
-#define C_6C05A0_H
-
-#include "ultra64.h"
-
-// void func_8009C900_jp();
-
-#endif
diff --git a/include/6DA460.h b/include/6DA460.h
index 820a8aa..5593cd6 100644
--- a/include/6DA460.h
+++ b/include/6DA460.h
@@ -3,13 +3,14 @@
#include "ultra64.h"
+struct Mail_c;
struct Game_Play;
// void func_800B67C0_jp();
// void func_800B6838_jp();
-// void func_800B68E8_jp();
+s32 mPO_get_keep_mail_sum(void);
// void func_800B690C_jp();
-// void func_800B6A3C_jp();
+s32 mPO_receipt_proc(Mail_c*, s32);
// void func_800B6AC8_jp();
// void func_800B6B94_jp();
// void func_800B6C14_jp();
diff --git a/include/6DB420.h b/include/6DB420.h
deleted file mode 100644
index dddbf59..0000000
--- a/include/6DB420.h
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef C_6DB420_H
-#define C_6DB420_H
-
-#include "ultra64.h"
-#include "6B8A70.h"
-#include "unk.h"
-
-struct PrivateInfo;
-struct mPr_map_info_c;
-struct LandInfo;
-struct MotherMailInfo;
-
-typedef struct PlayerName {
- /* 0x0 */ UNK_TYPE1 unk_0[0x6];
-} PlayerName; // size = 0x6
-
-typedef struct PersonalID {
- /* 0x0 */ PlayerName unk_0;
- /* 0x6 */ LandName unk_6;
- /* 0xC */ u16 unk_C;
- /* 0xE */ u16 unk_E;
-} PersonalID; // size = 0x10
-
-// void func_800B7780_jp();
-void mPr_CopyPlayerName(PlayerName* dst, PlayerName* src);
-// void func_800B77C4_jp();
-// void func_800B7804_jp();
-// void func_800B785C_jp();
-// void func_800B7914_jp();
-void mPr_ClearPersonalID(PersonalID* arg0);
-// void func_800B7998_jp();
-void mPr_CopyPersonalID(PersonalID* arg0, PersonalID* arg1);
-s32 mPr_CheckCmpPersonalID(PersonalID* arg0, PersonalID* arg1);
-// void func_800B7A94_jp();
-// void func_800B7AB0_jp();
-void mPr_ClearPrivateInfo(struct PrivateInfo* private);
-// void func_800B7B8C_jp();
-// void func_800B7BC0_jp();
-// void func_800B7CD0_jp();
-// void func_800B7D50_jp();
-void mPr_InitPrivateInfo(struct PrivateInfo* private);
-// void func_800B7F00_jp();
-// void func_800B7F48_jp();
-s32 mPr_CheckPrivate(struct PrivateInfo* private);
-// void func_800B7FA0_jp();
-// void func_800B7FD4_jp();
-// void func_800B8068_jp();
-// void func_800B80B4_jp();
-// void func_800B8128_jp();
-// void func_800B81A4_jp();
-// void func_800B8204_jp();
-// void func_800B828C_jp();
-// void func_800B8318_jp();
-// void func_800B83D4_jp();
-// void func_800B8544_jp();
-// void func_800B86EC_jp();
-// void func_800B88EC_jp();
-// void func_800B8A88_jp();
-void mPr_SetPossessionItem(struct PrivateInfo* priv, int idx, u16 item, u32 cond);
-// void func_800B8B8C_jp();
-// void func_800B8BE4_jp();
-// void func_800B8C10_jp();
-// void func_800B8C20_jp();
-// void func_800B8C34_jp();
-// void func_800B8C9C_jp();
-// void func_800B8D18_jp();
-// void func_800B8D3C_jp();
-s32 func_800B8D64_jp(u8 player_no, s32 arg1);
-void mPr_ClearMotherMailInfo(struct MotherMailInfo* arg0);
-// void func_800B8F20_jp();
-// void func_800B8FB8_jp();
-// void func_800B9038_jp();
-// void func_800B9170_jp();
-// void func_800B9350_jp();
-// void func_800B93AC_jp();
-// void func_800B947C_jp();
-// void func_800B94E0_jp();
-// void func_800B9704_jp();
-// void func_800B9790_jp();
-// void func_800B97C8_jp();
-// void func_800B97F8_jp();
-// void func_800B996C_jp();
-// void func_800B9AF0_jp();
-void func_800B9B2C_jp(void);
-// void func_800B9C34_jp();
-void mPr_SendForeingerAnimalMail(struct PrivateInfo* privateInfo);
-void mPr_StartSetCompleteTalkInfo(void);
-// void func_800B9E90_jp();
-// void func_800B9EB4_jp();
-// void func_800B9ED4_jp();
-// void func_800B9F00_jp();
-// void func_800B9F74_jp();
-// void func_800B9FA0_jp();
-// void func_800BA014_jp();
-// void func_800BA054_jp();
-// void func_800BA09C_jp();
-// void func_800BA0E4_jp();
-// void func_800BA130_jp();
-// void func_800BA150_jp();
-// void func_800BA18C_jp();
-// void func_800BA214_jp();
-// void func_800BA2B0_jp();
-// void func_800BA2D4_jp();
-// void func_800BA344_jp();
-// void func_800BA3D0_jp();
-void mPr_RenewalMapInfo(struct mPr_map_info_c* maps, s32 count, struct LandInfo* landInfo);
-// void mPr_RandomSetPlayerData_title_demo();
-// void mPr_PrintMapInfo_debug();
-
-#endif
diff --git a/include/6DE300.h b/include/6DE300.h
deleted file mode 100644
index 106f274..0000000
--- a/include/6DE300.h
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef C_6DE300_H
-#define C_6DE300_H
-
-#include "ultra64.h"
-#include "unk.h"
-
-struct mQst_delivery_c;
-struct mQst_errand_c;
-struct mQst_not_saved_c;
-
-// void func_800BA660_jp();
-void mQst_ClearDelivery(struct mQst_delivery_c* deliveries, s32 count);
-void mQst_ClearErrand(struct mQst_errand_c* errands, s32 count);
-// void func_800BA778_jp();
-void mQst_ClearNotSaveQuest(struct mQst_not_saved_c* quest);
-// void func_800BA7E8_jp();
-// void func_800BA8A0_jp();
-// void func_800BA8F4_jp();
-// void func_800BAA10_jp();
-// void func_800BAA7C_jp();
-// void func_800BAAA4_jp();
-// void func_800BABE8_jp();
-// void func_800BAC84_jp();
-// void func_800BACEC_jp();
-// void func_800BADBC_jp();
-// void func_800BAE78_jp();
-UNK_RET mQst_CheckLimitbyPossessionIdx(s32 arg0);
-// void func_800BB0A8_jp();
-// void func_800BB0E8_jp();
-// void func_800BB10C_jp();
-// void func_800BB270_jp();
-// void func_800BB3A4_jp();
-// void func_800BB4B0_jp();
-// void func_800BB5DC_jp();
-// void func_800BB634_jp();
-// void func_800BB658_jp();
-// void func_800BB67C_jp();
-// void func_800BB6A0_jp();
-// void func_800BB6F0_jp();
-// void func_800BB740_jp();
-// void func_800BB86C_jp();
-// void func_800BB990_jp();
-// void func_800BBAB0_jp();
-// void func_800BBB30_jp();
-// void func_800BBBEC_jp();
-// void func_800BBCBC_jp();
-// void func_800BBD00_jp();
-// void func_800BBD68_jp();
-// void func_800BBD90_jp();
-// void func_800BBDE0_jp();
-// void func_800BBE78_jp();
-// void func_800BBEE0_jp();
-// void func_800BBF3C_jp();
-// void func_800BBF98_jp();
-// void func_800BC064_jp();
-// void func_800BC10C_jp();
-// void func_800BC12C_jp();
-// void func_800BC14C_jp();
-// void func_800BC1E4_jp();
-// void func_800BC28C_jp();
-// void func_800BC33C_jp();
-// void func_800BC368_jp();
-// void func_800BC394_jp();
-// void func_800BC414_jp();
-// void func_800BC454_jp();
-// void func_800BC528_jp();
-// void func_800BC5D4_jp();
-// void func_800BC6B0_jp();
-// void func_800BC724_jp();
-// void func_800BC830_jp();
-// void mQst_PrintQuestInfo();
-
-
-#endif
diff --git a/include/6E30B0.h b/include/6E30B0.h
index 41c50a4..e08b2b8 100644
--- a/include/6E30B0.h
+++ b/include/6E30B0.h
@@ -20,7 +20,7 @@ struct Game;
// void func_800BFAA8_jp();
// void func_800BFC00_jp();
// void func_800BFC5C_jp();
-// void func_800BFCF0_jp();
+void mSP_SelectRandomItem_New(Game*, u16*, s32, u16*, s32, s32, s32);
// void func_800BFF8C_jp();
// void func_800BFFC0_jp();
// void func_800C0194_jp();
@@ -71,7 +71,7 @@ void mSP_ExchangeLineUp_InGame(struct Game* game);
// void func_800C2578_jp();
// void func_800C2718_jp();
// void func_800C284C_jp();
-// void func_800C297C_jp();
+void mSP_RandomUmbSelect(u16*, s32);
// void func_800C2AAC_jp();
// void func_800C2B70_jp();
// void func_800C2CC8_jp();
diff --git a/include/6E7AD0.h b/include/6E7AD0.h
index 06b9645..00d74f5 100644
--- a/include/6E7AD0.h
+++ b/include/6E7AD0.h
@@ -4,7 +4,7 @@
#include "ultra64.h"
// void func_800C3E30_jp();
-void func_800C3F70_jp(u8* buffer, s32 buffer_len, s32 arg2);
+void mString_Load_StringFromRom(char* buffer, s32 buffer_len, s32 arg2);
// void func_800C4084_jp();
// void func_800C40F8_jp();
// void func_800C4168_jp();
diff --git a/include/alignment.h b/include/alignment.h
index 9fb3b57..5ab84ac 100644
--- a/include/alignment.h
+++ b/include/alignment.h
@@ -3,6 +3,7 @@
#include "attributes.h"
+#define ALIGN2(val) (((val) + 1) & ~1)
#define ALIGN4(val) (((val) + 3) & ~3)
#define ALIGN8(val) (((val) + 7) & ~7)
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
diff --git a/include/code_variables.h b/include/code_variables.h
index 526347a..455a8db 100644
--- a/include/code_variables.h
+++ b/include/code_variables.h
@@ -537,7 +537,6 @@ extern s32 CanLookGokiCount;
// extern UNK_TYPE D_8010AECC_jp;
// extern UNK_TYPE D_8010AEE0_jp;
// extern UNK_TYPE D_8010AEF4_jp;
-// extern UNK_TYPE D_8010AF58_jp;
// extern UNK_TYPE D_8010B034_jp;
// extern UNK_TYPE D_8010B074_jp;
// extern UNK_TYPE D_8010B078_jp;
@@ -564,7 +563,6 @@ extern s32 CanLookGokiCount;
// extern UNK_TYPE D_8010B4FC_jp;
// extern UNK_TYPE D_8010B500_jp;
// extern UNK_TYPE D_8010B504_jp;
-// extern UNK_TYPE D_8010B510_jp;
// extern UNK_TYPE D_8010B810_jp;
// extern UNK_TYPE D_8010B818_jp;
// extern UNK_TYPE D_8010B81C_jp;
@@ -1882,12 +1880,10 @@ extern MtxF MtxF_clear;
// extern UNK_TYPE B_80142BBE_jp;
// extern UNK_TYPE B_80142BC0_jp;
// extern UNK_TYPE B_80142BE0_jp;
-// extern UNK_TYPE B_80142C00_jp;
// extern UNK_TYPE B_80142CF0_jp;
// extern UNK_TYPE B_80142D08_jp;
// extern UNK_TYPE B_80142E38_jp;
// extern UNK_TYPE B_80142E58_jp;
-// extern UNK_TYPE B_80142E78_jp;
// extern UNK_TYPE B_80142E80_jp;
// extern UNK_TYPE B_80142E98_jp;
// extern UNK_TYPE B_80142EB8_jp;
diff --git a/include/lb_rtc.h b/include/lb_rtc.h
index 1394b30..594f979 100644
--- a/include/lb_rtc.h
+++ b/include/lb_rtc.h
@@ -116,7 +116,7 @@ s32 lbRTC_IsOverTime(const lbRTC_time_c* t0, const lbRTC_time_c* t1);
s32 lbRTC_IsJustAtRTC(const lbRTC_time_c* time, s32 flags);
s32 lbRTC_IsOverRTC(const lbRTC_time_c* time);
s32 lbRTC_IsOverWeekRTC(const lbRTC_time_c* t0, lbRTC_weekday_t week);
-void func_800D5480_jp(lbRTC_time_c* t0, lbRTC_time_c* t1);
+s32 lbRTC_IntervalTime(lbRTC_time_c* t0, lbRTC_time_c* t1);
s32 lbRTC_GetIntervalDays(const lbRTC_time_c* t0, const lbRTC_time_c* t1);
void lbRTC_Add_YY(lbRTC_time_c* time, s32 years);
void lbRTC_Add_MM(lbRTC_time_c* time, s32 month);
diff --git a/include/libc64/malloc.h b/include/libc64/malloc.h
index 3ebbb4d..9de623c 100644
--- a/include/libc64/malloc.h
+++ b/include/libc64/malloc.h
@@ -9,7 +9,7 @@ void* malloc(size_t size);
void* malloc_r(size_t size);
void* realloc(void* ptr, size_t size);
void free(void* ptr);
-void* calloc(s32 num, size_t size);
+void* calloc(size_t num, size_t size);
void GetFreeArena(size_t* outMaxFree, size_t* outFree, size_t* outAlloc);
s32 CheckArena(void);
void MallocInit(void* heap, size_t size);
diff --git a/include/m_actor.h b/include/m_actor.h
index 1293e10..1c08512 100644
--- a/include/m_actor.h
+++ b/include/m_actor.h
@@ -41,6 +41,7 @@ typedef enum ActorFootIndex {
// TODO: figure out if those values make sense as an enum or if they should be changed to defines
typedef enum FgNameF000 {
/* 0x0 */ FGNAME_F000_0 = 0x0,
+ /* 0x0 */ FGNAME_F000_1 = 0x1,
/* 0x5 */ FGNAME_F000_5 = 0x5,
/* 0x8 */ FGNAME_F000_8 = 0x8,
/* 0xD */ FGNAME_F000_D = 0xD,
diff --git a/include/m_collision_bg.h b/include/m_collision_bg.h
index 182ebf3..7f03174 100644
--- a/include/m_collision_bg.h
+++ b/include/m_collision_bg.h
@@ -211,7 +211,7 @@ f32 mCoBG_GetBgY_OnlyCenter_FromWpos2(xyz_t arg0, f32 arg1);
// void func_80072398_jp();
// void func_800723C4_jp();
// void func_80072418_jp();
-// void func_8007244C_jp();
+s32 func_8007244C_jp(u32);
// void func_8007246C_jp();
// void func_8007249C_jp();
// void func_80072530_jp();
diff --git a/include/m_common_data.h b/include/m_common_data.h
index 6ea9d1d..6ccff3d 100644
--- a/include/m_common_data.h
+++ b/include/m_common_data.h
@@ -101,10 +101,6 @@ typedef struct CommonData_unk_10098 {
/* 0x86C */ UNK_TYPE unk_86C;
} CommonData_unk_10098; // size >= 0x870
-typedef struct MotherMailInfo {
- /* 0x00 */ UNK_TYPE1 unk_00[0xE];
-} MotherMailInfo; // size = 0xE
-
typedef enum Season {
/* 0 */ SPRING,
/* 1 */ SUMMER,
@@ -171,23 +167,27 @@ typedef struct CommonData {
/* 0x062A8 */ Foreground foreground[FG_BLOCK_Z_NUM][FG_BLOCK_X_NUM];
/* 0x09EA8 */ u8 unk_09EA8[0x70];
/* 0x09F18 */ Animal_c animals[ANIMAL_NUM_MAX]; // villagers in town
- /* 0x0EC70 */ u8 unk_0EC70[0x134];
+ /* 0x0EC70 */ AnmPersonalID_c lastRemovedAnimalId;
+ /* 0x0EC7C */ u8 unk_0EC7C[0x128];
/* 0x0EDA4 */ EventSaveInfo eventSaveInfo;
/* 0x0EE40 */ u8 unk_0EE40[0x118];
/* 0x0EF58 */ u16 fruit;
/* 0x0EF5A */ UNK_TYPE1 unk_0EF5A[0x12];
- /* 0x0EF6C */ Mail unk_0EF6C[5];
+ /* 0x0EF6C */ Mail_c unk_0EF6C[5];
/* 0x0F2A0 */ UNK_TYPE1 unk_0F2A0[0x17C];
/* 0x0F41C */ SnowmanData snowmanData[SNOWMAN_SAVE_COUNT];
- /* 0x0F428 */ UNK_TYPE1 unk_F428[0x10];
+ /* 0x0F428 */ u64 melody;
+ /* 0x0F430 */ UNK_TYPE1 unk_F430[0x8];
/* 0x0F438 */ u8 stationType;
/* 0x0F439 */ u8 unk_F439[0x3];
/* 0x0F43C */ u16 deposit[FG_BLOCK_X_NUM * FG_BLOCK_Z_NUM][UT_Z_NUM]; // flags for which items are buried around town
- /* 0x0F7FC */ lbRTC_time_c unk_0F7FC;
- /* 0x0F804 */ MotherMailInfo motherMailInfo[PLAYER_NUM];
+ /* 0x0F7FC */ lbRTC_time_c lastGrowTime;
+ /* 0x0F804 */ PrivateMotherMail motherMailInfo[PLAYER_NUM];
/* 0x0F83C */ u8 unk_0F83C[0x8];
/* 0x0F844 */ FamicomEmuCommonData famicomEmuCommonData;
- /* 0x0F86A */ u8 unk_0F86A[0x32];
+ /* 0x0F86A */ UNK_TYPE1 unk_0F86A[0x2];
+ /* 0x0F86C */ u8 npcUsedTable[32];
+ /* 0x0F88C */ UNK_TYPE1 unk_0F88A[0x10];
/* 0x0F89C */ lbRTC_time_c unk_0F89C;
/* 0x0F8A4 */ lbRTC_time_c unk_0F8A4;
/* 0x0F8AC */ UNK_TYPE1 unk_0F8AC;
@@ -236,7 +236,7 @@ typedef struct CommonData {
/* 0x105A0 */ u32 sceneFromTitleDemo;
/* 0x105A4 */ NpsSchedule npcSchedule[ANIMAL_NUM_MAX];
/* 0x10694 */ NpcWalking npcWalk;
- /* 0x10710 */ UNK_TYPE1 unk_10710[0x3C];
+ /* 0x10710 */ NpcEvent npcEvent[5];
/* 0x1074C */ UNK_TYPE unk_1074C;
/* 0x10750 */ UNK_TYPE1 unk_10750[0x4];
/* 0x10754 */ UNK_TYPE unk_10754;
@@ -244,11 +244,13 @@ typedef struct CommonData {
/* 0x107A0 */ UNK_TYPE unk_107A0;
/* 0x107A4 */ UNK_TYPE1 unk_107A4[0x12];
/* 0x107B6 */ s16 unk_107B6; // named "demo_profile" in AC GCN decomp (though it's an array of two s16s in that game)
- /* 0x107B8 */ u8 unk_107B8[0x28];
+ /* 0x107B8 */ UNK_TYPE1 unk_107B8[0x28];
/* 0x107E0 */ s8 player_decoy_flag;
- /* 0x107E1 */ u8 unk_107E1[0x3];
+ /* 0x107E1 */ UNK_TYPE1 unk_107E1[0x3];
/* 0x107E4 */ s16 unk_107E4;
- /* 0x107E6 */ u8 unk_107E6[0x254];
+ /* 0x107E6 */ UNK_TYPE1 unk107E6[0x252];
+ /* 0x10A38 */ s8 beeStingFlag;
+ /* 0x10A39 */ UNK_TYPE1 unk_10A39[0x1];
/* 0x10A3A */ u8 gokiShockedFlag;
/* 0x10A3B */ UNK_TYPE1 unk_10A3B[0x1];
/* 0x10A3C */ UNK_TYPE1 unk_10A3C[0x2C];
@@ -257,7 +259,7 @@ typedef struct CommonData {
/* 0x10A6C */ UNK_TYPE1 unk_10A6C[0x14];
/* 0x10A80 */ UNK_TYPE1 unk_10A80[0x2];
/* 0x10A82 */ s16 unk_10A82;
- /* 0x10A84 */ u8 unk_10A84[0x2C];
+ /* 0x10A84 */ UNK_TYPE1 unk_10A84[0x2C];
/* 0x10AB0 */ u8 unk_10AB0; // named "pad_connected" in AC GCN decomp
/* 0x10AB1 */ UNK_TYPE1 unk_10AB1[0x7];
} CommonData; // size = 0x10AB8
diff --git a/include/m_event.h b/include/m_event.h
index 4731cea..8a13010 100644
--- a/include/m_event.h
+++ b/include/m_event.h
@@ -116,7 +116,7 @@ s32 mEv_check_status(s32, s16);
// void func_80080040_jp();
// void func_80080080_jp();
// void func_80080200_jp();
-// void func_8008033C_jp();
+u8* func_8008033C_jp(s32,s32);
// void func_800804AC_jp();
// void func_800806A0_jp();
// void func_800807E0_jp();
diff --git a/include/m_field_info.h b/include/m_field_info.h
index f199bf0..da6a455 100644
--- a/include/m_field_info.h
+++ b/include/m_field_info.h
@@ -5,7 +5,10 @@
#include "z64math.h"
#include "m_collision_bg.h"
+struct Actor;
struct Game_Play;
+struct FieldMakeBlockInfo;
+struct FieldMakeMoveActor;
typedef enum FieldType {
/* 0 */ FI_FIELDTYPE_FG,
@@ -36,7 +39,7 @@ typedef enum FieldRoom {
// void func_80087C30_jp();
// void func_80087C40_jp();
-// void func_80087C64_jp();
+struct FieldMakeBlockInfo* mFI_GetBlockTopP(void);
u16 mFI_GetFieldId(void);
// void func_80087C9C_jp();
// void func_80087D30_jp();
@@ -58,14 +61,14 @@ u16 mFI_GetFieldId(void);
// void func_800884E0_jp();
// void func_800885A8_jp();
s32 mFI_Wpos2BlockNum(s32*, s32*, xyz_t);
-// void func_80088780_jp();
+s32 mFI_Wpos2BkandUtNuminBlock(s32*,s32*, s32* ,s32* ,xyz_t);
// void func_8008883C_jp();
// void func_800888AC_jp();
// void func_80088938_jp();
// void func_800889D8_jp();
// void func_80088A58_jp();
// void func_80088B3C_jp();
-// void func_80088BC0_jp();
+void mFI_UtNum2PosXZInBk(f32*, f32*, s32,s32);
// void func_80088BFC_jp();
// void func_80088C74_jp();
// void func_80088CBC_jp();
@@ -92,7 +95,7 @@ u8 mFI_BkNum2BlockType(s32,s32);
// void func_80089404_jp();
void mFI_BlockKind2BkNum(s32*,s32*,s32);
// void func_800894D0_jp();
-mCoBG_unkStructUnion* func_80089538_jp(s32 arg0, s32 arg1);
+mCoBG_unkStructUnion* mFI_GetBkNum2ColTop(s32 arg0, s32 arg1);
// void func_800895B8_jp();
// void func_80089698_jp();
// void func_80089704_jp();
@@ -111,7 +114,7 @@ mCoBG_unkStructUnion* func_80089538_jp(s32 arg0, s32 arg1);
// void func_80089E84_jp();
// void func_80089EF8_jp();
// void func_8008A000_jp();
-// void func_8008A33C_jp();
+u16* mFI_BkNumtoUtFGTop(s32,s32);
// void func_8008A3BC_jp();
// void func_8008A410_jp();
// void func_8008A4F8_jp();
@@ -151,11 +154,11 @@ s32 func_8008B3E8_jp(xyz_t* arg0, UNK_TYPE arg1);
// void func_8008BAEC_jp();
// void func_8008BB64_jp();
// void func_8008BBF0_jp();
-// void func_8008BC64_jp();
+void mFI_SetMoveActorBitData_ON(s16, u8,u8);
// void func_8008BCFC_jp();
-// void func_8008BD98_jp();
+void mFI_MyMoveActorBitData_ON(struct Actor*);
// void func_8008BDCC_jp();
-// void func_8008BE00_jp();
+s32 func_8008BE00_jp(struct FieldMakeMoveActor*, s32);
// void func_8008BE38_jp();
// void func_8008BF34_jp();
// void func_8008BFC4_jp();
@@ -163,14 +166,14 @@ s32 func_8008B3E8_jp(xyz_t* arg0, UNK_TYPE arg1);
s32 mFI_CheckPlayerWade(s32);
// void func_8008C120_jp();
// void func_8008C130_jp();
-// void func_8008C1E0_jp();
+u16* mFI_GetDepositP(s32,s32);
// void func_8008C344_jp();
// void func_8008C390_jp();
// void func_8008C3B0_jp();
// void func_8008C3D4_jp();
// void func_8008C3E8_jp();
// void func_8008C458_jp();
-void func_8008C478_jp(u16* deposit, int ut_x, int ut_z);
+void mFI_BlockDepositOFF(u16* deposit, int ut_x, int ut_z);
// void func_8008C498_jp();
// void func_8008C4B8_jp();
// void func_8008C504_jp();
@@ -205,7 +208,7 @@ void mFI_Wpos2DepositOFF(xyz_t);
// void func_8008D3A4_jp();
// void func_8008D574_jp();
// void func_8008D6E0_jp();
-// void func_8008D7B0_jp();
+s32 func_8008D7B0_jp(u16);
// void func_8008D884_jp();
s32 mFI_GetWaveUtinBlock(s32* arg0, s32* arg1, s32 arg2, s32 arg3);
// void func_8008DA4C_jp();
diff --git a/include/m_field_make.h b/include/m_field_make.h
index 9222fee..3d2777b 100644
--- a/include/m_field_make.h
+++ b/include/m_field_make.h
@@ -19,9 +19,34 @@ struct Game;
#define UT_TOTAL_NUM (UT_X_NUM * UT_Z_NUM)
typedef struct Foreground {
- /* 0x000 */ u16 items[UT_Z_NUM][UT_X_NUM];
+ /* 0x000 */ u16 items[UT_Z_NUM][UT_X_NUM];
} Foreground; // size = 0x200
+typedef struct FieldMakeMoveActor {
+ /* 0x0 */ u16 nameId;
+ /* 0x2 */ s8 utX;
+ /* 0x3 */ s8 utZ;
+ /* 0x4 */ s8 npcId;
+ /* 0x6 */ s16 arg;
+} FieldMakeMoveActor; // size = 0x8
+
+typedef struct FieldMakeFGData {
+ /* 0x000 */ u16 id;
+ /* 0x002 */ u16 items[UT_Z_NUM][UT_X_NUM];
+ /* 0x202 */ UNK_TYPE1 unk_202[4];
+} FieldMakeFGData; // size = 0x206
+
+typedef struct FieldMakeFGInfo {
+ /* 0x00 */ u16 fgId;
+ /* 0x04 */ u16* itemsPtr;
+ /* 0x08 */ UNK_TYPE1 unk_08[0x8C];
+} FieldMakeFGInfo; // size = 0x94
+
+typedef struct FieldMakeBlockInfo {
+ /* 0x000 */ UNK_TYPE1 unk_000[0x580];
+ /* 0x580 */ FieldMakeFGInfo fgInfo;
+} FieldMakeBlockInfo; // size = 0x614
+
// void func_80084ED0_jp();
// void func_80084FAC_jp();
// void func_800850E4_jp();
@@ -63,6 +88,6 @@ void mFM_InitFgCombiSaveData(struct Game* game);
// void func_80087788_jp();
// void func_800877CC_jp();
void mFM_RenewalReserve(void);
-// void func_800879B0_jp();
+u16 mFM_GetReseveName(s32,s32);
#endif
diff --git a/include/m_handbill.h b/include/m_handbill.h
index ab691a7..7bf4641 100644
--- a/include/m_handbill.h
+++ b/include/m_handbill.h
@@ -6,6 +6,24 @@
struct Game;
struct Game_Play;
+
+typedef struct HandbillzInfo {
+ /* 0x00 */ u8* superBuf;
+ /* 0x04 */ size_t superBufSize;
+ /* 0x08 */ u8* mailBuf;
+ /* 0x0C */ size_t mailBufSize;
+ /* 0x10 */ u8* psBuf;
+ /* 0x14 */ size_t psBufSize;
+ /* 0x18 */ s32 superNo;
+ /* 0x1C */ s32 mailANo;
+ /* 0x20 */ s32 mailBNo;
+ /* 0x24 */ s32 mailCNo;
+ /* 0x28 */ s32 psNo;
+ /* 0x2C */ s32 headerBackStart;
+} HandbillzInfo; // size = 0x30
+
+
+//TODO: move these out of the handbill header
void Balloon_init(struct Game_Play* game_play);
void Balloon_move(struct Game_Play* game_play);
// void func_80092B7C_jp();
@@ -13,7 +31,8 @@ void Balloon_move(struct Game_Play* game_play);
// void func_80092BA0_jp();
// void func_80092BE8_jp();
void mHsRm_GetHuusuiRoom(struct Game* game_play, s32 player_no);
-// void func_80092D10_jp();
+
+void mHandbill_Set_free_str(s32, char*, s32);
// void func_80092E14_jp();
// void func_80092E80_jp();
// void func_80092FC4_jp();
@@ -47,13 +66,13 @@ void mHsRm_GetHuusuiRoom(struct Game* game_play, s32 player_no);
// void func_80093B28_jp();
// void func_80093C98_jp();
// void func_80093DA8_jp();
-// void func_80093F04_jp();
-// void func_80093F54_jp();
+void mHandbill_Load_HandbillFromRom(u8*, s32*, u8*, u8*, s32);
+void mHandbill_Load_HandbillFromRom2(u8*, s32, s32*, u8*, s32, u8*, s32);
// void func_80093F94_jp();
// void func_800940A8_jp();
// void func_800941B0_jp();
// void func_800942A0_jp();
// void func_80094400_jp();
-// void func_800944B8_jp();
+s32 mHandbillz_load(HandbillzInfo*);
#endif
diff --git a/include/m_home.h b/include/m_home.h
index 787b447..0fb873d 100644
--- a/include/m_home.h
+++ b/include/m_home.h
@@ -2,9 +2,10 @@
#define M_HOME_H_H
#include "ultra64.h"
-#include "6DB420.h"
#include "unk.h"
#include "lb_rtc.h"
+#include "m_private_internals.h"
+#include "m_mail.h"
#define HOME_MAILBOX_SIZE 10
#define HANIWA_ITEM_HOLD_NUM 4
@@ -57,12 +58,13 @@ typedef struct mHm_goki_c {
} mHm_goki_c; // size = 0x6
typedef struct mHm_hs_c {
- /* 0x000 */ PersonalID unk_000;
+ /* 0x000 */ PersonalID_c ownerID;
/* 0x010 */ UNK_TYPE1 unk_010[0x12];
/* 0x022 */ u8 unk_022;
/* 0x023 */ UNK_TYPE1 unk023[0x1];
/* 0x024 */ u8 unk_024;
- /* 0x025 */ UNK_TYPE1 unk025[0xABB];
+ /* 0x025 */ UNK_TYPE1 unk025[0x453];
+ /* 0x478 */ Mail_c mailbox[HOME_MAILBOX_SIZE];
/* 0xAE0 */ Haniwa_c haniwa;
/* 0xB3C */ mHm_goki_c goki;
/* 0xB42 */ UNK_TYPE1 unkB42[0x6];
diff --git a/include/m_item_name.h b/include/m_item_name.h
index c8c9bf4..a4d4a9b 100644
--- a/include/m_item_name.h
+++ b/include/m_item_name.h
@@ -4,6 +4,6 @@
#include "ultra64.h"
// void func_80096710_jp();
-// void func_80096740_jp();
+void mIN_copy_name_str(char*, u16);
#endif
diff --git a/include/m_land.h b/include/m_land.h
index 2cfab06..9b2af3a 100644
--- a/include/m_land.h
+++ b/include/m_land.h
@@ -8,7 +8,27 @@
#define LAND_NAME_MURA_SIZE (LAND_NAME_SIZE + 2)
typedef struct LandInfo {
- char unk00[0xA];
-} LandInfo; // size >= 0xA
+ /* 0x0 */char name[LAND_NAME_SIZE];
+ /* 0x6 */s8 exists;
+ /* 0x8 */u16 id;
+} LandInfo; // size = 0xA
+
+// void func_80094DD0_jp();
+// void func_80094E10_jp();
+s32 mLd_CheckCmpLandName(char* name1, char* name2);
+s32 mLd_CheckCmpLand(char* name1, u16 id1, char* name2, u16 id2);
+void mLd_ClearLandName(char* name);
+void mLd_CopyLandName(char* arg0, char* arg1);
+// void func_80094F24_jp();
+// void func_80094F84_jp();
+// void func_8009504C_jp();
+char* mLd_GetLandName(void);
+// void func_800950E8_jp();
+// void func_8009519C_jp();
+s32 mLd_PlayerManKindCheck(void);
+s32 mLd_CheckThisLand(char* arg0, u16 arg1);
+// void func_80095218_jp();
+void mLd_LandDataInit(void);
+
#endif
diff --git a/include/m_mail.h b/include/m_mail.h
index cbb9fdd..59473f0 100644
--- a/include/m_mail.h
+++ b/include/m_mail.h
@@ -2,26 +2,24 @@
#define M_MAIL_H
#include "ultra64.h"
-#include "6B8A70.h"
-#include "6DB420.h"
#include "unk.h"
+#include "m_private_internals.h"
+#include "m_npc_base.h"
-struct struct_func_8085CE18_jp_arg4;
+#define MAIL_HEADER_LEN (16 - PLAYER_NAME_LEN)
+#define MAIL_FOOTER_LEN 16
+#define MAIL_BODY_LEN 96
+
+#define MAIL_FOOTER2_LEN 26
+#define MAIL_HEADER2_LEN (MAIL_FOOTER2_LEN - PLAYER_NAME_LEN)
-// TODO: move to a better header
-typedef struct mMl_get_npcinfo_from_mail_name_arg0 {
- /* 0x0 */ u16 unk_0;
- /* 0x2 */ u16 unk_2;
- /* 0x4 */ LandName unk_4;
- /* 0xA */ u8 unk_A;
- /* 0xB */ u8 unk_B;
- /* 0xB */ u8 unk_C;
-} mMl_get_npcinfo_from_mail_name_arg0; // size >= 0xC
+struct struct_func_8085CE18_jp_arg4;
+struct AnmPersonalID_c;
// MailName?
typedef struct mMl_unk_00 {
- /* 0x00 */ PersonalID unk_00;
- /* 0x10 */ u8 unk_10;
+ /* 0x00 */ PersonalID_c personalID;
+ /* 0x10 */ u8 type;
} mMl_unk_00; // size = 0x12
typedef struct mMl_unk_2A {
@@ -35,41 +33,57 @@ typedef struct MailHeaderCommon {
/* 0x0C */ u8 unk_0C[16];
} MailHeaderCommon; //size = 0x1C
-// MailBox?
-typedef struct Mail {
- /* 0x00 */ mMl_unk_00 unk_00;
- /* 0x12 */ mMl_unk_00 unk_12;
- /* 0x24 */ UNK_TYPE1 unk_24[0x2];
- /* 0x26 */ u8 unk_26;
- /* 0x27 */ UNK_TYPE1 unk_27[0x1];
- /* 0x28 */ u8 unk_28;
- /* 0x29 */ u8 unk_29;
- /* 0x2A */ mMl_unk_2A unk_2A;
-} Mail; // size = 0xA4
+typedef struct MailHeader {
+ /* 0x00 */ mMl_unk_00 recipient;
+ /* 0x12 */ mMl_unk_00 sender;
+} MailHeader; // size = 0x24
+
+typedef struct MailContent {
+ /* 0x00 */ u8 font;
+ /* 0x01 */ u8 headerBackStart;
+ /* 0x02 */ u8 mailType;
+ /* 0x03 */ u8 paperType;
+ /* 0x04 */ u8 header[MAIL_HEADER_LEN];
+ /* 0x1C */ u8 body[MAIL_BODY_LEN];
+ /* 0xDC */ u8 footer[MAIL_FOOTER_LEN];
+} MailContent; // size = 0x7F
+
+typedef struct Mail_c {
+ /* 0x000 */ MailHeader header;
+ /* 0x024 */ u16 present;
+ /* 0x026 */ MailContent content;
+} Mail_c; //size = 0xA4
+
+typedef enum MailNameType {
+ /* 0 */ MAIL_NAME_TYPE_PLAYER,
+ /* 1 */ MAIL_NAME_TYPE_NPC,
+ /* 2 */ MAIL_NAME_NUM,
+ /* 255 */ MAIL_NAME_TYPE_CLEAR = 0xFF
+} MailNameType;
s32 mMl_strlen(const char* arg0, s32 size, char c);
s32 mMl_strlen2(s32* arg0, const char* arg1, s32 size, char c);
void mMl_strcpy_back(char* dst, const char* src, s32 size);
-void mMl_clear_mail_header(Mail* mail);
-void mMl_clear_mail(Mail* mail);
-void mMl_clear_mail_box(Mail* mail, s32 arg1);
-s32 mMl_check_not_used_mail(Mail* mail);
+void mMl_clear_mail_header(Mail_c* mail);
+void mMl_clear_mail(Mail_c* mail);
+void mMl_clear_mail_box(Mail_c* mail, s32 arg1);
+s32 mMl_check_not_used_mail(Mail_c* mail);
void mMl_copy_header_name(mMl_unk_00* arg0, mMl_unk_00* arg1);
-void mMl_set_from_name(Mail* arg0, Mail* arg1);
-void mMl_set_to_name(Mail* arg0, Mail* arg1);
-void mMl_set_to_plname(Mail* arg0, Mail* arg1);
-void mMl_set_playername(Mail* mail, PersonalID* arg1);
-void mMl_init_mail(Mail* mail, PersonalID* arg1);
-s32 mMl_chk_mail_free_space(Mail mail[], s32 arg1);
-s32 mMl_use_mail_space(Mail mail[], s32 arg1, PersonalID* arg2);
-s32 mMl_count_use_mail_space(Mail mail[], s32 arg1);
-void mMl_copy_mail(Mail* dst, Mail* src);
+void mMl_set_from_name(Mail_c* arg0, Mail_c* arg1);
+void mMl_set_to_name(Mail_c* arg0, Mail_c* arg1);
+void mMl_set_to_plname(Mail_c* arg0, Mail_c* arg1);
+void mMl_set_playername(Mail_c* mail, PersonalID_c* arg1);
+void mMl_init_mail(Mail_c* mail, PersonalID_c* arg1);
+s32 mMl_chk_mail_free_space(Mail_c mail[], s32 arg1);
+s32 mMl_use_mail_space(Mail_c mail[], s32 arg1, PersonalID_c* arg2);
+s32 mMl_count_use_mail_space(Mail_c mail[], s32 arg1);
+void mMl_copy_mail(Mail_c* dst, Mail_c* src);
void mMl_clear_mail_header_common(MailHeaderCommon* arg0);
void mMl_copy_mail_header_common(MailHeaderCommon* arg0, MailHeaderCommon* arg1);
-void mMl_set_mail_name_npcinfo(mMl_unk_00* arg0, mMl_get_npcinfo_from_mail_name_arg0* arg1);
-s32 mMl_get_npcinfo_from_mail_name(mMl_get_npcinfo_from_mail_name_arg0* arg0, mMl_unk_00* arg1);
-s32 mMl_hunt_for_send_address(Mail* mail);
+void mMl_set_mail_name_npcinfo(mMl_unk_00* arg0, AnmPersonalID_c* arg1);
+s32 mMl_get_npcinfo_from_mail_name(AnmPersonalID_c* arg0, mMl_unk_00* arg1);
+s32 mMl_hunt_for_send_address(Mail_c* mail);
s32 mMl_check_send_mail(struct struct_func_8085CE18_jp_arg4* arg0);
-s32 mMl_check_set_present_myself(Mail* mail);
+s32 mMl_check_set_present_myself(Mail_c* mail);
#endif
diff --git a/include/m_mail_check.h b/include/m_mail_check.h
new file mode 100644
index 0000000..7e26bf5
--- /dev/null
+++ b/include/m_mail_check.h
@@ -0,0 +1,10 @@
+#ifndef M_MAIL_CHECK_H
+#define M_MAIL_CHECK_H
+
+#include "ultra64.h"
+
+struct Game;
+
+s32 mMC_get_mail_hit_rate(s32*, u8*, struct Game*);
+
+#endif
diff --git a/include/m_name_table.h b/include/m_name_table.h
index f0656d2..4bee1cb 100644
--- a/include/m_name_table.h
+++ b/include/m_name_table.h
@@ -3,6 +3,8 @@
#include "ultra64.h"
+extern u8 npc_looks_table[];
+
#define EMPTY_NO 0x0000
#define ITM_MONEY_START 0x2100
diff --git a/include/m_npc.h b/include/m_npc.h
index 4fb1303..9ce0bad 100644
--- a/include/m_npc.h
+++ b/include/m_npc.h
@@ -5,243 +5,376 @@
#include "m_actor.h"
#include "unk.h"
#include "m_land.h"
-#include "6DB420.h"
+#include "lb_rtc.h"
+#include "libu64/gfxprint.h"
+#include "m_quest.h"
#include "m_mail.h"
+#include "m_private_internals.h"
+#include "overlays/actors/ovl_Npc/ac_npc.h"
+#include "m_field_make.h"
+#include "m_npc_base.h"
-#define ANIMAL_NUM_MAX 15 /* Maximum number of villagers possible in town */
+#define ANIMAL_NUM_MIN 5
+#define ANIMAL_NUM_MAX 15 /* Maximum number of villagers possible in town */
+
+#define ANIMAL_MEMORY_NUM 7
+#define ANIMAL_CATCHPHRASE_LEN 4
+#define ANIMAL_NAME_LEN PLAYER_NAME_LEN
+
+#define NPC_NUM 216
+
+struct Game;
+struct PrivateInfo;
+
+typedef struct NpcHouseData {
+ /* 0x00 */ u8 type;
+ /* 0x01 */ u8 palette;
+ /* 0x02 */ u8 wallId;
+ /* 0x03 */ u8 floorId;
+ /* 0x04 */ u16 mainLayerId;
+ /* 0x06 */ u16 secondaryLayerId;
+} NpcHouseData; // size = 0x8
+
+typedef struct NpcListFlags {
+ /* 0x00 */ u8 beeSting:1; // [8]
+ /* 0x00 */ u8 fishComplete:1; // [7]
+ /* 0x00 */ u8 insectComplete:1; // [6]
+ /* 0x00 */ u8 unk3:6; // [5:0]
+} NpcListFlags; //size = 0x1
typedef struct NpcList {
- /* 0x00 */ char unk00[0x10];
+ /* 0x00 */ u16 name;
+ /* 0x02 */ u16 fieldName;
+ /* 0x04 */ xyz_t homePosition;
/* 0x10 */ xyz_t position;
- /* 0x14 */ char unk14[0x1C];
+ /* 0x1C */ u8 appearFlag;
+ /* 0x1D */ NpcListFlags flags;
+ /* 0x1F */ u8 unk1F;
+ /* 0x20 */ QuestBase questInfo;
+ /* 0x2C */ NpcHouseData houseData;
+ /* 0x34 */ u16 rewardFurniture;
} NpcList; // size = 0x38
-typedef struct AnmHome_c {
+typedef struct Anmland {
+ /* 0x00 */ char name[LAND_NAME_SIZE];
+ /* 0x08 */ u16 id;
+} Anmland; // size = 0x10
+
+typedef struct Anmhome_c {
/* 0x00 */ u8 typeUnused; /* Likely the house type, but seems to be unused outside of SChk_Anmhome_c_sub */
/* 0x01 */ u8 blockX; /* acre x position */
/* 0x02 */ u8 blockZ; /* acre y position */
/* 0x03 */ u8 utX; /* unit x position */
/* 0x04 */ u8 utZ; /* unit z position */
-} AnmHome_c; // size = 0x5
-
-typedef struct AnmPersonalId_c {
- /* 0x00 */ u16 npcId; /* id */
- /* 0x02 */ u16 landId; /* town id */
- /* 0x04 */ u8 landName[LAND_NAME_SIZE]; /* town name */
- /* 0x0A */ u8 nameId; /* lower byte of the id */
- /* 0x0B */ u8 looks; /* internal name for personality */
-} AnmPersonalID_c; // size = 0xC
-
-typedef struct Animal_c {
- /* 0x000 */ AnmPersonalID_c id;
- /* 0x00C */ char unk00C[0x4D4];
- /* 0x4E0 */ AnmHome_c homeInfo;
- /* 0x4E5 */ char unk4E5[0x43];
-} Animal_c;
-
-typedef enum NpcLooks{
- /* 0 */ NPC_LOOKS_GIRL,
- /* 1 */ NPC_LOOKS_KO_GIRL,
- /* 2 */ NPC_LOOKS_BOY,
- /* 3 */ NPC_LOOKS_SPORT_MAN,
- /* 4 */ NPC_LOOKS_GRIM_MAN,
- /* 5 */ NPC_LOOKS_NANIWA_LADY,
-
- /* 6 */ NPC_LOOKS_NUM
-}NpcLooks;
-
-// void func_800A6920_jp();
-// void func_800A6940_jp();
-// void func_800A695C_jp();
-void mNpc_ClearAnimalPersonalID(AnmPersonalID_c*);
-s32 mNpc_CheckFreeAnimalPersonalID(AnmPersonalID_c*);
-void mNpc_CopyAnimalPersonalID(AnmPersonalID_c*, AnmPersonalID_c*);
-s32 mNpc_CheckCmpAnimalPersonalID(AnmPersonalID_c*, AnmPersonalID_c*);
-// void func_800A6AF0_jp();
-// void func_800A6B58_jp();
-// void func_800A6B6C_jp();
-// void func_800A6B7C_jp();
-// void func_800A6B9C_jp();
-// void func_800A6BC8_jp();
-// void func_800A6C1C_jp();
-// void func_800A6C84_jp();
-// void func_800A6CE4_jp();
-// void func_800A6D04_jp();
-// void func_800A6DB0_jp();
-// void func_800A6DD0_jp();
-// void func_800A6E0C_jp();
+} Anmhome_c; // size = 0x5
+
+typedef struct Anmlet {
+ /* 0x00 */ u8 exists:1; /* letter received by villager and exists */
+ /* 0x00 */ u8 cond:1; /* mNpc_LETTER_RANK_* */
+ /* 0x00 */ u8 sendReply:1; /* set when the villager should reply */
+ /* 0x00 */ u8 hasPresentCloth:1; /* set when the villager's held present shirt is from this letter */
+ /* 0x00 */ u8 wearingPresentCloth:1; /* set when a villager is wearing the shirt sent with the saved letter */
+ /* 0x00 */ u8 unk5:3; /* seemingly unused */
+} Anmlet; // size = 0x1
+
+typedef struct AnmRemailFlags {
+ /* 0x00 */ u8 cond:1;
+ /* 0x00 */ u8 looks:7;
+} AnmremailFlags; // size 0x1
+
+typedef struct Anmremail {
+ /* 0x00 */ lbRTC_ymd_t date; /* date sent */
+ /* 0x04 */ char name[ANIMAL_NAME_LEN]; /* villager name */
+ /* 0x0A */ char landName[LAND_NAME_SIZE]; /* town name */
+ /* 0x10 */ AnmremailFlags flags;
+} Anmremail; // size = 0x12
+
+typedef struct Anmplmail_c {
+ /* 0x000 */ u8 font; /* 'font' to use for letter info */
+ /* 0x001 */ u8 paperType;
+ /* 0x002 */ u16 present;
+ /* 0x004 */ u8 headerBackStart; /* position for name insertion in header */
+ /* 0x005 */ u8 header[MAIL_HEADER_LEN];
+ /* 0x00F */ u8 body[MAIL_BODY_LEN];
+ /* 0x06F */ u8 footer[MAIL_FOOTER_LEN];
+ /* 0x07F */ u8 unk7F; /* likely pad */
+ /* 0x080 */ lbRTC_ymd_t date; /* sent date */
+} Anmplmail_c; // size = 0x84
+
+typedef struct AnmGoodbyeMail {
+ /* 0x000 */ AnmPersonalID_c id;
+ /* 0x00C */ u8 deliverTo;
+} AnmGoodbyeMail; // size = 0xE
+
+typedef struct Anmmem_c {
+ /* 0x000 */ PersonalID_c memoryPlayerId; /* personal id of the player memory belongs to */
+ /* 0x014 */ lbRTC_time_c lastSpeakTime; /* time the player last spoke to this villager */
+ /* 0x01C */ Anmland land; /* union between town NPC land memory & islander player action memory */
+ /* 0x028 */ u64 savedTownTune; /* memory origin town tune */
+ /* 0x030 */ s8 friendship; /* friendship with the player */
+ /* 0x031 */ Anmlet letterInfo; /* saved letter flags */
+ /* 0x032 */ Anmplmail_c letter; /* saved letter */
+} Anmmem_c; // size 0xB0
+
+typedef struct Animal_c {
+ /* 0x000 */ AnmPersonalID_c id;
+ /* 0x00C */ Anmmem_c memories[ANIMAL_MEMORY_NUM];
+ /* 0x4E0 */ Anmhome_c homeInfo;
+ /* 0x4E5 */ char catchphrase[ANIMAL_CATCHPHRASE_LEN];
+ /* 0x4E9 */ char unk4E9[0x3];
+ /* 0x4EC */ QuestContest contestQuest;
+ /* 0x4E9 */ char previousLandName[LAND_NAME_SIZE];
+ /* 0x4E9 */ char parentName[ANIMAL_NAME_LEN];
+ /* 0x51C */ u16 previousLandId;
+ /* 0x51E */ u8 mood;
+ /* 0x51F */ u8 moodTime;
+ /* 0x520 */ u16 cloth;
+ /* 0x522 */ u16 removeInfo;
+ /* 0x524 */ u8 isHome;
+ /* 0x525 */ u8 movedIn;
+ /* 0x526 */ u8 isMoving;
+} Animal_c; // size = 0x528
+
+typedef struct SpecialNpcData {
+ /* 0x00 */ u16 specialNpcId;
+ /* 0x02 */ u16 sex;
+ /* 0x04 */ s32 nameStringNumber;
+ /* 0x08 */ s32 soundId;
+} SpecialNpcData; // size = 0xC
+
+typedef struct NpcDefaultData {
+ /* 0x00 */ u16 cloth;
+ /* 0x02 */ u16 catchphraseIdx;
+ /* 0x04 */ s8 umbrella;
+} NpcDefaultData; // size = 0x5
+
+typedef struct NpcTalkInfo {
+ /* 0x00 */ u16 timer;
+ /* 0x02 */ u8 talkNum;
+ /* 0x03 */ u8 questRequest;
+ /* 0x04 */ u16 unlockTimer;
+ /* 0x06 */ u16 resetTimer;
+} NpcTalkInfo; // size = 0x8
+
+typedef struct NpcTemper {
+ /* 0x0 */ u16 unlockTimer;
+ /* 0x2 */ u8 overImpatientNum;
+ /* 0x3 */ u8 talkNumMax;
+} NpcTemper; // size = 0x4
+
+typedef struct NpcEvent {
+ /* 0x0 */ u16 eventId;
+ /* 0x2 */ u16 textureId;
+ /* 0x4 */ u16 npcId;
+ /* 0x6 */ u16 clothId;
+ /* 0x8 */ u8 exists;
+ /* 0x9 */ u8 use;
+ /* 0xA */ u16 unkA;
+} NpcEvent; // size = 0xC
+
+typedef struct DemoNpc {
+ /* 0x00 */ u16 npcName; /* villager id */
+ /* 0x04 */ u32 blockX; // spawn acre x
+ /* 0x08 */ u32 blockZ; // spawn acre z
+ /* 0x0C */ u32 utX; // spawn unit x in acre
+ /* 0x10 */ u32 utZ; // spawn unit z in acre
+} DemoNpc; // size = 0x14
+
+
+void mNpc_MakeRandTable(s32* table, s32 count, s32 swapNum);
+void mNpc_ClearBufSpace1(u8* buf, s32 size);
+void mNpc_AddNowNpcMax(u8* npcMax);
+void mNpc_SubNowNpcMax(u8* npcMax);
+void mNpc_ClearAnimalPersonalID(AnmPersonalID_c* pid);
+s32 mNpc_CheckFreeAnimalPersonalID(AnmPersonalID_c* pid);
+void mNpc_CopyAnimalPersonalID(AnmPersonalID_c* dst, AnmPersonalID_c* src);
+s32 mNpc_CheckCmpAnimalPersonalID(AnmPersonalID_c* id0, AnmPersonalID_c* id1);
+s32 mNpc_GetAnimalNum(void);
+s32 mNpc_CheckRemoveExp(Animal_c* animal);
+s32 mNpc_GetRemoveTime(Animal_c* animal);
+void mNpc_AddRemoveTime(Animal_c* animal);
+void mNpc_SetRemoveExp(Animal_c* animal, u16 removeExp);
+void mNpc_SetParentName(Animal_c* animal, PersonalID_c* parentId);
+void mNpc_SetParentNameAllAnimal(void);
+void mNpc_ClearAnimalMail(Anmplmail_c* mail);
+void mNpc_CopyAnimalMail(Anmplmail_c* dst, Anmplmail_c* src);
+void mNpc_ClearAnimalMemory(Anmmem_c* memory, s32 num);
+void mNpc_CopyAnimalMemory(Anmmem_c* dst, Anmmem_c* src);
+void mNpc_AddFriendship(Anmmem_c* memory, s32 amount);
+s32 mNpc_CheckFreeAnimalMemory(Anmmem_c* memory);
void mNpc_RenewalAnimalMemory(void);
-// void func_800A6F48_jp();
-// void func_800A6FF4_jp();
-// void func_800A706C_jp();
-// void func_800A71AC_jp();
-// void func_800A71F8_jp();
-// void func_800A7238_jp();
-// void func_800A72C0_jp();
-// void func_800A73D8_jp();
-// void func_800A74A0_jp();
-// void func_800A7530_jp();
-// void func_800A75FC_jp();
-// void func_800A76E4_jp();
-// void func_800A77F0_jp();
-// void func_800A7858_jp();
-// void func_800A78DC_jp();
-// void mNpc_ClearAnimalInfo();
-// void mNpc_ClearAnyAnimalInfo();
-s32 mNpc_CheckFreeAnimalInfo(Animal_c*);
-// void mNpc_GetFreeAnimalInfo();
-// void mNpc_UseFreeAnimalInfo();
-// void mNpc_CopyAnimalInfo();
-// void mNpc_SearchAnimalinfo();
-// void func_800A7C94_jp();
-// void func_800A7D08_jp();
-// void func_800A7DA0_jp();
-// void mNpc_GetOtherAnimalPersonalID();
-// void func_800A80D8_jp();
-// void func_800A8148_jp();
-// void func_800A820C_jp();
-// void func_800A82C8_jp();
-// void func_800A8344_jp();
-// void func_800A83F0_jp();
-// void func_800A845C_jp();
-// void func_800A8614_jp();
-// void func_800A86C4_jp();
-// void func_800A86E8_jp();
-// void func_800A8764_jp();
-// void func_800A8814_jp();
-// void func_800A8868_jp();
-// void func_800A8AB4_jp();
-// void func_800A8B10_jp();
-// void func_800A8B84_jp();
-// void func_800A8C48_jp();
-// void func_800A8DB4_jp();
-// void func_800A8F30_jp();
-// void func_800A9028_jp();
-// void func_800A9110_jp();
-// void func_800A918C_jp();
-void func_800A91DC_jp(void);
-// void func_800A9364_jp();
-// void func_800A93AC_jp();
-// void func_800A9468_jp();
-// void func_800A94C8_jp();
-// void func_800A956C_jp();
-// void func_800A96B0_jp();
-// void func_800A9780_jp();
-// void func_800A992C_jp();
-// void func_800A99B8_jp();
-// void func_800A9A98_jp();
-// void func_800A9BC4_jp();
-// void func_800A9BD4_jp();
-// void func_800A9CD4_jp();
-// void func_800A9D68_jp();
-// void func_800A9E54_jp();
-// void func_800A9E7C_jp();
-// void func_800A9EC8_jp();
-// void func_800A9F9C_jp();
-// void func_800AA028_jp();
-// void func_800AA0B8_jp();
-void func_800AA124_jp(void);
-// void func_800AA14C_jp();
-s32 mNpc_GetLooks(u16 arg0);
-// void func_800AA218_jp();
-// void func_800AA29C_jp();
-// void func_800AA2F8_jp();
-// void func_800AA35C_jp();
-// void func_800AA3A4_jp();
-// void func_800AA438_jp();
-// void func_800AA49C_jp();
-// void func_800AA4FC_jp();
-// void func_800AA51C_jp();
-// void mNpc_SetAnimalTitleDemo();
-// void func_800AA8C4_jp();
-// void func_800AA9F4_jp();
-// void func_800AAA40_jp();
-// void func_800AAB48_jp();
-// void func_800AAC88_jp();
-// void func_800AADE8_jp();
-// void func_800AAEFC_jp();
-void func_800AB054_jp(void);
-void func_800AB09C_jp(void);
-void mNpc_SetNpcList(NpcList* npclist, Animal_c* animals, s32 count, s32 malloc_flag);
-void mNpc_SetNpcinfo(struct Actor* actor, s8 arg1);
-// void func_800AB498_jp();
-// void func_800AB62C_jp();
-// void func_800AB6C8_jp();
-// void func_800AB734_jp();
-// void func_800AB7D0_jp();
-// void func_800AB80C_jp();
-// void func_800AB8A0_jp();
-// void func_800ABA14_jp();
-// void func_800ABAA8_jp();
-// void func_800ABAF0_jp();
-s32 mNpc_GetInAnimalP(void);
-// void func_800ABB24_jp();
-// void func_800ABCF8_jp();
+s32 mNpc_GetOldAnimalMemoryIdx(Anmmem_c* memory, s32 num);
+s32 mNpc_GetFreeAnimalMemoryIdx(Anmmem_c* memory, s32 num);
+s32 mNpc_ForceGetFreeAnimalMemoryIdx(Anmmem_c* memory, s32 num);
+void mNpc_SetAnimalMemory_NotSetDay(PersonalID_c* pid, Anmmem_c* memory);
+void mNpc_SetAnimalMemory(PersonalID_c* pid, Anmmem_c* memory);
+s32 mNpc_GetAnimalMemoryIdx(PersonalID_c* pid, Anmmem_c* memory, s32 num);
+void mNpc_SetAnimalLastTalk(Animal_c* animal);
+void mNpc_SetAnimalPersonalID2Memory(AnmPersonalID_c* anmId);
+s32 mNpc_GetHighestFriendshipIdx(Anmmem_c* memory, s32 num);
+s32 mNpc_SelectBestFriend(Anmmem_c** bestFriendMem, Anmmem_c* memory, s8* bestFriendFriendShip);
+s32 mNpc_GetAnimalMemoryBestFriend(Anmmem_c* memory, s32 num);
+s32 mNpc_GetAnimalMemoryFriend_Land_Sex(Anmmem_c* memory, s32 num, s32 sex);
+s32 mNpc_GetAnimalMemoryNum(Anmmem_c* memory, s32 count);
+s32 mNpc_GetAnimalMemoryLetterNum(Anmmem_c* memory, s32 count);
+s32 mNpc_GetAnimalMemoryLandKindNum(Anmmem_c* memory, s32 count);
+void mNpc_ClearAnimalInfo(Animal_c* animal);
+void mNpc_ClearAnyAnimalInfo(Animal_c* animals, s32 count);
+s32 mNpc_CheckFreeAnimalInfo(Animal_c* animal);
+s32 mNpc_GetFreeAnimalInfo(Animal_c* animal, s32 count);
+s32 mNpc_UseFreeAnimalInfo(Animal_c* animal, s32 count);
+void mNpc_CopyAnimalInfo(Animal_c* dst, Animal_c* src);
+s32 mNpc_SearchAnimalinfo(Animal_c* animal, u16 npcName, s32 count);
+Animal_c* mNpc_GetAnimalInfoP(u16 id);
+s32 mNpc_SearchAnimalPersonalID(AnmPersonalID_c* id);
+AnmPersonalID_c* mNpc_GetOtherAnimalPersonalIDOtherBlock(AnmPersonalID_c* pids, s32 count, s32 blockX, s32 blockY, s32 flag);
+AnmPersonalID_c* mNpc_GetOtherAnimalPersonalID(AnmPersonalID_c* pids, s32 count);
+void mNpc_SetAnimalThisLand(Animal_c* animal, s32 count);
+s32 mNpc_GetSameLooksNum(u8 looks);
+s32 mNpc_CheckNpcExistBlock(s32 idx, s32 checkBx, s32 checkBz);
+void mNpc_Mail2AnimalMail(Anmplmail_c* animalMail, Mail_c* mail);
+void mNpc_AnimalMail2Mail(Mail_c* mail, Anmplmail_c* animal_mail, PersonalID_c* pid, AnmPersonalID_c* anmId);
+s32 mNpc_CheckMailChar(u8 c);
+s32 mNpc_CheckNormalMail_sub(s32* num, u8* body);
+u8 mNpc_CheckNormalMail_length(s32* len, u8* body);
+u8 mNpc_CheckNormalMail(u8* body);
+s32 mNpc_SetMailCondThisLand(Anmmem_c* memory, u8* body);
+s32 mNpc_SetMailCondOtherLand(Animal_c* animal, u8* body);
+s32 mNpc_SetRemailCond(Animal_c* animal, Anmmem_c* memory, u8* body);
+s32 mNpc_SendMailtoNpc(Mail_c* mail);
+void mNpc_ClearRemail(Anmremail* remail);
+void mNpc_GetRemailPresent(u16* present);
+s32 mNpc_GetHandbillz(Mail_c* mail, s32 superNum, s32 mailANum, s32 mailBNum, s32 mailCNum, s32 psNum);
+void mNpc_SetRemailFreeString(PersonalID_c* pid, AnmPersonalID_c* anmId, Anmremail* remail);
+void mNpc_GetRemailGoodData(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* anmId, Anmremail* remail, u8 foreign);
+void mNpc_GetRemailWrongData(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* anmId, Anmremail* remail, u8 foreign);
+void mNpc_GetRemailData(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* anmId, Anmremail* remail, s32 cond, u8 foreign);
+s32 mNpc_SendRemailPostOffice(PersonalID_c* pid, AnmPersonalID_c* anmId, Anmremail* remail, s32 cond, u8 foreign);
+s32 mNpc_CheckLetterTime(lbRTC_ymd_t* letterDate, lbRTC_time_c* rtcTime);
+void mNpc_Remail(void);
+u8 mNpc_GetPaperType(void);
+void mNpc_LoadMailDataCommon2(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* amnId, u16 present, u8 paperType, s32 mailNo);
+void mNpc_GetEventPresent(u16* present, s32 type);
+void mNpc_GetEventMail(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* anmId, s32 type, s32 looks);
+s32 mNpc_SendEventPresentMail(PersonalID_c* pid, s32 playerNo, AnmPersonalID_c* anmId, s32 type);
+void mNpc_SendEventPresentMailSex(s32* selected, u8* type, Animal_c* animal, NpcSex sex);
+s32 mNpc_SendEventPresentMail_common(NpcSex sexType);
+void mNpc_GetBirthdayPresent(u16* present);
+void mNpc_GetBirthdayCard(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* anmId);
+s32 mNpc_SendBirthdayCard(PersonalID_c* pid, s32 playerNo, AnmPersonalID_c* anm_id);
+s32 mNpc_SendEventBirthdayCard(PersonalID_c* pid);
+s32 mNpc_SendEventBirthdayCard2(PersonalID_c* pid, s32 playerNo);
+void mNpc_GetXmasCardData(Mail_c* mail, PersonalID_c* pid);
+s32 mNpc_SendEventXmasCard(PersonalID_c* pid, s32 playerNo);
+void mNpc_SetWordEnding(Animal_c* animal, char* catchphrase);
+char* mNpc_GetWordEnding(Actor* actor);
+void mNpc_ResetWordEnding(Actor* actor);
+s32 mNpc_GetFreeEventNpcIdx(void);
+s32 mNpc_RegistEventNpc(u16 eventId, u16 textureId, u16 npcId, u16 clothId);
+void mNpc_UnRegistEventNpc(u16 eventId);
+void mNpc_ClearEventNpc(void);
+NpcEvent* mNpc_GetSameEventNpc(u16 eventId);
+u8 mNpc_GetLooks(u16 npcId);
+void mNpc_SetDefAnimalInfo(Animal_c* animal, u16 npcId, u8 looks, NpcDefaultData* defaultData);
+void mNpc_SetDefAnimal(Animal_c* animal, u16 npcId, NpcDefaultData* defaultData);
+void mNpc_SetHaveAppeared(u16 npcId);
+s32 mNpc_GetHaveAppeared_idx(s32 idx);
+s32 mNpc_GetLooks2NotHaveAppearedNum(u8 id);
+void mNpc_ResetHaveAppeared_common(u8* npcUsedTable, Animal_c* animal);
+void mNpc_ResetHaveAppeared(void);
+s32 mNpc_GetDefGrowPermission(s32 idx, s8* growList, s32 count);
+void mNpc_DecideLivingNpcMax(Animal_c* animal, u8 count, s32 mallocFlag);
+void mNpc_SetAnimalTitleDemo(DemoNpc* demo, Animal_c* animal, struct Game* game);
+s32 mNpc_GetReservedUtNum(s32* utX, s32* utZ, u16* item);
+s32 mNpc_BlockNum2ReservedUtNum(s32* utX, s32* utZ, s32 bx, s32 bz);
+void mNpc_MakeReservedListBeforeFieldct(Anmhome_c* reserved, s32 reservedNum, u8* reservedCount);
+void mNpc_MakeReservedListAfterFieldct(Anmhome_c* reserved, s32 reservedNum, u8* reserved_count, u8 bxMax, u8 bzMax);
+void mNpc_BuildHouseBeforeFieldct(u16 npcId, s32 bx, s32 bz, s32 utX, s32 utZ);
+void mNpc_DestroyHouse(Anmhome_c* home);
+void mNpc_SetNpcHome(Animal_c* animal, Anmhome_c* reserved, u8 reserved_num);
+void mNpc_InitNpcData(void);
+void mNpc_InitNpcList(void);
+void mNpc_SetNpcList(NpcList* npclist, Animal_c* animal, s32 count, s32 mallocFlag);
+void mNpc_SetNpcinfo(Actor* actor, s8 npcInfoIdx);
+void mNpc_AddNpc_inNpcRoom(FieldMakeMoveActor* moveActor, u8 bx, u8 bz);
+void mNpc_RenewalNpcRoom(s16* wallFloor);
+void mNpc_RenewalSetNpc(Actor* actor);
+s32 mNpc_GetFriendAnimalNum(PersonalID_c* pid);
+s32 mNpc_CheckFriendAllAnimal(PersonalID_c* pid);
+s32 mNpc_CheckSelectFurniture(u16 item);
+u16 func_800AB8A0_jp(FieldMakeFGData**, NpcList*, s32);
+void mNpc_SetNpcFurnitureRandom(FieldMakeFGData** data, s32 base);
+u16 mNpc_GetNpcFurniture(AnmPersonalID_c* anmId);
+void mNpc_ClearInAnimal(void);
+Animal_c* mNpc_GetInAnimalP(void);
+u8 mNpc_DecideRemoveAnimalNo(Animal_c* animal, s32 max);
+
void mNpc_SetRemoveAnimalNo(Animal_c* animal);
-// void func_800ABE30_jp();
-// void func_800ABF40_jp();
-// void func_800AC1A0_jp();
-// void func_800AC1C8_jp();
-// void func_800AC1EC_jp();
-// void func_800AC284_jp();
-// void func_800AC358_jp();
-// void func_800AC488_jp();
+s32 mNpc_CheckGoodbyAnimalMemoryNum(Animal_c* a0, Animal_c* a1);
+s32 mNpc_GetGoodbyAnimalIdx(void);
+void mNpc_ClearGoodbyMail(AnmGoodbyeMail* mail);
+void mNpc_FirstClearGoodbyMail(void);
+void mNpc_SetGoodbyAnimalMail(AnmGoodbyeMail* mail, Animal_c* animal);
+s32 mNpc_SetGoodbyMailData(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* anm_id);
+s32 mNpc_SendGoodbyAnimalMailOne(Mail_c* mail, struct PrivateInfo* priv, s32 playerNo, AnmPersonalID_c* anmId);
+void mNpc_SendGoodbyAnimalMail(AnmGoodbyeMail* mail);
void mNpc_SendRegisteredGoodbyMail(void);
-// void func_800AC57C_jp();
-// void func_800AC804_jp();
-void mNpc_SetReturnAnimal(s32 arg0);
-// void func_800ACB24_jp();
-// void func_800ACB54_jp();
-// void func_800ACC38_jp();
-// void func_800ACCAC_jp();
-void mNpc_GetNpcWorldNameAnm(PlayerName* arg0, struct mMl_get_npcinfo_from_mail_name_arg0* arg1);
-// void func_800ACD74_jp();
-// void func_800ACDF8_jp();
-// void func_800ACE90_jp();
-void mNpc_GetAnimalPlateName(char* arg0, xyz_t arg1);
-// void func_800AD084_jp();
-// void func_800AD0B8_jp();
-// void func_800AD104_jp();
-// void func_800AD154_jp();
-// void func_800AD188_jp();
-// void func_800AD1E0_jp();
-// void func_800AD22C_jp();
-// void func_800AD2B8_jp();
-void mNpc_InitNpcAllInfo(s32 arg0);
-// void func_800AD338_jp();
-// void func_800AD3BC_jp();
-// void func_800AD4B8_jp();
-// void func_800AD614_jp();
-// void func_800AD6D4_jp();
-// void func_800AD8C4_jp();
-// void func_800AD954_jp();
-void func_800AD9FC_jp(void);
-// void func_800ADBE4_jp();
-// void func_800ADC28_jp();
-// void func_800ADC8C_jp();
-// void func_800ADD20_jp();
-// void func_800ADEFC_jp();
-// void func_800AE110_jp();
+void mNpc_GetRemoveAnimal(Animal_c* transferAnimal, s32 movingOut);
+s32 mNpc_CheckBuildHouse(s32 blockX, s32 blockZ, u8 utX, u8 utZ);
+void mNpc_SetReturnAnimal(Animal_c* returnAnimal);
+void mNpc_AddActor_inBlock(FieldMakeMoveActor* moveActor, u8 bx, u8 bz);
+void mNpc_SetNpcNameID(Animal_c* animal, s32 count);
+void mNpc_LoadNpcNameString(char* name, u8 npcId);
+void mNpc_GetNpcWorldNameTableNo(char* name, u16 npcId);
+void mNpc_GetNpcWorldNameAnm(char* name, AnmPersonalID_c* anmId);
+void mNpc_GetNpcWorldNameP(char* name, u16 npcId);
+void mNpc_GetNpcWorldName(char* name,Npc* npc);
+void mNpc_GetRandomAnimalName(char* dst);
+void mNpc_GetAnimalPlateName(char* dst, xyz_t wpos);
+NpcLooks mNpc_GetNpcLooks(Actor* actor);
+NpcSex mNpc_GetActorSex(u16 npcId);
+NpcSex mNpc_GetLooks2Sex(NpcLooks looks);
+NpcSex mNpc_GetAnimalSex(Animal_c* animal);
+NpcSex mNpc_GetNpcSex(Actor* actor);
+s32 mNpc_GetNpcSoundSpecNotAnimal(u16 npcId);
+s32 mNpc_GetNpcSoundSpec(Actor* actor);
+void mNpc_GetMsg(s32 arg);
+void mNpc_InitNpcAllInfo(s32 mallocFlag);
+s32 mNpc_CheckGrowFieldRank(void);
+s32 mNpc_CheckGrow(void);
+u8 mNpc_GetMinLooks(u8* bitfield, s32* minLooksNum);
+NpcSex mNpc_GetMinSex(void);
+s32 mNpc_GrowLooksNpcIdx(u8 looks);
+void mNpc_SetAnimalInfoNpcIdx(Animal_c* animal, s32 idx);
+s32 mNpc_SetGrowNpc(u8 looks);
+void mNpc_Grow(void);
+s32 mNpc_CheckNpcSet_fgcol(u16 arg0, u32 arg1);
+s32 mNpc_CheckNpcSet_fgcol_hard(u16 arg0, u32 arg1);
+s32 mNpc_CheckNpcSet(s32 bx, s32 bz, s32 ut_x, s32 ut_z);
+s32 mNpc_GetMakeUtNuminBlock_hard_area(s32* utX, s32* utZ, s32 bx, s32 bz, s32 restrictArea);
+s32 mNpc_GetMakeUtNuminBlock_area(s32* utX, s32* utZ, s32 bx, s32 bz, s32 restrictArea);
+s32 mNpc_GetMakeUtNuminBlock(s32* utX, s32* utZ, s32 bx, s32 bz);
void mNpc_ClearTalkInfo(void);
-// void func_800AE1A0_jp();
-// void func_800AE1B8_jp();
-// void func_800AE1D8_jp();
-// void func_800AE23C_jp();
-// void func_800AE284_jp();
-// void func_800AE2E8_jp();
-// void func_800AE320_jp();
-// void func_800AE37C_jp();
-// void func_800AE3B4_jp();
-// void func_800AE4B4_jp();
-// void func_800AE558_jp();
-// void func_800AE5C8_jp();
-// void func_800AE64C_jp();
-// void func_800AE670_jp();
-// void func_800AE694_jp();
-// void func_800AE6B0_jp();
-// void func_800AE6CC_jp();
-// void func_800AE76C_jp();
-// void func_800AE898_jp();
-// void mNpc_PrintFriendship_fdebug();
+void mNpc_TimerCountDown(NpcTalkInfo* talkInfo);
+void mNpc_SetUnlockTimer(u16* unlockTimer, u16* resetTimer, s32 feel);
+s32 mNpc_CountTalkNum(s32 animalIdx, s32 feel);
+s32 mNpc_CheckOverImpatient(s32 animalIdx, s32 feel);
+s32 mNpc_GetOverImpatient(s32 animalIdx, s32 feel);
+s32 mNpc_CheckQuestRequest(s32 animalIdx);
+void mNpc_SetQuestRequestOFF(s32 animalIdx, s32 feel);
+void mNpc_UnlockTimerCountDown(NpcTalkInfo* talkInfo);
+void mNpc_TalkInfoMove(void);
+void mNpc_TalkEndMove(s32 animalIdx, s32 feel);
+s32 mNpc_GetNpcFloorNo(void);
+void mNpc_SetTalkBee(void);
+u8 mNpc_GetFishCompleteTalk(NpcList* npclist);
+u8 mNpc_GetInsectCompleteTalk(NpcList* npclist);
+void mNpc_SetFishCompleteTalk(NpcList* npclist);
+void mNpc_SetInsectCompleteTalk(NpcList* npclist);
+void mNpc_SetNpcHomeYpos(void);
+void mNpc_PrintRemoveInfo(gfxprint* gfxprint);
+void mNpc_SetTalkAnimalIdx_fdebug(AnmPersonalID_c* anm_id);
+void mNpc_PrintFriendship_fdebug(gfxprint* gfxprint);
+
#endif
diff --git a/include/m_npc_base.h b/include/m_npc_base.h
new file mode 100644
index 0000000..c98d121
--- /dev/null
+++ b/include/m_npc_base.h
@@ -0,0 +1,48 @@
+#ifndef M_NPC_BASE_H
+#define M_NPC_BASE_H
+
+#include "ultra64.h"
+
+typedef struct AnmPersonalId_c {
+ /* 0x00 */ u16 npcId; /* id */
+ /* 0x02 */ u16 landId; /* town id */
+ /* 0x04 */ char landName[LAND_NAME_SIZE]; /* town name */
+ /* 0x0A */ u8 nameId; /* lower byte of the id */
+ /* 0x0B */ u8 looks; /* internal name for personality */
+} AnmPersonalID_c; // size = 0xC
+
+typedef enum NpcSex {
+ /* 0 */ NPC_SEX_MALE,
+ /* 1 */ NPC_SEX_FEMALE,
+ /* 2 */ NPC_SEX_OTHER
+} NpcSex;
+
+typedef enum NpcLooks {
+ /* 0 */ NPC_LOOKS_GIRL,
+ /* 1 */ NPC_LOOKS_KO_GIRL,
+ /* 2 */ NPC_LOOKS_BOY,
+ /* 3 */ NPC_LOOKS_SPORT_MAN,
+ /* 4 */ NPC_LOOKS_GRIM_MAN,
+ /* 5 */ NPC_LOOKS_NANIWA_LADY,
+ /* 6 */ NPC_LOOKS_NUM
+} NpcLooks;
+
+typedef enum NpcFeels {
+ /* 0 */ NPC_FEEL_NORMAL,
+ /* 1 */ NPC_FEEL_HAPPY,
+ /* 2 */ NPC_FEEL_ANGRY,
+ /* 3 */ NPC_FEEL_SAD,
+ /* 4 */ NPC_FEEL_SLEEPY,
+ /* 5 */ NPC_FEEL_PITFALL,
+ /* 6 */ NPC_FEEL_NUM
+} NpcFeels;
+
+typedef enum NpcPatience {
+ /* 0 */ NPC_PATIENCE_MILDLY_ANNOYED,
+ /* 1 */ NPC_PATIENCE_ANNOYED,
+ /* 2 */ NPC_PATIENCE_NORMAL,
+ /* 3 */ NPC_PATIENCE_NUM
+} NpcPatience;
+
+#endif
+
diff --git a/include/m_private.h b/include/m_private.h
index caf8a80..f966bde 100644
--- a/include/m_private.h
+++ b/include/m_private.h
@@ -4,6 +4,8 @@
#include "ultra64.h"
#include "m_mail.h"
#include "m_quest.h"
+#include "m_private_internals.h"
+#include "m_npc.h"
#include "unk.h"
#define mPr_FOREIGN_MAP_COUNT 8
@@ -24,49 +26,113 @@ typedef enum mPr_ITEM_COND{
/* 3 */ mPr_ITEM_COND_NUM
} mPr_ITEM_COND;
-#define mPr_POCKETS_SLOT_COUNT 15
-#define mPr_DELIVERY_QUEST_NUM mPr_POCKETS_SLOT_COUNT
-#define mPr_ERRAND_QUEST_NUM 5
-
-typedef struct Private_Sub_A86 {
- /* 0x00 */ char unk00[0x3];
- /* 0x03 */ u8 unk_03;
- /* 0x04 */ char unk04[0x1];
- /* 0x05 */ u8 unk_05;
- /* 0x06 */ u16 unk_06;
- /* 0x08 */ u8 unk_08;
-} Private_Sub_A86; // size >= 0xA
-
-typedef struct mPr_map_info_c {
- /* 0x00 */ char unk00[0x8];
-} mPr_map_info_c; // size = 0x8
-
-typedef struct PrivateInventory {
- /* 0x00 */ u16 pockets[mPr_POCKETS_SLOT_COUNT]; /* items in inventory */
- /* 0x1E */ u8 lotto_ticket_expiry_month;
- /* 0x1F */ u8 lotto_ticket_mail_storage;
- /* 0x20 */ u32 item_conditions; /* bitfield (15 values), 2 bits per pocket slot */
- /* 0x24 */ u32 wallet;
- /* 0x28 */ u32 loan;
-} PrivateInventory; // size = 0x2C
-
typedef struct PrivateInfo {
- /* 0x000 */ UNK_TYPE1 unk000[0x10];
+ /* 0x000 */ PersonalID_c playerId;
/* 0x010 */ s8 gender;
/* 0x011 */ UNK_TYPE1 unk011[0x3];
/* 0x014 */ PrivateInventory inventory;
/* 0x040 */ mQst_delivery_c deliveries[mPr_DELIVERY_QUEST_NUM]; /* delivery quests */
- /* 0x25C */ mQst_errand_c errands[mPr_ERRAND_QUEST_NUM]; /* errand quests */
+ /* 0x25C */ QuestErrand errands[mPr_ERRAND_QUEST_NUM]; /* errand quests */
/* 0x3EC */ UNK_TYPE1 unk_3EC[0x2];
/* 0x3EE */ MailHeaderCommon unk_3EE;
- /* 0x40A */ Mail unk_40A[10];
+ /* 0x40A */ Mail_c unk_40A[10];
/* 0xA72 */ UNK_TYPE1 unk_A72[0x2];
/* 0xA74 */ u8 exists;
/* 0xA75 */ UNK_TYPE1 unkA75[0x11];
/* 0xA86 */ Private_Sub_A86 unk_A86;
- /* 0xA90 */ UNK_TYPE1 unkA8F[0xF8];
+ /* 0xA8F */ UNK_TYPE1 unkA8F[0x3c];
+ /* 0xACB */ Anmremail remail;
+ /* 0xADE */ char unkADE[06];
+ /* 0xADE */ PrivateAnimalMemory animalMemory;
+ /* 0xAE4 */ UNK_TYPE1 unkAEA[0x9C];
/* 0xB88 */ mPr_map_info_c maps[mPr_FOREIGN_MAP_COUNT]; /* maps 'collected' for foreign towns */
/* 0xBC8 */ UNK_TYPE1 unkBC8[0x8];
} PrivateInfo; // size = 0xBD0
+void mPr_ClearPlayerName(char* arg0);
+void mPr_CopyPlayerName(char* dst, char* src);
+s32 mPr_NullCheckPlayerName(char* arg0);
+// void func_800B7804_jp();
+// void func_800B785C_jp();
+s32 mPr_NullCheckPersonalID(PersonalID_c* arg0);
+void mPr_ClearPersonalID(PersonalID_c* arg0);
+// void func_800B7998_jp();
+void mPr_CopyPersonalID(PersonalID_c* arg0, PersonalID_c* arg1);
+s32 mPr_CheckCmpPersonalID(PersonalID_c* arg0, PersonalID_c* arg1);
+// void func_800B7A94_jp();
+// void func_800B7AB0_jp();
+void mPr_ClearPrivateInfo(PrivateInfo* private);
+// void func_800B7B8C_jp();
+// void func_800B7BC0_jp();
+// void func_800B7CD0_jp();
+// void func_800B7D50_jp();
+void mPr_InitPrivateInfo(PrivateInfo* private);
+// void func_800B7F00_jp();
+// void func_800B7F48_jp();
+s32 mPr_CheckPrivate(PrivateInfo* private);
+// void func_800B7FA0_jp();
+s32 mPr_GetPrivateIdx(PersonalID_c* arg0);
+// void func_800B8068_jp();
+// void func_800B80B4_jp();
+// void func_800B8128_jp();
+// void func_800B81A4_jp();
+// void func_800B8204_jp();
+// void func_800B828C_jp();
+// void func_800B8318_jp();
+// void func_800B83D4_jp();
+// void func_800B8544_jp();
+// void func_800B86EC_jp();
+// void func_800B88EC_jp();
+// void func_800B8A88_jp();
+void mPr_SetPossessionItem(PrivateInfo* priv, int idx, u16 item, u32 cond);
+// void func_800B8B8C_jp();
+// void func_800B8BE4_jp();
+// void func_800B8C10_jp();
+// void func_800B8C20_jp();
+// void func_800B8C34_jp();
+// void func_800B8C9C_jp();
+// void func_800B8D18_jp();
+// void func_800B8D3C_jp();
+s32 func_800B8D64_jp(u8 player_no, s32 arg1);
+void mPr_ClearMotherMailInfo(PrivateMotherMail* arg0);
+// void func_800B8F20_jp();
+// void func_800B8FB8_jp();
+// void func_800B9038_jp();
+// void func_800B9170_jp();
+// void func_800B9350_jp();
+// void func_800B93AC_jp();
+// void func_800B947C_jp();
+// void func_800B94E0_jp();
+// void func_800B9704_jp();
+// void func_800B9790_jp();
+// void func_800B97C8_jp();
+// void func_800B97F8_jp();
+// void func_800B996C_jp();
+// void func_800B9AF0_jp();
+void func_800B9B2C_jp(void);
+// void func_800B9C34_jp();
+void mPr_SendForeingerAnimalMail(PrivateInfo* privateInfo);
+void mPr_StartSetCompleteTalkInfo(void);
+// void func_800B9E90_jp();
+// void func_800B9EB4_jp();
+// void func_800B9ED4_jp();
+// void func_800B9F00_jp();
+// void func_800B9F74_jp();
+// void func_800B9FA0_jp();
+// void func_800BA014_jp();
+// void func_800BA054_jp();
+// void func_800BA09C_jp();
+// void func_800BA0E4_jp();
+// void func_800BA130_jp();
+// void func_800BA150_jp();
+// void func_800BA18C_jp();
+// void func_800BA214_jp();
+// void func_800BA2B0_jp();
+// void func_800BA2D4_jp();
+// void func_800BA344_jp();
+// void func_800BA3D0_jp();
+void mPr_RenewalMapInfo(mPr_map_info_c* maps, s32 count, struct LandInfo* landInfo);
+// void mPr_RandomSetPlayerData_title_demo();
+// void mPr_PrintMapInfo_debug();
+
#endif
diff --git a/include/m_private_internals.h b/include/m_private_internals.h
new file mode 100644
index 0000000..84c6b3c
--- /dev/null
+++ b/include/m_private_internals.h
@@ -0,0 +1,51 @@
+#ifndef M_PRIVATE_INTERNALS_H
+#define M_PRIVATE_INTERNALS_H
+
+#include "ultra64.h"
+#include "m_land.h"
+
+#define mPr_POCKETS_SLOT_COUNT 15
+#define mPr_DELIVERY_QUEST_NUM mPr_POCKETS_SLOT_COUNT
+#define mPr_ERRAND_QUEST_NUM 5
+
+#define PLAYER_NAME_LEN 6
+
+typedef struct PersonalID_c {
+ /* 0x00 */ char playerName[PLAYER_NAME_LEN];
+ /* 0x06 */ char landName[LAND_NAME_SIZE];
+ /* 0x0C */ u16 playerId;
+ /* 0x0E */ u16 landId;
+} PersonalID_c; // size = 0x10
+
+typedef struct Private_Sub_A86 {
+ /* 0x00 */ char unk00[0x3];
+ /* 0x03 */ u8 unk_03;
+ /* 0x04 */ char unk04[0x1];
+ /* 0x05 */ u8 unk_05;
+ /* 0x06 */ u16 unk_06;
+ /* 0x08 */ u8 unk_08;
+} Private_Sub_A86; // size >= 0xA
+
+typedef struct mPr_map_info_c {
+ /* 0x00 */ char unk00[0x8];
+} mPr_map_info_c; // size = 0x8
+
+typedef struct PrivateMotherMail {
+ /* 0x00 */ UNK_TYPE1 unk_00[0xE];
+} PrivateMotherMail; // size = 0xE
+
+typedef struct PrivateAnimalMemory{
+ /* 0x00 */ u16 npcId;
+ /* 0x02 */ char landName[LAND_NAME_SIZE];
+}PrivateAnimalMemory; // size 0x8
+
+typedef struct PrivateInventory {
+ /* 0x00 */ u16 pockets[mPr_POCKETS_SLOT_COUNT]; /* items in inventory */
+ /* 0x1E */ u8 lotto_ticket_expiry_month;
+ /* 0x1F */ u8 lotto_ticket_mail_storage;
+ /* 0x20 */ u32 item_conditions; /* bitfield (15 values), 2 bits per pocket slot */
+ /* 0x24 */ u32 wallet;
+ /* 0x28 */ u32 loan;
+} PrivateInventory; // size = 0x2C
+
+#endif
diff --git a/include/m_quest.h b/include/m_quest.h
index 671d511..84732b2 100644
--- a/include/m_quest.h
+++ b/include/m_quest.h
@@ -2,19 +2,123 @@
#define M_QUEST_H
#include "ultra64.h"
+#include "lb_rtc.h"
+#include "m_private_internals.h"
+#include "m_npc_base.h"
+
+typedef struct QuestBase {
+ /* 0x00 */ u32 questType:2; /* type, 0 = delivery, 1 = errand, 2 = contest, 3 = none */
+ /* 0x00 */ u32 questKind:6; /* kind, differs by type */
+ /* 0x01 */ u32 timeLimitEnabled:1; /* when set, the time limit will be utilized */
+ /* 0x01 */ u32 progress:4; /* progress towards quest goal */
+ /* 0x01 */ u32 giveReward:1; /* set to true when player cannot take the item, and will skip quest completion checks */
+ /* 0x01 */ u32 unused:2;
+
+ /* 0x02 */ lbRTC_time_c timeLimit;
+} QuestBase; // size = 0xC
/* 'Not Saved' Quest */
typedef struct mQst_not_saved_c {
- /* 0x00 */ s32 work;
- /* 0x04 */ u8 h;
+ /* 0x00 */ s32 work;
+ /* 0x04 */ u8 h;
} mQst_not_saved_c; // size = 0x5
typedef struct mQst_delivery_c {
- /* 0x00 */ char unk00[0x24];
+ /* 0x00 */ char unk00[0x24];
} mQst_delivery_c; // size = 0x24
-typedef struct mQst_errand_c {
- /* 0x00 */ char unk00[0x50];
-} mQst_errand_c; // size = 0x50
+typedef struct QuestFirstJob {
+ /* 0x00 */ AnmPersonalID_c usedId[2]; /* villagers already used for first job quest (furniture, then letter) */
+ /* 0x1C */ u8 usedNum:7; /* used count for 'used_ids' */
+ /* 0x1C */ u8 wrongNum:1; /* set to TRUE if player changes out of work uniform during chores */
+} QuestFirstJob;
+
+typedef struct QuestErrandChain {
+ /* 0x00 */ AnmPersonalID_c usedId[3];
+ /* 0x24 */ u8 usedNum;
+} QuestErrandChain; // size 0x26
+
+
+typedef union ErrandInfo{
+ /* 0x00 */ QuestErrandChain chain;
+ /* 0x12 */ QuestFirstJob firstJob;
+} ErrandInfo; // size = 0x24
+
+typedef struct QuestErrand {
+ /* 0x00 */ QuestBase base; /* quest base info */
+ /* 0x0C */ AnmPersonalID_c recipient; /* villager who will receive it */
+ /* 0x1A */ AnmPersonalID_c sender; /* villager who sent it */
+ /* 0x28 */ u16 item; /* errand item */
+ /* 0x2A */ s8 pocketIdx:5; /* index in player pockets where the errand item is */
+ /* 0x2A */ s8 errandType:3; /* errand type */
+ /* 0x2C */ ErrandInfo info; /* errand type-specific data */
+} QuestErrand; // size = 0x50
+
+typedef struct QuestContest {
+ /* 0x00 */ char unk00[0x24];
+} QuestContest; // size = 0x24
+
+
+void mQst_ClearQuestInfo(QuestBase*);
+void mQst_ClearDelivery(mQst_delivery_c* deliveries, s32 count);
+void mQst_ClearErrand(QuestErrand* errands, s32 count);
+void mQst_ClearContest(QuestContest* contest);
+void mQst_ClearNotSaveQuest(mQst_not_saved_c* quest);
+// void func_800BA7E8_jp();
+// void func_800BA8A0_jp();
+// void func_800BA8F4_jp();
+// void func_800BAA10_jp();
+// void func_800BAA7C_jp();
+// void func_800BAAA4_jp();
+// void func_800BABE8_jp();
+// void func_800BAC84_jp();
+// void func_800BACEC_jp();
+// void func_800BADBC_jp();
+// void func_800BAE78_jp();
+UNK_RET mQst_CheckLimitbyPossessionIdx(s32 arg0);
+// void func_800BB0A8_jp();
+// void func_800BB0E8_jp();
+// void func_800BB10C_jp();
+// void func_800BB270_jp();
+// void func_800BB3A4_jp();
+// void func_800BB4B0_jp();
+s32 mQst_GetOccuredContestIdx(s32);
+// void func_800BB634_jp();
+// void func_800BB658_jp();
+// void func_800BB67C_jp();
+// void func_800BB6A0_jp();
+// void func_800BB6F0_jp();
+// void func_800BB740_jp();
+// void func_800BB86C_jp();
+// void func_800BB990_jp();
+// void func_800BBAB0_jp();
+void mQst_SetReceiveLetter(QuestContest*, PersonalID_c*, u8*, u16);
+QuestErrand* mQst_GetFirstJobData(void);
+// void func_800BBCBC_jp();
+// void func_800BBD00_jp();
+// void func_800BBD68_jp();
+// void func_800BBD90_jp();
+// void func_800BBDE0_jp();
+// void func_800BBE78_jp();
+// void func_800BBEE0_jp();
+// void func_800BBF3C_jp();
+// void func_800BBF98_jp();
+// void func_800BC064_jp();
+// void func_800BC10C_jp();
+// void func_800BC12C_jp();
+// void func_800BC14C_jp();
+// void func_800BC1E4_jp();
+// void func_800BC28C_jp();
+// void func_800BC33C_jp();
+// void func_800BC368_jp();
+// void func_800BC394_jp();
+s32 mQst_GetRandom(s32);
+// void func_800BC454_jp();
+// void func_800BC528_jp();
+// void func_800BC5D4_jp();
+// void func_800BC6B0_jp();
+// void func_800BC724_jp();
+// void func_800BC830_jp();
+// void mQst_PrintQuestInfo();
#endif
diff --git a/include/m_submenu.h b/include/m_submenu.h
index 069b61c..423f3dd 100644
--- a/include/m_submenu.h
+++ b/include/m_submenu.h
@@ -84,7 +84,7 @@ typedef struct Submenu {
/* 0x2C */ struct struct_8085E9B0* unk_2C;
/* 0x30 */ SubmenuMoveFunc move;
/* 0x34 */ SubmenuDrawFunc draw;
- /* 0x38 */ Mail mail;
+ /* 0x38 */ Mail_c mail;
/* 0xDC */ u8 unk_DC;
/* 0xDD */ u8 unk_DD;
/* 0xDE */ u8 unk_DE;
diff --git a/include/segment_symbols.h b/include/segment_symbols.h
index f97649e..4e169e0 100644
--- a/include/segment_symbols.h
+++ b/include/segment_symbols.h
@@ -95,5 +95,10 @@ DECLARE_SEGMENT(ac_set_ovl_gyoei);
DECLARE_SEGMENT(segment_00A58000);
+DECLARE_SEGMENT(segment_00E02000);
+DECLARE_SEGMENT(segment_00E03000);
+DECLARE_SEGMENT(segment_00E04000);
+DECLARE_SEGMENT(segment_00E0D000);
+
#endif
diff --git a/include/sys_math.h b/include/sys_math.h
index c78155c..bccf335 100644
--- a/include/sys_math.h
+++ b/include/sys_math.h
@@ -4,11 +4,13 @@
#include "ultra64.h"
#include "libc64/qrand.h"
-/* Macro to generate a random float in the range of [0, n) */
#define RANDOM_F(n) (fqrand() * (f32)(n))
+/* Macro to generate a random integer in the range of [0, n) */
+#define RANDOM(n) ((s32)RANDOM_F(n))
+#define RANDOM_F2(n) ((f32)(n) * fqrand())
/* Macro to generate a random integer in the range of [0, n) */
-#define RANDOM(n) ((int)RANDOM_F(n))
+#define RANDOM2(n) ((s32)RANDOM_F2(n))
// void reverse_u32();
// void init_rnd();