summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2024-10-13 17:36:51 +0200
committerGitHub <noreply@github.com>2024-10-13 08:36:51 -0700
commit78d0c294c50f9ade86f9e60cb2bea6479b56357a (patch)
tree0c55c9b75fa942d7c05fcf4d2acd5e0bc62447dd
parent60cc4c9e2368f4ae47c24931b6530dabdc5e35dd (diff)
m_bgm OK (#222)
* m_demo OK * camera fix * m_bgm OK
-rw-r--r--include/67E840.h188
-rw-r--r--include/6E3240.h3
-rw-r--r--include/m_bgm.h406
-rw-r--r--include/m_common_data.h3
-rw-r--r--include/m_event.h2
-rw-r--r--include/m_field_info.h4
-rw-r--r--include/m_melody.h2
-rw-r--r--linker_scripts/jp/symbol_addrs_code.txt338
-rw-r--r--src/code/game.c4
-rw-r--r--src/code/m_bgm.c2075
-rw-r--r--src/code/m_demo.c2
-rw-r--r--src/code/m_field_info.c4
-rw-r--r--src/overlays/actors/player_actor/m_player.c2
-rw-r--r--src/overlays/gamestates/ovl_first_game/first_game.c2
-rw-r--r--src/overlays/gamestates/ovl_play/m_play.c2
-rw-r--r--src/overlays/gamestates/ovl_trademark/m_trademark.c2
-rw-r--r--yamls/jp/code.yaml10
17 files changed, 2674 insertions, 375 deletions
diff --git a/include/67E840.h b/include/67E840.h
deleted file mode 100644
index 7c38846..0000000
--- a/include/67E840.h
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef C_67E840_H
-#define C_67E840_H
-
-#include "ultra64.h"
-
-struct Game_Play;
-struct Game;
-
-// void func_8005ABA0_jp();
-// void func_8005ABE0_jp();
-// void func_8005ACA8_jp();
-// void func_8005ACC0_jp();
-// void func_8005ACEC_jp();
-// void func_8005AD08_jp();
-// void func_8005AD5C_jp();
-// void func_8005ADA8_jp();
-// void func_8005AE1C_jp();
-// void func_8005AE40_jp();
-// void func_8005AE78_jp();
-// void func_8005AF38_jp();
-// void func_8005AF7C_jp();
-// void func_8005AFD0_jp();
-// void func_8005AFE4_jp();
-// void func_8005AFF8_jp();
-// void func_8005B028_jp();
-// void func_8005B128_jp();
-// void func_8005B204_jp();
-// void func_8005B2F4_jp();
-// void func_8005B338_jp();
-// void func_8005B464_jp();
-// void func_8005B4D4_jp();
-// void func_8005B4E8_jp();
-// void func_8005B4FC_jp();
-// void func_8005B52C_jp();
-// void func_8005B5BC_jp();
-// void func_8005B5FC_jp();
-// void func_8005B610_jp();
-// void func_8005B620_jp();
-// void func_8005B668_jp();
-// void func_8005B6D4_jp();
-// void func_8005B6F8_jp();
-// void func_8005B730_jp();
-// void func_8005B758_jp();
-// void func_8005B810_jp();
-// void func_8005B8D4_jp();
-// void func_8005B90C_jp();
-// void func_8005B92C_jp();
-// void func_8005BA0C_jp();
-// void func_8005BB38_jp();
-// void func_8005BB90_jp();
-// void func_8005BC08_jp();
-// void func_8005BD24_jp();
-// void func_8005BDAC_jp();
-// void func_8005BE34_jp();
-// void func_8005BEBC_jp();
-// void func_8005BF40_jp();
-// void func_8005C07C_jp();
-// void func_8005C1B8_jp();
-// void func_8005C228_jp();
-// void func_8005C298_jp();
-// void func_8005C2E4_jp();
-// void func_8005C3E4_jp();
-// void func_8005C444_jp();
-// void func_8005C4F0_jp();
-// void func_8005C550_jp();
-// void func_8005C6E4_jp();
-// void func_8005C778_jp();
-// void func_8005C7B8_jp();
-// void func_8005C828_jp();
-// void func_8005C83C_jp();
-// void func_8005C888_jp();
-// void func_8005C8D4_jp();
-// void func_8005C918_jp();
-// void func_8005C9BC_jp();
-// void func_8005C9D0_jp();
-// void func_8005C9E4_jp();
-// void func_8005CA14_jp();
-// void func_8005CA44_jp();
-// void func_8005CC0C_jp();
-// void func_8005CC90_jp();
-// void func_8005CD70_jp();
-// void func_8005CE34_jp();
-// void func_8005CEC0_jp();
-// void func_8005CF04_jp();
-// void func_8005CF4C_jp();
-// void func_8005D000_jp();
-// void func_8005D084_jp();
-// void func_8005D13C_jp();
-// void func_8005D19C_jp();
-// void func_8005D1B8_jp();
-// void func_8005D1F4_jp();
-// void func_8005D2A4_jp();
-// void func_8005D338_jp();
-// void func_8005D3C0_jp();
-// void func_8005D4B0_jp();
-// void func_8005D758_jp();
-// void func_8005D7A0_jp();
-// void func_8005D810_jp();
-// void func_8005D84C_jp();
-// void func_8005D8E0_jp();
-// void func_8005D91C_jp();
-// void func_8005D958_jp();
-// void func_8005D9AC_jp();
-// void func_8005DA00_jp();
-// void func_8005DAF0_jp();
-// void func_8005DBA4_jp();
-// void func_8005DC40_jp();
-// void func_8005DC9C_jp();
-// void func_8005DCCC_jp();
-void mBGMPsComp_make_ps_lost_fanfare(s32 arg0, s32 arg1);
-// void func_8005DD5C_jp();
-void mBGMPsComp_make_ps_wipe(s32 arg0);
-// void func_8005DE0C_jp();
-// void func_8005DE60_jp();
-// void func_8005DE88_jp();
-// void func_8005DEE0_jp();
-// void func_8005DF14_jp();
-// void func_8005DF70_jp();
-// void func_8005DFA0_jp();
-// void func_8005DFFC_jp();
-// void func_8005E02C_jp();
-// void func_8005E080_jp();
-// void func_8005E0DC_jp();
-// void func_8005E10C_jp();
-// void func_8005E15C_jp();
-// void func_8005E1B0_jp();
-// void func_8005E1D8_jp();
-// void func_8005E22C_jp();
-// void func_8005E254_jp();
-// void func_8005E2B4_jp();
-// void func_8005E2EC_jp();
-// void func_8005E390_jp();
-// void func_8005E3EC_jp();
-// void func_8005E458_jp();
-// void func_8005E494_jp();
-// void func_8005E4C4_jp();
-// void func_8005E4F8_jp();
-// void func_8005E530_jp();
-// void func_8005E550_jp();
-// void func_8005E58C_jp();
-// void func_8005E5BC_jp();
-// void func_8005E5F8_jp();
-// void func_8005E628_jp();
-// void func_8005E660_jp();
-// void func_8005E69C_jp();
-// void func_8005E6CC_jp();
-// void func_8005E700_jp();
-// void func_8005E738_jp();
-// void func_8005E758_jp();
-// void func_8005E794_jp();
-// void func_8005E7C4_jp();
-// void func_8005E800_jp();
-// void func_8005E83C_jp();
-// void func_8005E8F4_jp();
-// void func_8005E9B4_jp();
-// void func_8005E9C8_jp();
-void mBGMPsComp_volume_talk_start(void);
-void mBGMPsComp_volume_talk_end(void);
-// void func_8005EA14_jp();
-// void func_8005EA24_jp();
-// void func_8005EA38_jp();
-// void func_8005EA4C_jp();
-void mBGMPsComp_scene_mode(s32 arg0);
-// void func_8005EAC8_jp();
-// void func_8005EAE4_jp();
-// void func_8005EAFC_jp();
-// void func_8005EB74_jp();
-// void func_8005EBD8_jp();
-// void func_8005EBE8_jp();
-// void func_8005ECC4_jp();
-// void func_8005ECF8_jp();
-// void func_8005ED24_jp();
-// void func_8005ED44_jp();
-// void func_8005ED78_jp();
-// void func_8005ED98_jp();
-// void func_8005EDC4_jp();
-void mBGMForce_inform_end(void);
-// void func_8005EDEC_jp();
-void mBGMForce_room_nonstop_start(void);
-// void func_8005EE20_jp();
-// void func_8005EEA0_jp();
-void mBGM_main(struct Game* game);
-void mBGM_ct(void);
-void func_8005F020_jp(void);
-void mBGM_cleanup(void);
-// void func_8005F250_jp();
-
-#endif
diff --git a/include/6E3240.h b/include/6E3240.h
index 663ee20..0c52ff4 100644
--- a/include/6E3240.h
+++ b/include/6E3240.h
@@ -2,6 +2,7 @@
#define C_6E3240_H
#include "ultra64.h"
+#include "lb_rtc.h"
struct Game;
struct Game_Play;
@@ -61,7 +62,7 @@ void mSP_ExchangeLineUp_InGame(struct Game* game);
// void func_800C2070_jp();
// void func_800C22F8_jp();
// void func_800C2354_jp();
-// void func_800C2380_jp();
+lbRTC_hour_t mSP_GetShopCloseTime_Bgm(void);
// void func_800C23EC_jp();
// void func_800C2480_jp();
// void func_800C2578_jp();
diff --git a/include/m_bgm.h b/include/m_bgm.h
new file mode 100644
index 0000000..0610d23
--- /dev/null
+++ b/include/m_bgm.h
@@ -0,0 +1,406 @@
+#ifndef C_67E840_H
+#define C_67E840_H
+
+#include "ultra64.h"
+#include "m_lib.h"
+
+struct Game_Play;
+struct Game;
+
+#define BGM_CHECK_BGM_DATA(num) \
+ (num == 40 || num == 73 || num == 68 || num == 74 || num == 76 || num == 75 || num == 49 || num == 50 || \
+ num == 71 || num == 64 || num == 66 || num == 78)
+
+#define BGM_MONTH_TIME_TO_BGM_MONTH_TIME(month) (((month) << 22) & 0x03C00000)
+#define BGM_DAY_TIME_TO_BGM_DAY_TIME(day) (((day) << 17) & 0x3E0000)
+#define BGM_HOUR_TIME_TO_BGM_HOUR_TIME(hour) (((hour) << 12) & 0x1F000)
+#define BGM_MIN_TIME_TO_BGM_MIN_TIME(min) (((min) << 6) & 0xFC0)
+#define BGM_SEC_TIME_TO_BGM_SEC_TIME(sec) (((sec) << 0) & 0x3F)
+
+#define BGM_RTC_TIME_TO_BGM_TIME(month, day, hour, min, sec) \
+ (BGM_MONTH_TIME_TO_BGM_MONTH_TIME(month) | BGM_DAY_TIME_TO_BGM_DAY_TIME(day) | \
+ BGM_HOUR_TIME_TO_BGM_HOUR_TIME(hour) | BGM_MIN_TIME_TO_BGM_MIN_TIME(min) | \
+ BGM_SEC_TIME_TO_BGM_SEC_TIME(sec))
+
+#define BGM_TIME_TO_SHOP_CLOSE_TIME(hour, min, sec) \
+ (BGM_HOUR_TIME_TO_BGM_HOUR_TIME(hour) | BGM_MIN_TIME_TO_BGM_MIN_TIME(min) | \
+ BGM_SEC_TIME_TO_BGM_SEC_TIME(sec))
+
+#define BGM_CLOCK_CHECK_SEC (((1 << 6) - 1) << 0)
+#define BGM_CLOCK_CHECK_MIN (((1 << 6) - 1) << 6)
+#define BGM_CLOCK_CHECK_HOUR (((1 << 5) - 1) << 12)
+#define BGM_CLOCK_CHECK_DAY (((1 << 5) - 1) << 17)
+#define BGM_CLOCK_CHECK_MONTH (((1 << 4) - 1) << 22)
+
+#define BGM_CLOCK_CHECK_ALL (BGM_CLOCK_CHECK_MONTH | BGM_CLOCK_CHECK_DAY | BGM_CLOCK_CHECK_HOUR | BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC)
+
+#define BGM_PS_MAX 12
+
+typedef struct BgmElement {
+ /* 0x00 */ u8 num;
+ /* 0x01 */ u8 unk1;
+ /* 0x02 */ u16 unk2;
+ /* 0x04 */ u16 stopType0;
+ /* 0x06 */ u16 stopType1;
+} BgmElement; // size = 0x8
+
+typedef struct BgmClock {
+ /* 0x00 */ u32 now;
+ /* 0x04 */ u32 prior;
+} BgmClock; // size = 0x8
+
+typedef struct BgmDemo {
+ /* 0x00 */ BgmElement element;
+ /* 0x08 */ u8 makeFlag;
+ /* 0x09 */ u8 deleteFlag;
+ /* 0x0A */ UNK_TYPE1 unkA[2];
+} BgmDemo; // size = 0xC
+
+typedef struct BgmRoom {
+ /* 0x00 */ BgmElement element;
+ /* 0x08 */ u8 makeFlag;
+ /* 0x09 */ u8 deleteFlag;
+ /* 0x0A */ u8 shopFadeoutFlag;
+ /* 0x0B */ UNK_TYPE1 unkB;
+ /* 0x0C */ u32 shopCloseTime0;
+ /* 0x10 */ u32 shopCloseTime1;
+} BgmRoom; // size 0x14
+
+typedef struct BgmTime BgmTime;
+
+typedef void (*BgmTimeMoveFunc)(BgmTime*, struct Game_Play*);
+
+struct BgmTime {
+ /* 0x4 */ BgmTimeMoveFunc moveFunc;
+ /* 0x5 */ u8 newYearEventFlag;
+ /* 0x6 */ UNK_TYPE1 unk6;
+}; // size = 0x8
+
+typedef struct BgmFieldSudden {
+ /* 0x0 */ u32 flag;
+ /* 0x4 */ u32 priorFlag;
+} BgmFieldSuddenEvent; // size = 0x8
+
+typedef enum BgmBlAttribute {
+ /* 0 */ BGM_BL_ATTRIBUTE_INACTIVE,
+ /* 1 */ BGM_BL_ATTRIBUTE_NEARBY,
+ /* 2 */ BGM_BL_ATTRIBUTE_ACTIVE,
+ /* 3 */ BGM_BL_ATTRIBUTE_MAX
+} BgmBlAttribute;
+
+typedef enum BgmEventArea {
+ /* 0 */ BGM_EVENT_AREA_EVERYWHERE,
+ /* 1 */ BGM_EVENT_AREA_BLOCK,
+ /* 2 */ BGM_EVENT_AREA_MAX,
+} BgmEventArea;
+
+typedef struct BgmFieldScheduleInfo {
+ /* 0x0 */ u32 flag;
+ /* 0x4 */ s32 attribute;
+ /* 0x8 */ s32 priorAttribute;
+} BgmFieldScheduleInfo; // size = 0xC
+
+typedef struct BgmFieldScheduleEvent {
+ /* 0x00 */ BgmFieldScheduleInfo info[21];
+} BgmFieldScheduleEvent; // size = 0xFC
+
+typedef struct BgmNorm {
+ /* 0x00 */ BgmElement element;
+ /* 0x08 */ u8 makeFlag;
+ /* 0x09 */ u8 deleteFlag;
+ /* 0x0A */ UNK_TYPE1 unkA[2];
+} BgmFieldNorm; // size = 0xC
+
+typedef struct BgmPS {
+ /* 0x00 */ BgmElement element;
+ /* 0x04 */ s32 category;
+ /* 0x08 */ s16 counter;
+ /* 0x0A */ u16 cfFlags;
+ /* 0x0C */ u8 priority;
+ /* 0x0D */ UNK_TYPE1 unkD;
+} BgmPS; // size = 0x10
+
+typedef struct BgmPSStop {
+ /* 0x0 */ u8 requestFlag;
+ /* 0x2 */ u16 type;
+ /* 0x4 */ UNK_TYPE1 unk4;
+} BgmPSStop; // size = 0x6
+
+typedef struct BgmPSStart {
+ /* 0x0 */ u8 requestFlag;
+ /* 0x1 */ u8 num;
+ /* 0x2 */ u8 flags;
+ /* 0x3 */ u8 unk;
+} BgmPSStart; // size = 0x4
+
+typedef struct BgmPSVolume {
+ /* 0x00 */ f32 mainVolume;
+ /* 0x04 */ u16 mainVolumeMoveCounter;
+ /* 0x06 */ u8 mainRequestFlag;
+ /* 0x08 */ f32 psVolume;
+ /* 0x0C */ u16 psVolumeMoveCounter;
+ /* 0x0E */ u8 psRequestFlag;
+ /* 0x10 */ f32 fishingInsectVolume;
+ /* 0x14 */ u16 fishingInsectVolumeMoveCounter;
+ /* 0x16 */ u8 fishingInsectRequestFlag;
+ /* 0x18 */ f32 talkVolume;
+ /* 0x1C */ u8 talkRequestFlag;
+ /* 0x20 */ f32 pauseVolume;
+ /* 0x24 */ u16 pauseVolumeMoveCounter;
+ /* 0x26 */ u8 pauseRequestFlag;
+} BgmPSVolume; // size = 0x28
+
+typedef struct BgmPSPause {
+ /* 0x0 */ u8 requestFlag;
+ /* 0x1 */ u8 mode;
+ /* 0x2 */ UNK_TYPE1 unk2[2];
+} BgmPSPause; // size = 0x4
+
+typedef struct BgmPSMd {
+ /* 0x00 */ u8 requestFlag;
+ /* 0x01 */ u8 makeFlag;
+ /* 0x02 */ u8 deleteFlag;
+ /* 0x03 */ u8 moveFlag;
+ /* 0x04 */ xyz_t pos;
+ /* 0x10 */ u16 angle;
+ /* 0x12 */ u16 mdType;
+ /* 0x14 */ u32 ongenNum;
+} BgmPSMd; // size = 0x18
+
+typedef struct BgmPSArm {
+ /* 0x0 */ u8 requestFlag;
+ /* 0x1 */ u8 armState;
+ /* 0x2 */ UNK_TYPE1 unk2[2];
+} BgmPSArm; // size = 0x4
+
+typedef struct BgmPSComp {
+ /* 0x000 */ BgmPS ps[BGM_PS_MAX];
+ /* 0x0F0 */ s32 psNum;
+ /* 0x0F4 */ s32 fishInsectState;
+ /* 0x0F8 */ s32 talkState;
+ /* 0x0FC */ s32 pauseState;
+ /* 0x100 */ BgmPSStop stop;
+ /* 0x106 */ BgmPSStart start;
+ /* 0x10C */ BgmPSVolume volume;
+ /* 0x134 */ BgmPSPause pause;
+ /* 0x138 */ BgmPSMd md;
+ /* 0x150 */ BgmPSArm arm;
+} BgmPSComp; // size = 0x154
+
+typedef struct BgmForce {
+ /* 0x0 */ s32 inform;
+ /* 0x4 */ u8 flag;
+ /* 0x8 */ s32 roomNonstop;
+} BgmForce; // size = 0xC
+
+typedef struct Bgm {
+ /* 0x000 */ BgmClock clock;
+ /* 0x008 */ BgmDemo demo;
+ /* 0x014 */ BgmRoom room;
+ /* 0x028 */ BgmTime time;
+ /* 0x030 */ BgmFieldSuddenEvent fieldSuddenEvent;
+ /* 0x038 */ BgmFieldScheduleEvent fieldScheduleEvent;
+ /* 0x134 */ BgmFieldNorm fieldNorm;
+ /* 0x140 */ BgmPSComp psComp;
+ /* 0x294 */ BgmForce force;
+} Bgm; // size = 0x2A0
+
+typedef struct BgmEventData {
+ /* 0x0 */ s16 eventType;
+ /* 0x2 */ u8 num;
+ /* 0x3 */ u8 eventArea;
+ /* 0x4 */ u32 blockType;
+} BgmEventData; // size = 0x8
+
+int mBGM_check_MD(u8 num);
+int mBGM_check_ignore_talk_volume(u8 num);
+int func_8005ACA8_jp(u8 num);
+void mBGMElem_default_set(BgmElement* element);
+int mBGMClock_after_time_check(BgmClock* clock, u32 checktTime, u32 checkMask);
+int mBGMClock_over_time_check(BgmClock* clock, u32 checktTime, u32 checkMask);
+int mBGMClock_range_time_check(BgmClock* clock, u32 checktTime0, u32 checktTime1, u32 checkMask);
+void mBGMClock_now_set(BgmClock* clock);
+void mBGMClock_move(BgmClock* clock, struct Game_Play* play);
+void mBGMClock_ct(BgmClock* clock);
+void mBGMDemo_make_scene_bgm(BgmDemo* demo);
+void mBGMDemo_delete_scene_bgm(BgmDemo* demo);
+void mBGMDemo_move(BgmDemo* demo, struct Game_Play* play);
+void mBGMDemo_scene_bgm_make_req(void);
+void mBGMDemo_scene_bgm_delete_req(void);
+void mBGMDemo_ct(BgmDemo* demo);
+void mBGMRoom_shop_close_time_set(BgmRoom* room);
+u8 mBGMRoom_make_scene_bgm_shop_get(BgmRoom* room, u16 fieldId);
+void mBGMRoom_make_scene_bgm(BgmRoom* room);
+void mBGMRoom_delete_scene_bgm(BgmRoom* room);
+s32 mBGMRoom_shop_close_check(BgmRoom* room);
+void mBGMRoom_move(BgmRoom* room, struct Game_Play* play);
+void mBGMRoom_scene_bgm_make_req(void);
+void mBGMRoom_scene_bgm_delete_req(void);
+void mBGMRoom_ct(BgmRoom* room);
+void mBGMTime_signal_melody(BgmTime* time);
+int mBGMTime_silent_check(BgmTime* time);
+void mBGMTime_new_year_ev_flag_set(void);
+void mBGMTime_new_year_ev_flag_clr(void);
+void mBGMTime_move_wait(BgmTime* time, struct Game_Play* play);
+void mBGMTime_move_change(BgmTime* time, struct Game_Play* play);
+void mBGMTime_move(BgmTime* time, struct Game_Play* play);
+void mBGMTime_ct(BgmTime* time);
+s32 mBGMFieldSuddenEv_flag_check_arbeit(BgmFieldSuddenEvent* fieldSuddenEvent, struct Game_Play* play);
+void mBGMFieldSuddenEv_flag_set(BgmFieldSuddenEvent* fieldSudden, struct Game_Play* play);
+void mBGMFieldSuddenEv_ps_compose(BgmFieldSuddenEvent* fieldSudden, struct Game_Play* play);
+void mBGMFieldSuddenEv_move(BgmFieldSuddenEvent* fieldSudden, struct Game_Play* play);
+void mBGMFieldSuddenEv_ct(BgmFieldSuddenEvent* fieldSudden);
+s32 mBGMFieldSchedEv_bl_attr_get(s32 blockX, s32 blockZ, s32 eventArea, u32 blockType);
+s32 mBGMFieldSchedEv_bl_attr_evdata_get(BgmEventData* data, struct Game_Play* play);
+void mBGMFieldSchedEv_Info_old_copy(BgmFieldScheduleInfo* info);
+void mBGMFieldSchedEv_Info_ev_now_set_standard(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_Silence_0(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_1(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_2(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_3(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_4(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_5(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_6(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_NewYear01(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_ev_now_set_NewYear02(BgmFieldScheduleInfo* info, BgmEventData* data, struct Game_Play* play,
+ s32 eventStartFlag);
+void mBGMFieldSchedEv_Info_attr_now_set(BgmFieldScheduleInfo* info, struct Game_Play* play, BgmEventData* data);
+void mBGMFieldSchedEv_info_set(BgmFieldScheduleEvent* schedule, struct Game_Play* play);
+void mBGMFieldSchedEv_Info_ps_delete(BgmFieldScheduleInfo* info, BgmEventData* data, s32 flag);
+void mBGMFieldSchedEv_Info_ps_make(BgmFieldScheduleInfo* info, BgmEventData* data, s32 priority);
+void mBGMFieldSchedEv_Info_ps_volume_change(BgmFieldScheduleInfo* info, BgmEventData* data);
+void mBGMFieldSchedEv_ps_compose(BgmFieldScheduleEvent* schedule, struct Game_Play* play);
+void mBGMFieldSchedEv_sp_flag(BgmFieldScheduleEvent* schedule);
+void mBGMFieldSchedEv_move(BgmFieldScheduleEvent* schedule, struct Game_Play* play);
+void mBGMFieldSchedEv_ct(BgmFieldScheduleEvent* schedule);
+u8 mBGMFieldNorm_bgm_num_get(s32 hour);
+void mBGMFieldNorm_elem_set(BgmFieldNorm* norm);
+void mBGMFieldNorm_make_bgm(BgmFieldNorm* norm, struct Game_Play* play);
+void mBGMFieldNorm_delete_bgm(BgmFieldNorm* norm);
+void mBGMFieldNorm_move(BgmFieldNorm* norm, struct Game_Play* play);
+void mBGMFieldNorm_make_req(void);
+void mBGMFieldNorm_delete_req(void);
+void mBGMFieldNorm_ct(BgmFieldNorm* norm);
+void mBGMPs_counter_dec(BgmPS* ps);
+void mBGMPsComp_ps_remove(BgmPSComp* psComp, s32 removePos);
+s32 mBGMPsComp_search_insert_pos_kategorie(BgmPSComp* psComp, s32 category, u8 priority);
+s32 mBGMPsComp_search_pos_kategorie_bgm_num(BgmPSComp* psComp, s32 category, u8 num, s32 counterFlag, s32 delPass);
+void mBGMPsComp_shift_behind(BgmPSComp* psComp, s32 shiftIdx);
+void mBGMPsComp_all_ps_bitclr(BgmPSComp* psComp, u8 bits);
+s32 mBGMPsComp_execute_ps_pos_get(BgmPSComp* psComp);
+BgmPS* mBGMPsComp_high_ps_not_delete(BgmPSComp* psComp, s32 maxPos);
+void mBGMPsComp_main_req_stop(BgmPSComp* psComp);
+void mBGMPsComp_main_remove(BgmPSComp* psComp);
+void mBGMPsComp_main_req_start(BgmPSComp* psComp);
+void mBGMPsComp_main_req_pause(BgmPSComp* psComp);
+void mBGMPsComp_main_req_md(BgmPSComp* psComp);
+void mBGMPsComp_main_md_move(BgmPSComp* psComp);
+void mBGMPsComp_main_req_volume_ps(BgmPSComp* psComp);
+void func_8005D2A4_jp(BgmPSComp* psComp);
+void mBGMPsComp_main_req_volume_talk(BgmPSComp* psComp);
+void mBGMPsComp_main_req_volume_pause(BgmPSComp* psComp);
+void mBGMPsComp_main_req_volume(BgmPSComp* psComp);
+void mBGMPsComp_MDPlayerPos_main_inform_sound(BgmPSMd* md);
+void mBGMPsComp_Arm_main_inform_sound(BgmPSArm* arm);
+void mBGMPsComp_Stop_main_inform_sound(BgmPSStop* stop);
+void mBGMPsComp_Start_main_inform_sound(BgmPSStart* start);
+void mBGMPsComp_Volume_main_inform_sound(BgmPSVolume* volume);
+void mBGMPsComp_Pause_main_inform_sound(BgmPSPause* pause);
+void mBGMPsComp_main_inform_sound(BgmPSComp* psComp);
+void mBGMPsComp_main_counter_dec(BgmPSComp* psComp);
+void mBGMPsComp_main_fo_check(BgmPSComp* psComp);
+void mBGMPsComp_main_lost(BgmPSComp* psComp);
+s32 mBGMPsComp_make_ps(BgmPSComp* psComp, BgmElement* element, s32 category, s16 counter, u16 cfFlags, u8 priority);
+void _mBGMPsComp_make_ps_fanfare(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_fanfare(u8 num, u16 stopType);
+void _mBGMPsComp_make_ps_lost_fanfare(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_lost_fanfare(u8 num, u16 stopType);
+void _mBGMPsComp_make_ps_wipe(u16 stopType);
+void mBGMPsComp_make_ps_wipe(u16 stopType);
+void _mBGMPsComp_make_ps_quiet(u16 stopType);
+void mBGMPsComp_make_ps_quiet(u16 stopType);
+void _mBGMPsComp_make_ps_co_quiet(u16 stopType, s16 counter);
+void mBGMPsComp_make_ps_co_quiet(u16 stopType, s16 counter);
+void _mBGMPsComp_make_ps_demo(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_demo(u8 num, u16 stopType);
+void _mBGMPsComp_make_ps_happening(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_happening(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_quietRoom(u16 stopType);
+void _mBGMPsComp_make_ps_room(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_room(u8 num, u16 stopType);
+void mBGMPsComp_make_ps_time(void);
+void _mBGMPsComp_make_ps_quietField(u16 stopType);
+void mBGMPsComp_make_ps_quietField(u16 stopType);
+void _mBGMPsComp_make_ps_fc_quietField(u16 stopType);
+void mBGMPsComp_make_ps_fc_quietField(u16 stopType);
+void _mBGMPsComp_make_ps_fieldSuddenEv(u8 num, u16 stopType, u8 priority);
+void mBGMPsComp_make_ps_fieldSuddenEv(u8 num, u16 stopType, u8 priority);
+void mBGMPsComp_make_ps_fieldSchedEv(u8 num, s32 updateVolumeMoveCounter, s32 updateVolumeFlag, s32 cfFlag,
+ u16 stopType, u8 priority);
+void mBGMPsComp_make_ps_fieldNorm(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps(BgmPSComp* psComp, s32 category, u8 num, u16 stopType, s32 counterFlag);
+void _mBGMPsComp_delete_ps_fanfare(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_fanfare(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_wipe(void);
+void _mBGMPsComp_delete_ps_quiet(void);
+void mBGMPsComp_delete_ps_quiet(void);
+void _mBGMPsComp_delete_ps_demo(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_demo(u8 num, u16 stopType);
+void _mBGMPsComp_delete_ps_happening(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_happening(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_quietRoom(void);
+void _mBGMPsComp_delete_ps_room(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_room(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_time(void);
+void _mBGMPsComp_delete_ps_quietField(void);
+void mBGMPsComp_delete_ps_quietField(void);
+void _mBGMPsComp_delete_ps_fieldSuddenEv(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_fieldSuddenEv(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_fieldSchedEv(u8 num, u16 stopType);
+void mBGMPsComp_delete_ps_fieldNorm(u8 num, u16 stopType);
+void mBGMPsComp_volume_change_fieldSchedEv(u8 num, s32 updateVolumeCounter, s32 updateVolumeLevel);
+void mBGMPsComp_search_cf_set_field(u8 num, s32 category);
+void func_8005E9B4_jp(void);
+void func_8005E9C8_jp(void);
+void mBGMPsComp_volume_talk_start(void);
+void mBGMPsComp_volume_talk_end(void);
+void mBGMPsComp_pause(s32 state);
+void mBGMPsComp_MDPlayerPos_make(void);
+void mBGMPsComp_MDPlayerPos_delete(void);
+void mBGMPsComp_MDPlayerPos_param_set(xyz_t* pos, u16 angle, u16 mdType, u32 ongenNum);
+void mBGMPsComp_scene_mode(u8 mode);
+void mBGMPsComp_arm_make(s32 state);
+void mBGMPsComp_arm_delete(void);
+s32 mBGMPsComp_execute_bgm_num_get(void);
+void mBGMPsComp_ct(BgmPSComp* psComp);
+s32 mBGMForce_wipe_ps_make_permit(BgmForce* force);
+void mBGMForce_move_inform(BgmForce* force);
+void mBGMForce_move_room_nonstop(BgmForce* force);
+void mBGMForce_move(BgmForce* force);
+void mBGMForce_ct(BgmForce* force);
+void mBGMForce_inform_cleanup(BgmForce* force);
+void mBGMForce_room_nonstop_cleanup(BgmForce* force);
+void mBGMForce_cleanup(BgmForce* force);
+void mBGMForce_inform_start(void);
+void mBGMForce_inform_end(void);
+void _mBGMForce_room_nonstop_start(void);
+void mBGMForce_room_nonstop_start(void);
+void mBGM_main_control(Bgm* bgm);
+void mBGM_weather_set(void);
+void mBGM_main(struct Game* game);
+void mBGM_ct(void);
+void mBGM_init(void);
+void mBGM_cleanup(void);
+void mBGM_reset(void);
+
+
+#endif
diff --git a/include/m_common_data.h b/include/m_common_data.h
index 3201dc2..0c399d4 100644
--- a/include/m_common_data.h
+++ b/include/m_common_data.h
@@ -180,7 +180,8 @@ typedef struct CommonData {
/* 0x10A3B */ UNK_TYPE1 unk_10A3B[0x1];
/* 0x10A3C */ UNK_TYPE1 unk_10A3C[0x2C];
/* 0x10A68 */ u8 unk_10A68;
- /* 0x10A69 */ UNK_TYPE1 unk_10A69[0x3];
+ /* 0x10A69 */ UNK_TYPE1 unk_10A69[0x2];
+ /* 0x10A6B */ u8 unk10A6B;
/* 0x10A6C */ xyz_t unk_10A6C;
/* 0x10A78 */ u8 unk_10A78;
/* 0x10A79 */ UNK_TYPE1 unk_10A79[0x7];
diff --git a/include/m_event.h b/include/m_event.h
index e8d3aad..8a6a973 100644
--- a/include/m_event.h
+++ b/include/m_event.h
@@ -110,7 +110,7 @@ s32 mEv_set_status(s32,s32);
void mEv_clear_status(s32, s16);
// void func_8007FEBC_jp();
s32 mEv_check_status(s32, s16);
-// void func_8007FF8C_jp();
+s32 mEv_check_status_edge(s32);
// void func_8007FFC4_jp();
// void func_80080000_jp();
// void func_80080040_jp();
diff --git a/include/m_field_info.h b/include/m_field_info.h
index 09e9801..744dbae 100644
--- a/include/m_field_info.h
+++ b/include/m_field_info.h
@@ -48,7 +48,7 @@ typedef enum FieldRoom {
(fieldId) == FI_FIELD_PLAYER2_ROOM || (fieldId) == FI_FIELD_PLAYER3_ROOM)
void mFI_ClearFieldData(void);
-// void func_80087C40_jp();
+s32 mFI_CheckFieldData(void);
struct FieldMakeBlockInfo* mFI_GetBlockTopP(void);
u16 mFI_GetFieldId(void);
// void func_80087C9C_jp();
@@ -175,7 +175,7 @@ s32 func_8008BE00_jp(struct FieldMakeMoveActor*, s32);
void mFI_SetPlayerWade(struct Game*);
s32 mFI_CheckPlayerWade(s32);
s32 mFI_GetPlayerWade(void);
-// void func_8008C130_jp();
+s32 mFI_GetNextBlockNum(s32*, s32*);
u16* mFI_GetDepositP(s32,s32);
// void func_8008C344_jp();
// void func_8008C390_jp();
diff --git a/include/m_melody.h b/include/m_melody.h
index dfb0e5b..f512b21 100644
--- a/include/m_melody.h
+++ b/include/m_melody.h
@@ -6,7 +6,7 @@
void mMld_SetDefaultMelody(void);
void mMld_TransformMelodyData_u64_2_u8(u8* dst, u64 src);
// void func_8009D03C_jp();
-// void func_8009D0CC_jp();
+void mMld_GetMelody(u8*);
// void func_8009D100_jp();
// void func_8009D128_jp();
// void func_8009D160_jp();
diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt
index a416f05..290949b 100644
--- a/linker_scripts/jp/symbol_addrs_code.txt
+++ b/linker_scripts/jp/symbol_addrs_code.txt
@@ -169,184 +169,184 @@ func_8005A070_jp = 0x8005A070; // type:func
func_8005A154_jp = 0x8005A154; // type:func
func_8005A238_jp = 0x8005A238; // type:func
banti_draw = 0x8005A2FC; // type:func
-func_8005ABA0_jp = 0x8005ABA0; // type:func
-func_8005ABE0_jp = 0x8005ABE0; // type:func
+mBGM_check_MD = 0x8005ABA0; // type:func
+mBGM_check_ignore_talk_volume = 0x8005ABE0; // type:func
func_8005ACA8_jp = 0x8005ACA8; // type:func
-func_8005ACC0_jp = 0x8005ACC0; // type:func
-func_8005ACEC_jp = 0x8005ACEC; // type:func
-func_8005AD08_jp = 0x8005AD08; // type:func
-func_8005AD5C_jp = 0x8005AD5C; // type:func
-func_8005ADA8_jp = 0x8005ADA8; // type:func
-func_8005AE1C_jp = 0x8005AE1C; // type:func
-func_8005AE40_jp = 0x8005AE40; // type:func
-func_8005AE78_jp = 0x8005AE78; // type:func
-func_8005AF38_jp = 0x8005AF38; // type:func
-func_8005AF7C_jp = 0x8005AF7C; // type:func
-func_8005AFD0_jp = 0x8005AFD0; // type:func
-func_8005AFE4_jp = 0x8005AFE4; // type:func
-func_8005AFF8_jp = 0x8005AFF8; // type:func
-func_8005B028_jp = 0x8005B028; // type:func
-func_8005B128_jp = 0x8005B128; // type:func
-func_8005B204_jp = 0x8005B204; // type:func
-func_8005B2F4_jp = 0x8005B2F4; // type:func
-func_8005B338_jp = 0x8005B338; // type:func
-func_8005B464_jp = 0x8005B464; // type:func
-func_8005B4D4_jp = 0x8005B4D4; // type:func
-func_8005B4E8_jp = 0x8005B4E8; // type:func
-func_8005B4FC_jp = 0x8005B4FC; // type:func
-func_8005B52C_jp = 0x8005B52C; // type:func
-func_8005B5BC_jp = 0x8005B5BC; // type:func
-func_8005B5FC_jp = 0x8005B5FC; // type:func
-func_8005B610_jp = 0x8005B610; // type:func
-func_8005B620_jp = 0x8005B620; // type:func
-func_8005B668_jp = 0x8005B668; // type:func
-func_8005B6D4_jp = 0x8005B6D4; // type:func
-func_8005B6F8_jp = 0x8005B6F8; // type:func
-func_8005B730_jp = 0x8005B730; // type:func
-func_8005B758_jp = 0x8005B758; // type:func
-func_8005B810_jp = 0x8005B810; // type:func
-func_8005B8D4_jp = 0x8005B8D4; // type:func
-func_8005B90C_jp = 0x8005B90C; // type:func
-func_8005B92C_jp = 0x8005B92C; // type:func
-func_8005BA0C_jp = 0x8005BA0C; // type:func
-func_8005BB38_jp = 0x8005BB38; // type:func
-func_8005BB90_jp = 0x8005BB90; // type:func
-func_8005BC08_jp = 0x8005BC08; // type:func
-func_8005BD24_jp = 0x8005BD24; // type:func
-func_8005BDAC_jp = 0x8005BDAC; // type:func
-func_8005BE34_jp = 0x8005BE34; // type:func
-func_8005BEBC_jp = 0x8005BEBC; // type:func
-func_8005BF40_jp = 0x8005BF40; // type:func
-func_8005C07C_jp = 0x8005C07C; // type:func
-func_8005C1B8_jp = 0x8005C1B8; // type:func
-func_8005C228_jp = 0x8005C228; // type:func
-func_8005C298_jp = 0x8005C298; // type:func
-func_8005C2E4_jp = 0x8005C2E4; // type:func
-func_8005C3E4_jp = 0x8005C3E4; // type:func
-func_8005C444_jp = 0x8005C444; // type:func
-func_8005C4F0_jp = 0x8005C4F0; // type:func
-func_8005C550_jp = 0x8005C550; // type:func
-func_8005C6E4_jp = 0x8005C6E4; // type:func
-func_8005C778_jp = 0x8005C778; // type:func
-func_8005C7B8_jp = 0x8005C7B8; // type:func
-func_8005C828_jp = 0x8005C828; // type:func
-func_8005C83C_jp = 0x8005C83C; // type:func
-func_8005C888_jp = 0x8005C888; // type:func
-func_8005C8D4_jp = 0x8005C8D4; // type:func
-func_8005C918_jp = 0x8005C918; // type:func
-func_8005C9BC_jp = 0x8005C9BC; // type:func
-func_8005C9D0_jp = 0x8005C9D0; // type:func
-func_8005C9E4_jp = 0x8005C9E4; // type:func
-func_8005CA14_jp = 0x8005CA14; // type:func
-func_8005CA44_jp = 0x8005CA44; // type:func
-func_8005CC0C_jp = 0x8005CC0C; // type:func
-func_8005CC90_jp = 0x8005CC90; // type:func
-func_8005CD70_jp = 0x8005CD70; // type:func
-func_8005CE34_jp = 0x8005CE34; // type:func
-func_8005CEC0_jp = 0x8005CEC0; // type:func
-func_8005CF04_jp = 0x8005CF04; // type:func
-func_8005CF4C_jp = 0x8005CF4C; // type:func
-func_8005D000_jp = 0x8005D000; // type:func
-func_8005D084_jp = 0x8005D084; // type:func
-func_8005D13C_jp = 0x8005D13C; // type:func
-func_8005D19C_jp = 0x8005D19C; // type:func
-func_8005D1B8_jp = 0x8005D1B8; // type:func
-func_8005D1F4_jp = 0x8005D1F4; // type:func
+mBGMElem_default_set = 0x8005ACC0; // type:func
+mBGMClock_after_time_check = 0x8005ACEC; // type:func
+mBGMClock_over_time_check = 0x8005AD08; // type:func
+mBGMClock_range_time_check = 0x8005AD5C; // type:func
+mBGMClock_now_set = 0x8005ADA8; // type:func
+mBGMClock_move = 0x8005AE1C; // type:func
+mBGMClock_ct = 0x8005AE40; // type:func
+mBGMDemo_make_scene_bgm = 0x8005AE78; // type:func
+mBGMDemo_delete_scene_bgm = 0x8005AF38; // type:func
+mBGMDemo_move = 0x8005AF7C; // type:func
+mBGMDemo_scene_bgm_make_req = 0x8005AFD0; // type:func
+mBGMDemo_scene_bgm_delete_req = 0x8005AFE4; // type:func
+mBGMDemo_ct = 0x8005AFF8; // type:func
+mBGMRoom_shop_close_time_set = 0x8005B028; // type:func
+mBGMRoom_make_scene_bgm_shop_get = 0x8005B128; // type:func
+mBGMRoom_make_scene_bgm = 0x8005B204; // type:func
+mBGMRoom_delete_scene_bgm = 0x8005B2F4; // type:func
+mBGMRoom_shop_close_check = 0x8005B338; // type:func
+mBGMRoom_move = 0x8005B464; // type:func
+mBGMRoom_scene_bgm_make_req = 0x8005B4D4; // type:func
+mBGMRoom_scene_bgm_delete_req = 0x8005B4E8; // type:func
+mBGMRoom_ct = 0x8005B4FC; // type:func
+mBGMTime_signal_melody = 0x8005B52C; // type:func
+mBGMTime_silent_check = 0x8005B5BC; // type:func
+mBGMTime_new_year_ev_flag_set = 0x8005B5FC; // type:func
+mBGMTime_new_year_ev_flag_clr = 0x8005B610; // type:func
+mBGMTime_move_wait = 0x8005B620; // type:func
+mBGMTime_move_change = 0x8005B668; // type:func
+mBGMTime_move = 0x8005B6D4; // type:func
+mBGMTime_ct = 0x8005B6F8; // type:func
+mBGMFieldSuddenEv_flag_check_arbeit = 0x8005B730; // type:func
+mBGMFieldSuddenEv_flag_set = 0x8005B758; // type:func
+mBGMFieldSuddenEv_ps_compose = 0x8005B810; // type:func
+mBGMFieldSuddenEv_move = 0x8005B8D4; // type:func
+mBGMFieldSuddenEv_ct = 0x8005B90C; // type:func
+mBGMFieldSchedEv_bl_attr_get = 0x8005B92C; // type:func
+mBGMFieldSchedEv_bl_attr_evdata_get = 0x8005BA0C; // type:func
+mBGMFieldSchedEv_Info_old_copy = 0x8005BB38; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_standard = 0x8005BB90; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_Silence_0 = 0x8005BC08; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_CountDown_1 = 0x8005BD24; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_CountDown_2 = 0x8005BDAC; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_CountDown_3 = 0x8005BE34; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_CountDown_4 = 0x8005BEBC; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_CountDown_5 = 0x8005BF40; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_CountDown_6 = 0x8005C07C; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_NewYear01 = 0x8005C1B8; // type:func
+mBGMFieldSchedEv_Info_ev_now_set_NewYear02 = 0x8005C228; // type:func
+mBGMFieldSchedEv_Info_attr_now_set = 0x8005C298; // type:func
+mBGMFieldSchedEv_info_set = 0x8005C2E4; // type:func
+mBGMFieldSchedEv_Info_ps_delete = 0x8005C3E4; // type:func
+mBGMFieldSchedEv_Info_ps_make = 0x8005C444; // type:func
+mBGMFieldSchedEv_Info_ps_volume_change = 0x8005C4F0; // type:func
+mBGMFieldSchedEv_ps_compose = 0x8005C550; // type:func
+mBGMFieldSchedEv_sp_flag = 0x8005C6E4; // type:func
+mBGMFieldSchedEv_move = 0x8005C778; // type:func
+mBGMFieldSchedEv_ct = 0x8005C7B8; // type:func
+mBGMFieldNorm_bgm_num_get = 0x8005C828; // type:func
+mBGMFieldNorm_elem_set = 0x8005C83C; // type:func
+mBGMFieldNorm_make_bgm = 0x8005C888; // type:func
+mBGMFieldNorm_delete_bgm = 0x8005C8D4; // type:func
+mBGMFieldNorm_move = 0x8005C918; // type:func
+mBGMFieldNorm_make_req = 0x8005C9BC; // type:func
+mBGMFieldNorm_delete_req = 0x8005C9D0; // type:func
+mBGMFieldNorm_ct = 0x8005C9E4; // type:func
+mBGMPs_counter_dec = 0x8005CA14; // type:func
+mBGMPsComp_ps_remove = 0x8005CA44; // type:func
+mBGMPsComp_search_insert_pos_kategorie = 0x8005CC0C; // type:func
+mBGMPsComp_search_pos_kategorie_bgm_num = 0x8005CC90; // type:func
+mBGMPsComp_shift_behind = 0x8005CD70; // type:func
+mBGMPsComp_all_ps_bitclr = 0x8005CE34; // type:func
+mBGMPsComp_execute_ps_pos_get = 0x8005CEC0; // type:func
+mBGMPsComp_high_ps_not_delete = 0x8005CF04; // type:func
+mBGMPsComp_main_req_stop = 0x8005CF4C; // type:func
+mBGMPsComp_main_remove = 0x8005D000; // type:func
+mBGMPsComp_main_req_start = 0x8005D084; // type:func
+mBGMPsComp_main_req_pause = 0x8005D13C; // type:func
+mBGMPsComp_main_req_md = 0x8005D19C; // type:func
+mBGMPsComp_main_md_move = 0x8005D1B8; // type:func
+mBGMPsComp_main_req_volume_ps = 0x8005D1F4; // type:func
func_8005D2A4_jp = 0x8005D2A4; // type:func
-func_8005D338_jp = 0x8005D338; // type:func
-func_8005D3C0_jp = 0x8005D3C0; // type:func
-func_8005D4B0_jp = 0x8005D4B0; // type:func
-func_8005D758_jp = 0x8005D758; // type:func
-func_8005D7A0_jp = 0x8005D7A0; // type:func
-func_8005D810_jp = 0x8005D810; // type:func
-func_8005D84C_jp = 0x8005D84C; // type:func
-func_8005D8E0_jp = 0x8005D8E0; // type:func
-func_8005D91C_jp = 0x8005D91C; // type:func
-func_8005D958_jp = 0x8005D958; // type:func
-func_8005D9AC_jp = 0x8005D9AC; // type:func
-func_8005DA00_jp = 0x8005DA00; // type:func
-func_8005DAF0_jp = 0x8005DAF0; // type:func
-func_8005DBA4_jp = 0x8005DBA4; // type:func
-func_8005DC40_jp = 0x8005DC40; // type:func
-func_8005DC9C_jp = 0x8005DC9C; // type:func
-func_8005DCCC_jp = 0x8005DCCC; // type:func
+mBGMPsComp_main_req_volume_talk = 0x8005D338; // type:func
+mBGMPsComp_main_req_volume_pause = 0x8005D3C0; // type:func
+mBGMPsComp_main_req_volume = 0x8005D4B0; // type:func
+mBGMPsComp_MDPlayerPos_main_inform_sound = 0x8005D758; // type:func
+mBGMPsComp_Arm_main_inform_sound = 0x8005D7A0; // type:func
+mBGMPsComp_Stop_main_inform_sound = 0x8005D810; // type:func
+mBGMPsComp_Start_main_inform_sound = 0x8005D84C; // type:func
+mBGMPsComp_Volume_main_inform_sound = 0x8005D8E0; // type:func
+mBGMPsComp_Pause_main_inform_sound = 0x8005D91C; // type:func
+mBGMPsComp_main_inform_sound = 0x8005D958; // type:func
+mBGMPsComp_main_counter_dec = 0x8005D9AC; // type:func
+mBGMPsComp_main_fo_check = 0x8005DA00; // type:func
+mBGMPsComp_main_lost = 0x8005DAF0; // type:func
+mBGMPsComp_make_ps = 0x8005DBA4; // type:func
+_mBGMPsComp_make_ps_fanfare = 0x8005DC40; // type:func
+mBGMPsComp_make_ps_fanfare = 0x8005DC9C; // type:func
+_mBGMPsComp_make_ps_lost_fanfare = 0x8005DCCC; // type:func
mBGMPsComp_make_ps_lost_fanfare = 0x8005DD2C; // type:func
-func_8005DD5C_jp = 0x8005DD5C; // type:func
+_mBGMPsComp_make_ps_wipe = 0x8005DD5C; // type:func
mBGMPsComp_make_ps_wipe = 0x8005DDE4; // type:func
-func_8005DE0C_jp = 0x8005DE0C; // type:func
-func_8005DE60_jp = 0x8005DE60; // type:func
-func_8005DE88_jp = 0x8005DE88; // type:func
-func_8005DEE0_jp = 0x8005DEE0; // type:func
-func_8005DF14_jp = 0x8005DF14; // type:func
-func_8005DF70_jp = 0x8005DF70; // type:func
-func_8005DFA0_jp = 0x8005DFA0; // type:func
-func_8005DFFC_jp = 0x8005DFFC; // type:func
-func_8005E02C_jp = 0x8005E02C; // type:func
-func_8005E080_jp = 0x8005E080; // type:func
-func_8005E0DC_jp = 0x8005E0DC; // type:func
-func_8005E10C_jp = 0x8005E10C; // type:func
-func_8005E15C_jp = 0x8005E15C; // type:func
-func_8005E1B0_jp = 0x8005E1B0; // type:func
-func_8005E1D8_jp = 0x8005E1D8; // type:func
-func_8005E22C_jp = 0x8005E22C; // type:func
-func_8005E254_jp = 0x8005E254; // type:func
-func_8005E2B4_jp = 0x8005E2B4; // type:func
-func_8005E2EC_jp = 0x8005E2EC; // type:func
-func_8005E390_jp = 0x8005E390; // type:func
-func_8005E3EC_jp = 0x8005E3EC; // type:func
-func_8005E458_jp = 0x8005E458; // type:func
-func_8005E494_jp = 0x8005E494; // type:func
-func_8005E4C4_jp = 0x8005E4C4; // type:func
-func_8005E4F8_jp = 0x8005E4F8; // type:func
-func_8005E530_jp = 0x8005E530; // type:func
-func_8005E550_jp = 0x8005E550; // type:func
-func_8005E58C_jp = 0x8005E58C; // type:func
-func_8005E5BC_jp = 0x8005E5BC; // type:func
-func_8005E5F8_jp = 0x8005E5F8; // type:func
-func_8005E628_jp = 0x8005E628; // type:func
-func_8005E660_jp = 0x8005E660; // type:func
-func_8005E69C_jp = 0x8005E69C; // type:func
-func_8005E6CC_jp = 0x8005E6CC; // type:func
-func_8005E700_jp = 0x8005E700; // type:func
-func_8005E738_jp = 0x8005E738; // type:func
-func_8005E758_jp = 0x8005E758; // type:func
-func_8005E794_jp = 0x8005E794; // type:func
-func_8005E7C4_jp = 0x8005E7C4; // type:func
-func_8005E800_jp = 0x8005E800; // type:func
-func_8005E83C_jp = 0x8005E83C; // type:func
-func_8005E8F4_jp = 0x8005E8F4; // type:func
+_mBGMPsComp_make_ps_quiet = 0x8005DE0C; // type:func
+mBGMPsComp_make_ps_quiet = 0x8005DE60; // type:func
+_mBGMPsComp_make_ps_co_quiet = 0x8005DE88; // type:func
+mBGMPsComp_make_ps_co_quiet = 0x8005DEE0; // type:func
+_mBGMPsComp_make_ps_demo = 0x8005DF14; // type:func
+mBGMPsComp_make_ps_demo = 0x8005DF70; // type:func
+_mBGMPsComp_make_ps_happening = 0x8005DFA0; // type:func
+mBGMPsComp_make_ps_happening = 0x8005DFFC; // type:func
+mBGMPsComp_make_ps_quietRoom = 0x8005E02C; // type:func
+_mBGMPsComp_make_ps_room = 0x8005E080; // type:func
+mBGMPsComp_make_ps_room = 0x8005E0DC; // type:func
+mBGMPsComp_make_ps_time = 0x8005E10C; // type:func
+_mBGMPsComp_make_ps_quietField = 0x8005E15C; // type:func
+mBGMPsComp_make_ps_quietField = 0x8005E1B0; // type:func
+_mBGMPsComp_make_ps_fc_quietField = 0x8005E1D8; // type:func
+mBGMPsComp_make_ps_fc_quietField = 0x8005E22C; // type:func
+_mBGMPsComp_make_ps_fieldSuddenEv = 0x8005E254; // type:func
+mBGMPsComp_make_ps_fieldSuddenEv = 0x8005E2B4; // type:func
+mBGMPsComp_make_ps_fieldSchedEv = 0x8005E2EC; // type:func
+mBGMPsComp_make_ps_fieldNorm = 0x8005E390; // type:func
+mBGMPsComp_delete_ps = 0x8005E3EC; // type:func
+_mBGMPsComp_delete_ps_fanfare = 0x8005E458; // type:func
+mBGMPsComp_delete_ps_fanfare = 0x8005E494; // type:func
+mBGMPsComp_delete_ps_wipe = 0x8005E4C4; // type:func
+_mBGMPsComp_delete_ps_quiet = 0x8005E4F8; // type:func
+mBGMPsComp_delete_ps_quiet = 0x8005E530; // type:func
+_mBGMPsComp_delete_ps_demo = 0x8005E550; // type:func
+mBGMPsComp_delete_ps_demo = 0x8005E58C; // type:func
+_mBGMPsComp_delete_ps_happening = 0x8005E5BC; // type:func
+mBGMPsComp_delete_ps_happening = 0x8005E5F8; // type:func
+mBGMPsComp_delete_ps_quietRoom = 0x8005E628; // type:func
+_mBGMPsComp_delete_ps_room = 0x8005E660; // type:func
+mBGMPsComp_delete_ps_room = 0x8005E69C; // type:func
+mBGMPsComp_delete_ps_time = 0x8005E6CC; // type:func
+_mBGMPsComp_delete_ps_quietField = 0x8005E700; // type:func
+mBGMPsComp_delete_ps_quietField = 0x8005E738; // type:func
+_mBGMPsComp_delete_ps_fieldSuddenEv = 0x8005E758; // type:func
+mBGMPsComp_delete_ps_fieldSuddenEv = 0x8005E794; // type:func
+mBGMPsComp_delete_ps_fieldSchedEv = 0x8005E7C4; // type:func
+mBGMPsComp_delete_ps_fieldNorm = 0x8005E800; // type:func
+mBGMPsComp_volume_change_fieldSchedEv = 0x8005E83C; // type:func
+mBGMPsComp_search_cf_set_field = 0x8005E8F4; // type:func
func_8005E9B4_jp = 0x8005E9B4; // type:func
func_8005E9C8_jp = 0x8005E9C8; // type:func
mBGMPsComp_volume_talk_start = 0x8005E9DC; // type:func
mBGMPsComp_volume_talk_end = 0x8005E9F0; // type:func
-func_8005EA14_jp = 0x8005EA14; // type:func
-func_8005EA24_jp = 0x8005EA24; // type:func
-func_8005EA38_jp = 0x8005EA38; // type:func
-func_8005EA4C_jp = 0x8005EA4C; // type:func
+mBGMPsComp_pause = 0x8005EA14; // type:func
+mBGMPsComp_MDPlayerPos_make = 0x8005EA24; // type:func
+mBGMPsComp_MDPlayerPos_delete = 0x8005EA38; // type:func
+mBGMPsComp_MDPlayerPos_param_set = 0x8005EA4C; // type:func
mBGMPsComp_scene_mode = 0x8005EAA0; // type:func
-func_8005EAC8_jp = 0x8005EAC8; // type:func
-func_8005EAE4_jp = 0x8005EAE4; // type:func
-func_8005EAFC_jp = 0x8005EAFC; // type:func
-func_8005EB74_jp = 0x8005EB74; // type:func
-func_8005EBD8_jp = 0x8005EBD8; // type:func
-func_8005EBE8_jp = 0x8005EBE8; // type:func
-func_8005ECC4_jp = 0x8005ECC4; // type:func
-func_8005ECF8_jp = 0x8005ECF8; // type:func
-func_8005ED24_jp = 0x8005ED24; // type:func
-func_8005ED44_jp = 0x8005ED44; // type:func
-func_8005ED78_jp = 0x8005ED78; // type:func
-func_8005ED98_jp = 0x8005ED98; // type:func
-func_8005EDC4_jp = 0x8005EDC4; // type:func
+mBGMPsComp_arm_make = 0x8005EAC8; // type:func
+mBGMPsComp_arm_delete = 0x8005EAE4; // type:func
+mBGMPsComp_execute_bgm_num_get = 0x8005EAFC; // type:func
+mBGMPsComp_ct = 0x8005EB74; // type:func
+mBGMForce_wipe_ps_make_permit = 0x8005EBD8; // type:func
+mBGMForce_move_inform = 0x8005EBE8; // type:func
+mBGMForce_move_room_nonstop = 0x8005ECC4; // type:func
+mBGMForce_move = 0x8005ECF8; // type:func
+mBGMForce_ct = 0x8005ED24; // type:func
+mBGMForce_inform_cleanup = 0x8005ED44; // type:func
+mBGMForce_room_nonstop_cleanup = 0x8005ED78; // type:func
+mBGMForce_cleanup = 0x8005ED98; // type:func
+mBGMForce_inform_start = 0x8005EDC4; // type:func
mBGMForce_inform_end = 0x8005EDD8; // type:func
-func_8005EDEC_jp = 0x8005EDEC; // type:func
+_mBGMForce_room_nonstop_start = 0x8005EDEC; // type:func
mBGMForce_room_nonstop_start = 0x8005EE00; // type:func
-func_8005EE20_jp = 0x8005EE20; // type:func
-func_8005EEA0_jp = 0x8005EEA0; // type:func
+mBGM_main_control = 0x8005EE20; // type:func
+mBGM_weather_set = 0x8005EEA0; // type:func
mBGM_main = 0x8005EEE8; // type:func
mBGM_ct = 0x8005EF9C; // type:func
-func_8005F020_jp = 0x8005F020; // type:func
+mBGM_init = 0x8005F020; // type:func
mBGM_cleanup = 0x8005F13C; // type:func
-func_8005F250_jp = 0x8005F250; // type:func
+mBGM_reset = 0x8005F250; // type:func
func_8005F390_jp = 0x8005F390; // type:func
func_8005F3DC_jp = 0x8005F3DC; // type:func
func_8005F4E4_jp = 0x8005F4E4; // type:func
@@ -1146,7 +1146,7 @@ func_8007FE0C_jp = 0x8007FE0C; // type:func
mEv_clear_status = 0x8007FE74; // type:func
func_8007FEBC_jp = 0x8007FEBC; // type:func
mEv_check_status = 0x8007FF08; // type:func
-func_8007FF8C_jp = 0x8007FF8C; // type:func
+mEv_check_status_edge = 0x8007FF8C; // type:func
func_8007FFC4_jp = 0x8007FFC4; // type:func
func_80080000_jp = 0x80080000; // type:func
func_80080040_jp = 0x80080040; // type:func
@@ -1296,7 +1296,7 @@ func_800877CC_jp = 0x800877CC; // type:func
mFM_RenewalReserve = 0x800878D4; // type:func
mFM_GetReseveName = 0x800879B0; // type:func
mFI_ClearFieldData = 0x80087C30; // type:func
-func_80087C40_jp = 0x80087C40; // type:func
+mFI_CheckFieldData = 0x80087C40; // type:func
mFI_GetBlockTopP = 0x80087C64; // type:func
mFI_GetFieldId = 0x80087C88; // type:func
func_80087C9C_jp = 0x80087C9C; // type:func
@@ -1423,7 +1423,7 @@ func_8008BFC4_jp = 0x8008BFC4; // type:func
mFI_SetPlayerWade = 0x8008C058; // type:func
mFI_CheckPlayerWade = 0x8008C0FC; // type:func
mFI_GetPlayerWade = 0x8008C120; // type:func
-func_8008C130_jp = 0x8008C130; // type:func
+mFI_GetNextBlockNum = 0x8008C130; // type:func
mFI_GetDepositP = 0x8008C1E0; // type:func
func_8008C344_jp = 0x8008C344; // type:func
func_8008C390_jp = 0x8008C390; // type:func
@@ -1896,7 +1896,7 @@ mMkRm_MarkRoom = 0x8009CDA8; // type:func
mMld_SetDefaultMelody = 0x8009CFB0; // type:func
mMld_TransformMelodyData_u64_2_u8 = 0x8009CFD4; // type:func
func_8009D03C_jp = 0x8009D03C; // type:func
-func_8009D0CC_jp = 0x8009D0CC; // type:func
+mMld_GetMelody = 0x8009D0CC; // type:func
func_8009D100_jp = 0x8009D100; // type:func
func_8009D128_jp = 0x8009D128; // type:func
func_8009D160_jp = 0x8009D160; // type:func
@@ -2992,7 +2992,7 @@ func_800C2060_jp = 0x800C2060; // type:func
func_800C2070_jp = 0x800C2070; // type:func
func_800C22F8_jp = 0x800C22F8; // type:func
func_800C2354_jp = 0x800C2354; // type:func
-func_800C2380_jp = 0x800C2380; // type:func
+mSP_GetShopCloseTime_Bgm = 0x800C2380; // type:func
func_800C23EC_jp = 0x800C23EC; // type:func
func_800C2480_jp = 0x800C2480; // type:func
func_800C2578_jp = 0x800C2578; // type:func
diff --git a/src/code/game.c b/src/code/game.c
index 4edc1fb..f92edd6 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -2,7 +2,7 @@
#include "gfx.h"
#include "m_controller.h"
#include "m_debug.h"
-#include "67E840.h"
+#include "m_bgm.h"
#include "speed_meter.h"
#include "graph.h"
#include "libu64/debug.h"
@@ -284,7 +284,7 @@ void game_ct(Game* game, GameStateFunc init, GraphicsContext* gfxCtx) {
init(game);
- func_8005F020_jp();
+ mBGM_init();
func_800D88B0_jp(&B_80145020_jp);
func_800D3E14_jp(game->gfxCtx);
}
diff --git a/src/code/m_bgm.c b/src/code/m_bgm.c
new file mode 100644
index 0000000..f9389d4
--- /dev/null
+++ b/src/code/m_bgm.c
@@ -0,0 +1,2075 @@
+#include "m_bgm.h"
+#include "6E3240.h"
+#include "audio.h"
+#include "m_common_data.h"
+#include "m_field_info.h"
+#include "m_melody.h"
+#include "m_player_lib.h"
+#include "m_scene_table.h"
+#include "macros.h"
+#include "overlays/actors/player_actor/m_player.h"
+#include "prevent_bss_reordering.h"
+
+// TODO : revisit for iQue, has some nonmatchings
+
+Bgm M_bgm;
+
+int mBGM_check_MD(u8 num) {
+ return ((num >= 0x80 && num <= 0xB3) || (num >= 0xB4 && num <= 0xB6));
+}
+
+int mBGM_check_ignore_talk_volume(u8 num) {
+ return BGM_CHECK_BGM_DATA(num);
+}
+
+int func_8005ACA8_jp(u8 num) {
+ return num == 40;
+}
+
+void mBGMElem_default_set(BgmElement* element) {
+ static BgmElement default_data = { 255, 0, 0, 0x168, 0x168 };
+ bcopy(&default_data, element, sizeof(BgmElement));
+}
+
+int mBGMClock_after_time_check(BgmClock* clock, u32 checktTime, u32 checkMask) {
+ u32 timeNow = clock->now & checkMask;
+ u32 timeCheck = checktTime & checkMask;
+
+ return timeNow >= timeCheck;
+}
+
+int mBGMClock_over_time_check(BgmClock* clock, u32 checktTime, u32 checkMask) {
+ u32 timeNow = clock->now & checkMask;
+ u32 timePrior = clock->prior & checkMask;
+ u32 timeCheck = checktTime & checkMask;
+
+ if (timeNow >= timePrior) {
+ return (timeCheck > timePrior && timeCheck <= timeNow);
+
+ } else {
+ return (timeCheck > timePrior || timeCheck <= timeNow);
+ }
+}
+
+int mBGMClock_range_time_check(BgmClock* clock, u32 checktTime0, u32 checktTime1, u32 checkMask) {
+ u32 timeNow = clock->now & checkMask;
+ u32 timeCheck0 = checktTime0 & checkMask;
+ u32 timeCheck1 = checktTime1 & checkMask;
+
+ if (timeCheck1 >= timeCheck0) {
+ return (timeNow >= timeCheck0 && timeNow < timeCheck1);
+
+ } else {
+ return (timeNow >= timeCheck0 || timeNow < timeCheck1);
+ }
+}
+
+void mBGMClock_now_set(BgmClock* clock) {
+ lbRTC_time_c* time = &common_data.time.rtcTime;
+
+ clock->prior = clock->now;
+ clock->now = BGM_RTC_TIME_TO_BGM_TIME(time->month, time->day, time->hour, time->min, time->sec);
+}
+
+void mBGMClock_move(BgmClock* clock, UNUSED Game_Play* play) {
+ mBGMClock_now_set(clock);
+}
+
+void mBGMClock_ct(BgmClock* clock) {
+ bzero(clock, sizeof(BgmClock));
+ mBGMClock_now_set(clock);
+ clock->prior = clock->now;
+}
+
+void mBGMDemo_make_scene_bgm(BgmDemo* demo) {
+ if (demo->element.num == 255 && mFI_CheckFieldData()) {
+ u16 fieldId = mFI_GetFieldId();
+ u8 num;
+
+ switch (fieldId) {
+ case 0x5000:
+ case 0x5001:
+ num = 42;
+ break;
+
+ case 0x5002:
+ if (common_data.save.sceneNo == SCENE_PLAYERSELECT_SAVE) {
+ num = 46;
+ } else {
+ num = 43;
+ }
+ break;
+
+ default:
+ num = 255;
+ break;
+ }
+
+ if (num != 255) {
+ mBGMElem_default_set(&demo->element);
+ demo->element.num = num;
+ mBGMPsComp_make_ps_demo(num, 0x168);
+ }
+ }
+}
+
+void mBGMDemo_delete_scene_bgm(BgmDemo* demo) {
+ if (demo->element.num != 255) {
+ mBGMPsComp_delete_ps_demo(demo->element.num, 0x168);
+ demo->element.num = 255;
+ }
+}
+
+void mBGMDemo_move(BgmDemo* demo, UNUSED Game_Play* play) {
+ if (demo->deleteFlag) {
+ mBGMDemo_delete_scene_bgm(demo);
+ }
+
+ if (demo->makeFlag) {
+ mBGMDemo_make_scene_bgm(demo);
+ }
+
+ demo->makeFlag = FALSE;
+ demo->deleteFlag = FALSE;
+}
+
+void mBGMDemo_scene_bgm_make_req() {
+ M_bgm.demo.makeFlag = TRUE;
+}
+
+void mBGMDemo_scene_bgm_delete_req() {
+ M_bgm.demo.deleteFlag = TRUE;
+}
+
+void mBGMDemo_ct(BgmDemo* demo) {
+ bzero(demo, sizeof(BgmDemo));
+ mBGMElem_default_set(&demo->element);
+}
+
+void mBGMRoom_shop_close_time_set(BgmRoom* room) {
+ if (mFI_CheckFieldData()) {
+ u16 fieldId = mFI_GetFieldId();
+
+ if (fieldId == 0x3001 || fieldId == 0x3006 || fieldId == 0x3007 || fieldId == 0x3008 || fieldId == 0x3009) {
+ lbRTC_time_c time;
+
+ bzero(&time, sizeof(lbRTC_time_c));
+ time.hour = mSP_GetShopCloseTime_Bgm();
+
+ lbRTC_Sub_mm(&time, 5);
+ room->shopCloseTime1 = BGM_TIME_TO_SHOP_CLOSE_TIME(time.hour, time.min, time.sec);
+
+ lbRTC_Sub_ss(&time, 5);
+ room->shopCloseTime0 = BGM_TIME_TO_SHOP_CLOSE_TIME(time.hour, time.min, time.sec);
+ }
+ }
+}
+
+u8 mBGMRoom_make_scene_bgm_shop_get(BgmRoom* room, u16 fieldId) {
+ u8 num;
+
+ if (mEv_CheckRealArbeit() == FALSE &&
+ mBGMClock_after_time_check(&M_bgm.clock, room->shopCloseTime1,
+ BGM_CLOCK_CHECK_HOUR | BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC)) {
+ if (fieldId == 0x3001) {
+ num = 79;
+ } else if (fieldId == 0x3006) {
+ num = 80;
+ } else if (fieldId == 0x3007) {
+ num = 81;
+ } else {
+ num = 82;
+ }
+ } else {
+ if (fieldId == 0x3001) {
+ num = 44;
+ } else if (fieldId == 0x3006) {
+ num = 37;
+ } else if (fieldId == 0x3007) {
+ num = 38;
+ } else {
+ num = 39;
+ }
+ }
+
+ return num;
+}
+
+void mBGMRoom_make_scene_bgm(BgmRoom* room) {
+ if (room->element.num == 255 && mFI_CheckFieldData()) {
+ u16 fieldId = mFI_GetFieldId();
+ u8 num;
+
+ switch (fieldId) {
+ case 0x3001:
+ case 0x3006:
+ case 0x3007:
+ case 0x3008:
+ case 0x3009:
+ num = mBGMRoom_make_scene_bgm_shop_get(room, fieldId);
+ break;
+
+ case 0x3002:
+ num = 25;
+ break;
+
+ case 0x3003:
+ if (common_data.unk10A6B != 0) {
+ num = 62;
+ } else {
+ num = 41;
+ }
+ break;
+
+ case 0x3004:
+ num = 45;
+ break;
+
+ case 0x3005:
+ num = 26;
+ break;
+
+ case 0x300A:
+ num = 77;
+ break;
+
+ default:
+ num = 255;
+ break;
+ }
+
+ if (num != 255) {
+ mBGMElem_default_set(&room->element);
+ room->element.num = num;
+ mBGMPsComp_make_ps_room(num, 0x168);
+ }
+ }
+}
+
+void mBGMRoom_delete_scene_bgm(BgmRoom* room) {
+ if (room->element.num != 255) {
+ mBGMPsComp_delete_ps_room(room->element.num, 0x168);
+ room->element.num = 255;
+ }
+}
+
+s32 mBGMRoom_shop_close_check(BgmRoom* room) {
+ s32 res = FALSE;
+ s32 fadeoutFlag = FALSE;
+
+ if (mFI_CheckFieldData()) {
+ u16 fieldId = mFI_GetFieldId();
+
+ if (fieldId == 0x3001 || fieldId == 0x3006 || fieldId == 0x3007 || fieldId == 0x3008 || fieldId == 0x3009) {
+ s32 realArbeit = mEv_CheckRealArbeit();
+
+ fadeoutFlag =
+ realArbeit == FALSE &&
+ mBGMClock_range_time_check(&M_bgm.clock, room->shopCloseTime0, room->shopCloseTime1,
+ BGM_CLOCK_CHECK_HOUR | BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC) != FALSE;
+
+ res = realArbeit == FALSE &&
+ mBGMClock_over_time_check(&M_bgm.clock, room->shopCloseTime1,
+ BGM_CLOCK_CHECK_HOUR | BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC) != FALSE;
+ }
+ }
+
+ if (fadeoutFlag && room->shopFadeoutFlag == FALSE) {
+ mBGMPsComp_make_ps_quietRoom(0x13DE);
+ room->shopFadeoutFlag = TRUE;
+ } else if (!fadeoutFlag && room->shopFadeoutFlag) {
+ mBGMPsComp_delete_ps_quietRoom();
+ room->shopFadeoutFlag = FALSE;
+ }
+
+ return res;
+}
+
+void mBGMRoom_move(BgmRoom* room, UNUSED Game_Play* play) {
+ if (mBGMRoom_shop_close_check(room)) {
+ room->deleteFlag = TRUE;
+ room->makeFlag = TRUE;
+ }
+
+ if (room->deleteFlag) {
+ mBGMRoom_delete_scene_bgm(room);
+ }
+
+ if (room->makeFlag) {
+ mBGMRoom_make_scene_bgm(room);
+ }
+
+ room->makeFlag = FALSE;
+ room->deleteFlag = FALSE;
+}
+
+void mBGMRoom_scene_bgm_make_req() {
+ M_bgm.room.makeFlag = TRUE;
+}
+
+void mBGMRoom_scene_bgm_delete_req() {
+ M_bgm.room.deleteFlag = TRUE;
+}
+
+void mBGMRoom_ct(BgmRoom* room) {
+ bzero(room, sizeof(BgmRoom));
+ mBGMElem_default_set(&room->element);
+}
+
+void mBGMTime_signal_melody(BgmTime* time) {
+ static u8 signal_melody_buf[8];
+
+ if (mEv_CheckFirstIntro() == FALSE && mEv_CheckTitleDemo() != -9 && mFI_CheckFieldData() &&
+ FI_GET_TYPE(mFI_GetFieldId()) != 0x5000 && time->newYearEventFlag == FALSE) {
+ mMld_GetMelody(signal_melody_buf);
+ sAdo_Inst(0xFF, signal_melody_buf);
+ }
+}
+
+int mBGMTime_silent_check(BgmTime* time) {
+ if (time->newYearEventFlag) {
+ return FALSE;
+ }
+
+ return mBGMClock_range_time_check(&M_bgm.clock, BGM_MIN_TIME_TO_BGM_MIN_TIME(59) | BGM_SEC_TIME_TO_BGM_SEC_TIME(52),
+ BGM_MIN_TIME_TO_BGM_MIN_TIME(0) | BGM_SEC_TIME_TO_BGM_SEC_TIME(16),
+ BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC);
+}
+
+void mBGMTime_new_year_ev_flag_set() {
+ M_bgm.time.newYearEventFlag = TRUE;
+}
+
+void mBGMTime_new_year_ev_flag_clr() {
+ M_bgm.time.newYearEventFlag = FALSE;
+}
+
+void mBGMTime_move_wait(BgmTime* time, UNUSED Game_Play* play) {
+ if (mBGMTime_silent_check(time)) {
+ mBGMPsComp_make_ps_time();
+ time->moveFunc = &mBGMTime_move_change;
+ }
+}
+
+void mBGMTime_move_change(BgmTime* time, UNUSED Game_Play* play) {
+ if (mBGMClock_over_time_check(&M_bgm.clock, 0, BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC)) {
+ mBGMTime_signal_melody(time);
+ }
+
+ if (mBGMTime_silent_check(time) == FALSE) {
+ mBGMPsComp_delete_ps_time();
+ time->moveFunc = &mBGMTime_move_wait;
+ }
+}
+
+void mBGMTime_move(BgmTime* time, Game_Play* play) {
+ time->moveFunc(time, play);
+}
+
+void mBGMTime_ct(BgmTime* time) {
+ bzero(time, sizeof(BgmTime));
+ time->moveFunc = &mBGMTime_move_wait;
+}
+
+s32 mBGMFieldSuddenEv_flag_check_arbeit(UNUSED BgmFieldSuddenEvent* fieldSuddenEvent, UNUSED Game_Play* play) {
+ return mEv_CheckFirstJob();
+}
+
+typedef s32 (*BgmFieldSuddenEventFunc)(BgmFieldSuddenEvent*, Game_Play*);
+
+void mBGMFieldSuddenEv_flag_set(BgmFieldSuddenEvent* fieldSudden, Game_Play* play) {
+ static BgmFieldSuddenEventFunc ev_chk[] = { NULL, &mBGMFieldSuddenEv_flag_check_arbeit };
+
+ fieldSudden->priorFlag = fieldSudden->flag;
+ fieldSudden->flag = 0;
+
+ if (mFI_CheckFieldData() && FI_GET_TYPE(mFI_GetFieldId()) == 0) {
+ s32 i = 0;
+ u32 mask = 1;
+
+ for (; i < ARRAY_COUNT(ev_chk); i++) {
+ if (ev_chk[i] != NULL && ev_chk[i](fieldSudden, play) != FALSE) {
+ fieldSudden->flag |= mask;
+ }
+
+ mask <<= 1;
+ }
+ }
+}
+
+void mBGMFieldSuddenEv_ps_compose(BgmFieldSuddenEvent* fieldSudden, UNUSED Game_Play* play) {
+ static u8 bgm_num_data[] = { 255, 52 };
+ s32 now;
+ s32 prior;
+ s32 i;
+ s32 mask;
+
+ for (i = 0, mask = 1; i < ARRAY_COUNT(bgm_num_data); i++) {
+ now = (fieldSudden->flag & mask) != 0;
+ prior = (fieldSudden->priorFlag & mask) != 0;
+
+ if (!now && prior) {
+ mBGMPsComp_delete_ps_fieldSuddenEv(bgm_num_data[i], 0x168);
+ }
+
+ if (now && !prior) {
+ mBGMPsComp_make_ps_fieldSuddenEv(bgm_num_data[i], 0x168, i);
+ }
+
+ mask <<= 1;
+ }
+}
+
+void mBGMFieldSuddenEv_move(BgmFieldSuddenEvent* fieldSudden, Game_Play* play) {
+ mBGMFieldSuddenEv_flag_set(fieldSudden, play);
+ mBGMFieldSuddenEv_ps_compose(fieldSudden, play);
+}
+
+void mBGMFieldSuddenEv_ct(BgmFieldSuddenEvent* fieldSudden) {
+ bzero(fieldSudden, sizeof(BgmFieldSuddenEvent));
+}
+
+s32 mbgm_pattern_data[3][3] = { { 2, 2, 2 }, { 0, 1, 2 }, { 0, 0, 2 } };
+
+BgmEventData mbgm_event_data[] = {
+ { -1, 255, BGM_EVENT_AREA_BLOCK, 0x8000 }, { 11, 55, BGM_EVENT_AREA_BLOCK, 0x8000 },
+ { 13, 53, BGM_EVENT_AREA_EVERYWHERE, 0 }, { 26, 54, BGM_EVENT_AREA_EVERYWHERE, 0 },
+ { 12, 56, BGM_EVENT_AREA_BLOCK, 4 }, { 16, 27, BGM_EVENT_AREA_BLOCK, 4 },
+ { 21, 30, BGM_EVENT_AREA_BLOCK, 0x8000 }, { 22, 30, BGM_EVENT_AREA_BLOCK, 0x8000 },
+ { 8, 27, BGM_EVENT_AREA_BLOCK, 4 }, { 10, 28, BGM_EVENT_AREA_BLOCK, 4 },
+ { 7, 29, BGM_EVENT_AREA_BLOCK, 4 }, { 9, 60, BGM_EVENT_AREA_BLOCK, 4 },
+ { 6, 31, BGM_EVENT_AREA_BLOCK, 0x8000 }, { -1, 32, BGM_EVENT_AREA_BLOCK, 0x8000 },
+ { -1, 33, BGM_EVENT_AREA_BLOCK, 0x8000 }, { -1, 34, BGM_EVENT_AREA_BLOCK, 0x8000 },
+ { -1, 35, BGM_EVENT_AREA_BLOCK, 0x8000 }, { -1, 57, BGM_EVENT_AREA_BLOCK, 0x8000 },
+ { 3, 59, BGM_EVENT_AREA_BLOCK, 4 }, { -1, 36, BGM_EVENT_AREA_EVERYWHERE, 0 },
+ { -1, 61, BGM_EVENT_AREA_EVERYWHERE, 0 },
+};
+
+s32 mBGMFieldSchedEv_bl_attr_get(s32 blockX, s32 blockZ, s32 eventArea, u32 blockType) {
+ s32 attr = BGM_BL_ATTRIBUTE_INACTIVE;
+
+ if (eventArea == BGM_EVENT_AREA_EVERYWHERE) {
+ attr = BGM_BL_ATTRIBUTE_ACTIVE;
+ } else if (blockType != 0) {
+ s32 eventBlockX;
+ s32 eventBlockZ;
+
+ if (mFI_BlockKind2BkNum(&eventBlockX, &eventBlockZ, blockType)) {
+ s32 diffBlockX = eventBlockX - blockX;
+ s32 diffBlockZ = eventBlockZ - blockZ;
+
+ if (diffBlockX == 0 && diffBlockZ == 0) {
+ attr = BGM_BL_ATTRIBUTE_ACTIVE;
+ } else if (eventArea == BGM_EVENT_AREA_BLOCK) {
+ diffBlockX = ABS(diffBlockX);
+ diffBlockZ = ABS(diffBlockZ);
+
+ if ((diffBlockX == 0 && diffBlockZ == 1) || (diffBlockX == 1 && diffBlockZ == 0)) {
+ attr = BGM_BL_ATTRIBUTE_NEARBY;
+ }
+ }
+ }
+ }
+
+ return attr;
+}
+
+s32 mBGMFieldSchedEv_bl_attr_evdata_get(BgmEventData* data, Game_Play* play) {
+ Player* player = get_player_actor_withoutCheck(play);
+ s32 attr = BGM_BL_ATTRIBUTE_MAX;
+
+ if (player != NULL) {
+ s32 wadeCheck = mFI_CheckPlayerWade(0) || mFI_CheckPlayerWade(3);
+ s32 validPos;
+ s32 blockX;
+ s32 blockZ;
+
+ if (wadeCheck) {
+ s32 inform = M_bgm.force.inform;
+
+ if (inform == 3 || inform == 4 || inform == 5 || inform == 6) {
+ xyz_t priorPos;
+
+ xyz_t_move_s_xyz(&priorPos, &common_data.eventDoorData.exitPos);
+ validPos = mFI_Wpos2BlockNum(&blockX, &blockZ, priorPos);
+ } else {
+ validPos = mFI_Wpos2BlockNum(&blockX, &blockZ, player->actor.world.pos);
+ }
+ } else {
+ validPos = mFI_GetNextBlockNum(&blockX, &blockZ);
+ }
+
+ if (validPos) {
+ attr = mBGMFieldSchedEv_bl_attr_get(blockX, blockZ, data->eventArea, data->blockType);
+ }
+ }
+
+ return attr;
+}
+
+void mBGMFieldSchedEv_Info_old_copy(BgmFieldScheduleInfo* info) {
+ if ((info->flag & 1)) {
+ info->flag |= 2;
+ } else {
+ info->flag &= ~2;
+ }
+
+ if ((info->flag & 4)) {
+ info->flag |= 8;
+ } else {
+ info->flag &= ~8;
+ }
+
+ info->priorAttribute = info->attribute;
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_standard(BgmFieldScheduleInfo* info, BgmEventData* data, UNUSED Game_Play* play,
+ s32 eventStartFlag) {
+ if (eventStartFlag || (info->flag & 1)) {
+ if (mEv_check_status(data->eventType, 1)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_Silence_0(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ s32 eventNow = FALSE;
+
+ if ((info->flag & 4) &&
+ mBGMClock_over_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 59, 0),
+ BGM_CLOCK_CHECK_ALL) &&
+ mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[0], play) == BGM_BL_ATTRIBUTE_ACTIVE) {
+ info->flag |= 0x10;
+ }
+
+ if (mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 59, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0), BGM_CLOCK_CHECK_ALL)) {
+ if ((info->flag & 0x10)) {
+ if (mEv_check_status(6, 8)) {
+ eventNow = TRUE;
+ }
+ } else {
+ eventNow = TRUE;
+ }
+ } else {
+ info->flag &= ~0x10;
+ }
+
+ if (eventNow) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_1(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ if (mEv_check_status(6, 1) &&
+ mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 0, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 30, 0), BGM_CLOCK_CHECK_ALL)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_2(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ if (mEv_check_status(6, 1) &&
+ mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 30, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 50, 0), BGM_CLOCK_CHECK_ALL)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_3(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ if (mEv_check_status(6, 1) &&
+ mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 50, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 55, 0), BGM_CLOCK_CHECK_ALL)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_4(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ if (mEv_check_status(6, 1) &&
+ mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_DECEMBER, 31, 23, 55, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0), BGM_CLOCK_CHECK_ALL)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_5(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ Game_Play* play, UNUSED s32 eventStartFlag) {
+ s32 eventNow = FALSE;
+
+ if (mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 1, 0, 0), BGM_CLOCK_CHECK_ALL)) {
+ if ((info->flag & 4) &&
+ mBGMClock_over_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0),
+ BGM_CLOCK_CHECK_ALL) &&
+ mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[16], play) != BGM_BL_ATTRIBUTE_INACTIVE) {
+ info->flag |= 0x20;
+ }
+
+ if ((info->flag & 0x20)) {
+ UNUSED s32 scoped;
+
+ if (mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[16], play) == BGM_BL_ATTRIBUTE_INACTIVE) {
+ info->flag &= ~0x20;
+ }
+ }
+
+ if (info->flag & 0x20) {
+ if (mEv_check_status(6, 1)) {
+ eventNow = TRUE;
+ }
+ }
+ } else {
+ info->flag &= ~0x20;
+ }
+
+ if (eventNow) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_CountDown_6(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ Game_Play* play, UNUSED s32 eventStartFlag) {
+ s32 eventNow = FALSE;
+
+ if (mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 1, 0, 0), BGM_CLOCK_CHECK_ALL)) {
+ if ((info->flag & 4) &&
+ mBGMClock_over_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0),
+ BGM_CLOCK_CHECK_ALL) &&
+ mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[17], play) != BGM_BL_ATTRIBUTE_INACTIVE) {
+ info->flag |= 0x20;
+ }
+
+ if (info->flag & 0x20) {
+ UNUSED s32 scoped;
+
+ if (mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[17], play) == BGM_BL_ATTRIBUTE_INACTIVE) {
+ info->flag &= ~0x20;
+ }
+ }
+
+ if (!(info->flag & 0x20)) {
+ if (mEv_check_status(6, 1)) {
+ eventNow = TRUE;
+ }
+ }
+ } else {
+ info->flag &= ~0x20;
+ }
+
+ if (eventNow) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_NewYear01(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ if (mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 18, 0, 0), BGM_CLOCK_CHECK_ALL)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_ev_now_set_NewYear02(BgmFieldScheduleInfo* info, UNUSED BgmEventData* data,
+ UNUSED Game_Play* play, UNUSED s32 eventStartFlag) {
+ if (mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 18, 0, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 2, 0, 0, 0), BGM_CLOCK_CHECK_ALL)) {
+ info->flag |= 1;
+ } else {
+ info->flag &= ~1;
+ }
+}
+
+void mBGMFieldSchedEv_Info_attr_now_set(BgmFieldScheduleInfo* info, Game_Play* play, BgmEventData* data) {
+ info->attribute = BGM_BL_ATTRIBUTE_INACTIVE;
+
+ if ((info->flag & 5) == 5) {
+ s32 attribute = mBGMFieldSchedEv_bl_attr_evdata_get(data, play);
+
+ if (attribute < BGM_BL_ATTRIBUTE_MAX) {
+ info->attribute = attribute;
+ }
+ }
+}
+
+typedef void (*BgmFieldScheduleEventInfoFunc)(BgmFieldScheduleInfo*, BgmEventData*, Game_Play*, s32);
+
+void mBGMFieldSchedEv_info_set(BgmFieldScheduleEvent* schedule, Game_Play* play) {
+ static BgmFieldScheduleEventInfoFunc ev_chk[] = {
+ mBGMFieldSchedEv_Info_ev_now_set_Silence_0, mBGMFieldSchedEv_Info_ev_now_set_standard,
+ mBGMFieldSchedEv_Info_ev_now_set_standard, mBGMFieldSchedEv_Info_ev_now_set_standard,
+ mBGMFieldSchedEv_Info_ev_now_set_standard, mBGMFieldSchedEv_Info_ev_now_set_standard,
+ mBGMFieldSchedEv_Info_ev_now_set_standard, mBGMFieldSchedEv_Info_ev_now_set_standard,
+ mBGMFieldSchedEv_Info_ev_now_set_standard, mBGMFieldSchedEv_Info_ev_now_set_standard,
+ mBGMFieldSchedEv_Info_ev_now_set_standard, mBGMFieldSchedEv_Info_ev_now_set_standard,
+ mBGMFieldSchedEv_Info_ev_now_set_CountDown_1, mBGMFieldSchedEv_Info_ev_now_set_CountDown_2,
+ mBGMFieldSchedEv_Info_ev_now_set_CountDown_3, mBGMFieldSchedEv_Info_ev_now_set_CountDown_4,
+ mBGMFieldSchedEv_Info_ev_now_set_CountDown_5, mBGMFieldSchedEv_Info_ev_now_set_CountDown_6,
+ mBGMFieldSchedEv_Info_ev_now_set_standard, mBGMFieldSchedEv_Info_ev_now_set_NewYear01,
+ mBGMFieldSchedEv_Info_ev_now_set_NewYear02,
+ };
+
+ BgmFieldScheduleInfo* info;
+ BgmEventData* data;
+ s32 i;
+ s32 edge = mEv_check_status_edge(1);
+ s32 validField = mFI_CheckFieldData() && FI_GET_TYPE(mFI_GetFieldId()) == 0;
+
+ for (i = 0, info = schedule->info, data = mbgm_event_data; i < ARRAY_COUNT(mbgm_event_data); info++, i++, data++) {
+ mBGMFieldSchedEv_Info_old_copy(info);
+ info->flag &= ~4;
+
+ if (validField) {
+ info->flag |= 4;
+ }
+
+ ev_chk[i](info, data, play, edge);
+ mBGMFieldSchedEv_Info_attr_now_set(info, play, data);
+ }
+}
+
+void mBGMFieldSchedEv_Info_ps_delete(UNUSED BgmFieldScheduleInfo* info, BgmEventData* data, s32 flag) {
+ mBGMPsComp_delete_ps_fieldSchedEv(data->num, 0x168);
+
+ if (flag) {
+ s32 num = mBGMPsComp_execute_bgm_num_get();
+
+ if (num == data->num) {
+ mBGMPsComp_search_cf_set_field(data->num, 10);
+ }
+ }
+}
+void mBGMFieldSchedEv_Info_ps_make(BgmFieldScheduleInfo* info, BgmEventData* data, s32 priority) {
+ s32 updateVolumeCtrl =
+ info->attribute != BGM_BL_ATTRIBUTE_INACTIVE && info->priorAttribute == BGM_BL_ATTRIBUTE_INACTIVE;
+ s32 updateVolumeLevel = mbgm_pattern_data[data->eventArea][info->attribute] == 1;
+ s32 crossfade = mBGMPsComp_execute_bgm_num_get() >= 0;
+ u16 stopType = priority == 0 ? (u16)0xA8C : (u16)0x168;
+
+ mBGMPsComp_make_ps_fieldSchedEv(data->num, updateVolumeCtrl, updateVolumeLevel, crossfade, stopType, priority);
+}
+
+void mBGMFieldSchedEv_Info_ps_volume_change(BgmFieldScheduleInfo* info, BgmEventData* data) {
+ s32 flag = mbgm_pattern_data[data->eventArea][info->attribute] == 1;
+
+ mBGMPsComp_volume_change_fieldSchedEv(data->num, TRUE, flag);
+}
+
+void mBGMFieldSchedEv_ps_compose(BgmFieldScheduleEvent* schedule, UNUSED Game_Play* play) {
+ s32 i;
+ s32 nowFlag = 0;
+ s32 priorFlag;
+ BgmFieldScheduleInfo* info;
+ BgmEventData* data;
+ s32 flag = TRUE;
+
+ for (i = 0, info = schedule->info, data = mbgm_event_data; i < ARRAY_COUNT(mbgm_event_data); i++, info++, data++) {
+ nowFlag = (info->flag & 5) == 5 && info->attribute != BGM_BL_ATTRIBUTE_INACTIVE;
+ priorFlag = (info->flag & 10) == 10 && info->priorAttribute != BGM_BL_ATTRIBUTE_INACTIVE;
+
+ if (!nowFlag && priorFlag) {
+ mBGMFieldSchedEv_Info_ps_delete(info, data, flag);
+ }
+
+ if (nowFlag && !priorFlag) {
+ if (data && data) {}
+ mBGMFieldSchedEv_Info_ps_make(info, data, i);
+ }
+
+ if (nowFlag && priorFlag) {
+ s32 nowVol = mbgm_pattern_data[data->eventArea][info->attribute];
+ s32 priorVol = mbgm_pattern_data[data->eventArea][info->priorAttribute];
+
+ if (nowVol != priorVol && nowVol != 0 && priorVol != 0 && data->num != 255) {
+ mBGMFieldSchedEv_Info_ps_volume_change(info, data);
+ }
+ }
+
+ if (flag && priorFlag) {
+ flag = FALSE;
+ }
+ }
+}
+void mBGMFieldSchedEv_sp_flag(BgmFieldScheduleEvent* schedule) {
+ BgmFieldScheduleInfo* info0 = &schedule->info[16];
+ BgmFieldScheduleInfo* info1 = &schedule->info[17];
+
+ if ((((info0->flag & 5) == 5 && info0->attribute != BGM_BL_ATTRIBUTE_INACTIVE) ||
+ ((info1->flag & 5) == 5 && info1->attribute != BGM_BL_ATTRIBUTE_INACTIVE)) &&
+ mBGMClock_range_time_check(&M_bgm.clock, BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 0, 0),
+ BGM_RTC_TIME_TO_BGM_TIME(lbRTC_JANUARY, 1, 0, 1, 0), BGM_CLOCK_CHECK_ALL)) {
+ mBGMTime_new_year_ev_flag_set();
+ } else {
+ mBGMTime_new_year_ev_flag_clr();
+ }
+}
+
+void mBGMFieldSchedEv_move(BgmFieldScheduleEvent* schedule, Game_Play* play) {
+ mBGMFieldSchedEv_info_set(schedule, play);
+ mBGMFieldSchedEv_ps_compose(schedule, play);
+ mBGMFieldSchedEv_sp_flag(schedule);
+}
+
+void mBGMFieldSchedEv_ct(BgmFieldScheduleEvent* schedule) {
+ s32 i;
+ bzero(schedule, sizeof(BgmFieldScheduleEvent));
+
+ for (i = 0; i < ARRAY_COUNT(schedule->info); i++) {
+ schedule->info[i].priorAttribute = BGM_BL_ATTRIBUTE_INACTIVE;
+ schedule->info[i].attribute = BGM_BL_ATTRIBUTE_INACTIVE;
+ }
+}
+
+u8 mBGMFieldNorm_bgm_num_get(s32 hour) {
+ static u8 bgm_table[lbRTC_HOURS_PER_DAY] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
+ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 };
+
+ return bgm_table[hour];
+}
+
+void mBGMFieldNorm_elem_set(BgmFieldNorm* norm) {
+ s32 hour = common_data.time.rtcTime.hour % 24;
+
+ mBGMElem_default_set(&norm->element);
+ norm->element.num = mBGMFieldNorm_bgm_num_get(hour);
+}
+
+void mBGMFieldNorm_make_bgm(BgmFieldNorm* norm, UNUSED Game_Play* play) {
+ if (norm->element.num == 255) {
+ mBGMFieldNorm_elem_set(norm);
+ mBGMPsComp_make_ps_fieldNorm(norm->element.num, 0x168);
+ }
+}
+
+void mBGMFieldNorm_delete_bgm(BgmFieldNorm* norm) {
+ if (norm->element.num != 255) {
+ mBGMPsComp_delete_ps_fieldNorm(norm->element.num, norm->element.stopType0);
+ norm->element.num = 255;
+ }
+}
+
+void mBGMFieldNorm_move(BgmFieldNorm* norm, Game_Play* play) {
+ if (mBGMClock_over_time_check(&M_bgm.clock, 0, BGM_CLOCK_CHECK_MIN | BGM_CLOCK_CHECK_SEC) && mFI_CheckFieldData() &&
+ FI_GET_TYPE(mFI_GetFieldId()) == 0) {
+ norm->deleteFlag = TRUE;
+ norm->makeFlag = TRUE;
+ }
+
+ if (norm->deleteFlag) {
+ mBGMFieldNorm_delete_bgm(norm);
+ }
+
+ if (norm->makeFlag) {
+ mBGMFieldNorm_make_bgm(norm, play);
+ }
+
+ norm->makeFlag = FALSE;
+ norm->deleteFlag = FALSE;
+}
+
+void mBGMFieldNorm_make_req() {
+ M_bgm.fieldNorm.makeFlag = TRUE;
+}
+
+void mBGMFieldNorm_delete_req() {
+ M_bgm.fieldNorm.deleteFlag = TRUE;
+}
+
+void mBGMFieldNorm_ct(BgmFieldNorm* norm) {
+ bzero(norm, sizeof(BgmFieldNorm));
+ mBGMElem_default_set(&norm->element);
+}
+
+void mBGMPs_counter_dec(BgmPS* ps) {
+ if (ps->counter > 0) {
+ ps->counter--;
+
+ if (ps->counter == 0) {
+ ps->cfFlags |= 1;
+ }
+ }
+}
+
+void mBGMPsComp_ps_remove(BgmPSComp* psComp, s32 removePos) {
+ if (removePos >= 0 && removePos < BGM_PS_MAX) {
+ if (removePos < psComp->psNum && psComp->psNum > 0) {
+ s32 i;
+ s32 max = psComp->psNum - 1;
+
+ for (i = removePos; i < max; i++) {
+ psComp->ps[i] = psComp->ps[i + 1];
+ }
+
+ bzero(&psComp->ps[max], sizeof(BgmPS));
+ psComp->psNum = max;
+ }
+ }
+}
+
+s32 mBGMPsComp_search_insert_pos_kategorie(BgmPSComp* psComp, s32 category, u8 priority) {
+ s32 max = psComp->psNum;
+ s32 res = -1;
+
+ if (max < BGM_PS_MAX) {
+ s32 i = 0;
+ BgmPS* ps = psComp->ps;
+
+ res = max;
+ for (; i < max; i++, ps++) {
+ if ((category == ps->category && priority < ps->priority) || category < ps->category) {
+ res = i;
+ break;
+ }
+ }
+ } else {
+ res = -1;
+ }
+
+ return res;
+}
+
+s32 mBGMPsComp_search_pos_kategorie_bgm_num(BgmPSComp* psComp, s32 category, u8 num, s32 counterFlag, s32 delPass) {
+ BgmPS* ps;
+ s32 validCategory = category < 12;
+ s32 bgmIsReset = num != 255;
+ s32 res = -1;
+ s32 mask = delPass != 0 ? 0 : 1;
+
+ if (validCategory || bgmIsReset) {
+ s32 max = psComp->psNum;
+ s32 i = 0;
+
+ for (ps = psComp->ps; i < max; i++, ps++) {
+ if ((!validCategory || ps->category == category) && (bgmIsReset == 0 || ps->element.num == num) &&
+ (counterFlag == FALSE || (ps->counter < 0 && (ps->cfFlags & 0x80) == 0)) &&
+ ((ps->cfFlags & mask) == 0)) {
+ res = i;
+ break;
+ }
+ }
+ }
+
+ return res;
+}
+
+void mBGMPsComp_shift_behind(BgmPSComp* psComp, s32 shiftIdx) {
+ if (psComp->psNum != 0) {
+ s32 i;
+
+ for (i = psComp->psNum - 1; i >= shiftIdx; i--) {
+ bcopy(&psComp->ps[i], &psComp->ps[i + 1], sizeof(BgmPS));
+ }
+ }
+
+ bzero(&psComp->ps[shiftIdx], sizeof(BgmPS));
+ psComp->psNum++;
+}
+
+void mBGMPsComp_all_ps_bitclr(BgmPSComp* psComp, u8 bits) {
+ BgmPS* ps;
+ s32 max = psComp->psNum;
+ s32 i = 0;
+
+ for (ps = psComp->ps; i < max; i++, ps++) {
+ ps->cfFlags &= ~bits;
+ }
+}
+
+s32 mBGMPsComp_execute_ps_pos_get(BgmPSComp* psComp) {
+ BgmPS* ps;
+ s32 idx = -1;
+ s32 max = psComp->psNum;
+ s32 i = 0;
+
+ for (ps = psComp->ps; i < max; i++, ps++) {
+ if ((ps->cfFlags & 4)) {
+ idx = i;
+ break;
+ }
+ }
+
+ return idx;
+}
+
+BgmPS* mBGMPsComp_high_ps_not_delete(BgmPSComp* psComp, s32 maxPos) {
+ BgmPS* ps;
+ BgmPS* highPs = NULL;
+ s32 max = maxPos;
+ s32 i = 0;
+
+ for (ps = psComp->ps; i < max; i++, ps++) {
+ if (!(ps->cfFlags & 1)) {
+ highPs = ps;
+ break;
+ }
+ }
+
+ return highPs;
+}
+
+void mBGMPsComp_main_req_stop(BgmPSComp* psComp) {
+ s32 executePos;
+ BgmPS* ps;
+ BgmPS* highPs;
+
+ executePos = mBGMPsComp_execute_ps_pos_get(psComp);
+ if (executePos >= 0) {
+ ps = psComp->ps + executePos;
+
+ if ((ps->cfFlags & 0x40) == 0) {
+ if (executePos > 0) {
+ highPs = mBGMPsComp_high_ps_not_delete(psComp, executePos);
+
+ if (highPs != NULL) {
+ psComp->stop.requestFlag = TRUE;
+ psComp->stop.type = highPs->element.stopType1;
+ return;
+ }
+ }
+
+ if ((ps->cfFlags & 0x1) && (ps->cfFlags & 0x100) == 0) {
+ psComp->stop.requestFlag = TRUE;
+ psComp->stop.type = ps->element.stopType0;
+ }
+ }
+ }
+}
+
+void mBGMPsComp_main_remove(BgmPSComp* psComp) {
+ BgmPS* ps;
+ s32 i;
+
+ for (i = psComp->psNum - 1, ps = &psComp->ps[i]; i >= 0; i--, ps--) {
+ if ((ps->cfFlags & 1)) {
+ ps->cfFlags &= ~1;
+ mBGMPsComp_ps_remove(psComp, i);
+ }
+ }
+}
+
+void mBGMPsComp_main_req_start(BgmPSComp* psComp) {
+ if (psComp->psNum > 0) {
+ BgmPS* ps = &psComp->ps[0];
+
+ if ((ps->cfFlags & 4) == 0) {
+ if ((ps->cfFlags & 0x40) == 0) {
+ psComp->start.requestFlag = TRUE;
+
+ psComp->start.flags = ps->cfFlags & 0x8 ? 1 : 0;
+ psComp->start.num = ps->element.num;
+
+ if (mBGM_check_MD(ps->element.num) == FALSE) {
+ ps->cfFlags |= 2;
+ }
+ }
+
+ mBGMPsComp_all_ps_bitclr(psComp, 4);
+ ps->cfFlags |= 4;
+ }
+
+ mBGMPsComp_all_ps_bitclr(psComp, 8);
+ }
+}
+
+void mBGMPsComp_main_req_pause(BgmPSComp* psComp) {
+ if (psComp->pauseState == 1 || psComp->pauseState == 3) {
+ psComp->pause.mode = 1;
+ psComp->pause.requestFlag = TRUE;
+ } else if (psComp->pauseState == 2) {
+ psComp->pause.mode = 2;
+ psComp->pause.requestFlag = TRUE;
+ } else if (psComp->pauseState == 5) {
+ psComp->pause.mode = 0;
+ psComp->pause.requestFlag = TRUE;
+ }
+}
+
+void mBGMPsComp_main_req_md(BgmPSComp* psComp) {
+ if (psComp->md.moveFlag) {
+ psComp->md.requestFlag = TRUE;
+ }
+}
+
+void mBGMPsComp_main_md_move(BgmPSComp* psComp) {
+ BgmPSMd* md = &psComp->md;
+
+ if (md->deleteFlag) {
+ md->moveFlag = FALSE;
+ md->deleteFlag = FALSE;
+ }
+
+ if (md->makeFlag) {
+ md->moveFlag = TRUE;
+ md->makeFlag = FALSE;
+ }
+}
+
+void mBGMPsComp_main_req_volume_ps(BgmPSComp* psComp) {
+ if (psComp->psNum > 0) {
+ if ((psComp->ps[0].cfFlags & 2)) {
+ if ((psComp->ps[0].cfFlags & 0x10)) {
+ psComp->volume.psVolumeMoveCounter = 90;
+ } else {
+ psComp->volume.psVolumeMoveCounter = 0;
+ }
+
+ if ((psComp->ps[0].cfFlags & 0x20)) {
+ psComp->volume.psVolume = 0.5f;
+ } else {
+ psComp->volume.psVolume = 1.0f;
+ }
+
+ psComp->volume.psRequestFlag = TRUE;
+ }
+
+ mBGMPsComp_all_ps_bitclr(psComp, 0x12);
+ }
+
+ if (mBGMPsComp_execute_bgm_num_get() < 0) {
+ psComp->volume.psVolume = -1.0f;
+ }
+}
+
+void func_8005D2A4_jp(BgmPSComp* psComp) {
+ if (psComp->fishInsectState == 1) {
+ psComp->fishInsectState = 2;
+ psComp->volume.fishingInsectVolume = 0.65f;
+ psComp->volume.fishingInsectVolumeMoveCounter = 100;
+ psComp->volume.fishingInsectRequestFlag = TRUE;
+ } else if (psComp->fishInsectState == 3) {
+ psComp->fishInsectState = 0;
+ psComp->volume.fishingInsectVolume = -1.0f;
+ psComp->volume.fishingInsectVolumeMoveCounter = 17;
+
+ if (psComp->psNum <= 0 || mBGM_check_MD(psComp->ps[0].element.num) == FALSE) {
+ psComp->volume.fishingInsectRequestFlag = TRUE;
+ }
+ }
+}
+
+void mBGMPsComp_main_req_volume_talk(BgmPSComp* psComp) {
+ if (psComp->talkState == 1) {
+ psComp->talkState = 2;
+ psComp->volume.talkVolume = 0.7f;
+ psComp->volume.talkRequestFlag = TRUE;
+ } else if (psComp->talkState == 3) {
+ psComp->talkState = 0;
+ psComp->volume.talkVolume = -1.0f;
+
+ if (psComp->psNum <= 0 || mBGM_check_MD(psComp->ps[0].element.num) == FALSE) {
+ psComp->volume.talkRequestFlag = TRUE;
+ }
+ }
+}
+
+void mBGMPsComp_main_req_volume_pause(BgmPSComp* psComp) {
+ if (psComp->pauseState == 1) {
+ psComp->pauseState = 4;
+ psComp->volume.pauseVolume = 0.5f;
+ psComp->volume.pauseVolumeMoveCounter = 2;
+ psComp->volume.pauseRequestFlag = TRUE;
+ } else if (psComp->pauseState == 2) {
+ psComp->pauseState = 4;
+ psComp->volume.pauseVolume = 0.0f;
+ psComp->volume.pauseVolumeMoveCounter = 2;
+ psComp->volume.pauseRequestFlag = TRUE;
+ } else if (psComp->pauseState == 3) {
+ psComp->pauseState = 4;
+ psComp->volume.pauseVolume = 0.5f;
+ psComp->volume.pauseVolumeMoveCounter = 2;
+ psComp->volume.pauseRequestFlag = TRUE;
+ } else if (psComp->pauseState == 5) {
+ psComp->pauseState = 0;
+ psComp->volume.pauseVolume = -1.0f;
+ psComp->volume.pauseVolumeMoveCounter = 2;
+
+ if (psComp->psNum <= 0 || mBGM_check_MD(psComp->ps[0].element.num) == FALSE) {
+ psComp->volume.pauseRequestFlag = TRUE;
+ }
+ }
+}
+void mBGMPsComp_main_req_volume(BgmPSComp* psComp) {
+ f32 psVolume;
+ f32 fishInsectVolume;
+ f32 talkVolume;
+ f32 pauseVolume;
+ f32 finalVolume;
+ u16 finalVolumeMoveCounter;
+ BgmPS* ps = &psComp->ps[0];
+
+ s32 ignoreTalk;
+ s32 ignoreFishInsect;
+ BgmPSVolume* volume;
+ f32 psVolumeTemp;
+
+ volume = &psComp->volume;
+
+ ignoreTalk = psComp->psNum > 0 ? mBGM_check_ignore_talk_volume(ps->element.num) : FALSE;
+ ignoreFishInsect = psComp->psNum > 0 ? func_8005ACA8_jp(ps->element.num) : FALSE;
+
+ mBGMPsComp_main_req_volume_ps(psComp);
+ func_8005D2A4_jp(psComp);
+ mBGMPsComp_main_req_volume_talk(psComp);
+ mBGMPsComp_main_req_volume_pause(psComp);
+
+ psVolumeTemp = volume->psVolume;
+ psVolume = psVolumeTemp;
+
+ if (psVolumeTemp < 0.0f) {
+ fishInsectVolume = -1.0f;
+ talkVolume = -1.0f;
+ pauseVolume = -1.0f;
+ } else {
+ fishInsectVolume =
+ (volume->fishingInsectVolume < 0.0f || ignoreFishInsect) ? psVolume : volume->fishingInsectVolume;
+
+ talkVolume = (volume->talkVolume < 0.0f || ignoreTalk) ? fishInsectVolume : volume->talkVolume;
+
+ pauseVolume = (volume->pauseVolume < 0.0f) ? talkVolume : volume->pauseVolume;
+ }
+
+ finalVolume = -1.0f;
+ finalVolumeMoveCounter = 0;
+
+ if (volume->psRequestFlag) {
+ finalVolume = psVolume;
+ finalVolumeMoveCounter = volume->psVolumeMoveCounter;
+ }
+
+ if (volume->fishingInsectRequestFlag && !ignoreFishInsect) {
+ finalVolume = fishInsectVolume;
+ finalVolumeMoveCounter = volume->fishingInsectVolumeMoveCounter;
+ }
+
+ if (volume->talkRequestFlag && !ignoreTalk) {
+ finalVolume = talkVolume;
+ finalVolumeMoveCounter = 30;
+ }
+
+ if (volume->pauseRequestFlag) {
+ finalVolume = pauseVolume;
+ finalVolumeMoveCounter = volume->pauseVolumeMoveCounter;
+ }
+
+ if (psComp->pauseState == 4) {
+ if ((finalVolume < 0) == FALSE) {
+ finalVolume = pauseVolume;
+ }
+ } else if (psComp->talkState == 2) {
+ if ((finalVolume < 0) == FALSE) {
+ finalVolume = talkVolume;
+ }
+ } else if (psComp->fishInsectState == 2) {
+ if ((finalVolume < 0) == FALSE) {
+ finalVolume = fishInsectVolume;
+ }
+ }
+
+ if ((finalVolume < 0.0f) == FALSE) {
+ volume->mainVolume = finalVolume;
+ volume->mainVolumeMoveCounter = finalVolumeMoveCounter;
+ volume->mainRequestFlag = TRUE;
+ }
+
+ volume->psRequestFlag = FALSE;
+ volume->fishingInsectRequestFlag = FALSE;
+ volume->talkRequestFlag = FALSE;
+ volume->pauseRequestFlag = FALSE;
+}
+
+void mBGMPsComp_MDPlayerPos_main_inform_sound(BgmPSMd* md) {
+ if (md->requestFlag) {
+ sAdo_MDPlayerPos(&md->pos, md->angle, md->mdType, md->ongenNum);
+ md->requestFlag = FALSE;
+ }
+}
+
+void mBGMPsComp_Arm_main_inform_sound(BgmPSArm* arm) {
+ if (arm->requestFlag) {
+ if (mBGMPsComp_execute_bgm_num_get() == 43) {
+ sAdos_TTKK_ARM(arm->armState);
+
+ if (arm->armState == 0) {
+ mBGMPsComp_arm_delete();
+ }
+ } else {
+ mBGMPsComp_arm_delete();
+ }
+ }
+}
+
+void mBGMPsComp_Stop_main_inform_sound(BgmPSStop* stop) {
+ if (stop->requestFlag) {
+ sAdo_BgmStop(stop->type);
+ stop->requestFlag = FALSE;
+ }
+}
+
+void mBGMPsComp_Start_main_inform_sound(BgmPSStart* start) {
+ if (start->requestFlag) {
+ if (start->flags != 0) {
+ sAdo_BgmCrossfadeStart(start->num);
+ } else {
+ sAdo_BgmStart(start->num);
+
+ if (start->num == 43) {
+ if (common_data.save.sceneNo == SCENE_PLAYERSELECT_2) {
+ mBGMPsComp_arm_make(1);
+ } else {
+ mBGMPsComp_arm_make(0);
+ }
+ }
+ }
+
+ start->requestFlag = FALSE;
+ }
+}
+
+void mBGMPsComp_Volume_main_inform_sound(BgmPSVolume* volume) {
+ if (volume->mainRequestFlag) {
+ sAdo_BGMVolume(volume->mainVolume, volume->mainVolumeMoveCounter);
+ volume->mainRequestFlag = FALSE;
+ }
+}
+
+void mBGMPsComp_Pause_main_inform_sound(BgmPSPause* pause) {
+ if (pause->requestFlag) {
+ sAdo_Pause(pause->mode);
+ pause->requestFlag = FALSE;
+ }
+}
+
+void mBGMPsComp_main_inform_sound(BgmPSComp* psComp) {
+ mBGMPsComp_MDPlayerPos_main_inform_sound(&psComp->md);
+ mBGMPsComp_Arm_main_inform_sound(&psComp->arm);
+ mBGMPsComp_Stop_main_inform_sound(&psComp->stop);
+ mBGMPsComp_Start_main_inform_sound(&psComp->start);
+ mBGMPsComp_Pause_main_inform_sound(&psComp->pause);
+ mBGMPsComp_Volume_main_inform_sound(&psComp->volume);
+}
+
+void mBGMPsComp_main_counter_dec(BgmPSComp* psComp) {
+ BgmPS* ps;
+ s32 i;
+ s32 max = psComp->psNum;
+
+ for (i = 0, ps = psComp->ps; i < max; i++, ps++) {
+ mBGMPs_counter_dec(ps);
+ }
+}
+
+void mBGMPsComp_main_fo_check(BgmPSComp* psComp) {
+ BgmPS* ps;
+ s32 i;
+ s32 max = psComp->psNum;
+
+ for (i = 0, ps = psComp->ps; i < max; i++, ps++) {
+ if (ps->cfFlags & 0x80) {
+ s32 executePos = mBGMPsComp_execute_ps_pos_get(psComp);
+
+ if ((executePos >= i || executePos < 0) || (psComp->ps[executePos].element.num == 255) ||
+ (psComp->ps[executePos].cfFlags & 0x40)) {
+ if (sAdo_BgmFadeoutCheck() == FALSE) {
+ continue;
+ }
+ }
+
+ ps->cfFlags &= ~0x80;
+ ps->cfFlags |= 1;
+ }
+ }
+}
+
+void mBGMPsComp_main_lost(BgmPSComp* psComp) {
+ BgmPS* ps;
+ s32 i;
+ s32 max = psComp->psNum;
+
+ for (i = 0, ps = psComp->ps; i < max; i++, ps++) {
+ if ((ps->cfFlags & 0x100)) {
+ ps->cfFlags |= 1;
+ }
+ }
+}
+
+s32 mBGMPsComp_make_ps(BgmPSComp* psComp, BgmElement* element, s32 category, s16 counter, u16 cfFlags, u8 priority) {
+ s32 pos = mBGMPsComp_search_insert_pos_kategorie(psComp, category, priority);
+
+ if (pos >= 0) {
+ BgmPS* dstPs = &psComp->ps[pos];
+
+ mBGMPsComp_shift_behind(psComp, pos);
+ bcopy(element, &dstPs->element, sizeof(BgmElement));
+ dstPs->category = category;
+ dstPs->counter = counter;
+ dstPs->cfFlags = cfFlags;
+ dstPs->priority = priority;
+ }
+
+ return pos;
+}
+
+void _mBGMPsComp_make_ps_fanfare(u8 num, u16 stopType) {
+ UNUSED s32 pad;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(&M_bgm.psComp, &element, 0, -1, 0, 0xFF);
+}
+
+void mBGMPsComp_make_ps_fanfare(u8 num, u16 stopType) {
+ _mBGMPsComp_make_ps_fanfare(num, stopType);
+}
+
+void _mBGMPsComp_make_ps_lost_fanfare(u8 num, u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 0, -1, 0x100, 0xFF);
+}
+
+void mBGMPsComp_make_ps_lost_fanfare(u8 num, u16 stopType) {
+ _mBGMPsComp_make_ps_lost_fanfare(num, stopType);
+}
+
+void _mBGMPsComp_make_ps_wipe(u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ if (mBGMForce_wipe_ps_make_permit(&M_bgm.force) &&
+ mBGMPsComp_search_pos_kategorie_bgm_num(psComp, 1, 255, FALSE, FALSE) < 0) {
+ mBGMElem_default_set(&element);
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(&M_bgm.psComp, &element, 1, -1, 0x40, 0xFF);
+ }
+}
+
+void mBGMPsComp_make_ps_wipe(u16 stopType) {
+ _mBGMPsComp_make_ps_wipe(stopType);
+}
+
+void _mBGMPsComp_make_ps_quiet(u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 2, -1, 0x40, 0xFF);
+}
+
+void mBGMPsComp_make_ps_quiet(u16 stopType) {
+ _mBGMPsComp_make_ps_quiet(stopType);
+}
+
+void _mBGMPsComp_make_ps_co_quiet(u16 stopType, s16 counter) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 2, counter, 0x40, 0xFF);
+}
+
+void mBGMPsComp_make_ps_co_quiet(u16 stopType, s16 counter) {
+ _mBGMPsComp_make_ps_co_quiet(stopType, counter);
+}
+
+void _mBGMPsComp_make_ps_demo(u8 num, u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 3, -1, 0, 0xFF);
+}
+
+void mBGMPsComp_make_ps_demo(u8 num, u16 stopType) {
+ _mBGMPsComp_make_ps_demo(num, stopType);
+}
+
+void _mBGMPsComp_make_ps_happening(u8 num, u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 4, -1, 0, 0xFF);
+}
+
+void mBGMPsComp_make_ps_happening(u8 num, u16 stopType) {
+ _mBGMPsComp_make_ps_happening(num, stopType);
+}
+
+void mBGMPsComp_make_ps_quietRoom(u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 5, -1, 0x40, 0xFF);
+}
+
+void _mBGMPsComp_make_ps_room(u8 num, u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 6, -1, 0, 0xFF);
+}
+
+void mBGMPsComp_make_ps_room(u8 num, u16 stopType) {
+ _mBGMPsComp_make_ps_room(num, stopType);
+}
+
+void mBGMPsComp_make_ps_time() {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.stopType1 = 0x870;
+ mBGMPsComp_make_ps(psComp, &element, 7, -1, 0x40, 0xFF);
+}
+
+void _mBGMPsComp_make_ps_quietField(u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 8, -1, 0x40, 0xFF);
+}
+
+void mBGMPsComp_make_ps_quietField(u16 stopType) {
+ _mBGMPsComp_make_ps_quietField(stopType);
+}
+
+void _mBGMPsComp_make_ps_fc_quietField(u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 8, -1, 0xC0, 0xFF);
+}
+
+void mBGMPsComp_make_ps_fc_quietField(u16 stopType) {
+ _mBGMPsComp_make_ps_fc_quietField(stopType);
+}
+
+void _mBGMPsComp_make_ps_fieldSuddenEv(u8 num, u16 stopType, u8 priority) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 9, -1, 0, priority);
+}
+
+void mBGMPsComp_make_ps_fieldSuddenEv(u8 num, u16 stopType, u8 priority) {
+ _mBGMPsComp_make_ps_fieldSuddenEv(num, stopType, priority);
+}
+
+void mBGMPsComp_make_ps_fieldSchedEv(u8 num, s32 updateVolumeMoveCounter, s32 updateVolumeFlag, s32 cfFlag,
+ u16 stopType, u8 priority) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+ u16 flags;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ flags = 0;
+
+ if (updateVolumeMoveCounter) {
+ flags |= 0x10;
+ }
+
+ if (updateVolumeFlag) {
+ flags |= 0x20;
+ }
+
+ if (cfFlag) {
+ flags |= 8;
+ }
+
+ if (num == 255) {
+ flags |= 0x40;
+ }
+
+ mBGMPsComp_make_ps(psComp, &element, 10, -1, flags, priority);
+}
+
+void mBGMPsComp_make_ps_fieldNorm(u8 num, u16 stopType) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ BgmElement element;
+
+ mBGMElem_default_set(&element);
+ element.num = num;
+ element.stopType1 = stopType;
+ mBGMPsComp_make_ps(psComp, &element, 11, -1, 0, 0xFF);
+}
+
+void mBGMPsComp_delete_ps(BgmPSComp* psComp, s32 category, u8 num, u16 stopType, s32 counterFlag) {
+ s32 searchNum = mBGMPsComp_search_pos_kategorie_bgm_num(psComp, category, num, counterFlag, FALSE);
+
+ if (searchNum >= 0 && searchNum < psComp->psNum) {
+ psComp->ps[searchNum].cfFlags |= 1;
+ psComp->ps[searchNum].element.stopType0 = stopType;
+ }
+}
+
+void _mBGMPsComp_delete_ps_fanfare(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 0, num, stopType, FALSE);
+}
+
+void mBGMPsComp_delete_ps_fanfare(u8 num, u16 stopType) {
+ _mBGMPsComp_delete_ps_fanfare(num, stopType);
+}
+
+void mBGMPsComp_delete_ps_wipe() {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 1, 255, 0x168, FALSE);
+}
+
+void _mBGMPsComp_delete_ps_quiet() {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 2, 255, 0x168, TRUE);
+}
+
+void mBGMPsComp_delete_ps_quiet() {
+ _mBGMPsComp_delete_ps_quiet();
+}
+
+void _mBGMPsComp_delete_ps_demo(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 3, num, stopType, FALSE);
+}
+
+void mBGMPsComp_delete_ps_demo(u8 num, u16 stopType) {
+ _mBGMPsComp_delete_ps_demo(num, stopType);
+}
+
+void _mBGMPsComp_delete_ps_happening(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 4, num, stopType, FALSE);
+}
+
+void mBGMPsComp_delete_ps_happening(u8 num, u16 stopType) {
+ _mBGMPsComp_delete_ps_happening(num, stopType);
+}
+
+void mBGMPsComp_delete_ps_quietRoom() {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 5, 255, 0x168, TRUE);
+}
+
+void _mBGMPsComp_delete_ps_room(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 6, num, stopType, FALSE);
+}
+
+void mBGMPsComp_delete_ps_room(u8 num, u16 stopType) {
+ _mBGMPsComp_delete_ps_room(num, stopType);
+}
+
+void mBGMPsComp_delete_ps_time() {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 7, 255, 0x168, FALSE);
+}
+
+void _mBGMPsComp_delete_ps_quietField() {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 8, 255, 0x168, TRUE);
+}
+
+void mBGMPsComp_delete_ps_quietField() {
+ _mBGMPsComp_delete_ps_quietField();
+}
+
+void _mBGMPsComp_delete_ps_fieldSuddenEv(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 9, num, stopType, FALSE);
+}
+
+void mBGMPsComp_delete_ps_fieldSuddenEv(u8 num, u16 stopType) {
+ _mBGMPsComp_delete_ps_fieldSuddenEv(num, stopType);
+}
+
+void mBGMPsComp_delete_ps_fieldSchedEv(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 10, num, stopType, FALSE);
+}
+
+void mBGMPsComp_delete_ps_fieldNorm(u8 num, u16 stopType) {
+ mBGMPsComp_delete_ps(&M_bgm.psComp, 11, num, stopType, FALSE);
+}
+
+void mBGMPsComp_volume_change_fieldSchedEv(u8 num, s32 updateVolumeCounter, s32 updateVolumeLevel) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ s32 posNum = mBGMPsComp_search_pos_kategorie_bgm_num(psComp, 10, num, FALSE, FALSE);
+
+ if (posNum >= 0) {
+ BgmPS* ps = &psComp->ps[posNum];
+
+ if (updateVolumeCounter) {
+ ps->cfFlags |= 0x10;
+ }
+
+ if (updateVolumeLevel) {
+ ps->cfFlags |= 0x20;
+ } else {
+ ps->cfFlags &= ~0x20;
+ }
+
+ ps->cfFlags |= 2;
+ }
+}
+
+void mBGMPsComp_search_cf_set_field(u8 num, s32 category) {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ s32 posNum = mBGMPsComp_search_pos_kategorie_bgm_num(psComp, category, num, FALSE, TRUE);
+
+ if (posNum >= 0) {
+ s32 i;
+
+ for (i = posNum + 1; i < psComp->psNum; i++) {
+ if (psComp->ps[i].category == 9 || psComp->ps[i].category == 10 || psComp->ps[i].category == 11) {
+ psComp->ps[i].cfFlags |= 0x18;
+ }
+ }
+ }
+}
+
+void func_8005E9B4_jp() {
+ M_bgm.psComp.fishInsectState = 1;
+}
+
+void func_8005E9C8_jp() {
+ M_bgm.psComp.fishInsectState = 3;
+}
+
+void mBGMPsComp_volume_talk_start() {
+ M_bgm.psComp.talkState = 1;
+}
+
+void mBGMPsComp_volume_talk_end() {
+ BgmPSComp* psComp = &M_bgm.psComp;
+
+ if (psComp->talkState != 0) {
+ psComp->talkState = 3;
+ }
+}
+
+void mBGMPsComp_pause(s32 state) {
+ M_bgm.psComp.pauseState = state;
+}
+
+void mBGMPsComp_MDPlayerPos_make() {
+ M_bgm.psComp.md.makeFlag = TRUE;
+}
+
+void mBGMPsComp_MDPlayerPos_delete() {
+ M_bgm.psComp.md.deleteFlag = TRUE;
+}
+
+void mBGMPsComp_MDPlayerPos_param_set(xyz_t* pos, u16 angle, u16 mdType, u32 ongenNum) {
+ BgmPSMd* md;
+
+ md = &M_bgm.psComp.md;
+
+ xyz_t_move(&md->pos, pos);
+ md->angle = angle;
+ md->mdType = mdType;
+ md->ongenNum = ongenNum;
+}
+
+void mBGMPsComp_scene_mode(u8 mode) {
+ sAdo_SceneMode(mode);
+}
+
+void mBGMPsComp_arm_make(s32 state) {
+ BgmPSArm* arm = &M_bgm.psComp.arm;
+
+ arm->requestFlag = TRUE;
+ arm->armState = state;
+}
+
+void mBGMPsComp_arm_delete() {
+ BgmPSArm* arm = &M_bgm.psComp.arm;
+
+ arm->requestFlag = FALSE;
+ arm->armState = 0;
+}
+
+s32 mBGMPsComp_execute_bgm_num_get() {
+ BgmPSComp* psComp = &M_bgm.psComp;
+ s32 pos = mBGMPsComp_execute_ps_pos_get(psComp);
+
+ if (pos >= 0 && psComp->ps[pos].element.num != 255 && (psComp->ps[pos].cfFlags & 0x40) == 0) {
+ return psComp->ps[pos].element.num;
+ }
+
+ return -1;
+}
+
+void mBGMPsComp_ct(BgmPSComp* psComp) {
+ BgmPSVolume* volume = &psComp->volume;
+
+ bzero(psComp, sizeof(BgmPSComp));
+
+ volume->mainVolume = -1.0f;
+ volume->mainVolumeMoveCounter = 0;
+ volume->psVolume = -1.0f;
+ volume->psVolumeMoveCounter = 0;
+ volume->fishingInsectVolume = -1.0f;
+ volume->fishingInsectVolumeMoveCounter = 100;
+ volume->talkVolume = -1.0f;
+ volume->pauseVolume = -1.0f;
+ volume->pauseVolumeMoveCounter = 2;
+}
+
+s32 mBGMForce_wipe_ps_make_permit(BgmForce* force) {
+ return force->roomNonstop == 0;
+}
+
+void mBGMForce_move_inform(BgmForce* force) {
+ if (force->inform == 1) {
+ s32 checkField = mFI_CheckFieldData();
+
+ if (checkField == FALSE || (checkField != FALSE && FI_GET_TYPE(mFI_GetFieldId()) != 0)) {
+ force->flag = TRUE;
+ mBGMPsComp_make_ps_wipe(0x428A);
+ }
+
+ force->inform = 2;
+ } else if (force->inform == 3) {
+ force->inform = 4;
+ } else if (force->inform == 5) {
+ if (force->flag) {
+ mBGMPsComp_make_ps_wipe(0x28A);
+ }
+
+ force->inform = 6;
+ } else if (force->inform == 7) {
+ force->inform = 0;
+ force->flag = FALSE;
+ }
+}
+
+void mBGMForce_move_room_nonstop(BgmForce* force) {
+ if (force->roomNonstop == 1) {
+ force->roomNonstop = 2;
+ } else if (force->roomNonstop == 3) {
+ force->roomNonstop = 0;
+ }
+}
+
+void mBGMForce_move(BgmForce* force) {
+ mBGMForce_move_inform(force);
+ mBGMForce_move_room_nonstop(force);
+}
+
+void mBGMForce_ct(BgmForce* force) {
+ bzero(force, sizeof(BgmForce));
+}
+
+void mBGMForce_inform_cleanup(BgmForce* force) {
+ if (force->inform == 2) {
+ force->inform = 3;
+ } else if (force->inform == 6) {
+ force->inform = 7;
+ }
+}
+
+void mBGMForce_room_nonstop_cleanup(BgmForce* force) {
+ if (force->roomNonstop == 2) {
+ force->roomNonstop = 3;
+ }
+}
+
+void mBGMForce_cleanup(BgmForce* force) {
+ mBGMForce_inform_cleanup(force);
+ mBGMForce_room_nonstop_cleanup(force);
+}
+
+void mBGMForce_inform_start() {
+ M_bgm.force.inform = 1;
+}
+
+void mBGMForce_inform_end() {
+ M_bgm.force.inform = 5;
+}
+
+void _mBGMForce_room_nonstop_start() {
+ M_bgm.force.roomNonstop = 1;
+}
+
+void mBGMForce_room_nonstop_start() {
+ _mBGMForce_room_nonstop_start();
+}
+
+void mBGM_main_control(Bgm* bgm) {
+ BgmPSComp* psComp = &bgm->psComp;
+
+ mBGMPsComp_main_req_md(psComp);
+ mBGMPsComp_main_req_stop(psComp);
+ mBGMPsComp_main_remove(psComp);
+ mBGMPsComp_main_req_start(psComp);
+ mBGMPsComp_main_req_pause(psComp);
+ mBGMPsComp_main_req_volume(psComp);
+ mBGMPsComp_main_inform_sound(psComp);
+ mBGMPsComp_main_md_move(psComp);
+ mBGMPsComp_main_counter_dec(psComp);
+ mBGMPsComp_main_fo_check(psComp);
+ mBGMPsComp_main_lost(psComp);
+}
+
+void mBGM_weather_set() {
+ s16 weather = common_data.weather;
+
+ if (weather >= mEnv_WEATHER_LEAVES) {
+ weather = mEnv_WEATHER_SAKURA;
+ } else if (weather < 0) {
+ weather = mEnv_WEATHER_CLEAR;
+ }
+
+ sAdo_Tenki(weather);
+}
+
+void mBGM_main(Game* game) {
+ Game_Play* play = (Game_Play*)game;
+
+ mBGMClock_move(&M_bgm.clock, play);
+ mBGMDemo_move(&M_bgm.demo, play);
+ mBGMRoom_move(&M_bgm.room, play);
+ mBGMFieldSuddenEv_move(&M_bgm.fieldSuddenEvent, play);
+ mBGMFieldSchedEv_move(&M_bgm.fieldScheduleEvent, play);
+ mBGMFieldNorm_move(&M_bgm.fieldNorm, play);
+ mBGMTime_move(&M_bgm.time, play);
+ mBGM_main_control(&M_bgm);
+ mBGMForce_move(&M_bgm.force);
+ mBGM_weather_set();
+}
+
+void mBGM_ct() {
+ mBGMClock_ct(&M_bgm.clock);
+ mBGMDemo_ct(&M_bgm.demo);
+ mBGMRoom_ct(&M_bgm.room);
+ mBGMTime_ct(&M_bgm.time);
+ mBGMFieldSuddenEv_ct(&M_bgm.fieldSuddenEvent);
+ mBGMFieldSchedEv_ct(&M_bgm.fieldScheduleEvent);
+ mBGMFieldNorm_ct(&M_bgm.fieldNorm);
+ mBGMPsComp_ct(&M_bgm.psComp);
+ mBGMForce_ct(&M_bgm.force);
+}
+
+void mBGM_init() {
+ mBGMPsComp_delete_ps_wipe();
+
+ if (mFI_CheckFieldData()) {
+ u16 fieldId = mFI_GetFieldId();
+ u16 fieldType = FI_GET_TYPE(fieldId);
+ BgmForce* force = &M_bgm.force;
+
+ if (fieldType == 0) {
+ if (mEv_CheckTitleDemo() > 0) {
+ mBGMPsComp_make_ps_demo(70, 0x168);
+ } else {
+ if ((force->inform != 3 && force->inform != 7) || force->flag) {
+ mBGMFieldNorm_make_req();
+ }
+
+ if (force->inform == 3 && force->flag) {
+ mBGMPsComp_make_ps_quiet(0x168);
+ }
+ }
+ } else if (fieldType == 0x3000 || fieldType == 0x4000 || fieldType == 0x6000) {
+ if (force->roomNonstop != 3) {
+ mBGMRoom_shop_close_time_set(&M_bgm.room);
+ mBGMRoom_scene_bgm_make_req();
+ }
+ } else {
+ mBGMDemo_scene_bgm_make_req();
+ }
+ }
+}
+
+void mBGM_cleanup() {
+ BgmForce* force = &M_bgm.force;
+
+ mBGMForce_cleanup(force);
+ if (mFI_CheckFieldData()) {
+ u16 fieldId = mFI_GetFieldId();
+ u16 fieldType = FI_GET_TYPE(fieldId);
+
+ if (fieldType == 0) {
+ if (mEv_CheckTitleDemo() > 0) {
+ mBGMPsComp_delete_ps_demo(70, 0x168);
+ } else {
+ if ((force->inform != 3 && force->inform != 7) || force->flag) {
+ mBGMFieldNorm_delete_req();
+ }
+
+ if (force->inform == 7 && force->flag) {
+ mBGMPsComp_delete_ps_quiet();
+ }
+ }
+ } else if (fieldType == 0x3000 || fieldType == 0x4000 || fieldType == 0x6000) {
+ if (force->roomNonstop != 3) {
+ mBGMRoom_scene_bgm_delete_req();
+ }
+ } else {
+ mBGMDemo_scene_bgm_delete_req();
+ }
+ }
+}
+
+void mBGM_reset() {
+ Bgm* bgm = &M_bgm;
+ BgmPSComp* psComp = &bgm->psComp;
+ BgmPS* ps = psComp->ps;
+ s32 i;
+ s32 max = psComp->psNum;
+
+ for (i = 0; i < max; i++, ps++) {
+ ps->cfFlags |= 1;
+ ps->element.stopType0 = 0x168;
+ }
+
+ psComp->talkState = 0;
+
+ if (psComp->pauseState != 0) {
+ sAdo_Pause(0);
+ psComp->pauseState = 0;
+ }
+
+ mBGMDemo_ct(&bgm->demo);
+ mBGMRoom_ct(&bgm->room);
+ mBGMTime_ct(&bgm->time);
+ mBGMFieldSuddenEv_ct(&bgm->fieldSuddenEvent);
+ mBGMFieldSchedEv_ct(&bgm->fieldScheduleEvent);
+ mBGMFieldNorm_ct(&bgm->fieldNorm);
+ mBGMForce_ct(&bgm->force);
+}
diff --git a/src/code/m_demo.c b/src/code/m_demo.c
index b6562e7..a317b24 100644
--- a/src/code/m_demo.c
+++ b/src/code/m_demo.c
@@ -7,7 +7,7 @@
#include "libc/math.h"
#include "m_field_info.h"
#include "audio.h"
-#include "67E840.h"
+#include "m_bgm.h"
f32 direct_vector[DEMO_DIRECT_MAX][2] = { { -1.0f, 0.0f }, { -M_SQRT2, M_SQRT2 }, { 0.0f, 1.0f },
{ M_SQRT2, M_SQRT2 }, { 1.0f, 0.0f }, { M_SQRT2, -M_SQRT2 },
diff --git a/src/code/m_field_info.c b/src/code/m_field_info.c
index 4932487..a005e5b 100644
--- a/src/code/m_field_info.c
+++ b/src/code/m_field_info.c
@@ -5,7 +5,7 @@
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_ClearFieldData.s")
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_80087C40_jp.s")
+#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_CheckFieldData.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_GetBlockTopP.s")
@@ -259,7 +259,7 @@
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_GetPlayerWade.s")
-#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/func_8008C130_jp.s")
+#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_GetNextBlockNum.s")
#pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_field_info/mFI_GetDepositP.s")
diff --git a/src/overlays/actors/player_actor/m_player.c b/src/overlays/actors/player_actor/m_player.c
index f187543..77c348e 100644
--- a/src/overlays/actors/player_actor/m_player.c
+++ b/src/overlays/actors/player_actor/m_player.c
@@ -10,7 +10,7 @@
#include "m_scene_table.h"
#include "m_debug.h"
#include "m_demo.h"
-#include "67E840.h"
+#include "m_bgm.h"
extern ClObjPipe_Init Player_actor_OcInfoData_forStand;
#if 0
diff --git a/src/overlays/gamestates/ovl_first_game/first_game.c b/src/overlays/gamestates/ovl_first_game/first_game.c
index cf01443..e5d79d1 100644
--- a/src/overlays/gamestates/ovl_first_game/first_game.c
+++ b/src/overlays/gamestates/ovl_first_game/first_game.c
@@ -1,6 +1,6 @@
#include "first_game.h"
#include "m_common_data.h"
-#include "67E840.h"
+#include "m_bgm.h"
#include "attributes.h"
#include "overlays/gamestates/ovl_second_game/second_game.h"
diff --git a/src/overlays/gamestates/ovl_play/m_play.c b/src/overlays/gamestates/ovl_play/m_play.c
index 64b6ec9..f5fbca7 100644
--- a/src/overlays/gamestates/ovl_play/m_play.c
+++ b/src/overlays/gamestates/ovl_play/m_play.c
@@ -34,7 +34,7 @@
#include "libu64/gfxprint.h"
#include "libc/alloca.h"
#include "m_std_dma.h"
-#include "67E840.h"
+#include "m_bgm.h"
#include "overlays/gamestates/ovl_famicom_emu/famicom_emu.h"
#include "overlays/gamestates/ovl_trademark/m_trademark.h"
#include "6A7D20.h"
diff --git a/src/overlays/gamestates/ovl_trademark/m_trademark.c b/src/overlays/gamestates/ovl_trademark/m_trademark.c
index a6868b3..819f723 100644
--- a/src/overlays/gamestates/ovl_trademark/m_trademark.c
+++ b/src/overlays/gamestates/ovl_trademark/m_trademark.c
@@ -17,7 +17,7 @@
#include "sys_matrix.h"
#include "libc64/qrand.h"
#include "m_std_dma.h"
-#include "67E840.h"
+#include "m_bgm.h"
#include "69CB30.h"
#include "6B3DC0.h"
#include "6B8F20.h"
diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml
index 7164735..3d00310 100644
--- a/yamls/jp/code.yaml
+++ b/yamls/jp/code.yaml
@@ -14,7 +14,8 @@
- [0x67C6B0, c, code/m_actor_dlftbls]
- [0x67C890, c, code/m_actor_shadow]
- [0x67D890, asm, code/67D890]
- - [0x67E840, asm, code/67E840]
+ - [0x67E840, c, code/m_bgm]
+ - [0x683020, pad] #extra alignment
- [0x683030, asm, code/683030]
- [0x688CE0, c, code/m_choice_main]
- [0x68AAF0, c, code/m_clip]
@@ -145,7 +146,8 @@
- [0x724910, .data, code/m_actor]
- [0x724930, .data, code/m_actor_dlftbls]
- [0x726260, .data, code/m_actor_shadow]
- - [0x7262C0, data, code/7262C0]
+ - [0x7262C0, .data, code/m_bgm]
+ - [0x726410, data, code/726410]
- start: 0x726720
type: .data
name: code/m_choice_main
@@ -211,7 +213,7 @@
- [0x739EA0, .rodata, code/m_actor_dlftbls]
- [0x739EF0, .rodata, code/m_actor_shadow]
- [0x739F20, rodata, code/739F20]
- - [0x739F70, rodata, code/739F70]
+ - [0x739F70, .rodata, code/m_bgm]
- [0x739FA0, rodata, code/739FA0]
- [0x73A080, .rodata, code/m_choice_main]
- [0x73A0F0, rodata, code/73A0F0]
@@ -292,6 +294,8 @@
- { start: 0x73F4D0, type: .bss, vram: 0x8011B850, name: code/m_actor }
- { start: 0x73F4D0, type: .bss, vram: 0x8011B890, name: code/m_actor_dlftbls }
- { start: 0x73F4D0, type: bss, vram: 0x8011B8B0, name: code/8011B8B0 }
+ - { start: 0x74AB40, type: .bss, vram: 0x80123CD0, name: code/m_bgm}
+ - { start: 0x74AB40, type: bss, vram: 0x80123F80, name: code/80123F80}
- { start: 0x73F4D0, type: .bss, vram: 0x80126E70, name: code/m_collision_obj }
- { start: 0x74AB40, type: .bss, vram: 0x80126EA0, name: code/m_common_data }
- { start: 0x75B600, type: bss, vram: 0x80137960, name: code/80137960 }