diff options
| author | Prakxo <87568477+Prakxo@users.noreply.github.com> | 2024-10-13 17:36:51 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-13 08:36:51 -0700 |
| commit | 78d0c294c50f9ade86f9e60cb2bea6479b56357a (patch) | |
| tree | 0c55c9b75fa942d7c05fcf4d2acd5e0bc62447dd | |
| parent | 60cc4c9e2368f4ae47c24931b6530dabdc5e35dd (diff) | |
m_bgm OK (#222)
* m_demo OK
* camera fix
* m_bgm OK
| -rw-r--r-- | include/67E840.h | 188 | ||||
| -rw-r--r-- | include/6E3240.h | 3 | ||||
| -rw-r--r-- | include/m_bgm.h | 406 | ||||
| -rw-r--r-- | include/m_common_data.h | 3 | ||||
| -rw-r--r-- | include/m_event.h | 2 | ||||
| -rw-r--r-- | include/m_field_info.h | 4 | ||||
| -rw-r--r-- | include/m_melody.h | 2 | ||||
| -rw-r--r-- | linker_scripts/jp/symbol_addrs_code.txt | 338 | ||||
| -rw-r--r-- | src/code/game.c | 4 | ||||
| -rw-r--r-- | src/code/m_bgm.c | 2075 | ||||
| -rw-r--r-- | src/code/m_demo.c | 2 | ||||
| -rw-r--r-- | src/code/m_field_info.c | 4 | ||||
| -rw-r--r-- | src/overlays/actors/player_actor/m_player.c | 2 | ||||
| -rw-r--r-- | src/overlays/gamestates/ovl_first_game/first_game.c | 2 | ||||
| -rw-r--r-- | src/overlays/gamestates/ovl_play/m_play.c | 2 | ||||
| -rw-r--r-- | src/overlays/gamestates/ovl_trademark/m_trademark.c | 2 | ||||
| -rw-r--r-- | yamls/jp/code.yaml | 10 |
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 } |
