summaryrefslogtreecommitdiff
path: root/src/code
diff options
context:
space:
mode:
authorPrakxo <87568477+Prakxo@users.noreply.github.com>2024-10-13 17:36:51 +0200
committerGitHub <noreply@github.com>2024-10-13 08:36:51 -0700
commit78d0c294c50f9ade86f9e60cb2bea6479b56357a (patch)
tree0c55c9b75fa942d7c05fcf4d2acd5e0bc62447dd /src/code
parent60cc4c9e2368f4ae47c24931b6530dabdc5e35dd (diff)
m_bgm OK (#222)
* m_demo OK * camera fix * m_bgm OK
Diffstat (limited to 'src/code')
-rw-r--r--src/code/game.c4
-rw-r--r--src/code/m_bgm.c2075
-rw-r--r--src/code/m_demo.c2
-rw-r--r--src/code/m_field_info.c4
4 files changed, 2080 insertions, 5 deletions
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")