summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaide <34639600+Kelebek1@users.noreply.github.com>2023-08-18 04:44:08 +0100
committerGitHub <noreply@github.com>2023-08-17 20:44:08 -0700
commitc863d781327c1d371cb81ad31a4fd06b53e1b953 (patch)
tree27d282e78cfe134623a000394dace56d03eb261a
parentae5aa8db7c07a162cf140a30e9af772c57e4b16b (diff)
m_start_data_init (#61)
* m_start_data_init * Fix NPC, m,atch last func * Rebased * Rebased * Update struct names * PR --------- Co-authored-by: Maide <you@example.com>
-rw-r--r--include/6792F0.h2
-rw-r--r--include/67E840.h2
-rw-r--r--include/68AB30.h4
-rw-r--r--include/69CB30.h4
-rw-r--r--include/6A83A0.h2
-rw-r--r--include/6B81C0.h6
-rw-r--r--include/6B8A70.h2
-rw-r--r--include/6BA500.h2
-rw-r--r--include/6C0690.h6
-rw-r--r--include/6C97F0.h2
-rw-r--r--include/6D2720.h8
-rw-r--r--include/6D9D80.h6
-rw-r--r--include/6DA460.h2
-rw-r--r--include/6DB420.h26
-rw-r--r--include/6DE300.h10
-rw-r--r--include/6E30B0.h4
-rw-r--r--include/6E7AD0.h2
-rw-r--r--include/6ECD90.h2
-rw-r--r--include/6EDD10.h2
-rw-r--r--include/6F8A60.h6
-rw-r--r--include/code_variables.h3
-rw-r--r--include/game.h38
-rw-r--r--include/lb_rtc.h103
-rw-r--r--include/m_all_grow.h30
-rw-r--r--include/m_common_data.h126
-rw-r--r--include/m_controller.h4
-rw-r--r--include/m_debug.h2
-rw-r--r--include/m_event.h26
-rw-r--r--include/m_field_info.h6
-rw-r--r--include/m_field_make.h25
-rw-r--r--include/m_handbill.h3
-rw-r--r--include/m_home.h60
-rw-r--r--include/m_house.h30
-rw-r--r--include/m_kankyo.h2
-rw-r--r--include/m_land.h14
-rw-r--r--include/m_lib.h2
-rw-r--r--include/m_msg_main.h4
-rw-r--r--include/m_name_table.h152
-rw-r--r--include/m_npc.h37
-rw-r--r--include/m_npc_walk.h11
-rw-r--r--include/m_private.h67
-rw-r--r--include/m_quest.h20
-rw-r--r--include/m_scene_table.h4
-rw-r--r--include/m_snowman.h4
-rw-r--r--include/m_start_data_init.h53
-rw-r--r--include/m_time.h81
-rw-r--r--include/speed_meter.h2
-rw-r--r--include/sys_math.h6
-rw-r--r--include/sys_matrix.h2
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt127
-rw-r--r--src/code/game.c122
-rw-r--r--src/code/m_actor.c2
-rw-r--r--src/code/m_start_data_init.c458
-rw-r--r--src/code/sys_matrix.c4
-rw-r--r--src/overlays/actors/ovl_Npc/ac_npc.h4
-rw-r--r--src/overlays/gamestates/ovl_play/m_play.c33
-rw-r--r--src/overlays/gamestates/ovl_play/m_play.h6
-rw-r--r--yamls/jp/code.yaml24
58 files changed, 1487 insertions, 310 deletions
diff --git a/include/6792F0.h b/include/6792F0.h
index 6962408..2cd1e57 100644
--- a/include/6792F0.h
+++ b/include/6792F0.h
@@ -24,6 +24,6 @@
// void func_8005615C_jp();
// void func_80056234_jp();
// void func_80056270_jp();
-// void func_80056310_jp();
+void mAGrw_ChangeTree2FruitTree(void);
#endif
diff --git a/include/67E840.h b/include/67E840.h
index fe460f6..bbb05ed 100644
--- a/include/67E840.h
+++ b/include/67E840.h
@@ -179,7 +179,7 @@ void mBGMPsComp_make_ps_wipe(s32 arg0, struct Game_Play* game_play);
// void func_8005EE00_jp();
// void func_8005EE20_jp();
// void func_8005EEA0_jp();
-void mBGM_main(struct Game* gameState);
+void mBGM_main(struct Game* game);
// void mBGM_ct();
void func_8005F020_jp(void);
void mBGM_cleanup(void);
diff --git a/include/68AB30.h b/include/68AB30.h
index 2cba5ab..1281555 100644
--- a/include/68AB30.h
+++ b/include/68AB30.h
@@ -6,10 +6,10 @@
// void func_80066E90_jp();
// void func_80066EB8_jp();
// void func_80066F1C_jp();
-// void func_80066F4C_jp();
+void mNW_InitMyOriginal(void);
// void func_80066F8C_jp();
// void func_8006700C_jp();
-// void func_800670C0_jp();
+void mCkRh_DecideNowGokiFamilyCount(s32 player_no);
// void func_80067190_jp();
// void func_80067264_jp();
// void func_80067338_jp();
diff --git a/include/69CB30.h b/include/69CB30.h
index 383e08b..60fe607 100644
--- a/include/69CB30.h
+++ b/include/69CB30.h
@@ -3,7 +3,7 @@
#include "ultra64.h"
-// void func_80078E90_jp();
+s32 func_80078E90_jp(s32 arg0, s32 arg1);
// void func_80078EB4_jp();
// void func_80078EE0_jp();
// void func_80078F08_jp();
@@ -37,7 +37,7 @@
// void func_80079EDC_jp();
// void func_80079F44_jp();
// void func_8007A008_jp();
-// void mCPk_get_pkinfo();
+s32 mCPk_get_pkinfo(void);
// void func_8007A080_jp();
#endif
diff --git a/include/6A83A0.h b/include/6A83A0.h
index 34ffeaa..803d3de 100644
--- a/include/6A83A0.h
+++ b/include/6A83A0.h
@@ -15,7 +15,7 @@
// void func_80084CA4_jp();
// void func_80084CD8_jp();
// void func_80084D08_jp();
-// void func_80084DA4_jp();
+void func_80084DA4_jp(void);
// void func_80084DE0_jp();
// void mFAs_PrintFieldAssessment();
diff --git a/include/6B81C0.h b/include/6B81C0.h
index 8720c14..a897cd4 100644
--- a/include/6B81C0.h
+++ b/include/6B81C0.h
@@ -5,15 +5,15 @@
// void func_80094520_jp();
// void func_80094690_jp();
-// void func_800946D0_jp();
+void mHm_SetNowHome(void);
// void func_80094744_jp();
// void func_800947C0_jp();
// void func_8009480C_jp();
// void func_800949B0_jp();
// void func_800949D8_jp();
// void func_80094A04_jp();
-// void func_80094A90_jp();
-// void func_80094BE0_jp();
+void mHm_CheckRehouseOrder(void);
+void mHS_house_init(void);
// void func_80094BF4_jp();
// void func_80094C10_jp();
// void func_80094C44_jp();
diff --git a/include/6B8A70.h b/include/6B8A70.h
index 7be9498..db73f5e 100644
--- a/include/6B8A70.h
+++ b/include/6B8A70.h
@@ -18,6 +18,6 @@
// void mLd_PlayerManKindCheck();
// void func_800951E4_jp();
// void func_80095218_jp();
-// void func_8009524C_jp();
+void mLd_LandDataInit(void);
#endif
diff --git a/include/6BA500.h b/include/6BA500.h
index e6c00ba..5db7e1e 100644
--- a/include/6BA500.h
+++ b/include/6BA500.h
@@ -7,7 +7,7 @@
// void func_800968C0_jp();
// void func_80096B2C_jp();
// void func_80096B4C_jp();
-// void func_80096B64_jp();
+void func_80096B64_jp(void);
// void func_80096BF0_jp();
#endif
diff --git a/include/6C0690.h b/include/6C0690.h
index 081f204..ad2c312 100644
--- a/include/6C0690.h
+++ b/include/6C0690.h
@@ -3,14 +3,16 @@
#include "ultra64.h"
+struct Game;
+
// void func_8009C9F0_jp();
// void func_8009CA54_jp();
// void func_8009CA94_jp();
// void func_8009CB5C_jp();
// void func_8009CC00_jp();
// void func_8009CC94_jp();
-// void func_8009CDA8_jp();
-// void func_8009CFB0_jp();
+void mMkRm_MarkRoom(struct Game* game);
+void mMld_SetDefaultMelody(void);
// void func_8009CFD4_jp();
// void func_8009D03C_jp();
// void func_8009D0CC_jp();
diff --git a/include/6C97F0.h b/include/6C97F0.h
index ce7d044..26f7cf7 100644
--- a/include/6C97F0.h
+++ b/include/6C97F0.h
@@ -14,7 +14,7 @@
// void func_800A6384_jp();
// void func_800A63F8_jp();
// void func_800A6450_jp();
-// void func_800A6548_jp();
+void func_800A6548_jp(void);
void func_800A65C4_jp(void);
#endif
diff --git a/include/6D2720.h b/include/6D2720.h
index b70cc3f..ff40168 100644
--- a/include/6D2720.h
+++ b/include/6D2720.h
@@ -3,13 +3,15 @@
#include "ultra64.h"
+struct mNpc_walk_c;
+
// void func_800AEA80_jp();
-// void func_800AEB50_jp();
+// void mNPS_set_schedule_area();
// void func_800AEB9C_jp();
// void func_800AEBC8_jp();
// void func_800AEC74_jp();
// void mNPS_schedule_manager();
-// void func_800AED68_jp();
+void mNPS_set_all_schedule_area(void);
// void func_800AEDD0_jp();
// void func_800AEE38_jp();
// void func_800AEE50_jp();
@@ -27,7 +29,7 @@
// void func_800AF84C_jp();
// void func_800AF9C8_jp();
// void func_800AFA1C_jp();
-// void func_800AFAF8_jp();
+void mNpcW_InitNpcWalk(struct mNpc_walk_c* npc_walk);
// void func_800AFC1C_jp();
// void func_800AFCAC_jp();
// void func_800AFCD8_jp();
diff --git a/include/6D9D80.h b/include/6D9D80.h
index b505197..b7cef40 100644
--- a/include/6D9D80.h
+++ b/include/6D9D80.h
@@ -3,9 +3,11 @@
#include "ultra64.h"
+struct Game;
+
// void func_800B60E0_jp();
// void func_800B6170_jp();
-// void mPB_keep_item();
+void mPB_keep_item(u16 name);
// void func_800B62B0_jp();
// void func_800B6474_jp();
// void func_800B6520_jp();
@@ -13,6 +15,6 @@
// void func_800B6618_jp();
// void func_800B6640_jp();
// void func_800B66CC_jp();
-// void func_800B6718_jp();
+void mPB_police_box_init(struct Game* game);
#endif
diff --git a/include/6DA460.h b/include/6DA460.h
index bf1d350..820a8aa 100644
--- a/include/6DA460.h
+++ b/include/6DA460.h
@@ -31,7 +31,7 @@ struct Game_Play;
// void func_800B74E8_jp();
// void func_800B7560_jp();
void mPO_business_proc(struct Game_Play* game_play);
-// void func_800B7680_jp();
+void func_800B7680_jp(struct Game_Play* game_play);
// void func_800B7700_jp();
#endif
diff --git a/include/6DB420.h b/include/6DB420.h
index f14bf4f..f110141 100644
--- a/include/6DB420.h
+++ b/include/6DB420.h
@@ -2,6 +2,12 @@
#define C_6DB420_H
#include "ultra64.h"
+#include "m_actor.h"
+
+struct Private_c;
+struct mPr_map_info_c;
+struct mLd_land_info_c;
+struct mPr_mother_mail_info_c;
// void func_800B7780_jp();
// void mPr_CopyPlayerName();
@@ -15,15 +21,15 @@
// void mPr_CheckCmpPersonalID();
// void func_800B7A94_jp();
// void func_800B7AB0_jp();
-// void mPr_ClearPrivateInfo();
+void mPr_ClearPrivateInfo(struct Private_c* private);
// void func_800B7B8C_jp();
// void func_800B7BC0_jp();
// void func_800B7CD0_jp();
// void func_800B7D50_jp();
-// void func_800B7D90_jp();
+void mPr_InitPrivateInfo(struct Private_c* private);
// void func_800B7F00_jp();
// void func_800B7F48_jp();
-// void mPr_CheckPrivate();
+s32 mPr_CheckPrivate(struct Private_c* private);
// void func_800B7FA0_jp();
// void func_800B7FD4_jp();
// void func_800B8068_jp();
@@ -38,7 +44,7 @@
// void func_800B86EC_jp();
// void func_800B88EC_jp();
// void func_800B8A88_jp();
-// void func_800B8B08_jp();
+void mPr_SetPossessionItem(struct Private_c* priv, int idx, u16 item, u32 cond);
// void func_800B8B8C_jp();
// void func_800B8BE4_jp();
// void func_800B8C10_jp();
@@ -47,8 +53,8 @@
// void func_800B8C9C_jp();
// void func_800B8D18_jp();
// void func_800B8D3C_jp();
-// void func_800B8D64_jp();
-// void func_800B8EE4_jp();
+s32 func_800B8D64_jp(u8 player_no, s32 arg1);
+void mPr_ClearMotherMailInfo(struct mPr_mother_mail_info_c* arg0);
// void func_800B8F20_jp();
// void func_800B8FB8_jp();
// void func_800B9038_jp();
@@ -63,10 +69,10 @@
// void func_800B97F8_jp();
// void func_800B996C_jp();
// void func_800B9AF0_jp();
-// void func_800B9B2C_jp();
+void func_800B9B2C_jp(void);
// void func_800B9C34_jp();
-// void func_800B9DAC_jp();
-// void func_800B9E44_jp();
+void mPr_SendForeingerAnimalMail(struct Private_c* now_private);
+void mPr_StartSetCompleteTalkInfo(void);
// void func_800B9E90_jp();
// void func_800B9EB4_jp();
// void func_800B9ED4_jp();
@@ -85,7 +91,7 @@
// void func_800BA2D4_jp();
// void func_800BA344_jp();
// void func_800BA3D0_jp();
-// void func_800BA404_jp();
+void mPr_RenewalMapInfo(struct mPr_map_info_c* maps, s32 count, struct mLd_land_info_c* land_info);
// void mPr_RandomSetPlayerData_title_demo();
// void mPr_PrintMapInfo_debug();
diff --git a/include/6DE300.h b/include/6DE300.h
index e277b26..3f06fa4 100644
--- a/include/6DE300.h
+++ b/include/6DE300.h
@@ -3,11 +3,15 @@
#include "ultra64.h"
+struct mQst_delivery_c;
+struct mQst_errand_c;
+struct mQst_not_saved_c;
+
// void func_800BA660_jp();
-// void func_800BA690_jp();
-// void func_800BA6F0_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 func_800BA7C8_jp();
+void mQst_ClearNotSaveQuest(struct mQst_not_saved_c* quest);
// void func_800BA7E8_jp();
// void func_800BA8A0_jp();
// void func_800BA8F4_jp();
diff --git a/include/6E30B0.h b/include/6E30B0.h
index 16c9ede..41c50a4 100644
--- a/include/6E30B0.h
+++ b/include/6E30B0.h
@@ -3,6 +3,8 @@
#include "ultra64.h"
+struct Game;
+
// void func_800BF410_jp();
// void func_800BF480_jp();
// void func_800BF4F4_jp();
@@ -37,7 +39,7 @@
// void func_800C0E98_jp();
// void func_800C1070_jp();
// void func_800C1230_jp();
-// void func_800C1428_jp();
+void mSP_ExchangeLineUp_InGame(struct Game* game);
// void func_800C1498_jp();
// void func_800C15A8_jp();
// void func_800C1610_jp();
diff --git a/include/6E7AD0.h b/include/6E7AD0.h
index 8d45d90..06b9645 100644
--- a/include/6E7AD0.h
+++ b/include/6E7AD0.h
@@ -4,7 +4,7 @@
#include "ultra64.h"
// void func_800C3E30_jp();
-// void func_800C3F70_jp();
+void func_800C3F70_jp(u8* buffer, s32 buffer_len, s32 arg2);
// void func_800C4084_jp();
// void func_800C40F8_jp();
// void func_800C4168_jp();
diff --git a/include/6ECD90.h b/include/6ECD90.h
index 7ae9812..3fca397 100644
--- a/include/6ECD90.h
+++ b/include/6ECD90.h
@@ -19,7 +19,7 @@ struct Game_Play;
// void func_800C9728_jp();
// void func_800C98A0_jp();
// void func_800C9D38_jp();
-// void func_800C9F88_jp();
+void mTRC_init(struct Game_Play* game_play);
void mTRC_move(struct Game_Play* game_play);
#endif
diff --git a/include/6EDD10.h b/include/6EDD10.h
index 62b33c5..de4a3d9 100644
--- a/include/6EDD10.h
+++ b/include/6EDD10.h
@@ -10,7 +10,7 @@ void mTM_set_season(void);
// void func_800CA278_jp();
// void func_800CA2A8_jp();
// void func_800CA2BC_jp();
-// void func_800CA2DC_jp();
+void mTM_renewal_renew_time(void);
// void func_800CA350_jp();
// void func_800CA570_jp();
void mTM_time(void);
diff --git a/include/6F8A60.h b/include/6F8A60.h
index bd00fe1..c26e350 100644
--- a/include/6F8A60.h
+++ b/include/6F8A60.h
@@ -3,6 +3,8 @@
#include "ultra64.h"
+struct lbRTC_time_c;
+
// void func_800D4DC0_jp();
// void func_800D4E20_jp();
// void func_800D4E94_jp();
@@ -10,7 +12,7 @@
// void func_800D4F6C_jp();
// void func_800D4FB8_jp();
// void func_800D5004_jp();
-// void func_800D5090_jp();
+void lbRTC_GetTime(struct lbRTC_time_c* time);
// void func_800D5104_jp();
// void func_800D5164_jp();
// void func_800D51E0_jp();
@@ -35,7 +37,7 @@
// void func_800D5BDC_jp();
// void func_800D5C84_jp();
// void func_800D5CF8_jp();
-// void func_800D5D6C_jp();
+void lbRTC_TimeCopy(struct lbRTC_time_c* dst, struct lbRTC_time_c* src);
// void func_800D5D94_jp();
#endif
diff --git a/include/code_variables.h b/include/code_variables.h
index 94d2f4e..0c1ef57 100644
--- a/include/code_variables.h
+++ b/include/code_variables.h
@@ -761,9 +761,6 @@
// extern UNK_TYPE D_8010DC88_jp;
// extern UNK_TYPE D_8010DC8C_jp;
// extern UNK_TYPE D_8010DC90_jp;
-// extern UNK_TYPE D_8010DCA0_jp;
-// extern UNK_TYPE D_8010DCB0_jp;
-// extern UNK_TYPE D_8010DCC4_jp;
// extern UNK_TYPE D_8010DCE0_jp;
// extern UNK_TYPE D_8010DCE4_jp;
// extern UNK_TYPE D_8010DCE8_jp;
diff --git a/include/game.h b/include/game.h
index 390703b..faa526a 100644
--- a/include/game.h
+++ b/include/game.h
@@ -26,7 +26,7 @@ typedef enum GameStateId {
#undef DEFINE_GAMESTATE_INTERNAL
-typedef void (*GameStateFunc)(struct Game* gameState);
+typedef void (*GameStateFunc)(struct Game* game);
typedef struct {
/* 0x00 */ void* loadedRamAddr;
@@ -62,24 +62,24 @@ typedef struct Game {
/* 0xA8 */ Controller controller;
} Game; // size = 0xE0
-void func_800D2E00_jp(Game* gameState);
+void func_800D2E00_jp(Game* game);
void func_800D2E58_jp(u16 button, Gfx** gfxP);
-void game_debug_draw_last(Game* gameState, struct GraphicsContext* gfxCtx);
+void game_debug_draw_last(Game* game, struct GraphicsContext* gfxCtx);
void game_draw_first(struct GraphicsContext* gfxCtx);
void game_draw_last(struct GraphicsContext* gfxCtx);
-void game_get_controller(Game* gameState);
+void game_get_controller(Game* game);
void SetGameFrame(s32 divisor);
-void game_main(Game* gameState);
-void game_init_hyral(Game* gameState, size_t size);
-void game_resize_hyral(Game* gameState, size_t size);
-void game_ct(Game* gameState, GameStateFunc init, struct GraphicsContext* gfxCtx);
-void game_dt(Game* gameState);
-GameStateFunc game_get_next_game_init(Game* gameState);
-size_t game_get_next_game_class_size(Game* gameState);
-s32 game_is_doing(Game* gameState);
-s32 game_getFreeBytes(Game* gameState);
-void game_goto_next_game_play(Game* gameState);
-void game_goto_next_game_name_famicom_emu(Game* gameState);
+void game_main(Game* game);
+void game_init_hyral(Game* game, size_t size);
+void game_resize_hyral(Game* game, size_t size);
+void game_ct(Game* game, GameStateFunc init, struct GraphicsContext* gfxCtx);
+void game_dt(Game* game);
+GameStateFunc game_get_next_game_init(Game* game);
+size_t game_get_next_game_class_size(Game* game);
+s32 game_is_doing(Game* game);
+s32 game_getFreeBytes(Game* game);
+void game_goto_next_game_play(Game* game);
+void game_goto_next_game_name_famicom_emu(Game* game);
// .data
@@ -103,10 +103,10 @@ extern GameStateOverlay game_dlftbls[GAMESTATE_ID_MAX];
extern GameStateId game_dlftbls_num;
-#define CONTROLLER1(gameState) (&(gameState)->input[0])
-#define CONTROLLER2(gameState) (&(gameState)->input[1])
-#define CONTROLLER3(gameState) (&(gameState)->input[2])
-#define CONTROLLER4(gameState) (&(gameState)->input[3])
+#define CONTROLLER1(game) (&(game)->input[0])
+#define CONTROLLER2(game) (&(game)->input[1])
+#define CONTROLLER3(game) (&(game)->input[2])
+#define CONTROLLER4(game) (&(game)->input[3])
#define STOP_GAMESTATE(curState) \
do { \
diff --git a/include/lb_rtc.h b/include/lb_rtc.h
new file mode 100644
index 0000000..18cdd3a
--- /dev/null
+++ b/include/lb_rtc.h
@@ -0,0 +1,103 @@
+#ifndef LB_RTC_H
+#define LB_RTC_H
+
+#include "ultra64.h"
+
+/* TODO: do these have a better header? */
+#define GAME_YEAR_MIN 2000 /* Minimum year supported by the game */
+#define GAME_YEAR_MAX 2032 /* Maximum year supported by the game */
+
+#define lbRTC_YEAR_MIN 1901
+#define lbRTC_YEAR_MAX 2099
+
+typedef u8 lbRTC_sec_t;
+typedef u8 lbRTC_min_t;
+typedef u8 lbRTC_hour_t;
+typedef u8 lbRTC_day_t;
+typedef u8 lbRTC_weekday_t;
+typedef u8 lbRTC_month_t;
+typedef u16 lbRTC_year_t;
+
+/* Name leaked in lbRTC_time_c_save_data_check */
+typedef struct lbRTC_time_c {
+ /* 0x00 */ lbRTC_sec_t sec;
+ /* 0x01 */ lbRTC_min_t min;
+ /* 0x02 */ lbRTC_hour_t hour;
+ /* 0x03 */ lbRTC_day_t day;
+ /* 0x04 */ lbRTC_weekday_t weekday;
+ /* 0x05 */ lbRTC_month_t month;
+ /* 0x06 */ lbRTC_year_t year;
+} lbRTC_time_c; // size = 0x8
+
+/* Name leaked in mTM_ymd_2_time */
+typedef struct lbRTC_ymd_t {
+ /* 0x00 */ lbRTC_year_t year;
+ /* 0x02 */ lbRTC_month_t month;
+ /* 0x03 */ lbRTC_day_t day;
+} lbRTC_ymd_t; // size = 0x4
+
+typedef enum WEEKDAYS {
+ /* 0 */ lbRTC_WEEKDAYS_BEGIN = 0,
+ /* 0 */ lbRTC_SUNDAY = lbRTC_WEEKDAYS_BEGIN,
+ /* 1 */ lbRTC_MONDAY,
+ /* 2 */ lbRTC_TUESDAY,
+ /* 3 */ lbRTC_WEDNESDAY,
+ /* 4 */ lbRTC_THURSDAY,
+ /* 5 */ lbRTC_FRIDAY,
+ /* 6 */ lbRTC_SATURDAY,
+ /* 7 */ lbRTC_WEEK,
+ /* 7 */ lbRTC_WEEKDAYS_MAX = lbRTC_WEEK
+} WEEKDAYS;
+
+typedef enum MONTHS {
+ /* 0 */ lbRTC_MONTHS_BEGIN = 0,
+ /* 1 */ lbRTC_JANUARY = 1,
+ /* 2 */ lbRTC_FEBRUARY,
+ /* 3 */ lbRTC_MARCH,
+ /* 4 */ lbRTC_APRIL,
+ /* 5 */ lbRTC_MAY,
+ /* 6 */ lbRTC_JUNE,
+ /* 7 */ lbRTC_JULY,
+ /* 8 */ lbRTC_AUGUST,
+ /* 9 */ lbRTC_SEPTEMBER,
+ /* 10 */ lbRTC_OCTOBER,
+ /* 11 */ lbRTC_NOVEMBER,
+ /* 12 */ lbRTC_DECEMBER,
+ /* 12 */ lbRTC_MONTHS_MAX = lbRTC_DECEMBER
+} MONTHS;
+
+typedef enum RTC_EQUALITY {
+ lbRTC_LESS = -1,
+ lbRTC_EQUAL = 0,
+ lbRTC_OVER = 1
+} RTC_EQUALITY;
+
+typedef enum RTC_EQUALITY_FLAGS {
+ /* 0x00 */lbRTC_CHECK_NONE = 0,
+
+ /* 0x01 */lbRTC_CHECK_SECONDS = 1 << 0,
+ /* 0x02 */lbRTC_CHECK_MINUTES = 1 << 1,
+ /* 0x04 */lbRTC_CHECK_HOURS = 1 << 2,
+ /* 0x08 */lbRTC_CHECK_WEEKDAYS = 1 << 3,
+ /* 0x10 */lbRTC_CHECK_DAYS = 1 << 4,
+ /* 0x20 */lbRTC_CHECK_MONTHS = 1 << 5,
+ /* 0x40 */lbRTC_CHECK_YEARS = 1 << 6,
+
+ /* 0x7F */
+ lbRTC_CHECK_ALL = lbRTC_CHECK_SECONDS |
+ lbRTC_CHECK_MINUTES |
+ lbRTC_CHECK_HOURS |
+ lbRTC_CHECK_WEEKDAYS |
+ lbRTC_CHECK_DAYS |
+ lbRTC_CHECK_MONTHS |
+ lbRTC_CHECK_YEARS
+} RTC_EQUALITY_FLAGS;
+
+#define lbRTC_HOURS_PER_DAY 24
+#define lbRTC_MINUTES_PER_HOUR 60
+#define lbRTC_SECONDS_PER_MINUTE 60
+
+#define lbRTC_IS_LEAPYEAR(year) \
+ (((year % 4) == 0 && ((year % 100) != 0)) || ((year % 400) == 0))
+
+#endif
diff --git a/include/m_all_grow.h b/include/m_all_grow.h
new file mode 100644
index 0000000..99867ed
--- /dev/null
+++ b/include/m_all_grow.h
@@ -0,0 +1,30 @@
+#ifndef M_ALL_GROW_H
+#define M_ALL_GROW_H
+
+#include "ultra64.h"
+
+#define mAGrw_DUMP_WIDTH 4
+#define mAGrw_DUMP_HEIGHT 4
+
+typedef enum mAGrw_XMAS_PROC {
+ /* 0 */ mAGrw_XMAS_PROC_CLEAR,
+ /* 1 */ mAGrw_XMAS_PROC_SET,
+
+ /* 2 */ mAGrw_XMAS_PROC_NUM
+} mAGrw_XMAS_PROC;
+
+typedef enum mAGrw_FRUIT {
+ /* 0 */ mAGrw_FRUIT_APPLE,
+ /* 1 */ mAGrw_FRUIT_CHERRY,
+ /* 2 */ mAGrw_FRUIT_PEAR,
+ /* 3 */ mAGrw_FRUIT_PEACH,
+ /* 4 */ mAGrw_FRUIT_ORANGE,
+
+ /* 5 */ mAGrw_FRUIT_NUM
+} mAGrw_FRUIT;
+
+#define mAGrw_XMAS_LIGHTS_MAX_BLOCK 3
+#define mAGrw_CEDAR_BLOCK_Z_MIN 0
+#define mAGrw_CEDAR_BLOCK_Z_MAX 3 // [min, max)
+
+#endif
diff --git a/include/m_common_data.h b/include/m_common_data.h
index 2c0d526..6049005 100644
--- a/include/m_common_data.h
+++ b/include/m_common_data.h
@@ -3,6 +3,15 @@
#include "ultra64.h"
#include "unk.h"
+#include "m_npc.h"
+#include "m_npc_walk.h"
+#include "m_quest.h"
+#include "m_private.h"
+#include "m_land.h"
+#include "lb_rtc.h"
+#include "m_home.h"
+#include "m_event.h"
+#include "m_field_make.h"
struct Actor;
struct ActorOverlay;
@@ -53,30 +62,83 @@ typedef struct CommonData_unk_10098 {
/* 0x10 */ CommonData_unk_10098_unk_10 unk_10;
} CommonData_unk_10098; // size >= 0x10
-typedef struct CommonData10138_Sub {
- /* 0x00 */ char unk00[0x3];
- /* 0x03 */ u8 unk_03;
- /* 0x04 */ char unk04[0x1];
- /* 0x05 */ u8 unk_05;
- /* 0x06 */ u16 unk_06;
- /* 0x08 */ u8 unk_08;
-} CommonData10138_Sub; // size >= 0xC
-
-typedef struct CommonData10138 {
- /* 0x000 */ char unk000[0xA86];
- /* 0xA86 */ CommonData10138_Sub unk_A86;
-} CommonData10138; // size >= 0xA90
+typedef struct mPr_mother_mail_info_c {
+ /* 0x00 */ UNK_TYPE1 unk_00[0xE];
+} mPr_mother_mail_info_c; // size = 0xE
+
+typedef struct Time_c {
+ /* 0x00 */ u32 season;
+ /* 0x04 */ u32 term_idx;
+ /* 0x08 */ s16 bgitem_profile;
+ /* 0x0A */ s16 bgitem_bank;
+ /* 0x0C */ s32 now_sec;
+ /* 0x10 */ lbRTC_time_c rtc_time;
+ /* 0x18 */ s16 rad_min; /* clock hand radial position for mins */
+ /* 0x1A */ s16 rad_hour; /* clock hand radial position for hours */
+ /* 0x1C */ u8 time_signal;
+ /* 0x1D */ u8 under_sec;
+ /* 0x1E */ u8 disp;
+ /* 0x1F */ u8 rtc_crashed;
+ /* 0x20 */ s32 rtc_enabled;
+ /* 0x24 */ s32 add_sec;
+ /* 0x28 */ s32 add_idx;
+} Time_c; // size = 0x2C
+
+typedef struct FamicomEmuCommonData {
+ /* 0x00 */ s16 unk_00;
+ /* 0x02 */ s16 unk_02;
+ /* 0x04 */ s16 unk_04;
+ /* 0x06 */ s16 unk_06;
+ /* 0x08 */ s16 unk_08;
+ /* 0x0A */ s16 unk_0A;
+ /* 0x0C */ s16 unk_0C;
+ /* 0x0E */ s16 unk_0E;
+ /* 0x10 */ s16 unk_10;
+ /* 0x12 */ s16 unk_12;
+ /* 0x14 */ s16 unk_14;
+ /* 0x16 */ s16 unk_16;
+ /* 0x18 */ s16 unk_18;
+ /* 0x1A */ s16 unk_1A;
+ /* 0x1C */ s16 unk_1C;
+ /* 0x1E */ s16 unk_1E;
+ /* 0x20 */ s16 unk_20;
+ /* 0x22 */ s16 unk_22;
+ /* 0x24 */ s16 unk_24;
+}FamicomEmuCommonData; // size >= 0x26
typedef void (*CommonData_100E4_Func)(struct Game_Play*);
typedef struct CommonData {
/* 0x00000 */ u8 unk00000[0x14];
/* 0x00014 */ s32 unk_00014;
- /* 0x00018 */ u8 unk00018[0xFFE8];
+ /* 0x00018 */ u8 unk00018[0x8];
+ /* 0x00020 */ Private_c private[PLAYER_NUM]; /* player data */
+ /* 0x02F60 */ mLd_land_info_c land_info; /* town name & id */
+ /* 0x02F6A */ u8 unk02F6A[0x61E];
+ /* 0x03588 */ mHm_hs_c homes[PLAYER_NUM];
+ /* 0x062A8 */ mFM_fg_c fg[FG_BLOCK_Z_NUM][FG_BLOCK_X_NUM]; /* fg items (fg = foreground?) */
+ /* 0x09EA8 */ u8 unk09EA8[0x70];
+ /* 0x09F18 */ Animal_c animals[ANIMAL_NUM_MAX]; /* villagers in town */
+ /* 0x0EC70 */ u8 unk0EC70[0x134];
+ /* 0x0EDA4 */ mEv_event_save_c event_save_data;
+ /* 0x0EE40 */ u8 unk0EE40[0x118];
+ /* 0x0EF58 */ u16 fruit;
+ /* 0x0EF5A */ u8 unk0EF5A[0x4DE];
+ /* 0x0F438 */ u8 station_type; /* train station type */
+ /* 0x0F439 */ u8 unk0F439[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 */ mPr_mother_mail_info_c mother_mail[PLAYER_NUM];
+ /* 0x0F83C */ u8 unk0F83C[0x8];
+ /* 0x0F844 */ FamicomEmuCommonData famicom_emu_common_data;
+ /* 0x0F86A */ u8 unk0F86A[0x32];
+ /* 0x0F89C */ lbRTC_time_c unk_0F89C;
+ /* 0x0F8A4 */ lbRTC_time_c unk_0F8A4;
+ /* 0x0F8AC */ u8 unk0F8AC[0x754];
/* 0x10000 */ u8 unk_10000; // named "game_started" in AC GCN decomp
/* 0x10001 */ u8 unk_10001;
/* 0x10002 */ u8 unk10002[0x1];
- /* 0x10003 */ u8 unk_10003;
+ /* 0x10003 */ u8 player_no;
/* 0x10004 */ s32 unk_10004; // named "last_scene_no" in AC GCN decomp
/* 0x10008 */ UNK_TYPE1 unk_10008[0x44];
/* 0x1004C */ CommonData_unk_1004C *unk_1004C;
@@ -84,25 +146,35 @@ typedef struct CommonData {
/* 0x10098 */ CommonData_unk_10098 *unk_10098;
/* 0x1009C */ UNK_TYPE1 unk_1009C[0x48];
/* 0x100E4 */ CommonData_100E4_Func* unk_100E4;
- /* 0x100E8 */ u8 unk100E8[0x37];
- /* 0x1011F */ u8 unk_1011F;
- /* 0x10120 */ u8 unk10120[0x1];
- /* 0x10121 */ u8 unk_10121;
- /* 0x10122 */ u16 unk_10122;
- /* 0x10124 */ u8 unk10124[0x14];
- /* 0x10138 */ CommonData10138* unk_10138;
- /* 0x1013C */ u8 unk1013C[0xD];
+ /* 0x100E8 */ u8 unk100E8[0x24];
+ /* 0x1010C */ Time_c time;
+ /* 0x10138 */ Private_c* now_private;
+ /* 0x1013C */ u8 unk1013C[0x5];
+ /* 0x10141 */ u8 fish_location;
+ /* 0x10142 */ u8 unk10142[0x7];
/* 0x10149 */ u8 unk_10149;
/* 0x1014A */ u8 unk_1014A;
/* 0x1014B */ u8 unk_1014B; // named "wipeType" in AC GCN decomp
/* 0x1014C */ UNK_TYPE1 unk_1014C[0x2];
/* 0x1014E */ s16 unk_1014E;
- /* 0x10150 */ UNK_TYPE1 unk_10150[0x664];
- /* 0x107B4 */ UNK_TYPE1 unk_107B4[0x2];
+ /* 0x10150 */ UNK_TYPE1 unk_10150[0x10];
+ /* 0x10160 */ mNpc_NpcList_c npclist[ANIMAL_NUM_MAX];
+ /* 0x104A8 */ u16 house_owner_name;
+ /* 0x104AA */ u16 last_field_id;
+ /* 0x104AC */ UNK_TYPE1 unk_104AC[0xEC];
+ /* 0x10598 */ mQst_not_saved_c quest;
+ /* 0x105A0 */ u32 scene_from_title_demo;
+ /* 0x105A4 */ UNK_TYPE1 unk_105A4[0xF0];
+ /* 0x10694 */ mNpc_walk_c npc_walk;
+ /* 0x10710 */ UNK_TYPE1 unk_10710[0xA6];
/* 0x107B6 */ s16 unk_107B6; // named "demo_profile" in AC GCN decomp (though it's an array of two s16s in that game)
- /* 0x107B8 */ u8 unk107B8[0x2C];
+ /* 0x107B8 */ u8 unk107B8[0x28];
+ /* 0x107E0 */ s8 player_decoy_flag;
+ /* 0x107E1 */ u8 unk107E1[0x3];
/* 0x107E4 */ s16 unk_107E4;
- /* 0x107E6 */ u8 unk107E6[0x29C];
+ /* 0x107E6 */ u8 unk107E6[0x254];
+ /* 0x10A3A */ u8 goki_shocked_flag;
+ /* 0x10A3B */ u8 unk10A3B[0x47];
/* 0x10A82 */ s16 unk_10A82;
/* 0x10A84 */ u8 unk10A84[0x2C];
/* 0x10AB0 */ u8 unk_10AB0; // named "pad_connected" in AC GCN decomp
diff --git a/include/m_controller.h b/include/m_controller.h
index 5fdac72..2a0e21f 100644
--- a/include/m_controller.h
+++ b/include/m_controller.h
@@ -33,8 +33,8 @@ typedef struct Controller {
struct Game;
-void mCon_ct(struct Game* gameState);
-void mCon_dt(struct Game* gameState);
+void mCon_ct(struct Game* game);
+void mCon_dt(struct Game* game);
void mCon_calc(Controller* controller, f32 x, f32 y);
void mCon_main(struct Game* game);
s32 chkButton(u16 mask);
diff --git a/include/m_debug.h b/include/m_debug.h
index fb86480..220c437 100644
--- a/include/m_debug.h
+++ b/include/m_debug.h
@@ -53,7 +53,7 @@ typedef enum {
#define DEBUG_REG_COUNT (DEBUG_REG_SIZE * DEBUG_REG_GROUP * DEBUG_REG_MAX)
-typedef struct debug_mode_s {
+typedef struct Debug_mode {
/* 0x00 */ u8 mode;
/* 0x01 */ u8 type;
/* 0x02 */ s8 inputR;
diff --git a/include/m_event.h b/include/m_event.h
index 00ab4a5..017b4ea 100644
--- a/include/m_event.h
+++ b/include/m_event.h
@@ -3,7 +3,11 @@
#include "ultra64.h"
-typedef struct Game_Play1EBC {
+typedef struct mEv_event_save_c {
+ /* 0x00 */ char unk00[0x9C];
+} mEv_event_save_c; // size >= 0x9C
+
+typedef struct Event {
/* 0x00 */ u8 unk_00;
/* 0x01 */ u8 unk_01;
/* 0x02 */ u8 unk_02;
@@ -12,12 +16,12 @@ typedef struct Game_Play1EBC {
/* 0x06 */ s16 unk_06;
/* 0x08 */ s32 unk_08;
/* 0x0C */ s32 unk_0C;
-} Game_Play1EBC; // size = 0x10
+} Event; // size = 0x10
// void func_8007D140_jp();
// void func_8007D180_jp();
-// void func_8007D1A8_jp();
-// void mEv_ClearEventInfo();
+void mEv_ClearEventSaveInfo(mEv_event_save_c* event_save);
+void mEv_ClearEventInfo(void);
// void func_8007D25C_jp();
// void func_8007D2B8_jp();
// void func_8007D318_jp();
@@ -47,9 +51,9 @@ s32 mEv_CheckFirstJob(void);
// void func_8007D784_jp();
// void func_8007D7BC_jp();
// void func_8007D810_jp();
-// void func_8007D848_jp();
+void mEv_SetGateway(void);
// void func_8007D880_jp();
-// void func_8007D8D4_jp();
+void mEv_UnSetGateway(void);
s32 mEv_CheckTitleDemo(void);
// void func_8007D91C_jp();
// void func_8007D930_jp();
@@ -92,12 +96,12 @@ s32 mEv_CheckTitleDemo(void);
// void func_8007F358_jp();
// void func_8007F6A0_jp();
// void func_8007F764_jp();
-void func_8007F858_jp(Game_Play1EBC* arg0);
-// void func_8007F8A4_jp();
-void mEv_2nd_init(Game_Play1EBC* arg0);
+void mEv_init(Event* event);
+void mEv_init_force(void*);
+void mEv_2nd_init(Event* event);
// void func_8007F950_jp();
-void mEv_run(Game_Play1EBC* arg0);
-void mEv_finish(Game_Play1EBC* arg0);
+void mEv_run(Event* event);
+void mEv_finish(Event* event);
// void func_8007FCB8_jp();
// void func_8007FD40_jp();
// void func_8007FDA8_jp();
diff --git a/include/m_field_info.h b/include/m_field_info.h
index bb80205..7451f66 100644
--- a/include/m_field_info.h
+++ b/include/m_field_info.h
@@ -143,7 +143,7 @@ s32 func_8008B3E8_jp(Vec3f* arg0, UNK_TYPE arg1);
// void func_8008C3D4_jp();
// void func_8008C3E8_jp();
// void func_8008C458_jp();
-// void func_8008C478_jp();
+void func_8008C478_jp(u16* deposit, int ut_x, int ut_z);
// void func_8008C498_jp();
// void func_8008C4B8_jp();
// void func_8008C504_jp();
@@ -182,7 +182,7 @@ s32 func_8008B3E8_jp(Vec3f* arg0, UNK_TYPE arg1);
// void func_8008D884_jp();
// void func_8008D928_jp();
// void func_8008DA4C_jp();
-// void func_8008DCF8_jp();
+void func_8008DCF8_jp(void);
// void func_8008DD0C_jp();
// void func_8008DD3C_jp();
// void func_8008DDC8_jp();
@@ -206,7 +206,7 @@ void func_8008E5F4_jp(Vec3f arg0);
// void func_8008EEB4_jp();
// void func_8008EEE8_jp();
// void func_8008EF0C_jp();
-// void mFRm_CheckSaveData();
+s32 mFRm_CheckSaveData(void);
void mFRm_ClearSaveCheckData(struct CommonData* common_data);
// void func_8008EFDC_jp();
// void func_8008F020_jp();
diff --git a/include/m_field_make.h b/include/m_field_make.h
index e983efb..dfda16f 100644
--- a/include/m_field_make.h
+++ b/include/m_field_make.h
@@ -3,6 +3,25 @@
#include "ultra64.h"
+struct Game;
+
+#define BLOCK_X_NUM 7
+#define BLOCK_Z_NUM 10
+#define BLOCK_TOTAL_NUM (BLOCK_X_NUM * BLOCK_Z_NUM)
+
+#define FG_BLOCK_X_NUM (BLOCK_X_NUM - 2) /* 5 */
+#define FG_BLOCK_Z_NUM (BLOCK_Z_NUM - 4) /* 6 */
+#define FG_BLOCK_TOTAL_NUM (FG_BLOCK_X_NUM * FG_BLOCK_Z_NUM)
+
+#define UT_BASE_NUM 16
+#define UT_X_NUM UT_BASE_NUM /* Spaces per block (acre) in x direction */
+#define UT_Z_NUM UT_BASE_NUM /* Spaces per block (acre) in z direction */
+#define UT_TOTAL_NUM (UT_X_NUM * UT_Z_NUM)
+
+typedef struct mFM_fg_c {
+ /* 0x000 */ u16 items[UT_Z_NUM][UT_X_NUM];
+} mFM_fg_c; // size = 0x200
+
// void func_80084ED0_jp();
// void func_80084FAC_jp();
// void func_800850E4_jp();
@@ -37,13 +56,13 @@
void func_80087004_jp(void);
void func_80087280_jp(void);
// void func_80087380_jp();
-// void func_80087420_jp();
-// void func_800874CC_jp();
+void mFM_SetBlockKindLoadCombi(struct Game* game);
+void mFM_InitFgCombiSaveData(struct Game* game);
// void func_80087754_jp();
// void func_8008775C_jp();
// void func_80087788_jp();
// void func_800877CC_jp();
-// void func_800878D4_jp();
+void mFM_RenewalReserve(void);
// void func_800879B0_jp();
#endif
diff --git a/include/m_handbill.h b/include/m_handbill.h
index bae1cde..ab691a7 100644
--- a/include/m_handbill.h
+++ b/include/m_handbill.h
@@ -3,6 +3,7 @@
#include "ultra64.h"
+struct Game;
struct Game_Play;
void Balloon_init(struct Game_Play* game_play);
@@ -11,7 +12,7 @@ void Balloon_move(struct Game_Play* game_play);
// void func_80092B8C_jp();
// void func_80092BA0_jp();
// void func_80092BE8_jp();
-void mHsRm_GetHuusuiRoom(s32 arg0, u8 arg1);
+void mHsRm_GetHuusuiRoom(struct Game* game_play, s32 player_no);
// void func_80092D10_jp();
// void func_80092E14_jp();
// void func_80092E80_jp();
diff --git a/include/m_home.h b/include/m_home.h
new file mode 100644
index 0000000..3f2cfda
--- /dev/null
+++ b/include/m_home.h
@@ -0,0 +1,60 @@
+#ifndef M_HOME_H_H
+#define M_HOME_H_H
+
+#include "ultra64.h"
+
+#define HOME_MAILBOX_SIZE 10
+#define HANIWA_ITEM_HOLD_NUM 4
+#define HANIWA_MESSAGE_LEN 64
+
+typedef enum mHm_ROOM{
+ /* 0 */ mHm_ROOM_MAIN,
+ /* 1 */ mHm_ROOM_UPPER,
+ /* 2 */ mHm_ROOM_BASEMENT,
+
+ /* 3 */ mHm_ROOM_NUM
+} mHm_ROOM;
+
+typedef enum mHm_ROOMTYPE {
+ /* 0 */ mHm_ROOMTYPE_SMALL,
+ /* 1 */ mHm_ROOMTYPE_MEDIUM,
+ /* 2 */ mHm_ROOMTYPE_LARGE,
+ /* 3 */ mHm_ROOMTYPE_COTTAGE,
+
+ /* 4 */ mHm_ROOMTYPE_NUM
+} mHm_ROOMTYPE;
+
+typedef enum mHm_HOMESIZE {
+ /* 0 */ mHm_HOMESIZE_SMALL, /* initial size */
+ /* 1 */ mHm_HOMESIZE_MEDIUM, /* paid off first debt */
+ /* 2 */ mHm_HOMESIZE_LARGE, /* paid off second debt (excluding basement) */
+ /* 3 */ mHm_HOMESIZE_UPPER, /* paid off third debt & basement */
+ /* 4 */ mHm_HOMESIZE_STATUE, /* paid off final debt */
+
+ /* 5 */ mHm_HOMESIZE_NUM
+}mHm_HOMESIZE;
+
+typedef struct Haniwa_Item_c {
+ /* 0x00 */ u16 item; /* held item */
+ /* 0x02 */ s16 exchange_type; /* type of exchange (sale, free, trade) */
+ /* 0x04 */ u16 extra_data; /* trade related data */
+} Haniwa_Item_c; // size = 0x6
+
+typedef struct Haniwa_c {
+ /* 0x00 */ Haniwa_Item_c items[HANIWA_ITEM_HOLD_NUM]; /* held items */
+ /* 0x18 */ u8 message[HANIWA_MESSAGE_LEN]; /* message for visitors */
+ /* 0x58 */ u32 bells; /* held bells from selling items */
+} Haniwa_c; // size = 0x5C
+
+typedef struct mHm_hs_c {
+ /* 0x000 */ char unk000[0x22];
+ /* 0x022 */ u8 unk_022;
+ /* 0x023 */ char unk023[0x1];
+ /* 0x024 */ u8 unk_024;
+ /* 0x025 */ char unk025[0xABB];
+ /* 0xAE0 */ Haniwa_c haniwa;
+ /* 0xB3C */ char unkB3C[0xC];
+} mHm_hs_c; // size = 0xB48
+
+
+#endif
diff --git a/include/m_house.h b/include/m_house.h
new file mode 100644
index 0000000..539a4a0
--- /dev/null
+++ b/include/m_house.h
@@ -0,0 +1,30 @@
+#ifndef M_HOUSE_H
+#define M_HOUSE_H
+
+#include "ultra64.h"
+
+/**
+ * House arrangement byte breakdown
+ *
+ * PX = player x
+ * HX = house x
+ *
+ * xx xx xx xx
+ * P3 P2 P1 P0
+ *
+ * Example:
+ * 01 11 10 00
+ * P3 P2 P1 P0
+ * H1 H3 H2 H0
+ **/
+
+typedef enum mHS_HOUSE {
+ /* 0 */ mHS_HOUSE0, /* Top-left house */
+ /* 1 */ mHS_HOUSE1, /* Top-right house */
+ /* 2 */ mHS_HOUSE2, /* Bottom-left house */
+ /* 3 */ mHS_HOUSE3, /* Bottom-right house */
+
+ /* 4 */ mHS_HOUSE_NUM
+} mHS_HOUSE;
+
+#endif
diff --git a/include/m_kankyo.h b/include/m_kankyo.h
index d2c89ce..bb2e62d 100644
--- a/include/m_kankyo.h
+++ b/include/m_kankyo.h
@@ -60,7 +60,7 @@ void Global_kankyo_set(struct Game_Play* game_play, struct Kankyo* kankyo, struc
void mEnv_WindMove(void);
// void func_80098CCC_jp();
// void func_80098D88_jp();
-// void func_80098DE0_jp();
+void mEnv_DecideWeather_NormalGameStart(void);
// void mEnv_NowWeather();
// void func_80098F68_jp();
// void func_80098FF0_jp();
diff --git a/include/m_land.h b/include/m_land.h
new file mode 100644
index 0000000..7569415
--- /dev/null
+++ b/include/m_land.h
@@ -0,0 +1,14 @@
+#ifndef M_LAND_H_H
+#define M_LAND_H_H
+
+#include "ultra64.h"
+
+// Town name character count
+#define LAND_NAME_SIZE 8
+#define LAND_NAME_MURA_SIZE (LAND_NAME_SIZE + 2)
+
+typedef struct mLd_land_info_c {
+ char unk00[0xA];
+} mLd_land_info_c; // size >= 0xA
+
+#endif
diff --git a/include/m_lib.h b/include/m_lib.h
index c0e03be..2a288d6 100644
--- a/include/m_lib.h
+++ b/include/m_lib.h
@@ -5,7 +5,7 @@
#include "z64math.h"
#include "unk.h"
-// void mem_copy();
+void mem_copy(u8* dst, u8* src, u32 size);
s32 mem_clear(void* ptr, size_t size, u8 value);
// void mem_cmp();
f32 cos_s(s16 angle);
diff --git a/include/m_msg_main.h b/include/m_msg_main.h
index 917b51a..c31430a 100644
--- a/include/m_msg_main.h
+++ b/include/m_msg_main.h
@@ -294,7 +294,7 @@ void mMsg_Draw(struct Game_Play* game_play);
// void func_800A34E8_jp();
// void func_800A35C8_jp();
// void func_800A3658_jp();
-// void func_800A36CC_jp();
+void mMsm_SendInformationMail(void);
// void func_800A3784_jp();
// void func_800A37D0_jp();
// void func_800A3810_jp();
@@ -318,7 +318,7 @@ void mMsg_Draw(struct Game_Play* game_play);
// void func_800A49E8_jp();
// void func_800A4A84_jp();
// void func_800A4B00_jp();
-// void func_800A4D10_jp();
+void func_800A4D10_jp(void);
// void func_800A4DC8_jp();
// void func_800A4E74_jp();
// void func_800A4F38_jp();
diff --git a/include/m_name_table.h b/include/m_name_table.h
new file mode 100644
index 0000000..795c642
--- /dev/null
+++ b/include/m_name_table.h
@@ -0,0 +1,152 @@
+#ifndef M_NAME_TABLE_H
+#define M_NAME_TABLE_H
+
+#include "ultra64.h"
+
+#define EMPTY_NO 0x0000
+
+#define ITM_MONEY_START 0x2100
+#define ITM_MONEY_1000 ITM_MONEY_START // 0x2100
+#define ITM_MONEY_10000 (ITM_MONEY_1000 + 1) // 0x2101
+#define ITM_MONEY_30000 (ITM_MONEY_10000 + 1) // 0x2102
+#define ITM_MONEY_100 (ITM_MONEY_30000 + 1) // 0x2103
+#define ITM_MONEY_END ITM_MONEY_100 // 0x2103
+
+#define ITM_FOOD_START 0x2800
+#define ITM_FOOD_APPLE ITM_FOOD_START
+#define ITM_FOOD_CHERRY (ITM_FOOD_APPLE + 1)
+#define ITM_FOOD_PEAR (ITM_FOOD_CHERRY + 1)
+#define ITM_FOOD_PEACH (ITM_FOOD_PEAR + 1)
+#define ITM_FOOD_ORANGE (ITM_FOOD_PEACH + 1)
+#define ITM_FOOD_MUSHROOM (ITM_FOOD_ORANGE + 1)
+#define ITM_FOOD_CANDY (ITM_FOOD_MUSHROOM + 1)
+#define ITM_FOOD_COCONUT (ITM_FOOD_CANDY + 1)
+#define ITM_FOOD_END 0x2808
+
+/* begin environmental/nature objects */
+#define ENV_START 0x0800
+/* tree */
+#define TREE_SAPLING ENV_START
+#define TREE_S0 (TREE_SAPLING + 1)
+#define TREE_S1 (TREE_S0 + 1)
+#define TREE_S2 (TREE_S1 + 1)
+#define TREE (TREE_S2 + 1) /* fully grown */
+/* apple tree */
+#define TREE_APPLE_SAPLING (TREE + 1)
+#define TREE_APPLE_S0 (TREE_APPLE_SAPLING + 1)
+#define TREE_APPLE_S1 (TREE_APPLE_S0 + 1)
+#define TREE_APPLE_S2 (TREE_APPLE_S1 + 1)
+#define TREE_APPLE_NOFRUIT_0 (TREE_APPLE_S2 + 1) /* fully grown, no fruit */
+#define TREE_APPLE_NOFRUIT_1 (TREE_APPLE_NOFRUIT_0 + 1)
+#define TREE_APPLE_NOFRUIT_2 (TREE_APPLE_NOFRUIT_1 + 1)
+#define TREE_APPLE_FRUIT (TREE_APPLE_NOFRUIT_2 + 1)
+/* orange tree */
+#define TREE_ORANGE_SAPLING (TREE_APPLE_FRUIT + 1)
+#define TREE_ORANGE_S0 (TREE_ORANGE_SAPLING + 1)
+#define TREE_ORANGE_S1 (TREE_ORANGE_S0 + 1)
+#define TREE_ORANGE_S2 (TREE_ORANGE_S1 + 1) /* fully grown, no fruit */
+#define TREE_ORANGE_NOFRUIT_0 (TREE_ORANGE_S2 + 1)
+#define TREE_ORANGE_NOFRUIT_1 (TREE_ORANGE_NOFRUIT_0 + 1)
+#define TREE_ORANGE_NOFRUIT_2 (TREE_ORANGE_NOFRUIT_1 + 1)
+#define TREE_ORANGE_FRUIT (TREE_ORANGE_NOFRUIT_2 + 1)
+/* peach tree */
+#define TREE_PEACH_SAPLING (TREE_ORANGE_FRUIT + 1)
+#define TREE_PEACH_S0 (TREE_PEACH_SAPLING + 1)
+#define TREE_PEACH_S1 (TREE_PEACH_S0 + 1)
+#define TREE_PEACH_S2 (TREE_PEACH_S1 + 1)
+#define TREE_PEACH_NOFRUIT_0 (TREE_PEACH_S2 + 1) /* fully grown, no fruit */
+#define TREE_PEACH_NOFRUIT_1 (TREE_PEACH_NOFRUIT_0 + 1)
+#define TREE_PEACH_NOFRUIT_2 (TREE_PEACH_NOFRUIT_1 + 1)
+#define TREE_PEACH_FRUIT (TREE_PEACH_NOFRUIT_2 + 1)
+/* pear tree */
+#define TREE_PEAR_SAPLING (TREE_PEACH_FRUIT + 1)
+#define TREE_PEAR_S0 (TREE_PEAR_SAPLING + 1)
+#define TREE_PEAR_S1 (TREE_PEAR_S0 + 1)
+#define TREE_PEAR_S2 (TREE_PEAR_S1 + 1)
+#define TREE_PEAR_NOFRUIT_0 (TREE_PEAR_S2 + 1) /* fully grown, no fruit */
+#define TREE_PEAR_NOFRUIT_1 (TREE_PEAR_NOFRUIT_0 + 1)
+#define TREE_PEAR_NOFRUIT_2 (TREE_PEAR_NOFRUIT_1 + 1)
+#define TREE_PEAR_FRUIT (TREE_PEAR_NOFRUIT_2 + 1)
+/* cherry tree */
+#define TREE_CHERRY_SAPLING (TREE_PEAR_FRUIT + 1)
+#define TREE_CHERRY_S0 (TREE_CHERRY_SAPLING + 1)
+#define TREE_CHERRY_S1 (TREE_CHERRY_S0 + 1)
+#define TREE_CHERRY_S2 (TREE_CHERRY_S1 + 1)
+#define TREE_CHERRY_NOFRUIT_0 (TREE_CHERRY_S2 + 1) /* fully grown, no fruit */
+#define TREE_CHERRY_NOFRUIT_1 (TREE_CHERRY_NOFRUIT_0 + 1)
+#define TREE_CHERRY_NOFRUIT_2 (TREE_CHERRY_NOFRUIT_1 + 1)
+#define TREE_CHERRY_FRUIT (TREE_CHERRY_NOFRUIT_2 + 1)
+/* money tree (1,000 Bells) */
+#define TREE_1000BELLS_SAPLING (TREE_CHERRY_FRUIT + 1)
+#define TREE_1000BELLS_S0 (TREE_1000BELLS_SAPLING + 1)
+#define TREE_1000BELLS_S1 (TREE_1000BELLS_S0 + 1)
+#define TREE_1000BELLS_S2 (TREE_1000BELLS_S1 + 1)
+#define TREE_1000BELLS (TREE_1000BELLS_S2 + 1) /* fully grown w/ bells */
+/* money tree (10,000 Bells) */
+#define TREE_10000BELLS_SAPLING (TREE_1000BELLS + 1)
+#define TREE_10000BELLS_S0 (TREE_10000BELLS_SAPLING + 1)
+#define TREE_10000BELLS_S1 (TREE_10000BELLS_S0 + 1)
+#define TREE_10000BELLS_S2 (TREE_10000BELLS_S1 + 1)
+#define TREE_10000BELLS (TREE_10000BELLS_S2 + 1) /* fully grown w/ bells */
+/* money tree (30,000 Bells) */
+#define TREE_30000BELLS_SAPLING (TREE_10000BELLS + 1)
+#define TREE_30000BELLS_S0 (TREE_30000BELLS_SAPLING + 1)
+#define TREE_30000BELLS_S1 (TREE_30000BELLS_S0 + 1)
+#define TREE_30000BELLS_S2 (TREE_30000BELLS_S1 + 1)
+#define TREE_30000BELLS (TREE_30000BELLS_S2 + 1) /* fully grown w/ bells */
+/* flower leaves (unused growth stage) */
+#define FLOWER_LEAVES_PANSIES0 (TREE_30000BELLS + 1) /* white */
+#define FLOWER_LEAVES_PANSIES1 (FLOWER_LEAVES_PANSIES0 + 1) /* purple */
+#define FLOWER_LEAVES_PANSIES2 (FLOWER_LEAVES_PANSIES1 + 1) /* yellow */
+#define FLOWER_LEAVES_COSMOS0 (FLOWER_LEAVES_PANSIES2 + 1) /* yellow */
+#define FLOWER_LEAVES_COSMOS1 (FLOWER_LEAVES_COSMOS0 + 1) /* purple */
+#define FLOWER_LEAVES_COSMOS2 (FLOWER_LEAVES_COSMOS1 + 1) /* blue */
+#define FLOWER_LEAVES_TULIP0 (FLOWER_LEAVES_COSMOS2 + 1) /* red */
+#define FLOWER_LEAVES_TULIP1 (FLOWER_LEAVES_TULIP0 + 1) /* white */
+#define FLOWER_LEAVES_TULIP2 (FLOWER_LEAVES_TULIP1 + 1) /* yellow */
+/* flowers */
+#define FLOWER_PANSIES0 (FLOWER_LEAVES_TULIP2 + 1) /* white */
+#define FLOWER_PANSIES1 (FLOWER_PANSIES0 + 1) /* purple */
+#define FLOWER_PANSIES2 (FLOWER_PANSIES1 + 1) /* yellow */
+#define FLOWER_COSMOS0 (FLOWER_PANSIES2 + 1) /* yellow */
+#define FLOWER_COSMOS1 (FLOWER_COSMOS0 + 1) /* purple */
+#define FLOWER_COSMOS2 (FLOWER_COSMOS1 + 1) /* blue */
+#define FLOWER_TULIP0 (FLOWER_COSMOS2 + 1) /* red */
+#define FLOWER_TULIP1 (FLOWER_TULIP0 + 1) /* white */
+#define FLOWER_TULIP2 (FLOWER_TULIP1 + 1) /* yellow */
+/* dead sapling */
+#define DEAD_SAPLING (FLOWER_TULIP2 + 1)
+/* money tree (100 Bells) */
+#define TREE_100BELLS_SAPLING (DEAD_SAPLING + 1)
+#define TREE_100BELLS_S0 (TREE_100BELLS_SAPLING + 1)
+#define TREE_100BELLS_S1 (TREE_100BELLS_S0 + 1)
+#define TREE_100BELLS_S2 (TREE_100BELLS_S1 + 1)
+#define TREE_100BELLS (TREE_100BELLS_S2 + 1) /* fully grown w/ bells */
+/* palm tree */
+#define TREE_PALM_SAPLING (TREE_100BELLS + 1)
+#define TREE_PALM_S0 (TREE_PALM_SAPLING + 1)
+#define TREE_PALM_S1 (TREE_PALM_S0 + 1)
+#define TREE_PALM_S2 (TREE_PALM_S1 + 1)
+#define TREE_PALM_NOFRUIT_0 (TREE_PALM_S2 + 1) /* fully grown, no fruit */
+#define TREE_PALM_NOFRUIT_1 (TREE_PALM_NOFRUIT_0 + 1)
+#define TREE_PALM_NOFRUIT_2 (TREE_PALM_NOFRUIT_1 + 1)
+#define TREE_PALM_FRUIT (TREE_PALM_NOFRUIT_2 + 1)
+#define DEAD_PALM_SAPLING (TREE_PALM_FRUIT + 1)
+/* cedar tree */
+#define CEDAR_TREE_SAPLING (DEAD_PALM_SAPLING + 1)
+#define CEDAR_TREE_S0 (CEDAR_TREE_SAPLING + 1)
+#define CEDAR_TREE_S1 (CEDAR_TREE_S0 + 1)
+#define CEDAR_TREE_S2 (CEDAR_TREE_S1 + 1)
+#define CEDAR_TREE (CEDAR_TREE_S2 + 1) /* fully grown */
+#define DEAD_CEDAR_SAPLING (CEDAR_TREE + 1)
+/* gold tree */
+#define GOLD_TREE_SAPLING (DEAD_CEDAR_SAPLING + 1)
+#define GOLD_TREE_S0 (GOLD_TREE_SAPLING + 1)
+#define GOLD_TREE_S1 (GOLD_TREE_S0 + 1)
+#define GOLD_TREE_S2 (GOLD_TREE_S1 + 1)
+#define GOLD_TREE_SHOVEL (GOLD_TREE_S2 + 1) /* fully grown w/ golden shovel */
+#define GOLD_TREE (GOLD_TREE_SHOVEL + 1) /* fully grown */
+#define DEAD_GOLD_SAPLING (GOLD_TREE + 1)
+/* end of environmental objects */
+
+#endif
diff --git a/include/m_npc.h b/include/m_npc.h
index 6ed8cae..c566a70 100644
--- a/include/m_npc.h
+++ b/include/m_npc.h
@@ -5,12 +5,15 @@
#include "m_actor.h"
#include "unk.h"
-typedef struct Npc {
- /* 0x000 */ Actor actor;
- /* 0x174 */ UNK_TYPE1 unk_174[0x594];
- /* 0x708 */ s32 unk_708;
-} Npc; // size >= 0x70C
+#define ANIMAL_NUM_MAX 15 /* Maximum number of villagers possible in town */
+typedef struct mNpc_NpcList_c {
+ /* 0x00 */ char unk00[0x38];
+} mNpc_NpcList_c; // size = 0x38
+
+typedef struct Animal_c {
+ /* 0x000 */ char unk000[0x528];
+} Animal_c; // size = 0x528
// void func_800A6810_jp();
// void func_800A6920_jp();
@@ -33,7 +36,7 @@ typedef struct Npc {
// void func_800A6DB0_jp();
// void func_800A6DD0_jp();
// void func_800A6E0C_jp();
-// void func_800A6E40_jp();
+void mNpc_RenewalAnimalMemory(void);
// void func_800A6F48_jp();
// void func_800A6FF4_jp();
// void func_800A706C_jp();
@@ -82,7 +85,7 @@ typedef struct Npc {
// void func_800A9028_jp();
// void func_800A9110_jp();
// void func_800A918C_jp();
-// void func_800A91DC_jp();
+void func_800A91DC_jp(void);
// void func_800A9364_jp();
// void func_800A93AC_jp();
// void func_800A9468_jp();
@@ -123,9 +126,9 @@ void func_800AA124_jp(void);
// void func_800AAC88_jp();
// void func_800AADE8_jp();
// void func_800AAEFC_jp();
-// void func_800AB054_jp();
-// void func_800AB09C_jp();
-// void mNpc_SetNpcList();
+void func_800AB054_jp(void);
+void func_800AB09C_jp(void);
+void mNpc_SetNpcList(mNpc_NpcList_c* 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();
@@ -137,10 +140,10 @@ void mNpc_SetNpcinfo(struct Actor* actor, s8 arg1);
// void func_800ABA14_jp();
// void func_800ABAA8_jp();
// void func_800ABAF0_jp();
-// void func_800ABB14_jp();
+s32 mNpc_GetInAnimalP(void);
// void func_800ABB24_jp();
// void func_800ABCF8_jp();
-// void func_800ABD90_jp();
+void mNpc_SetRemoveAnimalNo(Animal_c* animal);
// void func_800ABE30_jp();
// void func_800ABF40_jp();
// void func_800AC1A0_jp();
@@ -149,10 +152,10 @@ void mNpc_SetNpcinfo(struct Actor* actor, s8 arg1);
// void func_800AC284_jp();
// void func_800AC358_jp();
// void func_800AC488_jp();
-// void func_800AC558_jp();
+void mNpc_SendRegisteredGoodbyMail(void);
// void func_800AC57C_jp();
// void func_800AC804_jp();
-// void func_800AC898_jp();
+void mNpc_SetReturnAnimal(s32 arg0);
// void func_800ACB24_jp();
// void func_800ACB54_jp();
// void func_800ACC38_jp();
@@ -170,7 +173,7 @@ void mNpc_SetNpcinfo(struct Actor* actor, s8 arg1);
// void func_800AD1E0_jp();
// void func_800AD22C_jp();
// void func_800AD2B8_jp();
-// void func_800AD2C4_jp();
+void mNpc_InitNpcAllInfo(s32 arg0);
// void func_800AD338_jp();
// void func_800AD3BC_jp();
// void func_800AD4B8_jp();
@@ -178,14 +181,14 @@ void mNpc_SetNpcinfo(struct Actor* actor, s8 arg1);
// void func_800AD6D4_jp();
// void func_800AD8C4_jp();
// void func_800AD954_jp();
-// void func_800AD9FC_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 func_800AE134_jp();
+void mNpc_ClearTalkInfo(void);
// void func_800AE1A0_jp();
// void func_800AE1B8_jp();
// void func_800AE1D8_jp();
diff --git a/include/m_npc_walk.h b/include/m_npc_walk.h
new file mode 100644
index 0000000..6b8116c
--- /dev/null
+++ b/include/m_npc_walk.h
@@ -0,0 +1,11 @@
+#ifndef M_NPC_WALK_H
+#define M_NPC_WALK_H
+
+#include "ultra64.h"
+
+typedef struct mNpc_walk_c {
+ /* 0x00 */ char unk00[0x7C];
+} mNpc_walk_c; // size = 0x7C
+
+
+#endif
diff --git a/include/m_private.h b/include/m_private.h
new file mode 100644
index 0000000..40d5b13
--- /dev/null
+++ b/include/m_private.h
@@ -0,0 +1,67 @@
+#ifndef M_PRIVATE_H
+#define M_PRIVATE_H
+
+#include "ultra64.h"
+#include "m_quest.h"
+
+#define mPr_FOREIGN_MAP_COUNT 8
+#define PLAYER_NUM 4
+
+typedef enum mPr_SEX {
+ /* 0 */ mPr_SEX_MALE,
+ /* 1 */ mPr_SEX_FEMALE,
+
+ /* 2 */ mPr_SEX_NUM
+} mPr_SEX;
+
+typedef enum mPr_ITEM_COND{
+ /* 0 */ mPr_ITEM_COND_NORMAL,
+ /* 1 */ mPr_ITEM_COND_PRESENT,
+ /* 2 */ mPr_ITEM_COND_QUEST,
+
+ /* 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 Private_c {
+ /* 0x000 */ char unk000[0x10];
+ /* 0x010 */ s8 gender;
+ /* 0x011 */ char 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 */
+ /* 0x3EC */ char unk3EC[0x688];
+ /* 0xA74 */ u8 exists;
+ /* 0xA75 */ char unkA75[0x11];
+ /* 0xA86 */ Private_Sub_A86 unk_A86;
+ /* 0xA90 */ char unkA8F[0xF8];
+ /* 0xB88 */ mPr_map_info_c maps[mPr_FOREIGN_MAP_COUNT]; /* maps 'collected' for foreign towns */
+ /* 0xBC8 */ char unkBC8[0x8];
+} Private_c; // size = 0xBD0
+
+#endif
diff --git a/include/m_quest.h b/include/m_quest.h
new file mode 100644
index 0000000..671d511
--- /dev/null
+++ b/include/m_quest.h
@@ -0,0 +1,20 @@
+#ifndef M_QUEST_H
+#define M_QUEST_H
+
+#include "ultra64.h"
+
+/* 'Not Saved' Quest */
+typedef struct mQst_not_saved_c {
+ /* 0x00 */ s32 work;
+ /* 0x04 */ u8 h;
+} mQst_not_saved_c; // size = 0x5
+
+typedef struct mQst_delivery_c {
+ /* 0x00 */ char unk00[0x24];
+} mQst_delivery_c; // size = 0x24
+
+typedef struct mQst_errand_c {
+ /* 0x00 */ char unk00[0x50];
+} mQst_errand_c; // size = 0x50
+
+#endif
diff --git a/include/m_scene_table.h b/include/m_scene_table.h
index aa21a3e..9adf609 100644
--- a/include/m_scene_table.h
+++ b/include/m_scene_table.h
@@ -4,6 +4,10 @@
#include "ultra64.h"
#include "z64math.h"
+#define SCENE_FG 7
+#define SCENE_START_DEMO 15
+#define SCENE_START_DEMO2 16
+
extern Struct_8010EAA0 scene_data_status[];
#endif
diff --git a/include/m_snowman.h b/include/m_snowman.h
index 0fb9576..caca944 100644
--- a/include/m_snowman.h
+++ b/include/m_snowman.h
@@ -9,7 +9,7 @@
// void mSN_MeltSnowman();
// void mSN_get_free_space();
// void func_800C8BC4_jp();
-// void mSN_decide_msg();
-// void mSN_snowman_init();
+void mSN_decide_msg(void);
+void mSN_snowman_init(void);
#endif
diff --git a/include/m_start_data_init.h b/include/m_start_data_init.h
index e8798bc..e7d2a28 100644
--- a/include/m_start_data_init.h
+++ b/include/m_start_data_init.h
@@ -2,23 +2,42 @@
#define M_START_DATA_INIT_H
#include "ultra64.h"
+#include "game.h"
+#include "m_actor.h"
-// void func_800C2FF0_jp();
-// void func_800C3054_jp();
-// void func_800C3118_jp();
-// void func_800C31D0_jp();
-// void func_800C327C_jp();
-// void func_800C3398_jp();
-// void func_800C33CC_jp();
-// void func_800C3418_jp();
-// void func_800C3488_jp();
-// void func_800C34D0_jp();
-// void func_800C37BC_jp();
-// void func_800C3970_jp();
-// void func_800C3AAC_jp();
-// void func_800C3BB4_jp();
-// void mSDI_StartInitAfter();
-// void mSDI_StartInitBefore();
-// void func_800C3DA8_jp();
+typedef enum mSDI_INIT_MODE {
+ /* 0 */ mSDI_INIT_MODE_NEW,
+ /* 1 */ mSDI_INIT_MODE_NEW_PLAYER,
+ /* 2 */ mSDI_INIT_MODE_FROM,
+ /* 3 */ mSDI_INIT_MODE_PAK,
+ /* 4 */ mSDI_INIT_MODE_ERR,
+
+ /* 5 */ mSDI_INIT_MODE_NUM
+} mSDI_INIT_MODE;
+
+typedef enum mSDI_MALLOC_FLAG {
+ /* 0 */ mSDI_MALLOC_FLAG_GAME,
+ /* 1 */ mSDI_MALLOC_FLAG_ZELDA,
+
+ /* 2 */ mSDI_MALLOC_FLAG_NUM
+} mSDI_MALLOC_FLAG;
+
+void famicom_emu_initial_common_data(void);
+void decide_fruit(u16* fruit);
+void decide_fish_location(u8* fish_location);
+void title_game_haniwa_data_init(void);
+void mSDI_ClearMoneyPlayerHomeStationBlock(void);
+void mSDI_PullTreeUT(u16* item_p);
+void mSDI_PullTreeBlock(u16* items_p, s32 ut);
+void mSDI_PullTree(void);
+void mSDI_PullTreeUnderPlayerBlock(void);
+s32 mSDI_StartInitNew(Game* game2, s32 player_no, s32 malloc_flag);
+s32 mSDI_StartInitFrom(Game* game2, s32 player_no, s32 malloc_flag);
+s32 mSDI_StartInitNewPlayer(Game* game, s32 player_no, s32 malloc_flag);
+s32 mSDI_StartInitPak(Game* game2, s32 player_no, s32 malloc_flag);
+s32 mSDI_StartInitErr(Game* game, s32 player_no, s32 malloc_flag);
+void mSDI_StartInitAfter(Game* game, s32 renewal_reserve_flag, s32 malloc_flag);
+s32 mSDI_StartInitBefore(Game* game, s32 player_no, s32 init_mode, s32 malloc_flag);
+s32 mSDI_StartDataInit(Game* game, s32 player_no, s32 init_mode);
#endif
diff --git a/include/m_time.h b/include/m_time.h
new file mode 100644
index 0000000..eb6dc05
--- /dev/null
+++ b/include/m_time.h
@@ -0,0 +1,81 @@
+#ifndef M_TIME_H
+#define M_TIME_H
+
+#include "ultra64.h"
+#include "lb_rtc.h"
+
+/* TODO: this might have a better header to live in */
+#define mTM_FIELD_RENEW_HOUR 6 /* hour which daily things 'reset' */
+
+#define mTM_MIN_YEAR 2001
+#define mTM_MAX_YEAR 2030
+
+typedef enum mTM_SEASON{
+ /* 0 */ mTM_SEASON_BEGIN = 0,
+ /* 0 */ mTM_SEASON_SPRING = mTM_SEASON_BEGIN,
+ /* 1 */ mTM_SEASON_SUMMER,
+ /* 2 */ mTM_SEASON_AUTUMN,
+ /* 3 */ mTM_SEASON_WINTER,
+
+ /* 4 */ mTM_SEASON_NUM
+} mTM_SEASON;
+
+typedef enum mTM_TERM{
+ /* 0 */ mTM_TERM_BEGIN = 0,
+ /* 0 */ mTM_TERM_0 = mTM_TERM_BEGIN,
+ /* 1 */ mTM_TERM_1,
+ /* 2 */ mTM_TERM_2,
+ /* 3 */ mTM_TERM_3,
+ /* 4 */ mTM_TERM_4,
+ /* 5 */ mTM_TERM_5,
+ /* 6 */ mTM_TERM_6,
+ /* 7 */ mTM_TERM_7,
+ /* 8 */ mTM_TERM_8,
+ /* 9 */ mTM_TERM_9,
+ /* 10 */ mTM_TERM_10,
+ /* 11 */ mTM_TERM_11,
+ /* 12 */ mTM_TERM_12,
+ /* 13 */ mTM_TERM_13,
+ /* 14 */ mTM_TERM_14,
+ /* 15 */ mTM_TERM_15,
+ /* 16 */ mTM_TERM_16,
+ /* 17 */ mTM_TERM_17,
+
+ /* 18 */ mTM_TERM_NUM
+} mTM_TERM;
+
+#define mTM_RENEW_TIME_NONE 0
+#define mTM_RENEW_TIME_ALL 0xFF
+
+typedef enum mTM_RENEW_TIME{
+ /* 0 */ mTM_RENEW_TIME_BEGIN = 0,
+ /* 0 */ mTM_RENEW_TIME_WEATHER = mTM_RENEW_TIME_BEGIN,
+ /* 1 */ mTM_RENEW_TIME_DAILY
+} mTM_RENEW_TIME;
+
+#define mTM_SECONDS_IN_MINUTE 60
+#define mTM_SECONDS_IN_HOUR 60*60
+#define mTM_SECONDS_IN_HALFDAY 12*60*60
+#define mTM_SECONDS_IN_DAY 24*60*60
+
+#define mTM_MINUTES_IN_HOUR 60
+
+typedef struct mTM_calendar_term_t {
+ /* 0x00 */ lbRTC_month_t month;
+ /* 0x01 */ lbRTC_day_t day;
+ /* 0x02 */ u16 season;
+ /* 0x04 */ s16 bgitem_profile;
+ /* 0x06 */ s16 bgitem_bank;
+} mTM_calendar_term_t; // size = 0x8
+
+extern lbRTC_time_c mTM_rtcTime_clear_code;
+extern lbRTC_ymd_t mTM_rtcTime_ymd_clear_code;
+extern lbRTC_time_c mTM_rtcTime_default_code;
+
+#define mTM_IsTimeCleared(time) (lbRTC_IsEqualTime((time), &mTM_rtcTime_clear_code, lbRTC_CHECK_ALL) == TRUE)
+#define mTM_AreTimesEqual(t0, t1) (lbRTC_IsEqualTime(t0, t1, lbRTC_CHECK_ALL))
+
+#define mTM_CheckCmpYMDEqual(ymd0, ymd1) ((ymd0)->year == (ymd1)->year && (ymd0)->month == (ymd1)->month && (ymd0)->day == (ymd1)->day)
+#define mTM_CheckCmpYMDClear(ymd0) ((ymd0)->year == mTM_rtcTime_ymd_clear_code.year || (ymd0)->month == mTM_rtcTime_ymd_clear_code.month || (ymd0)->day == mTM_rtcTime_ymd_clear_code.day)
+
+#endif
diff --git a/include/speed_meter.h b/include/speed_meter.h
index 65d6333..d63d843 100644
--- a/include/speed_meter.h
+++ b/include/speed_meter.h
@@ -18,7 +18,7 @@ void func_800D88E0_jp(struct_80145020_jp *arg0);
void func_800D8A54_jp(struct_80145020_jp *arg0, struct GraphicsContext* gfxCtx);
// void func_800D8DD4_jp();
// void func_800D8E18_jp();
-void func_800D9018_jp(struct_80145020_jp *arg0, struct GraphicsContext* gfxCtx, struct Game *gameState);
+void func_800D9018_jp(struct_80145020_jp *arg0, struct GraphicsContext* gfxCtx, struct Game *game);
// void func_800D93F4_jp();
#endif
diff --git a/include/sys_math.h b/include/sys_math.h
index 61c19d0..133bdd8 100644
--- a/include/sys_math.h
+++ b/include/sys_math.h
@@ -3,6 +3,12 @@
#include "ultra64.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) ((int)RANDOM_F(n))
+
// void reverse_u32();
// void init_rnd();
// void ffact();
diff --git a/include/sys_matrix.h b/include/sys_matrix.h
index 0d24c24..2791bf0 100644
--- a/include/sys_matrix.h
+++ b/include/sys_matrix.h
@@ -12,7 +12,7 @@ typedef enum {
/* 1 */ MTXMODE_APPLY // applies transformation to the current matrix
} MatrixMode;
-void new_Matrix(struct Game* gameState);
+void new_Matrix(struct Game* game);
void Matrix_push(void);
void Matrix_pull(void);
void Matrix_get(MtxF* dest);
diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt
index 51f9e9c..2976509 100644
--- a/linker_scripts/jp/symbol_addrs_code.txt
+++ b/linker_scripts/jp/symbol_addrs_code.txt
@@ -76,7 +76,7 @@ func_8005611C_jp = 0x8005611C; // type:func
func_8005615C_jp = 0x8005615C; // type:func
func_80056234_jp = 0x80056234; // type:func
func_80056270_jp = 0x80056270; // type:func
-func_80056310_jp = 0x80056310; // type:func
+mAGrw_ChangeTree2FruitTree = 0x80056310; // type:func
func_80056380_jp = 0x80056380; // type:func
projection_pos_set = 0x800563F4; // type:func
Actor_world_to_eye = 0x80056450; // type:func
@@ -594,10 +594,10 @@ clip_clear = 0x80066E50; // type:func
func_80066E90_jp = 0x80066E90; // type:func
func_80066EB8_jp = 0x80066EB8; // type:func
func_80066F1C_jp = 0x80066F1C; // type:func
-func_80066F4C_jp = 0x80066F4C; // type:func
+mNW_InitMyOriginal = 0x80066F4C; // type:func
func_80066F8C_jp = 0x80066F8C; // type:func
func_8006700C_jp = 0x8006700C; // type:func
-func_800670C0_jp = 0x800670C0; // type:func
+mCkRh_DecideNowGokiFamilyCount = 0x800670C0; // type:func
func_80067190_jp = 0x80067190; // type:func
func_80067264_jp = 0x80067264; // type:func
func_80067338_jp = 0x80067338; // type:func
@@ -1057,7 +1057,7 @@ func_8007D100_jp = 0x8007D100; // type:func
func_8007D128_jp = 0x8007D128; // type:func
func_8007D140_jp = 0x8007D140; // type:func
func_8007D180_jp = 0x8007D180; // type:func
-func_8007D1A8_jp = 0x8007D1A8; // type:func
+mEv_ClearEventSaveInfo = 0x8007D1A8; // type:func
mEv_ClearEventInfo = 0x8007D1DC; // type:func
func_8007D25C_jp = 0x8007D25C; // type:func
func_8007D2B8_jp = 0x8007D2B8; // type:func
@@ -1088,9 +1088,9 @@ func_8007D734_jp = 0x8007D734; // type:func
func_8007D784_jp = 0x8007D784; // type:func
func_8007D7BC_jp = 0x8007D7BC; // type:func
func_8007D810_jp = 0x8007D810; // type:func
-func_8007D848_jp = 0x8007D848; // type:func
+mEv_SetGateway = 0x8007D848; // type:func
func_8007D880_jp = 0x8007D880; // type:func
-func_8007D8D4_jp = 0x8007D8D4; // type:func
+mEv_UnSetGateway = 0x8007D8D4; // type:func
mEv_CheckTitleDemo = 0x8007D90C; // type:func
func_8007D91C_jp = 0x8007D91C; // type:func
func_8007D930_jp = 0x8007D930; // type:func
@@ -1133,8 +1133,8 @@ func_8007F318_jp = 0x8007F318; // type:func
func_8007F358_jp = 0x8007F358; // type:func
func_8007F6A0_jp = 0x8007F6A0; // type:func
func_8007F764_jp = 0x8007F764; // type:func
-func_8007F858_jp = 0x8007F858; // type:func
-func_8007F8A4_jp = 0x8007F8A4; // type:func
+mEv_init = 0x8007F858; // type:func
+mEv_init_force = 0x8007F8A4; // type:func
mEv_2nd_init = 0x8007F8DC; // type:func
func_8007F950_jp = 0x8007F950; // type:func
mEv_run = 0x8007F988; // type:func
@@ -1287,13 +1287,13 @@ func_80086FEC_jp = 0x80086FEC; // type:func
func_80087004_jp = 0x80087004; // type:func
func_80087280_jp = 0x80087280; // type:func
func_80087380_jp = 0x80087380; // type:func
-func_80087420_jp = 0x80087420; // type:func
-func_800874CC_jp = 0x800874CC; // type:func
+mFM_SetBlockKindLoadCombi = 0x80087420; // type:func
+mFM_InitFgCombiSaveData = 0x800874CC; // type:func
func_80087754_jp = 0x80087754; // type:func
func_8008775C_jp = 0x8008775C; // type:func
func_80087788_jp = 0x80087788; // type:func
func_800877CC_jp = 0x800877CC; // type:func
-func_800878D4_jp = 0x800878D4; // type:func
+mFM_RenewalReserve = 0x800878D4; // type:func
func_800879B0_jp = 0x800879B0; // type:func
func_80087C30_jp = 0x80087C30; // type:func
func_80087C40_jp = 0x80087C40; // type:func
@@ -1639,15 +1639,15 @@ func_80094400_jp = 0x80094400; // type:func
func_800944B8_jp = 0x800944B8; // type:func
func_80094520_jp = 0x80094520; // type:func
func_80094690_jp = 0x80094690; // type:func
-func_800946D0_jp = 0x800946D0; // type:func
+mHm_SetNowHome = 0x800946D0; // type:func
func_80094744_jp = 0x80094744; // type:func
func_800947C0_jp = 0x800947C0; // type:func
func_8009480C_jp = 0x8009480C; // type:func
func_800949B0_jp = 0x800949B0; // type:func
func_800949D8_jp = 0x800949D8; // type:func
func_80094A04_jp = 0x80094A04; // type:func
-func_80094A90_jp = 0x80094A90; // type:func
-func_80094BE0_jp = 0x80094BE0; // type:func
+mHm_CheckRehouseOrder = 0x80094A90; // type:func
+mHS_house_init = 0x80094BE0; // type:func
func_80094BF4_jp = 0x80094BF4; // type:func
func_80094C10_jp = 0x80094C10; // type:func
func_80094C44_jp = 0x80094C44; // type:func
@@ -1667,7 +1667,7 @@ func_8009519C_jp = 0x8009519C; // type:func
mLd_PlayerManKindCheck = 0x800951C0; // type:func
func_800951E4_jp = 0x800951E4; // type:func
func_80095218_jp = 0x80095218; // type:func
-func_8009524C_jp = 0x8009524C; // type:func
+mLd_LandDataInit = 0x8009524C; // type:func
func_80095280_jp = 0x80095280; // type:func
func_800952A4_jp = 0x800952A4; // type:func
func_800952D0_jp = 0x800952D0; // type:func
@@ -1746,7 +1746,7 @@ func_80098A90_jp = 0x80098A90; // type:func
mEnv_WindMove = 0x80098B50; // type:func
func_80098CCC_jp = 0x80098CCC; // type:func
func_80098D88_jp = 0x80098D88; // type:func
-func_80098DE0_jp = 0x80098DE0; // type:func
+mEnv_DecideWeather_NormalGameStart = 0x80098DE0; // type:func
mEnv_NowWeather = 0x80098EE4; // type:func
func_80098F68_jp = 0x80098F68; // type:func
func_80098FF0_jp = 0x80098FF0; // type:func
@@ -1892,8 +1892,8 @@ func_8009CA94_jp = 0x8009CA94; // type:func
func_8009CB5C_jp = 0x8009CB5C; // type:func
func_8009CC00_jp = 0x8009CC00; // type:func
func_8009CC94_jp = 0x8009CC94; // type:func
-func_8009CDA8_jp = 0x8009CDA8; // type:func
-func_8009CFB0_jp = 0x8009CFB0; // type:func
+mMkRm_MarkRoom = 0x8009CDA8; // type:func
+mMld_SetDefaultMelody = 0x8009CFB0; // type:func
func_8009CFD4_jp = 0x8009CFD4; // type:func
func_8009D03C_jp = 0x8009D03C; // type:func
func_8009D0CC_jp = 0x8009D0CC; // type:func
@@ -2190,7 +2190,7 @@ func_800A345C_jp = 0x800A345C; // type:func
func_800A34E8_jp = 0x800A34E8; // type:func
func_800A35C8_jp = 0x800A35C8; // type:func
func_800A3658_jp = 0x800A3658; // type:func
-func_800A36CC_jp = 0x800A36CC; // type:func
+mMsm_SendInformationMail = 0x800A36CC; // type:func
func_800A3784_jp = 0x800A3784; // type:func
func_800A37D0_jp = 0x800A37D0; // type:func
func_800A3810_jp = 0x800A3810; // type:func
@@ -2263,7 +2263,7 @@ func_800A6D04_jp = 0x800A6D04; // type:func
func_800A6DB0_jp = 0x800A6DB0; // type:func
func_800A6DD0_jp = 0x800A6DD0; // type:func
func_800A6E0C_jp = 0x800A6E0C; // type:func
-func_800A6E40_jp = 0x800A6E40; // type:func
+mNpc_RenewalAnimalMemory = 0x800A6E40; // type:func
func_800A6F48_jp = 0x800A6F48; // type:func
func_800A6FF4_jp = 0x800A6FF4; // type:func
func_800A706C_jp = 0x800A706C; // type:func
@@ -2367,10 +2367,10 @@ func_800AB8A0_jp = 0x800AB8A0; // type:func
func_800ABA14_jp = 0x800ABA14; // type:func
func_800ABAA8_jp = 0x800ABAA8; // type:func
func_800ABAF0_jp = 0x800ABAF0; // type:func
-func_800ABB14_jp = 0x800ABB14; // type:func
+mNpc_GetInAnimalP = 0x800ABB14; // type:func
func_800ABB24_jp = 0x800ABB24; // type:func
func_800ABCF8_jp = 0x800ABCF8; // type:func
-func_800ABD90_jp = 0x800ABD90; // type:func
+mNpc_SetRemoveAnimalNo = 0x800ABD90; // type:func
func_800ABE30_jp = 0x800ABE30; // type:func
func_800ABF40_jp = 0x800ABF40; // type:func
func_800AC1A0_jp = 0x800AC1A0; // type:func
@@ -2379,10 +2379,10 @@ func_800AC1EC_jp = 0x800AC1EC; // type:func
func_800AC284_jp = 0x800AC284; // type:func
func_800AC358_jp = 0x800AC358; // type:func
func_800AC488_jp = 0x800AC488; // type:func
-func_800AC558_jp = 0x800AC558; // type:func
+mNpc_SendRegisteredGoodbyMail = 0x800AC558; // type:func
func_800AC57C_jp = 0x800AC57C; // type:func
func_800AC804_jp = 0x800AC804; // type:func
-func_800AC898_jp = 0x800AC898; // type:func
+mNpc_SetReturnAnimal = 0x800AC898; // type:func
func_800ACB24_jp = 0x800ACB24; // type:func
func_800ACB54_jp = 0x800ACB54; // type:func
func_800ACC38_jp = 0x800ACC38; // type:func
@@ -2400,7 +2400,7 @@ func_800AD188_jp = 0x800AD188; // type:func
func_800AD1E0_jp = 0x800AD1E0; // type:func
func_800AD22C_jp = 0x800AD22C; // type:func
func_800AD2B8_jp = 0x800AD2B8; // type:func
-func_800AD2C4_jp = 0x800AD2C4; // type:func
+mNpc_InitNpcAllInfo = 0x800AD2C4; // type:func
func_800AD338_jp = 0x800AD338; // type:func
func_800AD3BC_jp = 0x800AD3BC; // type:func
func_800AD4B8_jp = 0x800AD4B8; // type:func
@@ -2415,7 +2415,7 @@ func_800ADC8C_jp = 0x800ADC8C; // type:func
func_800ADD20_jp = 0x800ADD20; // type:func
func_800ADEFC_jp = 0x800ADEFC; // type:func
func_800AE110_jp = 0x800AE110; // type:func
-func_800AE134_jp = 0x800AE134; // type:func
+mNpc_ClearTalkInfo = 0x800AE134; // type:func
func_800AE1A0_jp = 0x800AE1A0; // type:func
func_800AE1B8_jp = 0x800AE1B8; // type:func
func_800AE1D8_jp = 0x800AE1D8; // type:func
@@ -2437,12 +2437,12 @@ func_800AE76C_jp = 0x800AE76C; // type:func
func_800AE898_jp = 0x800AE898; // type:func
mNpc_PrintFriendship_fdebug = 0x800AE8C8; // type:func
func_800AEA80_jp = 0x800AEA80; // type:func
-func_800AEB50_jp = 0x800AEB50; // type:func
+mNPS_set_schedule_area = 0x800AEB50; // type:func
func_800AEB9C_jp = 0x800AEB9C; // type:func
func_800AEBC8_jp = 0x800AEBC8; // type:func
func_800AEC74_jp = 0x800AEC74; // type:func
mNPS_schedule_manager = 0x800AED08; // type:func
-func_800AED68_jp = 0x800AED68; // type:func
+mNPS_set_all_schedule_area = 0x800AED68; // type:func
func_800AEDD0_jp = 0x800AEDD0; // type:func
func_800AEE38_jp = 0x800AEE38; // type:func
func_800AEE50_jp = 0x800AEE50; // type:func
@@ -2460,7 +2460,7 @@ func_800AF7BC_jp = 0x800AF7BC; // type:func
func_800AF84C_jp = 0x800AF84C; // type:func
func_800AF9C8_jp = 0x800AF9C8; // type:func
func_800AFA1C_jp = 0x800AFA1C; // type:func
-func_800AFAF8_jp = 0x800AFAF8; // type:func
+mNpcW_InitNpcWalk = 0x800AFAF8; // type:func
func_800AFC1C_jp = 0x800AFC1C; // type:func
func_800AFCAC_jp = 0x800AFCAC; // type:func
func_800AFCD8_jp = 0x800AFCD8; // type:func
@@ -2682,7 +2682,7 @@ func_800B6564_jp = 0x800B6564; // type:func
func_800B6618_jp = 0x800B6618; // type:func
func_800B6640_jp = 0x800B6640; // type:func
func_800B66CC_jp = 0x800B66CC; // type:func
-func_800B6718_jp = 0x800B6718; // type:func
+mPB_police_box_init = 0x800B6718; // type:func
func_800B67C0_jp = 0x800B67C0; // type:func
func_800B6838_jp = 0x800B6838; // type:func
func_800B68E8_jp = 0x800B68E8; // type:func
@@ -2728,7 +2728,7 @@ func_800B7B8C_jp = 0x800B7B8C; // type:func
func_800B7BC0_jp = 0x800B7BC0; // type:func
func_800B7CD0_jp = 0x800B7CD0; // type:func
func_800B7D50_jp = 0x800B7D50; // type:func
-func_800B7D90_jp = 0x800B7D90; // type:func
+mPr_InitPrivateInfo = 0x800B7D90; // type:func
func_800B7F00_jp = 0x800B7F00; // type:func
func_800B7F48_jp = 0x800B7F48; // type:func
mPr_CheckPrivate = 0x800B7F78; // type:func
@@ -2746,7 +2746,7 @@ func_800B8544_jp = 0x800B8544; // type:func
func_800B86EC_jp = 0x800B86EC; // type:func
func_800B88EC_jp = 0x800B88EC; // type:func
func_800B8A88_jp = 0x800B8A88; // type:func
-func_800B8B08_jp = 0x800B8B08; // type:func
+mPr_SetPossessionItem = 0x800B8B08; // type:func
func_800B8B8C_jp = 0x800B8B8C; // type:func
func_800B8BE4_jp = 0x800B8BE4; // type:func
func_800B8C10_jp = 0x800B8C10; // type:func
@@ -2756,7 +2756,7 @@ func_800B8C9C_jp = 0x800B8C9C; // type:func
func_800B8D18_jp = 0x800B8D18; // type:func
func_800B8D3C_jp = 0x800B8D3C; // type:func
func_800B8D64_jp = 0x800B8D64; // type:func
-func_800B8EE4_jp = 0x800B8EE4; // type:func
+mPr_ClearMotherMailInfo = 0x800B8EE4; // type:func
func_800B8F20_jp = 0x800B8F20; // type:func
func_800B8FB8_jp = 0x800B8FB8; // type:func
func_800B9038_jp = 0x800B9038; // type:func
@@ -2773,8 +2773,8 @@ func_800B996C_jp = 0x800B996C; // type:func
func_800B9AF0_jp = 0x800B9AF0; // type:func
func_800B9B2C_jp = 0x800B9B2C; // type:func
func_800B9C34_jp = 0x800B9C34; // type:func
-func_800B9DAC_jp = 0x800B9DAC; // type:func
-func_800B9E44_jp = 0x800B9E44; // type:func
+mPr_SendForeingerAnimalMail = 0x800B9DAC; // type:func
+mPr_StartSetCompleteTalkInfo = 0x800B9E44; // type:func
func_800B9E90_jp = 0x800B9E90; // type:func
func_800B9EB4_jp = 0x800B9EB4; // type:func
func_800B9ED4_jp = 0x800B9ED4; // type:func
@@ -2793,14 +2793,14 @@ func_800BA2B0_jp = 0x800BA2B0; // type:func
func_800BA2D4_jp = 0x800BA2D4; // type:func
func_800BA344_jp = 0x800BA344; // type:func
func_800BA3D0_jp = 0x800BA3D0; // type:func
-func_800BA404_jp = 0x800BA404; // type:func
+mPr_RenewalMapInfo = 0x800BA404; // type:func
mPr_RandomSetPlayerData_title_demo = 0x800BA494; // type:func
mPr_PrintMapInfo_debug = 0x800BA50C; // type:func
func_800BA660_jp = 0x800BA660; // type:func
-func_800BA690_jp = 0x800BA690; // type:func
-func_800BA6F0_jp = 0x800BA6F0; // type:func
+mQst_ClearDelivery = 0x800BA690; // type:func
+mQst_ClearErrand = 0x800BA6F0; // type:func
func_800BA778_jp = 0x800BA778; // type:func
-func_800BA7C8_jp = 0x800BA7C8; // type:func
+mQst_ClearNotSaveQuest = 0x800BA7C8; // type:func
func_800BA7E8_jp = 0x800BA7E8; // type:func
func_800BA8A0_jp = 0x800BA8A0; // type:func
func_800BA8F4_jp = 0x800BA8F4; // type:func
@@ -2966,7 +2966,7 @@ func_800C0DEC_jp = 0x800C0DEC; // type:func
func_800C0E98_jp = 0x800C0E98; // type:func
func_800C1070_jp = 0x800C1070; // type:func
func_800C1230_jp = 0x800C1230; // type:func
-func_800C1428_jp = 0x800C1428; // type:func
+mSP_ExchangeLineUp_InGame = 0x800C1428; // type:func
func_800C1498_jp = 0x800C1498; // type:func
func_800C15A8_jp = 0x800C15A8; // type:func
func_800C1610_jp = 0x800C1610; // type:func
@@ -3007,23 +3007,23 @@ func_800C2D8C_jp = 0x800C2D8C; // type:func
func_800C2DF0_jp = 0x800C2DF0; // type:func
func_800C2E80_jp = 0x800C2E80; // type:func
func_800C2EE0_jp = 0x800C2EE0; // type:func
-func_800C2FF0_jp = 0x800C2FF0; // type:func
-func_800C3054_jp = 0x800C3054; // type:func
-func_800C3118_jp = 0x800C3118; // type:func
-func_800C31D0_jp = 0x800C31D0; // type:func
-func_800C327C_jp = 0x800C327C; // type:func
-func_800C3398_jp = 0x800C3398; // type:func
-func_800C33CC_jp = 0x800C33CC; // type:func
-func_800C3418_jp = 0x800C3418; // type:func
-func_800C3488_jp = 0x800C3488; // type:func
-func_800C34D0_jp = 0x800C34D0; // type:func
-func_800C37BC_jp = 0x800C37BC; // type:func
-func_800C3970_jp = 0x800C3970; // type:func
-func_800C3AAC_jp = 0x800C3AAC; // type:func
-func_800C3BB4_jp = 0x800C3BB4; // type:func
+famicom_emu_initial_common_data = 0x800C2FF0; // type:func
+decide_fruit = 0x800C3054; // type:func
+decide_fish_location = 0x800C3118; // type:func
+title_game_haniwa_data_init = 0x800C31D0; // type:func
+mSDI_ClearMoneyPlayerHomeStationBlock = 0x800C327C; // type:func
+mSDI_PullTreeUT = 0x800C3398; // type:func
+mSDI_PullTreeBlock = 0x800C33CC; // type:func
+mSDI_PullTree = 0x800C3418; // type:func
+mSDI_PullTreeUnderPlayerBlock = 0x800C3488; // type:func
+mSDI_StartInitNew = 0x800C34D0; // type:func
+mSDI_StartInitFrom = 0x800C37BC; // type:func
+mSDI_StartInitNewPlayer = 0x800C3970; // type:func
+mSDI_StartInitPak = 0x800C3AAC; // type:func
+mSDI_StartInitErr = 0x800C3BB4; // type:func
mSDI_StartInitAfter = 0x800C3BCC; // type:func
mSDI_StartInitBefore = 0x800C3D50; // type:func
-func_800C3DA8_jp = 0x800C3DA8; // type:func
+mSDI_StartDataInit = 0x800C3DA8; // type:func
func_800C3E30_jp = 0x800C3E30; // type:func
func_800C3F70_jp = 0x800C3F70; // type:func
func_800C4084_jp = 0x800C4084; // type:func
@@ -3173,7 +3173,7 @@ func_800C96B0_jp = 0x800C96B0; // type:func
func_800C9728_jp = 0x800C9728; // type:func
func_800C98A0_jp = 0x800C98A0; // type:func
func_800C9D38_jp = 0x800C9D38; // type:func
-func_800C9F88_jp = 0x800C9F88; // type:func
+mTRC_init = 0x800C9F88; // type:func
mTRC_move = 0x800CA008; // type:func
func_800CA070_jp = 0x800CA070; // type:func
mTM_set_season = 0x800CA1DC; // type:func
@@ -3182,7 +3182,7 @@ func_800CA240_jp = 0x800CA240; // type:func
func_800CA278_jp = 0x800CA278; // type:func
func_800CA2A8_jp = 0x800CA2A8; // type:func
func_800CA2BC_jp = 0x800CA2BC; // type:func
-func_800CA2DC_jp = 0x800CA2DC; // type:func
+mTM_renewal_renew_time = 0x800CA2DC; // type:func
func_800CA350_jp = 0x800CA350; // type:func
func_800CA570_jp = 0x800CA570; // type:func
mTM_time = 0x800CA63C; // type:func
@@ -3455,7 +3455,7 @@ func_800D4F18_jp = 0x800D4F18; // type:func
func_800D4F6C_jp = 0x800D4F6C; // type:func
func_800D4FB8_jp = 0x800D4FB8; // type:func
func_800D5004_jp = 0x800D5004; // type:func
-func_800D5090_jp = 0x800D5090; // type:func
+lbRTC_GetTime = 0x800D5090; // type:func
func_800D5104_jp = 0x800D5104; // type:func
func_800D5164_jp = 0x800D5164; // type:func
func_800D51E0_jp = 0x800D51E0; // type:func
@@ -3480,7 +3480,7 @@ func_800D5B34_jp = 0x800D5B34; // type:func
func_800D5BDC_jp = 0x800D5BDC; // type:func
func_800D5C84_jp = 0x800D5C84; // type:func
func_800D5CF8_jp = 0x800D5CF8; // type:func
-func_800D5D6C_jp = 0x800D5D6C; // type:func
+lbRTC_TimeCopy = 0x800D5D6C; // type:func
func_800D5D94_jp = 0x800D5D94; // type:func
func_800D5E70_jp = 0x800D5E70; // type:func
func_800D5EA8_jp = 0x800D5EA8; // type:func
@@ -4941,9 +4941,6 @@ D_8010DC84_jp = 0x8010DC84; //
D_8010DC88_jp = 0x8010DC88; // type:u8
D_8010DC8C_jp = 0x8010DC8C; // type:u8
D_8010DC90_jp = 0x8010DC90; // type:u8
-D_8010DCA0_jp = 0x8010DCA0; //
-D_8010DCB0_jp = 0x8010DCB0; //
-D_8010DCC4_jp = 0x8010DCC4; //
D_8010DCE0_jp = 0x8010DCE0; //
D_8010DCE4_jp = 0x8010DCE4; //
D_8010DCE8_jp = 0x8010DCE8; //
@@ -5652,9 +5649,9 @@ jtbl_80117AB0_jp = 0x80117AB0; // type:jtbl
RO_FLT_80117AD4_jp = 0x80117AD4; // type:f32
RO_FLT_80117AD8_jp = 0x80117AD8; // type:f32
RO_FLT_80117ADC_jp = 0x80117ADC; // type:f32
-RO_80117AE0_jp = 0x80117AE0; //
-RO_80117AE8_jp = 0x80117AE8; //
-RO_80117AEC_jp = 0x80117AEC; //
+mTM_rtcTime_clear_code = 0x80117AE0; //
+mTM_rtcTime_ymd_clear_code = 0x80117AE8; //
+mTM_rtcTime_default_code = 0x80117AEC; //
RO_STR_80117AF4_jp = 0x80117AF4; // type:asciz
RO_STR_80117AFC_jp = 0x80117AFC; // type:asciz
RO_STR_80117B04_jp = 0x80117B04; // type:asciz
diff --git a/src/code/game.c b/src/code/game.c
index a9a37ed..0f657ac 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -27,9 +27,9 @@ f32 game_GameFrameF;
f32 game_GameFrame_2F;
f32 game_GameFrame__1F;
-void func_800D2E00_jp(Game* gameState) {
+void func_800D2E00_jp(Game* game) {
if (zurumode_flag >= 2) {
- Debug_mode_input(CONTROLLER2(gameState));
+ Debug_mode_input(CONTROLLER2(game));
}
if (SREG(0) != 0) {
@@ -82,7 +82,7 @@ void func_800D2E58_jp(u16 button, Gfx** gfxP) {
*gfxP = gfx;
}
-void game_debug_draw_last(Game* gameState, GraphicsContext* gfxCtx) {
+void game_debug_draw_last(Game* game, GraphicsContext* gfxCtx) {
Gfx* gfx;
Gfx* gfxHead;
@@ -98,7 +98,7 @@ void game_debug_draw_last(Game* gameState, GraphicsContext* gfxCtx) {
gSPDisplayList(OVERLAY_DISP++, gfx);
}
- B_80145040_jp = CONTROLLER1(gameState)->press.button | CONTROLLER1(gameState)->cur.button;
+ B_80145040_jp = CONTROLLER1(game)->press.button | CONTROLLER1(game)->cur.button;
func_800D2E58_jp(B_80145040_jp, &gfx);
@@ -119,7 +119,7 @@ void game_debug_draw_last(Game* gameState, GraphicsContext* gfxCtx) {
if (SREG(0) != 0) {
func_800D8A54_jp(&B_80145020_jp, gfxCtx);
- func_800D9018_jp(&B_80145020_jp, gfxCtx, gameState);
+ func_800D9018_jp(&B_80145020_jp, gfxCtx, game);
}
}
@@ -172,11 +172,11 @@ void game_draw_last(GraphicsContext* gfxCtx) {
CLOSE_DISPS(gfxCtx);
}
-void game_get_controller(Game* gameState) {
- if (gameState->unk_74 == 1) {
- padmgr_RequestPadData(gameState->input, 1);
+void game_get_controller(Game* game) {
+ if (game->unk_74 == 1) {
+ padmgr_RequestPadData(game->input, 1);
} else {
- padmgr_ClearPadData(gameState->input);
+ padmgr_ClearPadData(game->input);
}
}
@@ -190,8 +190,8 @@ void SetGameFrame(s32 divisor) {
}
}
-void game_main(Game* gameState) {
- GraphicsContext* gfxCtx = gameState->gfxCtx;
+void game_main(Game* game) {
+ GraphicsContext* gfxCtx = game->gfxCtx;
u8 gameframe = game_GameFrame;
if (SREG(30) != gameframe) {
@@ -203,37 +203,37 @@ void game_main(Game* gameState) {
mTM_time();
gfxCtx->unk_2F0 = 7;
- gameState->main(gameState);
+ game->main(game);
gfxCtx->unk_2F0 = 9;
- mBGM_main(gameState);
+ mBGM_main(game);
gfxCtx->unk_2F0 = 0xA;
- func_800D2E00_jp(gameState);
+ func_800D2E00_jp(game);
- gameState->unk_A0++;
+ game->unk_A0++;
}
-void game_init_hyral(Game* gameState, size_t size) {
- void* buf = gamealloc_malloc(&gameState->alloc, size);
+void game_init_hyral(Game* game, size_t size) {
+ void* buf = gamealloc_malloc(&game->alloc, size);
if (buf != NULL) {
- THA_ct(&gameState->heap, buf, size);
+ THA_ct(&game->heap, buf, size);
return;
}
- THA_ct(&gameState->heap, NULL, 0);
+ THA_ct(&game->heap, NULL, 0);
_dbg_hungup("../game.c", 462);
}
-void game_resize_hyral(Game* gameState, size_t size) {
- GameAlloc* alloc = &gameState->alloc;
+void game_resize_hyral(Game* game, size_t size) {
+ GameAlloc* alloc = &game->alloc;
void* gameArena;
size_t maxFree;
size_t bytesFree;
size_t bytesAllocated;
- void* heapStart = gameState->heap.start;
+ void* heapStart = game->heap.start;
- THA_dt(&gameState->heap);
+ THA_dt(&game->heap);
gamealloc_free(alloc, heapStart);
@@ -246,16 +246,16 @@ void game_resize_hyral(Game* gameState, size_t size) {
gameArena = gamealloc_malloc(alloc, size);
if (gameArena != NULL) {
- THA_ct(&gameState->heap, gameArena, size);
+ THA_ct(&game->heap, gameArena, size);
return;
}
- THA_ct(&gameState->heap, NULL, 0);
+ THA_ct(&game->heap, NULL, 0);
_dbg_hungup("../game.c", 508);
}
-void game_ct(Game* gameState, GameStateFunc init, GraphicsContext* gfxCtx) {
- gamePT = gameState;
+void game_ct(Game* game, GameStateFunc init, GraphicsContext* gfxCtx) {
+ gamePT = game;
gfxCtx->unk_2F2 = 1;
gfxCtx->unk_25C = &osViModeNtscLan1;
@@ -263,71 +263,71 @@ void game_ct(Game* gameState, GameStateFunc init, GraphicsContext* gfxCtx) {
gfxCtx->unk_2FC = 1.0f;
gfxCtx->unk_300 = 1.0f;
- mCon_ct(gameState);
+ mCon_ct(game);
- gameState->unk_A0 = 0;
- gameState->main = NULL;
- gameState->destroy = NULL;
- gameState->running = true;
- gameState->unk_74 = 1;
+ game->unk_A0 = 0;
+ game->main = NULL;
+ game->destroy = NULL;
+ game->running = true;
+ game->unk_74 = 1;
{
s32 requiredScopeTemp UNUSED;
- gameState->gfxCtx = gfxCtx;
- gameState->init = NULL;
- gameState->size = 0;
+ game->gfxCtx = gfxCtx;
+ game->init = NULL;
+ game->size = 0;
}
- gamealloc_init(&gameState->alloc);
+ gamealloc_init(&game->alloc);
- game_init_hyral(gameState, 0x100000); // 1 MiB
+ game_init_hyral(game, 0x100000); // 1 MiB
SetGameFrame(2);
- init(gameState);
+ init(game);
func_8005F020_jp();
func_800D88B0_jp(&B_80145020_jp);
- func_800D3E14_jp(gameState->gfxCtx);
+ func_800D3E14_jp(game->gfxCtx);
}
-void game_dt(Game* gameState) {
- mCon_dt(gameState);
- func_800D3E40_jp(gameState->gfxCtx);
+void game_dt(Game* game) {
+ mCon_dt(game);
+ func_800D3E40_jp(game->gfxCtx);
mBGM_cleanup();
- if (gameState->destroy != NULL) {
- gameState->destroy(gameState);
+ if (game->destroy != NULL) {
+ game->destroy(game);
}
func_800D88D4_jp(&B_80145020_jp);
- THA_dt(&gameState->heap);
- gamealloc_cleanup(&gameState->alloc);
+ THA_dt(&game->heap);
+ gamealloc_cleanup(&game->alloc);
gamePT = NULL;
}
-GameStateFunc game_get_next_game_init(Game* gameState) {
- return gameState->init;
+GameStateFunc game_get_next_game_init(Game* game) {
+ return game->init;
}
-size_t game_get_next_game_class_size(Game* gameState) {
- return gameState->size;
+size_t game_get_next_game_class_size(Game* game) {
+ return game->size;
}
-s32 game_is_doing(Game* gameState) {
- return gameState->running;
+s32 game_is_doing(Game* game) {
+ return game->running;
}
-s32 game_getFreeBytes(Game* gameState) {
- return THA_getFreeBytes(&gameState->heap);
+s32 game_getFreeBytes(Game* game) {
+ return THA_getFreeBytes(&game->heap);
}
-void game_goto_next_game_play(Game* gameState) {
- STOP_GAMESTATE(gameState);
- SET_NEXT_GAMESTATE(gameState, play_init, sizeof(Game_Play));
+void game_goto_next_game_play(Game* game) {
+ STOP_GAMESTATE(game);
+ SET_NEXT_GAMESTATE(game, play_init, sizeof(Game_Play));
}
-void game_goto_next_game_name_famicom_emu(Game* gameState) {
- STOP_GAMESTATE(gameState);
- SET_NEXT_GAMESTATE(gameState, famicom_emu_init, sizeof(Game_FamicomEmu));
+void game_goto_next_game_name_famicom_emu(Game* game) {
+ STOP_GAMESTATE(game);
+ SET_NEXT_GAMESTATE(game, famicom_emu_init, sizeof(Game_FamicomEmu));
}
diff --git a/src/code/m_actor.c b/src/code/m_actor.c
index 21fc868..809a754 100644
--- a/src/code/m_actor.c
+++ b/src/code/m_actor.c
@@ -11,7 +11,6 @@
#include "m_lib.h"
#include "m_skin_matrix.h"
#include "m_player_lib.h"
-#include "m_npc.h"
#include "m_scene.h"
#include "libc/math.h"
#include "fault.h"
@@ -24,6 +23,7 @@
#include "macros.h"
#include "overlays/gamestates/ovl_play/m_play.h"
#include "overlays/actors/player_actor/m_player.h"
+#include "overlays/actors/ovl_Npc/ac_npc.h"
void func_80056380_jp(void* arg0, void* arg1 UNUSED) {
Actor* actor = arg0;
diff --git a/src/code/m_start_data_init.c b/src/code/m_start_data_init.c
new file mode 100644
index 0000000..86ed5b3
--- /dev/null
+++ b/src/code/m_start_data_init.c
@@ -0,0 +1,458 @@
+#include "m_start_data_init.h"
+#include "6792F0.h"
+#include "68AB30.h"
+#include "69CB30.h"
+#include "6A83A0.h"
+#include "6B81C0.h"
+#include "6B8A70.h"
+#include "6BA500.h"
+#include "6C0690.h"
+#include "6C97F0.h"
+#include "6D2720.h"
+#include "6D9D80.h"
+#include "6DA460.h"
+#include "6DB420.h"
+#include "6DE300.h"
+#include "6E30B0.h"
+#include "6E7AD0.h"
+#include "6ECD90.h"
+#include "6EDD10.h"
+#include "6F8A60.h"
+#include "global.h"
+#include "libc64/qrand.h"
+#include "m_all_grow.h"
+#include "m_common_data.h"
+#include "m_event.h"
+#include "m_field_info.h"
+#include "m_field_make.h"
+#include "m_handbill.h"
+#include "m_home.h"
+#include "m_house.h"
+#include "m_kankyo.h"
+#include "m_lib.h"
+#include "m_msg_main.h"
+#include "m_name_table.h"
+#include "m_npc.h"
+#include "m_scene_table.h"
+#include "m_snowman.h"
+#include "m_time.h"
+#include "overlays/gamestates/ovl_play/m_play.h"
+#include "sys_math.h"
+
+void famicom_emu_initial_common_data(void) {
+ FamicomEmuCommonData* famicom = &common_data.famicom_emu_common_data;
+
+ famicom->unk_00 = 0;
+ famicom->unk_02 = 0x3E8;
+ famicom->unk_04 = 0x3E8;
+ famicom->unk_06 = 0x9C4;
+ famicom->unk_08 = 0;
+ famicom->unk_0A = 0;
+ famicom->unk_0C = 0;
+ famicom->unk_0E = 0;
+ famicom->unk_10 = 0x64;
+ famicom->unk_14 = 0;
+ famicom->unk_16 = 0;
+ famicom->unk_18 = 0;
+ famicom->unk_1A = 0;
+ famicom->unk_1C = 0;
+ famicom->unk_1E = 0;
+ famicom->unk_20 = 0;
+ famicom->unk_22 = 0;
+ famicom->unk_24 = 0;
+}
+
+void decide_fruit(u16* fruit) {
+ u16 n = mAGrw_FRUIT_NUM;
+
+ *fruit = ITM_FOOD_START | (u16)RANDOM_F(n);
+}
+
+void decide_fish_location(u8* fish_location) {
+ *fish_location = RANDOM_F(3);
+}
+
+void title_game_haniwa_data_init(void) {
+ s32 i;
+ u8 haniwa_buf[HANIWA_MESSAGE_LEN];
+ s32 j;
+ Haniwa_c* haniwa;
+
+ func_800C3F70_jp(haniwa_buf, HANIWA_MESSAGE_LEN, 0x55C);
+
+ for (i = 0; i < mHS_HOUSE_NUM; i++) {
+ haniwa = &common_data.homes[i].haniwa;
+
+ mem_copy(common_data.homes[i].haniwa.message, haniwa_buf, HANIWA_MESSAGE_LEN);
+
+ for (j = 0; j < HANIWA_ITEM_HOLD_NUM; j++) {
+ haniwa->items[j].item = EMPTY_NO;
+ }
+ haniwa->bells = 0;
+ }
+}
+
+void mSDI_ClearMoneyPlayerHomeStationBlock(void) {
+ static s32 block_num[2][2] = {
+ { 2, 1 }, /* Player home */
+ { 2, 0 } /* Station */
+ };
+
+ s32 block_z;
+ s32 block_x;
+ u16* items;
+ s32 ut_x;
+ s32 ut_z;
+ u16 item;
+ s32 i;
+ s32 depositOffset;
+
+ for (i = 0; i < 2; i++) {
+ block_z = block_num[i][1];
+ block_x = block_num[i][0];
+
+ depositOffset = block_num[i][1] * FG_BLOCK_X_NUM + block_x;
+ items = common_data.fg[block_z][block_x].items[0];
+
+ if (items != NULL) {
+ for (ut_z = 0; ut_z < UT_Z_NUM; ut_z++) {
+ for (ut_x = 0; ut_x < UT_X_NUM; ut_x++) {
+ item = *items;
+
+ if (item >= ITM_MONEY_START && item <= ITM_MONEY_END) {
+ u16* deposit = common_data.deposit[depositOffset];
+
+ mPB_keep_item(item);
+ *items = EMPTY_NO;
+
+ if (deposit != NULL) {
+ func_8008C478_jp(deposit, ut_x, ut_z);
+ }
+ }
+
+ items++;
+ }
+ }
+ }
+ }
+}
+
+void mSDI_PullTreeUT(u16* item_p) {
+ if ((*item_p >= TREE_SAPLING && *item_p <= TREE_30000BELLS) ||
+ (*item_p >= TREE_100BELLS_SAPLING && *item_p <= TREE_100BELLS)) {
+ *item_p = EMPTY_NO;
+ }
+}
+
+void mSDI_PullTreeBlock(u16* items_p, s32 ut) {
+ s32 i;
+
+ for (i = ut; i < UT_TOTAL_NUM; i += UT_X_NUM) {
+ mSDI_PullTreeUT(&items_p[i]);
+ }
+}
+
+void mSDI_PullTree(void) {
+ mFM_fg_c* fg_block;
+ s32 block_z;
+
+ for (block_z = 0; block_z < FG_BLOCK_Z_NUM; block_z++) {
+ /* Clear trees against the cliffs on the left and right town cliff borders */
+ fg_block = &common_data.fg[block_z][0];
+ mSDI_PullTreeBlock(fg_block->items[0], 0);
+ mSDI_PullTreeBlock((fg_block + FG_BLOCK_X_NUM - 1)->items[0], UT_X_NUM - 1);
+ }
+
+ if (fg_block) {}
+}
+
+void mSDI_PullTreeUnderPlayerBlock(void) {
+ /**
+ * Cleared tree diagram
+ *
+ * -------xx-------
+ * -------xx-------
+ * ----------------
+ * ...
+ **/
+
+ u16* items = &common_data.fg[2][2].items[0][0];
+
+ mSDI_PullTreeUT(&items[7]);
+ mSDI_PullTreeUT(&items[8]);
+ mSDI_PullTreeUT(&items[16 + 7]);
+ mSDI_PullTreeUT(&items[16 + 8]);
+}
+
+s32 mSDI_StartInitNew(Game* game2, s32 player_no, s32 malloc_flag) {
+ Game_Play* game_play = (Game_Play*)game2;
+ Private_c* priv;
+ Private_c* priv_p;
+ Game* game = NULL;
+ s32 i;
+ UNUSED s32 pad[2];
+
+ common_data.scene_from_title_demo = SCENE_START_DEMO;
+ lbRTC_GetTime(&common_data.time.rtc_time);
+
+ priv = &common_data.private[player_no];
+ common_data.now_private = priv;
+ common_data.player_no = player_no;
+
+ common_data.now_private->gender = mPr_SEX_MALE;
+
+ decide_fruit(&common_data.fruit);
+ if (malloc_flag == 0) {
+ game = game2;
+ }
+
+ bzero(&common_data.deposit, sizeof(common_data.deposit));
+
+ mFM_InitFgCombiSaveData(game);
+ mSDI_PullTree();
+ mSDI_PullTreeUnderPlayerBlock();
+ mFM_SetBlockKindLoadCombi(game);
+ mAGrw_ChangeTree2FruitTree();
+
+ priv_p = &common_data.private[0];
+
+ mMld_SetDefaultMelody();
+ mLd_LandDataInit();
+ mEv_ClearEventSaveInfo(&common_data.event_save_data);
+ mEv_init(&game_play->event);
+ mNpc_InitNpcAllInfo(malloc_flag);
+
+ for (i = 0; i < PLAYER_NUM; i++) {
+ mPr_ClearPrivateInfo(priv_p);
+ priv_p++;
+ }
+
+ priv_p += player_no;
+ priv_p -= PLAYER_NUM;
+ mPr_InitPrivateInfo(priv_p);
+ mNpc_SetRemoveAnimalNo(common_data.animals);
+ title_game_haniwa_data_init();
+ mPB_police_box_init(game);
+ mSN_snowman_init();
+ mHS_house_init();
+
+ lbRTC_TimeCopy(&common_data.unk_0F7FC, &mTM_rtcTime_clear_code);
+ lbRTC_TimeCopy(&common_data.unk_0F89C, &mTM_rtcTime_clear_code);
+ lbRTC_TimeCopy(&common_data.unk_0F8A4, &mTM_rtcTime_clear_code);
+
+ for (i = 0; i < PLAYER_NUM; i++) {
+ common_data.homes[i].unk_022 &= (u16)~0xC0;
+ common_data.homes[i].unk_022 &= 0xCF;
+ common_data.homes[i].unk_022 &= 0xF7;
+ common_data.homes[i].unk_024 = i;
+ }
+
+ common_data.station_type = RANDOM_F(15);
+
+ for (i = 0; i < PLAYER_NUM; i++) {
+ mPr_ClearMotherMailInfo(&common_data.mother_mail[i]);
+ }
+
+ mPr_SetPossessionItem(common_data.now_private, 0, ITM_MONEY_1000, mPr_ITEM_COND_QUEST);
+ mNW_InitMyOriginal();
+ mEv_2nd_init(&game_play->event);
+ famicom_emu_initial_common_data();
+ return TRUE;
+}
+
+s32 mSDI_StartInitFrom(Game* game2, s32 player_no, s32 malloc_flag) {
+ Game_Play* game_play = (Game_Play*)game2;
+ Private_c* priv;
+ Game* game = game2;
+ s32 res = FALSE;
+
+ if (malloc_flag != 0) {
+ game = NULL;
+ }
+
+ common_data.scene_from_title_demo = SCENE_FG;
+ lbRTC_GetTime(&common_data.time.rtc_time);
+
+ if (mFRm_CheckSaveData() == TRUE) {
+ priv = &common_data.private[player_no];
+ if (mPr_CheckPrivate(priv) == TRUE) {
+ if (priv->exists == TRUE) {
+ common_data.now_private = priv;
+ common_data.player_no = player_no;
+ mFM_SetBlockKindLoadCombi(game);
+ mEv_init_force(&game_play->event);
+ mHsRm_GetHuusuiRoom(game, player_no);
+ mSP_ExchangeLineUp_InGame(game);
+ mNpc_SetRemoveAnimalNo(common_data.animals);
+ mCkRh_DecideNowGokiFamilyCount(player_no);
+ mMkRm_MarkRoom(game);
+ res = TRUE;
+ } else {
+ common_data.player_decoy_flag = TRUE;
+ priv->exists = TRUE;
+ common_data.now_private = priv;
+ common_data.player_no = player_no;
+ mFM_SetBlockKindLoadCombi(game);
+ mHsRm_GetHuusuiRoom(game, player_no);
+ mSP_ExchangeLineUp_InGame(game);
+ mNpc_SetRemoveAnimalNo(common_data.animals);
+
+ bzero(priv->inventory.pockets, sizeof(priv->inventory.pockets));
+ priv->inventory.lotto_ticket_expiry_month = 0;
+ priv->inventory.lotto_ticket_mail_storage = 0;
+ priv->inventory.item_conditions = 0;
+ priv->inventory.wallet = 0;
+ mQst_ClearDelivery(priv->deliveries, mPr_DELIVERY_QUEST_NUM);
+ mQst_ClearErrand(priv->errands, mPr_ERRAND_QUEST_NUM);
+ mCkRh_DecideNowGokiFamilyCount(player_no);
+ mMkRm_MarkRoom(game);
+ res = TRUE;
+ }
+ }
+ }
+ return res;
+}
+
+s32 mSDI_StartInitNewPlayer(Game* game, s32 player_no, s32 malloc_flag) {
+ Game_Play* game_play = (Game_Play*)game;
+ Private_c* priv;
+ s32 res = FALSE;
+ UNUSED s32 pad;
+
+ common_data.scene_from_title_demo = SCENE_START_DEMO2;
+ lbRTC_GetTime(&common_data.time.rtc_time);
+
+ priv = &common_data.private[player_no];
+ if (mFRm_CheckSaveData() == TRUE) {
+ if (mPr_CheckPrivate(priv) != TRUE) {
+ mPr_InitPrivateInfo(priv);
+ common_data.now_private = priv;
+ mPr_SetPossessionItem(common_data.now_private, 0, ITM_MONEY_1000, mPr_ITEM_COND_QUEST);
+ common_data.player_no = player_no;
+ common_data.now_private->gender = mPr_SEX_MALE;
+ if (malloc_flag == 0) {
+ mFM_SetBlockKindLoadCombi(game);
+ mEv_init_force(&game_play->event);
+ mSP_ExchangeLineUp_InGame(game);
+ } else {
+ mFM_SetBlockKindLoadCombi(NULL);
+ mEv_init_force(&game_play->event);
+ mSP_ExchangeLineUp_InGame(NULL);
+ }
+ mNpc_SetRemoveAnimalNo(common_data.animals);
+ mSDI_ClearMoneyPlayerHomeStationBlock();
+ res = TRUE;
+ }
+ }
+ return res;
+}
+
+s32 mSDI_StartInitPak(Game* game2, s32 player_no, s32 malloc_flag) {
+ Game* game = game2;
+ Game_Play* game_play = (Game_Play*)game;
+ UNUSED s32 pad;
+ s32 res = FALSE;
+ s32 sp1C;
+
+ if (malloc_flag == 1) {
+ game = NULL;
+ }
+
+ if (player_no < 5) {
+ common_data.scene_from_title_demo = SCENE_FG;
+ }
+
+ if (mFRm_CheckSaveData() == TRUE) {
+ sp1C = mCPk_get_pkinfo();
+ if ((func_80078E90_jp(sp1C, 0) == TRUE) && (func_800B8D64_jp(player_no, sp1C) == TRUE)) {
+ mFM_SetBlockKindLoadCombi(game);
+ mEv_init_force(&game_play->event);
+ mHsRm_GetHuusuiRoom(game, player_no);
+ mSP_ExchangeLineUp_InGame(game);
+ mNpc_SetRemoveAnimalNo(common_data.animals);
+ mNpc_SetReturnAnimal(mNpc_GetInAnimalP());
+ mNpc_SendRegisteredGoodbyMail();
+ mCkRh_DecideNowGokiFamilyCount(player_no);
+ mMkRm_MarkRoom(game);
+ mEv_SetGateway();
+ res = TRUE;
+ }
+ }
+ return res;
+}
+
+s32 mSDI_StartInitErr(UNUSED Game* game, UNUSED s32 player_no, UNUSED s32 malloc_flag) {
+ return TRUE;
+}
+
+void mSDI_StartInitAfter(Game* game, s32 renewal_reserve_flag, s32 malloc_flag) {
+ Game_Play* game_play = (Game_Play*)game;
+
+ common_data.house_owner_name = -1;
+ common_data.last_field_id = -1;
+
+ mHm_SetNowHome();
+ mNpc_RenewalAnimalMemory();
+ mTM_renewal_renew_time();
+ mEv_ClearEventInfo();
+ mEnv_DecideWeather_NormalGameStart();
+ func_800B7680_jp(game_play);
+ mTM_set_season();
+ func_80084DA4_jp();
+ mEv_2nd_init(&game_play->event);
+ func_800AD9FC_jp();
+ func_80096B64_jp();
+ func_800AB054_jp();
+ func_800AB09C_jp();
+ mNpc_SetNpcList(common_data.npclist, common_data.animals, ANIMAL_NUM_MAX, malloc_flag);
+ mNpc_ClearTalkInfo();
+ if (renewal_reserve_flag == 1) {
+ mFM_RenewalReserve();
+ }
+ mQst_ClearNotSaveQuest(&common_data.quest);
+ mNPS_set_all_schedule_area();
+ mNpcW_InitNpcWalk(&common_data.npc_walk);
+ mHm_CheckRehouseOrder();
+ decide_fish_location(&common_data.fish_location);
+ mTRC_init(game_play);
+ common_data.goki_shocked_flag = FALSE;
+ func_800A6548_jp();
+ func_800B9B2C_jp();
+ func_800A91DC_jp();
+ mPr_SendForeingerAnimalMail(common_data.now_private);
+ mPr_StartSetCompleteTalkInfo();
+ mMsm_SendInformationMail();
+ func_8008DCF8_jp();
+ func_800A4D10_jp();
+ mSN_decide_msg();
+ mPr_RenewalMapInfo(common_data.now_private->maps, mPr_FOREIGN_MAP_COUNT, &common_data.land_info);
+}
+
+typedef s32 (*mSDI_INIT_PROC)(Game*, s32, s32);
+
+s32 mSDI_StartInitBefore(Game* game, s32 player_no, s32 init_mode, s32 malloc_flag) {
+ static mSDI_INIT_PROC init_proc[mSDI_INIT_MODE_NUM] = {
+ mSDI_StartInitNew, mSDI_StartInitNewPlayer, mSDI_StartInitFrom, mSDI_StartInitPak, mSDI_StartInitErr,
+ };
+
+ mEv_UnSetGateway();
+ return init_proc[init_mode](game, player_no, malloc_flag);
+}
+
+s32 mSDI_StartDataInit(Game* game, s32 player_no, s32 init_mode) {
+ static int renew_reserve_mode_table[mSDI_INIT_MODE_NUM] = {
+ TRUE, FALSE, FALSE, FALSE, FALSE,
+ };
+ s32 res;
+
+ if ((init_mode < mSDI_INIT_MODE_NEW) || (init_mode >= mSDI_INIT_MODE_NUM)) {
+ init_mode = mSDI_INIT_MODE_NEW;
+ }
+
+ res = mSDI_StartInitBefore(game, player_no, init_mode, mSDI_MALLOC_FLAG_ZELDA);
+ if (res == TRUE) {
+ mSDI_StartInitAfter(game, renew_reserve_mode_table[init_mode], mSDI_MALLOC_FLAG_ZELDA);
+ }
+
+ return res;
+}
diff --git a/src/code/sys_matrix.c b/src/code/sys_matrix.c
index 1661c13..ab7d1cf 100644
--- a/src/code/sys_matrix.c
+++ b/src/code/sys_matrix.c
@@ -75,8 +75,8 @@ MtxF* Matrix_now; // Top of the stack.
/**
* Create the matrix stack and set the pointer to the top of it.
*/
-void new_Matrix(Game* gameState) {
- Matrix_now = THA_alloc16(&gameState->heap, MATRIX_STACK_SIZE * sizeof(MtxF));
+void new_Matrix(Game* game) {
+ Matrix_now = THA_alloc16(&game->heap, MATRIX_STACK_SIZE * sizeof(MtxF));
Matrix_stack = Matrix_now;
}
diff --git a/src/overlays/actors/ovl_Npc/ac_npc.h b/src/overlays/actors/ovl_Npc/ac_npc.h
index 3d5cadd..a2f7393 100644
--- a/src/overlays/actors/ovl_Npc/ac_npc.h
+++ b/src/overlays/actors/ovl_Npc/ac_npc.h
@@ -12,7 +12,9 @@ typedef void (*NpcActionFunc)(struct Npc*, struct Game_Play*);
typedef struct Npc {
/* 0x000 */ Actor actor;
- /* 0x174 */ UNK_TYPE1 unk_174[0x7C8];
+ /* 0x174 */ UNK_TYPE1 unk_174[0x594];
+ /* 0x708 */ s32 unk_708;
+ /* 0x70C */ UNK_TYPE1 unk_70C[0x230];
} Npc; // size = 0x93C
#endif
diff --git a/src/overlays/gamestates/ovl_play/m_play.c b/src/overlays/gamestates/ovl_play/m_play.c
index 7aa524b..3bf2aa1 100644
--- a/src/overlays/gamestates/ovl_play/m_play.c
+++ b/src/overlays/gamestates/ovl_play/m_play.c
@@ -26,6 +26,7 @@
#include "6E0F50.h"
#include "6D2720.h"
#include "m_lights.h"
+#include "m_private.h"
#include "m_skin_matrix.h"
#include "gfxalloc.h"
#include "version.h"
@@ -38,7 +39,7 @@
#include "6A7D20.h"
#include "m_scene_table.h"
-void play_main(Game* gameState);
+void play_main(Game* game);
void Gameplay_Scene_Read(Game_Play* game_play, s16 arg1);
void Game_play_fbdemo_wipe_create(Game_Play* game_play);
void Game_play_fbdemo_wipe_init(Game_Play* game_play);
@@ -98,12 +99,12 @@ static u16 S_back_title_timer;
static u16 S_se_endcheck_timeout;
void Game_play_Reset_destiny(void) {
- CommonData10138_Sub* temp = &common_data.unk_10138->unk_A86;
- u8* one = &common_data.unk_1011F;
- u8* two = &common_data.unk_10121;
+ Private_Sub_A86* temp = &common_data.now_private->unk_A86;
+ u8* day = &common_data.time.rtc_time.day;
+ u8* month = &common_data.time.rtc_time.month;
if ((temp->unk_08 != 0) &&
- ((common_data.unk_10122 != temp->unk_06) || (*two != temp->unk_05) || (*one != temp->unk_03))) {
+ ((common_data.time.rtc_time.year != temp->unk_06) || (*month != temp->unk_05) || (*day != temp->unk_03))) {
temp->unk_08 = 0;
}
}
@@ -333,8 +334,8 @@ void Game_play_fbdemo_proc(Game_Play* game_play) {
}
}
-void play_cleanup(Game* gameState) {
- Game_Play* game_play = (Game_Play*)gameState;
+void play_cleanup(Game* game) {
+ Game_Play* game_play = (Game_Play*)game;
func_800A3304_jp(game_play);
game_play->state.gfxCtx->unk_2F4 = 0;
@@ -353,19 +354,19 @@ void play_cleanup(Game* gameState) {
}
Actor_info_dt(&game_play->actorInfo, game_play);
- mEv_finish(&game_play->unk_1EBC);
+ mEv_finish(&game_play->event);
func_800AA124_jp();
mSM_submenu_dt(&game_play->unk_1CBC);
game_play->unk_1DAC = -1;
mSM_submenu_ovlptr_cleanup(&game_play->unk_1CBC);
mPlib_Object_Exchange_keep_Player_dt(game_play);
- mHsRm_GetHuusuiRoom(0, common_data.unk_10003);
+ mHsRm_GetHuusuiRoom(0, common_data.player_no);
func_80087280_jp();
zelda_CleanupArena();
}
-void play_init(Game* gameState) {
- Game_Play* game_play = (Game_Play*)gameState;
+void play_init(Game* game) {
+ Game_Play* game_play = (Game_Play*)game;
GraphicsContext* gfxCtx = game_play->state.gfxCtx;
u32 temp_v1;
u32 temp_v0_2;
@@ -384,7 +385,7 @@ void play_init(Game* gameState) {
func_800B594C_jp();
func_800C49D4_jp(game_play);
func_8007CFD8_jp(game_play);
- func_8007F858_jp(&game_play->unk_1EBC);
+ mEv_init(&game_play->event);
initView(&game_play->unk_1938, gfxCtx);
func_80064F48_jp(game_play);
func_80077620_jp(game_play, &game_play->unk_2138);
@@ -430,7 +431,7 @@ void play_init(Game* gameState) {
Actor_info_ct(game_play, &game_play->actorInfo, game_play->unk_1EA8);
game_play->unk_2208 = (void*)none_proc1;
mMsg_ct(game_play);
- mEv_2nd_init(&game_play->unk_1EBC);
+ mEv_2nd_init(&game_play->event);
mTD_player_keydata_init(game_play);
Balloon_init(game_play);
func_800A65C4_jp();
@@ -449,7 +450,7 @@ void Game_play_move_fbdemo_not_move(Game_Play* game_play) {
game_play->state.unk_9C = 2;
mDemo_Main(game_play);
game_play->state.unk_9C = 3;
- mEv_run(&game_play->unk_1EBC);
+ mEv_run(&game_play->event);
}
game_play->state.unk_9C = 4;
mDemo_stock_clear();
@@ -776,8 +777,8 @@ label:;
}
}
-void play_main(Game* gameState) {
- Game_Play* game_play = (Game_Play*)gameState;
+void play_main(Game* game) {
+ Game_Play* game_play = (Game_Play*)game;
game_play->state.unk_9D = 0x6E;
game_play->state.unk_9C = 0;
diff --git a/src/overlays/gamestates/ovl_play/m_play.h b/src/overlays/gamestates/ovl_play/m_play.h
index 46b12cd..315f744 100644
--- a/src/overlays/gamestates/ovl_play/m_play.h
+++ b/src/overlays/gamestates/ovl_play/m_play.h
@@ -97,7 +97,7 @@ typedef struct Game_Play {
/* 0x1EB0 */ s16 *unk_1EB0;
/* 0x1EB4 */ UNK_TYPE1 unk_1EB4[0x4];
/* 0x1EB8 */ s32 unk_1EB8;
- /* 0x1EBC */ Game_Play1EBC unk_1EBC;
+ /* 0x1EBC */ Event event;
/* 0x1ECC */ UNK_TYPE1 unk_1ECC[0x14];
/* 0x1EE0 */ u8 unk_1EE0;
/* 0x1EE1 */ u8 unk_1EE1;
@@ -113,7 +113,7 @@ typedef struct Game_Play {
/* 0x2214 */ UNK_TYPE1 unk_2214[0x1FC];
} Game_Play; // size = 0x2410
-void play_init(Game* gameState);
-void play_cleanup(Game* gameState);
+void play_init(Game* game);
+void play_cleanup(Game* game);
#endif
diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml
index 0e77ff3..708c867 100644
--- a/yamls/jp/code.yaml
+++ b/yamls/jp/code.yaml
@@ -29,16 +29,18 @@
- [0x6A0DE0, asm, code/6A0DE0]
- [0x6A5B00, asm, code/6A5B00]
- [0x6A6C40, asm, code/6A6C40]
- - [0x6A6E80, asm, code/6A6E80]
- - [0x6A7D20, asm, code/6A7D20]
- - [0x6A8180, asm, code/6A8180]
- - [0x6A83A0, asm, code/6A83A0]
+ - [0x6A6E80, asm, code/m_fbdemo]
+ - [0x6A78A0, asm, code/m_fbdemo_triforce]
+ - [0x6A7D20, asm, code/m_fbdemo_wipe1]
+ - [0x6A8180, asm, code/m_fbdemo_fade]
+ - [0x6A83A0, asm, code/m_field_assessment]
- [0x6A8B70, asm, code/m_field_make]
- [0x6AB8D0, asm, code/m_field_info]
- [0x6B3DC0, asm, code/6B3DC0]
- [0x6B6560, asm, code/m_handbill]
- - [0x6B81C0, asm, code/6B81C0]
- - [0x6B8A70, asm, code/6B8A70]
+ - [0x6B81C0, asm, code/m_home]
+ - [0x6B8880, asm, code/m_house]
+ - [0x6B8A70, asm, code/m_land]
- [0x6B8F20, asm, code/6B8F20]
- [0x6BA3B0, asm, code/m_item_name]
- [0x6BA500, asm, code/6BA500]
@@ -66,7 +68,7 @@
- [0x6E0F50, asm, code/6E0F50]
- [0x6E2300, asm, code/6E2300]
- [0x6E30B0, asm, code/6E30B0]
- - [0x6E6C90, asm, code/m_start_data_init]
+ - [0x6E6C90, c, code/m_start_data_init]
- [0x6E7AD0, asm, code/6E7AD0]
- [0x6E80C0, asm, code/6E80C0]
- [0x6E9650, asm, code/6E9650]
@@ -74,7 +76,7 @@
- [0x6EC430, asm, code/m_snowman]
- [0x6EC9E0, asm, code/6EC9E0]
- [0x6ECD90, asm, code/6ECD90]
- - [0x6EDD10, asm, code/6EDD10]
+ - [0x6EDD10, asm, code/m_time]
- [0x6EE540, asm, code/m_view]
- [0x6EFC20, asm, code/6EFC20]
- [0x6F12E0, asm, code/6F12E0]
@@ -140,8 +142,12 @@
- [0x72ACB0, data, code/72ACB0]
- [0x72B7A0, data, code/m_lib]
- [0x72B7D0, data, code/72B7D0]
+ - [0x731940, .data, code/m_start_data_init]
+ - [0x731980, data, code/731980]
- [0x731A70, .data, code/m_object] # made-up name
- [0x732740, data, code/732740]
+ - [0x732AF0, data, code/m_time]
+ - [0x732BA0, data, code/m_view]
- [0x732C30, .data, code/game]
- [0x732C40, data, code/732C40]
- [0x732C50, .data, code/irqmgr]
@@ -202,7 +208,7 @@
- [0x73B710, rodata, code/73B710]
- [0x73B720, rodata, code/m_titledemo]
- [0x73B740, rodata, code/73B740]
- - [0x73B780, rodata, code/73B780]
+ - [0x73B780, rodata, code/m_time]
- [0x73B7D0, rodata, code/73B7D0]
- [0x73B7E0, rodata, code/73B7E0]
- [0x73B830, rodata, code/73B830]