Files
ac-decomp/src/m_bgm.c
T
2023-12-13 18:19:42 -05:00

2970 lines
77 KiB
C

#include "m_bgm.h"
#include "game.h"
#include "libultra/libultra.h"
#include "m_common_data.h"
#include "m_event.h"
#include "m_lib.h"
#include "m_melody.h"
#include "m_player_lib.h"
#define mBGMPs_FLAG_REMOVE (1 << 0)
#define mBGMPs_FLAG_UPDATE_VOLUME (1 << 1)
#define mBGMPs_FLAG_EXECUTE (1 << 2)
#define mBGMPs_FLAG_CROSSFADE (1 << 3)
#define mBGMPs_FLAG_UPDATE_VOLUME_MOVE_CTR (1 << 4)
#define mBGMPs_FLAG_UPDATE_VOLUME_LEVEL (1 << 5)
#define mBGMPs_FLAG_SILENT (1 << 6)
#define mBGMPs_FLAG_FADEOUT (1 << 7)
#define mBGMPs_FLAG_LOST (1 << 8)
enum {
mBGM_KATEGORIE_FANFARE,
mBGM_KATEGORIE_WIPE,
mBGM_KATEGORIE_QUIET,
mBGM_KATEGORIE_DEMO,
mBGM_KATEGORIE_HAPPENING,
mBGM_KATEGORIE_QUIETROOM,
mBGM_KATEGORIE_ROOM,
mBGM_KATEGORIE_TIME,
mBGM_KATEGORIE_QUIETFIELD,
mBGM_KATEGORIE_FIELDSUDDENEV,
mBGM_KATEGORIE_FIELDSCHEDEV,
mBGM_KATEGORIE_FIELDNORM,
mBGM_KATEGORIE_NUM
};
enum {
mBGMForce_INFORM_0,
mBGMForce_INFORM_1,
mBGMForce_INFORM_2,
mBGMForce_INFORM_3,
mBGMForce_INFORM_4,
mBGMForce_INFORM_5,
mBGMForce_INFORM_6,
mBGMForce_INFORM_7,
mBGMForce_INFORM_NUM
};
typedef struct bgm_elem_s {
u8 bgm_num;
u8 _pad0;
u16 _pad1;
u16 stop_type0;
u16 stop_type1;
} mBGMElem;
typedef struct bgm_clock_s {
u32 now;
u32 before;
} mBGMClock;
typedef struct bgm_demo_s {
mBGMElem elem;
u8 make_flag;
u8 delete_flag;
u16 _pad;
} mBGMDemo;
typedef struct bgm_room_s {
mBGMElem elem;
u8 make_flag;
u8 delete_flag;
u8 shop_fadeout_flag;
u8 _pad;
u32 shop_close_time0;
u32 shop_close_time1;
} mBGMRoom;
typedef struct bgm_time_s mBGMTime;
typedef void (*mBGMTime_MOVE_PROC)(mBGMTime*, GAME*);
struct bgm_time_s {
mBGMTime_MOVE_PROC move_proc;
u8 new_year_ev_flag;
u8 _pad;
};
typedef struct bgm_field_sudden_ev_s {
u32 flag;
u32 old_flag;
} mBGMFieldSuddenEv;
typedef struct bgm_field_schedule_ev_info_s {
u32 flag;
int attr;
int old_attr;
} mBGMFieldSchedEv_Info;
typedef struct bgm_field_schedule_ev_s {
mBGMFieldSchedEv_Info info[24]; // every hour has its own info
} mBGMFieldSchedEv;
typedef struct bgm_field_normal_s {
mBGMElem elem;
u8 make_flag;
u8 delete_flag;
u16 _pad;
} mBGMFieldNorm;
typedef struct bgm_ps_s {
mBGMElem elem;
int kategorie;
s16 counter;
u16 cf_flags;
u8 priority;
u8 _pad;
} mBGMPs;
typedef struct bgm_ps_comp_stop_s {
u8 req_flag;
u16 type;
u8 _pad;
} mBGMPsComp_Stop;
typedef struct bgm_ps_comp_start_s {
u8 req_flag;
u8 bgm_num;
u8 flags;
u8 _pad;
} mBGMPsComp_Start;
typedef struct bgm_ps_comp_volume_s {
f32 main_volume;
u16 main_volume_move_ctr;
u8 main_req_flag;
u8 _pad0;
f32 ps_volume;
u16 ps_volume_move_ctr;
u8 ps_req_flag;
u8 _pad1;
f32 fishing_volume;
u16 fishing_volume_move_ctr;
u8 fishing_req_flag;
u8 _pad2;
f32 collect_insects_volume;
u16 collect_insects_volume_move_ctr;
u8 collect_insects_req_flag;
u8 _pad3;
f32 talk_volume;
u8 talk_req_flag;
u8 _pad4;
f32 boat_volume;
u8 boat_req_flag;
u8 _pad5;
f32 pause_volume;
u16 pause_volume_move_ctr;
u8 pause_req_flag;
u8 _pad6;
} mBGMPsComp_Volume;
typedef struct bgm_ps_comp_pause_s {
u8 req_flag;
u8 mode;
u16 _pad;
} mBGMPsComp_Pause;
typedef struct bgm_ps_comp_md_player_pos_s {
u8 req_flag;
u8 make_flag;
u8 delete_flag;
u8 move_flag;
xyz_t pos;
u16 angle;
u16 md_type_no;
u32 ongen_no;
} mBGMPsComp_MDPlayerPos;
#define mBGM_BGMPs_NUM 14
typedef struct bgm_ps_comp_arm_s {
u8 req_flag;
u8 arm_state;
u16 _pad;
} mBGMPsComp_Arm;
typedef struct bgm_ps_comp_museum_s {
u8 req_flag;
u8 type;
u16 _pad;
} mBGMPsComp_Museum;
typedef struct bgm_ps_comp_s {
mBGMPs ps[mBGM_BGMPs_NUM];
int ps_num;
int fishing_state;
int collect_insects_state;
int talk_state;
int boat_state;
int pause_state;
mBGMPsComp_Stop stop;
mBGMPsComp_Start start;
mBGMPsComp_Volume volume;
mBGMPsComp_Pause pause;
mBGMPsComp_MDPlayerPos md;
mBGMPsComp_Arm arm;
mBGMPsComp_Museum museum;
} mBGMPsComp;
typedef struct bgm_force_s {
int inform;
u8 flag;
int room_nonstop;
} mBGMForce;
typedef struct bgm_s {
mBGMClock clock;
mBGMDemo demo;
mBGMRoom room;
mBGMTime time;
mBGMFieldSuddenEv field_sudden_ev;
mBGMFieldSchedEv field_sched_ev;
mBGMFieldNorm field_norm;
mBGMPsComp ps_comp;
mBGMForce force;
} mBGM;
static mBGM M_bgm;
static int mBGM_check_MD(u8 bgm_num) {
int res = FALSE;
if ((bgm_num >= 0x80 && bgm_num <= 0xB3) || (bgm_num >= 0xB4 && bgm_num <= 0xB6)) {
res = TRUE;
}
return res;
}
static int mBGM_check_ignore_talk_volume(u8 bgm_num) {
/* TODO: defines/enums for these ids */
static const u8 bgm_data[44] = {
40,
73,
68,
74,
76,
75,
49,
50,
71,
64,
66,
78,
122,
125,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121
};
const u8* bgm_data_p = bgm_data;
int i;
for (i = 0; i < ARRAY_COUNT(bgm_data); i++) {
if (bgm_num == *bgm_data_p) {
return TRUE;
}
bgm_data_p++;
}
return FALSE;
}
static int mBGM_check_ignore_collect_insects_volume(u8 bgm_num) {
if (bgm_num == 40) {
return TRUE;
}
return FALSE;
}
static mBGMElem_default_set(mBGMElem* elem) {
static mBGMElem default_data = { 127, 0, 0, 0x168, 0x168 };
bcopy(&default_data, elem, sizeof(mBGMElem));
}
/* mBGMClock */
#define mBGMClock_CHK_ss (((1 << 6) - 1) << 0)
#define mBGMClock_CHK_mm (((1 << 6) - 1) << 6)
#define mBGMClock_CHK_hh (((1 << 5) - 1) << 12)
#define mBGMClock_CHK_DD (((1 << 5) - 1) << 17)
#define mBGMClock_CHK_MM (((1 << 4) - 1) << 22)
static int mBGMClock_after_time_check(mBGMClock* clock, u32 check_time, u32 check_mask) {
u32 t_now = clock->now & check_mask;
u32 t_check = check_time & check_mask;
if (t_now >= t_check) {
return TRUE;
}
return FALSE;
}
static int mBGMClock_over_time_check(mBGMClock* clock, u32 check_time, u32 check_mask) {
u32 t_now = clock->now & check_mask;
u32 t_before = clock->before & check_mask;
u32 t_check = check_time & check_mask;
if (t_now >= t_before) {
int res = FALSE;
if (t_check > t_before && t_check <= t_now) {
res = TRUE;
}
return res;
}
else {
int res = FALSE;
if (t_check > t_before || t_check <= t_now) {
res = TRUE;
}
return res;
}
}
static int mBGMClock_range_time_check(mBGMClock* clock, u32 check_time0, u32 check_time1, u32 check_mask) {
u32 t_now = clock->now & check_mask;
u32 t_check0 = check_time0 & check_mask;
u32 t_check1 = check_time1 & check_mask;
int res;
if (t_check1 >= t_check0) {
res = FALSE;
if (t_now >= t_check0 && t_now < t_check1) {
res = TRUE;
}
return res;
}
else {
res = FALSE;
if (t_now >= t_check0 || t_now < t_check1) {
res = TRUE;
}
return res;
}
}
static void mBGMClock_now_set(mBGMClock* clock) {
clock->before = clock->now;
clock->now =
((Common_Get(time.rtc_time).month & 0x0F) << 22) |
((Common_Get(time.rtc_time).day & 0x1F) << 17) |
((Common_Get(time.rtc_time).hour & 0x1F) << 12) |
((Common_Get(time.rtc_time).min & 0x3F) << 6) |
((Common_Get(time.rtc_time).sec & 0x3F) << 0);
}
static void mBGMClock_move(mBGMClock* clock, GAME* game) {
mBGMClock_now_set(clock);
}
static void mBGMClock_ct(mBGMClock* clock) {
bzero(clock, sizeof(mBGMClock));
mBGMClock_now_set(clock);
clock->before = clock->now;
}
/* mBGMDemo */
static void mBGMDemo_make_scene_bgm(mBGMDemo* demo) {
if (demo->elem.bgm_num == 127 && mFI_CheckFieldData()) {
mActor_name_t field_id = mFI_GetFieldId();
u8 bgm_num;
switch (field_id) {
case mFI_FIELD_DEMO_STARTDEMO:
case mFI_FIELD_DEMO_STARTDEMO2:
bgm_num = 42;
break;
case mFI_FIELD_DEMO_STARTDEMO3:
bgm_num = 123;
break;
case mFI_FIELD_DEMO_PLAYERSELECT:
if (Save_Get(scene_no) == SCENE_PLAYERSELECT_SAVE) {
bgm_num = 46;
}
else {
bgm_num = 43;
}
break;
default:
bgm_num = 127;
break;
}
if (bgm_num != 127) {
mBGMElem_default_set(&demo->elem);
demo->elem.bgm_num = bgm_num;
mBGMPsComp_make_ps_demo(bgm_num, 0x168);
}
}
}
static void mBGMDemo_delete_scene_bgm(mBGMDemo* demo) {
if (demo->elem.bgm_num != 127) {
mBGMPsComp_delete_ps_demo(demo->elem.bgm_num, 0x168);
demo->elem.bgm_num = 127;
}
}
static void mBGMDemo_move(mBGMDemo* demo, GAME* game) {
if (demo->delete_flag) {
mBGMDemo_delete_scene_bgm(demo);
}
if (demo->make_flag) {
mBGMDemo_make_scene_bgm(demo);
}
demo->make_flag = FALSE;
demo->delete_flag = FALSE;
}
static void mBGMDemo_scene_bgm_make_req() {
M_bgm.demo.make_flag = TRUE;
}
static void mBGMDemo_scene_bgm_delete_req() {
M_bgm.demo.delete_flag = TRUE;
}
static void mBGMDemo_ct(mBGMDemo* demo) {
bzero(demo, sizeof(mBGMDemo));
mBGMElem_default_set(&demo->elem);
}
/* mBGMRoom */
static void mBGMRoom_shop_close_time_set(mBGMRoom* room) {
if (mFI_CheckFieldData()) {
mActor_name_t field_id = mFI_GetFieldId();
if (
field_id == mFI_FIELD_ROOM_SHOP0 ||
field_id == mFI_FIELD_ROOM_SHOP1 ||
field_id == mFI_FIELD_ROOM_SHOP2 ||
field_id == mFI_FIELD_ROOM_SHOP3_1 ||
field_id == mFI_FIELD_ROOM_SHOP3_2
) {
lbRTC_time_c time;
bzero(&time, sizeof(lbRTC_time_c));
time.hour = mSP_GetShopCloseTime_Bgm();
lbRTC_Sub_mm(&time, 5);
room->shop_close_time1 = ((time.hour & 0x1F) << 12) | ((time.min & 0x3F) << 6) | ((time.sec & 0x3F) << 0);
lbRTC_Sub_ss(&time, 5);
room->shop_close_time0 = ((time.hour & 0x1F) << 12) | ((time.min & 0x3F) << 6) | ((time.sec & 0x3F) << 0);
}
}
}
static u8 mBGMRoom_make_scene_bgm_shop_get(mBGMRoom* room, mActor_name_t field_id) {
u8 bgm_num;
if (
mEv_CheckRealArbeit() == FALSE &&
mBGMClock_after_time_check(&M_bgm.clock, room->shop_close_time1, mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss)
) {
/* Play 'almost closing' music */
if (field_id == mFI_FIELD_ROOM_SHOP0) {
bgm_num = 79;
}
else if (field_id == mFI_FIELD_ROOM_SHOP1) {
bgm_num = 80;
}
else if (field_id == mFI_FIELD_ROOM_SHOP2) {
bgm_num = 81;
}
else {
bgm_num = 82;
}
}
else {
/* Play normal music */
if (field_id == mFI_FIELD_ROOM_SHOP0) {
bgm_num = 44;
}
else if (field_id == mFI_FIELD_ROOM_SHOP1) {
bgm_num = 37;
}
else if (field_id == mFI_FIELD_ROOM_SHOP2) {
bgm_num = 38;
}
else {
bgm_num = 39;
}
}
return bgm_num;
}
static void mBGMRoom_make_scene_bgm(mBGMRoom* room) {
if (room->elem.bgm_num == 127 && mFI_CheckFieldData()) {
mActor_name_t field_id = mFI_GetFieldId();
u8 bgm_num;
switch (field_id) {
case mFI_FIELD_ROOM_SHOP0:
case mFI_FIELD_ROOM_SHOP1:
case mFI_FIELD_ROOM_SHOP2:
case mFI_FIELD_ROOM_SHOP3_1:
case mFI_FIELD_ROOM_SHOP3_2:
bgm_num = mBGMRoom_make_scene_bgm_shop_get(room, field_id);
break;
case mFI_FIELD_ROOM_BROKER_SHOP:
bgm_num = 25;
break;
case mFI_FIELD_ROOM_POST_OFFICE:
if (Common_Get(post_girl_npc_type) != 0) {
bgm_num = 62;
}
else {
bgm_num = 41;
}
break;
case mFI_FIELD_ROOM_POLICE_BOX:
bgm_num = 45;
break;
case mFI_FIELD_ROOM_BUGGY:
bgm_num = 26;
break;
case mFI_FIELD_ROOM_KAMAKURA:
bgm_num = 77;
break;
case mFI_FIELD_ROOM_TENT:
bgm_num = 254;
break;
case mFI_FIELD_ROOM_MUSEUM_ENTRANCE:
case mFI_FIELD_ROOM_MUSEUM_PAINTING:
case mFI_FIELD_ROOM_MUSEUM_FOSSIL:
case mFI_FIELD_ROOM_MUSEUM_INSECT:
case mFI_FIELD_ROOM_MUSEUM_FISH:
bgm_num = 88;
break;
case mFI_FIELD_ROOM_NEEDLEWORK:
bgm_num = 89;
break;
case mFI_FIELD_ROOM_LIGHTHOUSE:
bgm_num = 90;
break;
default:
bgm_num = 127;
break;
}
if (bgm_num != 127) {
mBGMElem_default_set(&room->elem);
room->elem.bgm_num = bgm_num;
mBGMPsComp_make_ps_room(bgm_num, 0x168);
}
}
}
static void mBGMRoom_delete_scene_bgm(mBGMRoom* room) {
if (room->elem.bgm_num != 127) {
mBGMPsComp_delete_ps_room(room->elem.bgm_num, 0x168);
room->elem.bgm_num = 127;
}
}
static void mBGMPsComp_make_ps_quietRoom(u16 stop_type);
static void mBGMPsComp_delete_ps_quietRoom();
static int mBGMRoom_shop_close_check(mBGMRoom* room) {
int res = FALSE;
int time1_flag = FALSE;
int fadeout_flag = FALSE;
int temp_flag2;
if (mFI_CheckFieldData()) {
mActor_name_t field_id = mFI_GetFieldId();
if (
field_id == mFI_FIELD_ROOM_SHOP0 ||
field_id == mFI_FIELD_ROOM_SHOP1 ||
field_id == mFI_FIELD_ROOM_SHOP2 ||
field_id == mFI_FIELD_ROOM_SHOP3_1 ||
field_id == mFI_FIELD_ROOM_SHOP3_2
) {
int real_arbeit = mEv_CheckRealArbeit();
temp_flag2 = FALSE;
if (real_arbeit == FALSE && mBGMClock_range_time_check(&M_bgm.clock, room->shop_close_time0, room->shop_close_time1, mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss)) {
temp_flag2 = TRUE;
}
fadeout_flag = temp_flag2;
time1_flag = FALSE;
if (real_arbeit == FALSE && mBGMClock_over_time_check(&M_bgm.clock, room->shop_close_time1, mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss)) {
time1_flag = TRUE;
}
res = time1_flag;
}
}
if (fadeout_flag && room->shop_fadeout_flag == FALSE) {
mBGMPsComp_make_ps_quietRoom(0x13DE);
room->shop_fadeout_flag = TRUE;
}
else if (!fadeout_flag && room->shop_fadeout_flag) {
mBGMPsComp_delete_ps_quietRoom();
room->shop_fadeout_flag = FALSE;
}
return res;
}
static void mBGMRoom_move(mBGMRoom* room, GAME* game) {
if (mBGMRoom_shop_close_check(room)) {
room->delete_flag = TRUE;
room->make_flag = TRUE;
}
if (room->delete_flag) {
mBGMRoom_delete_scene_bgm(room);
}
if (room->make_flag) {
mBGMRoom_make_scene_bgm(room);
}
room->make_flag = FALSE;
room->delete_flag = FALSE;
}
static void mBGMRoom_scene_bgm_make_req() {
M_bgm.room.make_flag = TRUE;
}
static void mBGMRoom_scene_bgm_delete_req() {
M_bgm.room.delete_flag = TRUE;
}
static void mBGMRoom_ct(mBGMRoom* room) {
bzero(room, sizeof(mBGMRoom));
mBGMElem_default_set(&room->elem);
}
/* mBGMTime */
static void mBGMTime_signal_melody(mBGMTime* time, GAME* game) {
static u8 signal_melody_buf[mMld_MELODY_LEN];
if (
mEv_CheckFirstIntro() == FALSE &&
mEv_CheckTitleDemo() != -9 &&
mFI_CheckFieldData() &&
mFI_GET_TYPE(mFI_GetFieldId()) != mFI_FIELD_DEMO_STARTDEMO &&
time->new_year_ev_flag == FALSE &&
mPlib_get_player_actor_main_index(game) != mPlayer_INDEX_DEMO_GETON_BOAT &&
mPlib_get_player_actor_main_index(game) != mPlayer_INDEX_DEMO_GETON_BOAT_SITDOWN &&
mPlib_get_player_actor_main_index(game) != mPlayer_INDEX_DEMO_GETON_BOAT_WAIT &&
mPlib_get_player_actor_main_index(game) != mPlayer_INDEX_DEMO_GETON_BOAT_WADE &&
mPlib_get_player_actor_main_index(game) != mPlayer_INDEX_DEMO_GETOFF_BOAT_STANDUP &&
mPlib_get_player_actor_main_index(game) != mPlayer_INDEX_DEMO_GETOFF_BOAT
) {
mMld_GetMelody(signal_melody_buf);
if (mFI_CheckInIsland()) {
sAdo_Inst(0xFE, signal_melody_buf);
}
else {
sAdo_Inst(0xFF, signal_melody_buf);
}
}
}
static int mBGMTime_silent_check(mBGMTime* time) {
if (time->new_year_ev_flag) {
return FALSE;
}
/* Silent between XX:59:52 and XX:00:16 */
return mBGMClock_range_time_check(&M_bgm.clock, (59 << 6) | (52 << 0), (0 << 6) | (16 << 0), mBGMClock_CHK_mm | mBGMClock_CHK_ss);
}
static void mBGMTime_new_year_ev_flag_set() {
M_bgm.time.new_year_ev_flag = TRUE;
}
static void mBGMTime_new_year_ev_flag_clr() {
M_bgm.time.new_year_ev_flag = FALSE;
}
static void mBGMTime_move_wait(mBGMTime* time, GAME* game);
static void mBGMTime_move_change(mBGMTime* time, GAME* game);
static void mBGMPsComp_make_ps_time();
static void mBGMTime_move_wait(mBGMTime* time, GAME* game) {
if (mBGMTime_silent_check(time)) {
mBGMPsComp_make_ps_time();
time->move_proc = &mBGMTime_move_change;
}
}
static void mBGMPsComp_delete_ps_time();
static void mBGMTime_move_change(mBGMTime* time, GAME* game) {
/* Wait until XX:00:00 and then play the town tune melody */
if (mBGMClock_over_time_check(&M_bgm.clock, 0, mBGMClock_CHK_mm | mBGMClock_CHK_ss)) {
mBGMTime_signal_melody(time, game);
}
if (mBGMTime_silent_check(time) == FALSE) {
mBGMPsComp_delete_ps_time();
time->move_proc = &mBGMTime_move_wait;
}
}
static void mBGMTime_move(mBGMTime* time, GAME* game) {
(*time->move_proc)(time, game);
}
static void mBGMTime_ct(mBGMTime* time) {
bzero(time, sizeof(mBGMTime));
time->move_proc = &mBGMTime_move_wait;
}
/* mBGMFieldSuddenEv */
static int mBGMFieldSuddenEv_flag_check_island(mBGMFieldSuddenEv* field_sudden_ev, GAME* game) {
return mFI_CheckInJustIslandOutdoor();
}
static int mBGMFieldSuddenEv_flag_check_arbeit(mBGMFieldSuddenEv* field_sudden_ev, GAME* game) {
return mEv_CheckFirstJob();
}
typedef int (*mBGMFieldSuddenEv_EV_CHK_PROC)(mBGMFieldSuddenEv*, GAME*);
static void mBGMFieldSuddenEv_flag_set(mBGMFieldSuddenEv* field_sudden_ev, GAME* game) {
static mBGMFieldSuddenEv_EV_CHK_PROC ev_chk[] = {
&mBGMFieldSuddenEv_flag_check_island,
NULL,
&mBGMFieldSuddenEv_flag_check_arbeit
};
field_sudden_ev->old_flag = field_sudden_ev->flag;
field_sudden_ev->flag = 0;
if (mFI_CheckFieldData() && mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_FG) {
int i = 0;
u32 mask = 1;
for (i; i < 3; i++) {
if (ev_chk[i] != NULL && (*ev_chk[i])(field_sudden_ev, game) != FALSE) {
field_sudden_ev->flag |= mask;
}
mask <<= 1;
}
}
}
static void mBGMFieldSuddenEv_ps_compose(mBGMFieldSuddenEv* field_sudden_ev, GAME* game) {
static u8 bgm_num_data[3] = { 91, 127, 52 };
int now;
int old;
int i = 0;
int mask = 1;
for (i; i < 3; i++) {
now = (field_sudden_ev->flag & mask) != 0;
old = (field_sudden_ev->old_flag & mask) != 0;
if (!now && old) {
mBGMPsComp_delete_ps_fieldSuddenEv(bgm_num_data[i], 0x168);
}
if (now && !old) {
mBGMPsComp_make_ps_fieldSuddenEv(bgm_num_data[i], 0x168, i);
}
mask <<= 1;
}
}
static void mBGMFieldSuddenEv_move(mBGMFieldSuddenEv* field_sudden_ev, GAME* game) {
mBGMFieldSuddenEv_flag_set(field_sudden_ev, game);
mBGMFieldSuddenEv_ps_compose(field_sudden_ev, game);
}
static void mBGMFieldSuddenEv_ct(mBGMFieldSuddenEv* field_sudden_ev) {
bzero(field_sudden_ev, sizeof(mBGMFieldSuddenEv));
}
/* mBGMFieldSchedEv */
static int mbgm_pattern_data[3][3] = {
{ 2, 2, 2 },
{ 0, 1, 2 },
{ 0, 0, 2 }
};
#define mBGMEventArea_ALL 0 /* Happens everywhere */
#define mBGMEventArea_BLOCK 1 /* Happens at a specific block */
enum {
mBGMFieldSchedEv_EVENT_SILENCE_0,
mBGMFieldSchedEv_EVENT_FIREWORKS,
mBGMFieldSchedEv_EVENT_HALLOWEEN,
mBGMFieldSchedEv_EVENT_TOY_DAY,
mBGMFieldSchedEv_EVENT_CHERRY_BLOSSOM_FESTIVAL,
mBGMFieldSchedEv_EVENT_MORNING_AEROBICS,
mBGMFieldSchedEv_EVENT_HARVEST_MOON_13,
mBGMFieldSchedEv_EVENT_HARVEST_FESTIVAL,
mBGMFieldSchedEv_EVENT_SPORTS_FAIR_AEROBICS,
mBGMFieldSchedEv_EVENT_SPORTS_FAIR_FOOT_RACE,
mBGMFieldSchedEv_EVENT_SPORTS_FAIR_BALL_TOSS,
mBGMFieldSchedEv_EVENT_SPORTS_FAIR_TUG_OF_WAR,
mBGMFieldSchedEv_EVENT_COUNTDOWN_1,
mBGMFieldSchedEv_EVENT_COUNTDOWN_2,
mBGMFieldSchedEv_EVENT_COUNTDOWN_3,
mBGMFieldSchedEv_EVENT_COUNTDOWN_4,
mBGMFieldSchedEv_EVENT_COUNTDOWN_5,
mBGMFieldSchedEv_EVENT_COUNTDOWN_6,
mBGMFieldSchedEv_EVENT_NEW_YEARS,
mBGMFieldSchedEv_EVENT_HOTARU,
mBGMFieldSchedEv_EVENT_NEWYEAR01,
mBGMFieldSchedEv_EVENT_NEWYEAR02,
mBGMFieldSchedEv_EVENT_GROUNDHOG_DAY,
mBGMFieldSchedEv_EVENT_METEOR_SHOWER,
mBGMFieldSchedEv_EVENT_NUM
};
typedef struct bgm_event_data_s {
s16 event_type;
u8 bgm_num;
u8 event_area;
u32 block_type;
} mBGMEventData;
static mBGMEventData mbgm_event_data[mBGMFieldSchedEv_EVENT_NUM] = {
{
-1,
127,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
mEv_EVENT_FIREWORKS_SHOW,
55,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
mEv_EVENT_HALLOWEEN,
53,
mBGMEventArea_ALL,
mRF_BLOCKKIND_NONE
},
{
mEv_EVENT_TALK_TOY_DAY,
54,
mBGMEventArea_ALL,
mRF_BLOCKKIND_NONE
},
{
mEv_EVENT_CHERRY_BLOSSOM_FESTIVAL,
56,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_MORNING_AEROBICS,
27,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_HARVEST_MOON_FESTIVAL,
30,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
mEv_EVENT_HARVEST_FESTIVAL,
253,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_SPORTS_FAIR_AEROBICS,
27,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_SPORTS_FAIR_FOOT_RACE,
28,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_SPORTS_FAIR_BALL_TOSS,
29,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_SPORTS_FAIR_TUG_OF_WAR,
60,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN,
31,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
-1,
32,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
-1,
33,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
-1,
34,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
-1,
35,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
-1,
57,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
},
{
mEv_EVENT_NEW_YEARS_DAY,
59,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
-1,
255,
mBGMEventArea_ALL,
mRF_BLOCKKIND_NONE
},
{
-1,
36,
mBGMEventArea_ALL,
mRF_BLOCKKIND_NONE
},
{
-1,
61,
mBGMEventArea_ALL,
mRF_BLOCKKIND_NONE
},
{
mEv_EVENT_GROUNDHOG_DAY,
251,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_SHRINE
},
{
mEv_EVENT_METEOR_SHOWER,
250,
mBGMEventArea_BLOCK,
mRF_BLOCKKIND_POOL
}
};
enum {
mBGM_BL_ATTR_INACTIVE,
mBGM_BL_ATTR_NEARBY,
mBGM_BL_ATTR_ACTIVE,
mBGM_BL_ATTR_NUM
};
static int mBGMFieldSchedEv_bl_attr_get(int bx, int bz, int area, u32 block_type) {
int attr = mBGM_BL_ATTR_INACTIVE;
if (area == mBGMEventArea_ALL) {
attr = mBGM_BL_ATTR_ACTIVE;
}
else if (block_type != mRF_BLOCKKIND_NONE) {
int ev_bx;
int ev_bz;
if (mFI_BlockKind2BkNum(&ev_bx, &ev_bz, block_type)) {
int d_bx = ev_bx - bx;
int d_bz = ev_bz - bz;
if (d_bx == 0 && d_bz == 0) {
attr = mBGM_BL_ATTR_ACTIVE;
}
else if (area == mBGMEventArea_BLOCK) {
d_bx = ABS(d_bx);
d_bz = ABS(d_bz);
if ((d_bx == 0 && d_bz == 1) || (d_bx == 1 && d_bz == 0)) {
attr = mBGM_BL_ATTR_NEARBY;
}
}
}
}
return attr;
}
static int mBGMFieldSchedEv_bl_attr_evdata_get(mBGMEventData* data, GAME* game) {
PLAYER_ACTOR* player = GET_PLAYER_ACTOR((GAME_PLAY*)game);
int attr = mBGM_BL_ATTR_NUM;
if (player != NULL) {
int not_wading = mFI_CheckPlayerWade(mFI_WADE_NONE) || mFI_CheckPlayerWade(mFI_WADE_END);
int pos_valid;
int bx;
int bz;
if (not_wading) {
int inform = M_bgm.force.inform;
if (
inform == mBGMForce_INFORM_3 ||
inform == mBGMForce_INFORM_4 ||
inform == mBGMForce_INFORM_5 ||
inform == mBGMForce_INFORM_6
) {
xyz_t original_pos;
xyz_t_move_s_xyz(&original_pos, &Common_Get(event_door_data).exit_position);
pos_valid = mFI_Wpos2BlockNum(&bx, &bz, original_pos);
}
else {
pos_valid = mFI_Wpos2BlockNum(&bx, &bz, player->actor_class.world.position);
}
}
else {
pos_valid = mFI_GetNextBlockNum(&bx, &bz);
}
if (pos_valid) {
attr = mBGMFieldSchedEv_bl_attr_get(bx, bz, data->event_area, data->block_type);
}
}
return attr;
}
static void mBGMFieldSchedEv_Info_old_copy(mBGMFieldSchedEv_Info* sched_ev_info) {
if ((sched_ev_info->flag & 1)) {
sched_ev_info->flag |= 2;
}
else {
sched_ev_info->flag &= ~2;
}
if ((sched_ev_info->flag & 4)) {
sched_ev_info->flag |= 8;
}
else {
sched_ev_info->flag &= ~8;
}
sched_ev_info->old_attr = sched_ev_info->attr;
}
static void mBGMFieldSchedEv_Info_ev_now_set_standard(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (ev_start_flag || (sched_ev_info->flag & 1)) {
if (mEv_check_status(data->event_type, mEv_STATUS_ACTIVE)) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_Silence_0(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
int event_now = FALSE;
if (
(sched_ev_info->flag & 4) &&
mBGMClock_over_time_check(&M_bgm.clock, (12 << 22) | (31 << 17) | (23 << 12) | (59 << 6) | (0 << 0), mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss) &&
mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[mBGMFieldSchedEv_EVENT_SILENCE_0], game) == mBGM_BL_ATTR_ACTIVE
) {
sched_ev_info->flag |= 0x10;
}
if (
mBGMClock_range_time_check(
&M_bgm.clock,
(12 << 22) | (31 << 17) | (23 << 12) | (59 << 6) | (0 << 0),
( 1 << 22) | ( 1 << 17) | ( 0 << 12) | ( 0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
if ((sched_ev_info->flag & 0x10)) {
if (mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_PLAYSOUND)) {
event_now = TRUE;
}
}
else {
event_now = TRUE;
}
}
else {
sched_ev_info->flag &= ~0x10;
}
if (event_now) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_CountDown_1(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE) &&
mBGMClock_range_time_check(
&M_bgm.clock,
(12 << 22) | (31 << 17) | (23 << 12) | ( 0 << 6) | (0 << 0),
(12 << 22) | (31 << 17) | (23 << 12) | (30 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_CountDown_2(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE) &&
mBGMClock_range_time_check(
&M_bgm.clock,
(12 << 22) | (31 << 17) | (23 << 12) | (30 << 6) | (0 << 0),
(12 << 22) | (31 << 17) | (23 << 12) | (50 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_CountDown_3(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE) &&
mBGMClock_range_time_check(
&M_bgm.clock,
(12 << 22) | (31 << 17) | (23 << 12) | (50 << 6) | (0 << 0),
(12 << 22) | (31 << 17) | (23 << 12) | (55 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_CountDown_4(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE) &&
mBGMClock_range_time_check(
&M_bgm.clock,
(12 << 22) | (31 << 17) | (23 << 12) | (55 << 6) | (0 << 0),
( 1 << 22) | ( 1 << 17) | ( 0 << 12) | ( 0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_CountDown_5(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
int event_now = FALSE;
if (
mBGMClock_range_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (0 << 12) | (0 << 6) | (0 << 0),
(1 << 22) | (1 << 17) | (1 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
if (
(sched_ev_info->flag & 4) &&
mBGMClock_over_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (0 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
) &&
mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[mBGMFieldSchedEv_EVENT_COUNTDOWN_5], game) != mBGM_BL_ATTR_INACTIVE
) {
sched_ev_info->flag |= 0x20;
}
if (
(sched_ev_info->flag & 0x20) &&
mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[mBGMFieldSchedEv_EVENT_COUNTDOWN_5], game) == mBGM_BL_ATTR_INACTIVE
) {
sched_ev_info->flag &= ~0x20;
}
if ((sched_ev_info->flag & 0x20) && mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE)) {
event_now = TRUE;
}
}
else {
sched_ev_info->flag &= ~0x20;
}
if (event_now) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_CountDown_6(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
int event_now = FALSE;
if (
mBGMClock_range_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (0 << 12) | (0 << 6) | (0 << 0),
(1 << 22) | (1 << 17) | (1 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
if (
(sched_ev_info->flag & 4) &&
mBGMClock_over_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (0 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
) &&
mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[mBGMFieldSchedEv_EVENT_COUNTDOWN_6], game) != mBGM_BL_ATTR_INACTIVE
) {
sched_ev_info->flag |= 0x20;
}
if (
(sched_ev_info->flag & 0x20) &&
mBGMFieldSchedEv_bl_attr_evdata_get(&mbgm_event_data[mBGMFieldSchedEv_EVENT_COUNTDOWN_6], game) == mBGM_BL_ATTR_INACTIVE
) {
sched_ev_info->flag &= ~0x20;
}
if ((sched_ev_info->flag & 0x20) == 0 && mEv_check_status(mEv_EVENT_NEW_YEARS_EVE_COUNTDOWN, mEv_STATUS_ACTIVE)) {
event_now = TRUE;
}
}
else {
sched_ev_info->flag &= ~0x20;
}
if (event_now) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_Hotaru(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mBGMClock_range_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (0 << 12) | (0 << 6) | (0 << 0),
(1 << 22) | (1 << 17) | (1 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_NewYear01(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mBGMClock_range_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | ( 1 << 12) | (0 << 6) | (0 << 0),
(1 << 22) | (1 << 17) | (18 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_ev_now_set_NewYear02(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, GAME* game, int ev_start_flag) {
if (
mBGMClock_range_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (18 << 12) | (0 << 6) | (0 << 0),
(1 << 22) | (2 << 17) | ( 0 << 12) | (0 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
sched_ev_info->flag |= 1;
}
else {
sched_ev_info->flag &= ~1;
}
}
static void mBGMFieldSchedEv_Info_attr_now_set(mBGMFieldSchedEv_Info* sched_ev_info, GAME* game, mBGMEventData* data) {
sched_ev_info->attr = mBGM_BL_ATTR_INACTIVE;
if ((sched_ev_info->flag & (4 | 1)) == (4 | 1)) {
int attr = mBGMFieldSchedEv_bl_attr_evdata_get(data, game);
if (attr < mBGM_BL_ATTR_NUM) {
sched_ev_info->attr = attr;
}
}
}
typedef void (*mBGMFieldSchedEv_INFO_CHK_PROC)(mBGMFieldSchedEv_Info*, mBGMEventData*, GAME*, int);
static void mBGMFieldSchedEv_info_set(mBGMFieldSchedEv* sched_ev, GAME* game) {
static mBGMFieldSchedEv_INFO_CHK_PROC ev_chk[mBGMFieldSchedEv_EVENT_NUM] = {
&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_Hotaru,
&mBGMFieldSchedEv_Info_ev_now_set_NewYear01,
&mBGMFieldSchedEv_Info_ev_now_set_NewYear02,
&mBGMFieldSchedEv_Info_ev_now_set_standard,
&mBGMFieldSchedEv_Info_ev_now_set_standard
};
mBGMFieldSchedEv_Info* info;
mBGMEventData* data;
int i;
const int event_active_on_edge = mEv_check_status_edge(mEv_STATUS_ACTIVE);
const int valid_field = mFI_CheckFieldData() && mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_FG;
info = sched_ev->info;
data = mbgm_event_data;
for (i = 0; i < ARRAY_COUNT(mbgm_event_data); i++, info++, data++) {
mBGMFieldSchedEv_Info_old_copy(info);
info->flag &= ~4;
if (valid_field) {
info->flag |= 4;
}
(*ev_chk[i])(info, data, game, event_active_on_edge);
mBGMFieldSchedEv_Info_attr_now_set(info, game, data);
}
}
static void mBGMPsComp_delete_ps_fieldSchedEv(u8 bgm_num, u16 stop_type);
static void mBGMPsComp_search_cf_set_field(u8 bgm_num, int kategorie);
static void mBGMFieldSchedEv_Info_ps_delete(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, int flag) {
mBGMPsComp_delete_ps_fieldSchedEv(data->bgm_num, 0x168);
if (flag && data->bgm_num == mBGMPsComp_execute_bgm_num_get()) {
mBGMPsComp_search_cf_set_field(data->bgm_num, 10);
}
}
static void mBGMPsComp_make_ps_fieldSchedEv(u8 bgm_num, int update_volume_move_ctr, int update_volume_level, int cf_flag, u16 stop_type, u8 priority);
static void mBGMFieldSchedEv_Info_ps_make(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data, int priority) {
int update_volume_move_ctr = sched_ev_info->attr != mBGM_BL_ATTR_INACTIVE && sched_ev_info->old_attr == mBGM_BL_ATTR_INACTIVE;
int update_volume_level = mbgm_pattern_data[data->event_area][sched_ev_info->attr] == 1;
int crossfade = mBGMPsComp_execute_bgm_num_get() < 0 ? FALSE : TRUE;
u16 stop_type = priority == 0 ? (u16)0xA8C : (u16)0x168;
mBGMPsComp_make_ps_fieldSchedEv(data->bgm_num, update_volume_move_ctr, update_volume_level, crossfade, stop_type, priority);
}
static void mBGMPsComp_volume_change_fieldSchedEv(u8 bgm_num, int update_volume_move_ctr, int update_volume_level);
static void mBGMFieldSchedEv_Info_ps_volume_change(mBGMFieldSchedEv_Info* sched_ev_info, mBGMEventData* data) {
int flag = mbgm_pattern_data[data->event_area][sched_ev_info->attr] == 1;
mBGMPsComp_volume_change_fieldSchedEv(data->bgm_num, TRUE, flag);
}
static void mBGMFieldSchedEv_ps_compose(mBGMFieldSchedEv* sched_ev, GAME* game) {
mBGMFieldSchedEv_Info* info = sched_ev->info;
mBGMEventData* data = mbgm_event_data;
int i;
int flag = TRUE;
int now_flag;
int old_flag;
for (i = 0; i < ARRAY_COUNT(mbgm_event_data); i++) {
now_flag = (info->flag & (4 | 1)) == (4 | 1) && info->attr != mBGM_BL_ATTR_INACTIVE;
old_flag = (info->flag & (8 | 2)) == (8 | 2) && info->old_attr != mBGM_BL_ATTR_INACTIVE;
if (!now_flag && old_flag) {
mBGMFieldSchedEv_Info_ps_delete(info, data, flag);
}
if (now_flag && !old_flag) {
mBGMFieldSchedEv_Info_ps_make(info, data, i);
}
if (now_flag && old_flag) {
int now_vol = mbgm_pattern_data[data->event_area][info->attr];
int old_vol = mbgm_pattern_data[data->event_area][info->old_attr];
if (now_vol != old_vol && now_vol != 0 && old_vol != 0 && data->bgm_num != 127) {
mBGMFieldSchedEv_Info_ps_volume_change(info, data);
}
}
if (flag && old_flag) {
flag = FALSE;
}
info++;
data++;
}
}
static void mBGMFieldSchedEv_sp_flag(mBGMFieldSchedEv* sched_ev) {
mBGMFieldSchedEv_Info* info0 = &sched_ev->info[mBGMFieldSchedEv_EVENT_COUNTDOWN_5];
mBGMFieldSchedEv_Info* info1 = &sched_ev->info[mBGMFieldSchedEv_EVENT_COUNTDOWN_6];
if (
(
((info0->flag & (4 | 1)) == (4 | 1) && info0->attr != mBGM_BL_ATTR_INACTIVE) ||
((info1->flag & (4 | 1)) == (4 | 1) && info1->attr != mBGM_BL_ATTR_INACTIVE)
) &&
mBGMClock_range_time_check(
&M_bgm.clock,
(1 << 22) | (1 << 17) | (0 << 12) | (0 << 6) | (0 << 0),
(1 << 22) | (1 << 17) | (0 << 12) | (1 << 6) | (0 << 0),
mBGMClock_CHK_MM | mBGMClock_CHK_DD | mBGMClock_CHK_hh | mBGMClock_CHK_mm | mBGMClock_CHK_ss
)
) {
mBGMTime_new_year_ev_flag_set();
}
else {
mBGMTime_new_year_ev_flag_clr();
}
}
static void mBGMFieldSchedEv_move(mBGMFieldSchedEv* sched_ev, GAME* game) {
mBGMFieldSchedEv_info_set(sched_ev, game);
mBGMFieldSchedEv_ps_compose(sched_ev, game);
mBGMFieldSchedEv_sp_flag(sched_ev);
}
static void mBGMFieldSchedEv_ct(mBGMFieldSchedEv* sched_ev) {
int i;
bzero(sched_ev, sizeof(mBGMFieldSchedEv));
for (i = 0; i < ARRAY_COUNT(sched_ev->info); i++) {
sched_ev->info[i].old_attr = mBGM_BL_ATTR_INACTIVE;
sched_ev->info[i].attr = mBGM_BL_ATTR_INACTIVE;
}
}
/* mBGMFieldNorm */
static u8 mBGMFieldNorm_bgm_num_get(int hour) {
static u8 bgm_table[24] = {
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];
}
static void mBGMFieldNorm_elem_set(mBGMFieldNorm* norm) {
int hour = Common_Get(time.rtc_time.hour) % 24;
mBGMElem_default_set(&norm->elem);
norm->elem.bgm_num = mBGMFieldNorm_bgm_num_get(hour);
}
static void mBGMPsComp_make_ps_fieldNorm(u8 bgm_num, u16 stop_type);
static void mBGMFieldNorm_make_bgm(mBGMFieldNorm* norm, GAME* game) {
if (norm->elem.bgm_num == 127) {
mBGMFieldNorm_elem_set(norm);
mBGMPsComp_make_ps_fieldNorm(norm->elem.bgm_num, 0x168);
}
}
static void mBGMPsComp_delete_ps_fieldNorm(u8 bgm_num, u16 stop_type);
static void mBGMFieldNorm_delete_bgm(mBGMFieldNorm* norm) {
if (norm->elem.bgm_num != 127) {
mBGMPsComp_delete_ps_fieldNorm(norm->elem.bgm_num, norm->elem.stop_type0);
norm->elem.bgm_num = 127;
}
}
static void mBGMFieldNorm_move(mBGMFieldNorm* norm, GAME* game) {
if (
mBGMClock_over_time_check(&M_bgm.clock, 0, mBGMClock_CHK_mm | mBGMClock_CHK_ss) &&
mFI_CheckFieldData() &&
mFI_GET_TYPE(mFI_GetFieldId()) == mFI_FIELD_FG
) {
norm->delete_flag = TRUE;
norm->make_flag = TRUE;
}
if (norm->delete_flag) {
mBGMFieldNorm_delete_bgm(norm);
}
if (norm->make_flag) {
mBGMFieldNorm_make_bgm(norm, game);
}
norm->make_flag = FALSE;
norm->delete_flag = FALSE;
}
static void mBGMFieldNorm_make_req() {
M_bgm.field_norm.make_flag = TRUE;
}
static void mBGMFieldNorm_delete_req() {
M_bgm.field_norm.delete_flag = TRUE;
}
static void mBGMFieldNorm_ct(mBGMFieldNorm* norm) {
bzero(norm, sizeof(mBGMFieldNorm));
mBGMElem_default_set(&norm->elem);
}
/* mBGMPs[Comp] */
static void mBGMPs_counter_dec(mBGMPs* ps) {
if (ps->counter > 0) {
ps->counter--;
if (ps->counter == 0) {
ps->cf_flags |= mBGMPs_FLAG_REMOVE;
}
}
}
static void mBGMPsComp_ps_remove(mBGMPsComp* ps_comp, int remove_pos) {
if (remove_pos >= 0 && remove_pos < mBGM_BGMPs_NUM) {
if (remove_pos < ps_comp->ps_num && ps_comp->ps_num > 0) {
int max = ps_comp->ps_num - 1;
int i;
for (i = remove_pos; i < max; i++) {
ps_comp->ps[i] = ps_comp->ps[i + 1];
}
bzero(&ps_comp->ps[max], sizeof(mBGMPs));
ps_comp->ps_num = max;
}
}
}
static int mBGMPsComp_search_insert_pos_kategorie(mBGMPsComp* ps_comp, int kategorie, u8 priority) {
mBGMPs* ps = ps_comp->ps;
int max = ps_comp->ps_num;
int i;
int res;
if (max < mBGM_BGMPs_NUM) {
res = max;
for (i = 0; i < max; i++, ps++) {
if ((kategorie == ps->kategorie && priority < ps->priority) || kategorie < ps->kategorie) {
res = i;
break;
}
}
}
else {
res = -1;
}
return res;
}
static int mBGMPsComp_search_pos_kategorie_bgm_num(mBGMPsComp* ps_comp, int kategorie, u8 bgm_num, int counter_flag, int del_pass) {
int kategorie_valid = kategorie < mBGM_KATEGORIE_NUM;
int bgm_is_reset = bgm_num != 127;
int res = -1;
u8 delete_mask = del_pass == 0;
if (kategorie_valid || bgm_is_reset) {
mBGMPs* ps = ps_comp->ps;
int i = 0;
int max = ps_comp->ps_num;
for (i; i < max; i++, ps++) {
if (
(!kategorie_valid || ps->kategorie == kategorie) &&
(!bgm_is_reset || ps->elem.bgm_num == bgm_num) &&
(counter_flag == FALSE || (ps->counter < 0 && (ps->cf_flags & mBGMPs_FLAG_FADEOUT) == 0)) &&
((ps->cf_flags & delete_mask) == 0)
) {
res = i;
break;
}
}
}
return res;
}
static void mBGMPsComp_shift_behind(mBGMPsComp* ps_comp, int shift_idx) {
if (ps_comp->ps_num != 0) {
int i;
for (i = ps_comp->ps_num - 1; i >= shift_idx; i--) {
bcopy(&ps_comp->ps[i], &ps_comp->ps[i + 1], sizeof(mBGMPs));
}
}
bzero(&ps_comp->ps[shift_idx], sizeof(mBGMPs));
ps_comp->ps_num++;
}
static void mBGMPsComp_all_ps_bitclr(mBGMPsComp* ps_comp, u8 bits) {
mBGMPs* ps = ps_comp->ps;
int max = ps_comp->ps_num;
int i;
for (i = 0; i < max; i++, ps++) {
ps->cf_flags &= ~bits;
}
}
static int mBGMPsComp_execute_ps_pos_get(mBGMPsComp* ps_comp) {
mBGMPs* ps = ps_comp->ps;
int max = ps_comp->ps_num;
int i;
int idx = -1;
for (i = 0; i < max; i++, ps++) {
if ((ps->cf_flags & mBGMPs_FLAG_EXECUTE)) {
idx = i;
break;
}
}
return idx;
}
static mBGMPs* mBGMPsComp_high_ps_not_delete(mBGMPsComp* ps_comp, int max_pos) {
mBGMPs* ps = ps_comp->ps;
mBGMPs* high_ps = NULL;
int i;
for (i = 0; i < max_pos; i++, ps++) {
if ((ps->cf_flags & mBGMPs_FLAG_REMOVE) == 0) {
high_ps = ps;
break;
}
}
return high_ps;
}
static void mBGMPsComp_main_req_stop(mBGMPsComp* ps_comp) {
mBGMPs* ps = ps_comp->ps;
int execute_pos = mBGMPsComp_execute_ps_pos_get(ps_comp);
if (execute_pos >= 0) {
ps += execute_pos;
if ((ps->cf_flags & mBGMPs_FLAG_SILENT) == 0) {
if (execute_pos > 0) {
mBGMPs* high_ps = mBGMPsComp_high_ps_not_delete(ps_comp, execute_pos);
if (high_ps != NULL) {
ps_comp->stop.req_flag = TRUE;
ps_comp->stop.type = high_ps->elem.stop_type1;
return;
}
}
if ((ps->cf_flags & mBGMPs_FLAG_REMOVE) && (ps->cf_flags & mBGMPs_FLAG_LOST) == 0) {
ps_comp->stop.req_flag = TRUE;
ps_comp->stop.type = ps->elem.stop_type0;
}
}
}
}
static void mBGMPsComp_main_remove(mBGMPsComp* ps_comp) {
mBGMPs* ps;
int i;
for (i = ps_comp->ps_num - 1, ps = &ps_comp->ps[i]; i >= 0; i--, ps--) {
if ((ps->cf_flags & mBGMPs_FLAG_REMOVE)) {
ps->cf_flags &= ~mBGMPs_FLAG_REMOVE;
mBGMPsComp_ps_remove(ps_comp, i);
}
}
}
static void mBGMPsComp_main_req_start(mBGMPsComp* ps_comp) {
if (ps_comp->ps_num > 0) {
if ((ps_comp->ps[0].cf_flags & mBGMPs_FLAG_EXECUTE) == 0) {
if ((ps_comp->ps[0].cf_flags & mBGMPs_FLAG_SILENT) == 0) {
ps_comp->start.req_flag = TRUE;
ps_comp->start.flags = (ps_comp->ps[0].cf_flags >> 3) & 1; // crossfade (mBGMPs_FLAG_CROSSFADE)
ps_comp->start.bgm_num = ps_comp->ps[0].elem.bgm_num;
if (mBGM_check_MD(ps_comp->ps[0].elem.bgm_num) == FALSE) {
ps_comp->ps[0].cf_flags |= mBGMPs_FLAG_UPDATE_VOLUME;
}
}
mBGMPsComp_all_ps_bitclr(ps_comp, mBGMPs_FLAG_EXECUTE);
ps_comp->ps[0].cf_flags |= mBGMPs_FLAG_EXECUTE;
}
mBGMPsComp_all_ps_bitclr(ps_comp, mBGMPs_FLAG_CROSSFADE);
}
}
static void mBGMPsComp_main_req_pause(mBGMPsComp* ps_comp) {
if (ps_comp->pause_state == 1 || ps_comp->pause_state == 3) {
ps_comp->pause.mode = 1;
ps_comp->pause.req_flag = TRUE;
}
else if (ps_comp->pause_state == 2) {
ps_comp->pause.mode = 2;
ps_comp->pause.req_flag = TRUE;
}
else if (ps_comp->pause_state == 5) {
ps_comp->pause.mode = 0;
ps_comp->pause.req_flag = TRUE;
}
}
static void mBGMPsComp_main_req_md(mBGMPsComp* ps_comp) {
if (ps_comp->md.move_flag) {
ps_comp->md.req_flag = TRUE;
}
}
static void mBGMPsComp_main_md_move(mBGMPsComp* ps_comp) {
if (ps_comp->md.delete_flag) {
ps_comp->md.move_flag = FALSE;
ps_comp->md.delete_flag = FALSE;
}
if (ps_comp->md.make_flag) {
ps_comp->md.move_flag = TRUE;
ps_comp->md.make_flag = FALSE;
}
}
static void mBGMPsComp_main_req_volume_ps(mBGMPsComp* ps_comp) {
if (ps_comp->ps_num > 0) {
if ((ps_comp->ps[0].cf_flags & mBGMPs_FLAG_UPDATE_VOLUME)) {
if ((ps_comp->ps[0].cf_flags & mBGMPs_FLAG_UPDATE_VOLUME_MOVE_CTR)) {
ps_comp->volume.ps_volume_move_ctr = 90;
}
else {
ps_comp->volume.ps_volume_move_ctr = 0;
}
if ((ps_comp->ps[0].cf_flags & mBGMPs_FLAG_UPDATE_VOLUME_LEVEL)) {
ps_comp->volume.ps_volume = 0.5f;
}
else {
ps_comp->volume.ps_volume = 1.0f;
}
ps_comp->volume.ps_req_flag = TRUE;
}
mBGMPsComp_all_ps_bitclr(ps_comp, mBGMPs_FLAG_UPDATE_VOLUME_MOVE_CTR | mBGMPs_FLAG_UPDATE_VOLUME);
}
if (mBGMPsComp_execute_bgm_num_get() < 0) {
ps_comp->volume.ps_volume = -1.0f;
}
}
static void mBGMPsComp_main_req_volume_fishing(mBGMPsComp* ps_comp) {
if (ps_comp->fishing_state == 1) {
ps_comp->fishing_state = 2;
ps_comp->volume.fishing_volume = 0.6f;
ps_comp->volume.fishing_volume_move_ctr = 300;
ps_comp->volume.fishing_req_flag = TRUE;
}
else if (ps_comp->fishing_state == 3) {
ps_comp->fishing_state = 0;
ps_comp->volume.fishing_volume = -1.0f;
ps_comp->volume.fishing_volume_move_ctr = 35;
if (ps_comp->ps_num <= 0 || mBGM_check_MD(ps_comp->ps[0].elem.bgm_num) == FALSE) {
ps_comp->volume.fishing_req_flag = TRUE;
}
}
}
static void mBGMPsComp_main_req_volume_collect_insects(mBGMPsComp* ps_comp) {
if (ps_comp->collect_insects_state == 1) {
ps_comp->collect_insects_state = 2;
ps_comp->volume.collect_insects_volume = 0.65f;
ps_comp->volume.collect_insects_volume_move_ctr = 100;
ps_comp->volume.collect_insects_req_flag = TRUE;
}
else if (ps_comp->collect_insects_state == 3) {
ps_comp->collect_insects_state = 0;
ps_comp->volume.collect_insects_volume = -1.0f;
ps_comp->volume.collect_insects_volume_move_ctr = 17;
if (ps_comp->ps_num <= 0 || mBGM_check_MD(ps_comp->ps[0].elem.bgm_num) == FALSE) {
ps_comp->volume.collect_insects_req_flag = TRUE;
}
}
}
static void mBGMPsComp_main_req_volume_talk(mBGMPsComp* ps_comp) {
if (ps_comp->talk_state == 1) {
ps_comp->talk_state = 2;
ps_comp->volume.talk_volume = 0.7f;
ps_comp->volume.talk_req_flag = TRUE;
}
else if (ps_comp->talk_state == 3) {
ps_comp->talk_state = 0;
ps_comp->volume.talk_volume = -1.0f;
if (ps_comp->ps_num <= 0 || mBGM_check_MD(ps_comp->ps[0].elem.bgm_num) == FALSE) {
ps_comp->volume.talk_req_flag = TRUE;
}
}
}
static void mBGMPsComp_main_req_volume_boat(mBGMPsComp* ps_comp) {
if (ps_comp->boat_state == 1) {
ps_comp->boat_state = 2;
ps_comp->volume.boat_volume = 0.7f;
ps_comp->volume.boat_req_flag = TRUE;
}
else if (ps_comp->boat_state == 3) {
ps_comp->boat_state = 0;
ps_comp->volume.boat_volume = -1.0f;
if (ps_comp->ps_num <= 0 || mBGM_check_MD(ps_comp->ps[0].elem.bgm_num) == FALSE) {
ps_comp->volume.boat_req_flag = TRUE;
}
}
}
static void mBGMPsComp_main_req_volume_pause(mBGMPsComp* ps_comp) {
if (ps_comp->pause_state == 1) {
ps_comp->pause_state = 4;
ps_comp->volume.pause_volume = 0.5f;
ps_comp->volume.pause_volume_move_ctr = 2;
ps_comp->volume.pause_req_flag = TRUE;
}
else if (ps_comp->pause_state == 2) {
ps_comp->pause_state = 4;
ps_comp->volume.pause_volume = 0.0f;
ps_comp->volume.pause_volume_move_ctr = 2;
ps_comp->volume.pause_req_flag = TRUE;
}
else if (ps_comp->pause_state == 3) {
ps_comp->pause_state = 4;
ps_comp->volume.pause_volume = 0.5f;
ps_comp->volume.pause_volume_move_ctr = 2;
ps_comp->volume.pause_req_flag = TRUE;
}
else if (ps_comp->pause_state == 5) {
ps_comp->pause_state = 0;
ps_comp->volume.pause_volume = -1.0f;
ps_comp->volume.pause_volume_move_ctr = 2;
if (ps_comp->ps_num <= 0 || mBGM_check_MD(ps_comp->ps[0].elem.bgm_num) == FALSE) {
ps_comp->volume.pause_req_flag = TRUE;
}
}
}
static void mBGMPsComp_main_req_volume(mBGMPsComp* ps_comp) {
f32 t_ps_vol;
f32 t_talk_vol;
f32 t_pause_vol;
f32 t_collect_insects_vol;
f32 t_fishing_vol;
f32 t_boat_vol;
f32 final_vol;
u16 final_vol_move_ctr;
mBGMPs* ps = &ps_comp->ps[0];
int ignore_talk = ps_comp->ps_num > 0 ? mBGM_check_ignore_talk_volume(ps->elem.bgm_num) : FALSE;
int ignore_collect_insects = ps_comp->ps_num > 0 ? mBGM_check_ignore_collect_insects_volume(ps->elem.bgm_num) : FALSE;
mBGMPsComp_main_req_volume_ps(ps_comp);
mBGMPsComp_main_req_volume_fishing(ps_comp);
mBGMPsComp_main_req_volume_collect_insects(ps_comp);
mBGMPsComp_main_req_volume_talk(ps_comp);
mBGMPsComp_main_req_volume_boat(ps_comp);
mBGMPsComp_main_req_volume_pause(ps_comp);
t_ps_vol = ps_comp->volume.ps_volume;
if (t_ps_vol < 0.0f) {
t_fishing_vol = -1.0f;
t_collect_insects_vol = -1.0f;
t_talk_vol = -1.0f;
t_boat_vol = -1.0f;
t_pause_vol = -1.0f;
}
else {
t_fishing_vol = (ps_comp->volume.fishing_volume < 0.0f || ps_comp->volume.fishing_volume > t_ps_vol || ignore_collect_insects) ? t_ps_vol : ps_comp->volume.fishing_volume;
t_collect_insects_vol = (ps_comp->volume.collect_insects_volume < 0.0f || ps_comp->volume.collect_insects_volume > t_fishing_vol || ignore_collect_insects) ? t_fishing_vol : ps_comp->volume.collect_insects_volume;
t_talk_vol = (ps_comp->volume.talk_volume < 0.0f || ps_comp->volume.talk_volume > t_collect_insects_vol || ignore_talk) ? t_collect_insects_vol : ps_comp->volume.talk_volume;
t_boat_vol = (ps_comp->volume.boat_volume < 0.0f || ps_comp->volume.boat_volume > t_talk_vol) ? t_talk_vol : ps_comp->volume.boat_volume;
t_pause_vol = (ps_comp->volume.pause_volume < 0.0f || ps_comp->volume.pause_volume > t_boat_vol) ? t_boat_vol : ps_comp->volume.pause_volume;
}
final_vol = -1.0f;
final_vol_move_ctr = 0;
if (ps_comp->volume.ps_req_flag) {
final_vol = t_ps_vol;
final_vol_move_ctr = ps_comp->volume.ps_volume_move_ctr;
}
if (ps_comp->volume.fishing_req_flag && !ignore_collect_insects) {
final_vol = t_fishing_vol;
final_vol_move_ctr = ps_comp->volume.fishing_volume_move_ctr;
}
if (ps_comp->volume.collect_insects_req_flag && !ignore_collect_insects) {
final_vol = t_collect_insects_vol;
final_vol_move_ctr = ps_comp->volume.collect_insects_volume_move_ctr;
}
if (ps_comp->volume.talk_req_flag && !ignore_talk) {
final_vol = t_talk_vol;
final_vol_move_ctr = 30;
}
if (ps_comp->volume.boat_req_flag) {
final_vol = t_boat_vol;
final_vol_move_ctr = 30;
}
if (ps_comp->volume.pause_req_flag) {
final_vol = t_pause_vol;
final_vol_move_ctr = ps_comp->volume.pause_volume_move_ctr;
}
if (ps_comp->pause_state == 4) {
if ((final_vol < 0.0f) == FALSE) {
final_vol = t_pause_vol;
}
}
else if (ps_comp->boat_state == 2) {
if ((final_vol < 0.0f) == FALSE) {
final_vol = t_boat_vol;
}
}
else if (ps_comp->talk_state == 2) {
if ((final_vol < 0.0f) == FALSE) {
final_vol = t_talk_vol;
}
}
else if (ps_comp->collect_insects_state == 2) {
if ((final_vol < 0.0f) == FALSE) {
final_vol = t_collect_insects_vol;
}
}
else if (ps_comp->fishing_state == 2) {
if ((final_vol < 0.0f) == FALSE) {
final_vol = t_fishing_vol;
}
}
if ((final_vol < 0.0f) == FALSE) {
ps_comp->volume.main_volume = final_vol;
ps_comp->volume.main_volume_move_ctr = final_vol_move_ctr;
ps_comp->volume.main_req_flag = TRUE;
}
ps_comp->volume.ps_req_flag = FALSE;
ps_comp->volume.fishing_req_flag = FALSE;
ps_comp->volume.collect_insects_req_flag = FALSE;
ps_comp->volume.talk_req_flag = FALSE;
ps_comp->volume.boat_req_flag = FALSE;
ps_comp->volume.pause_req_flag = FALSE;
}
static void mBGMPsComp_MDPlayerPos_main_inform_sound(mBGMPsComp_MDPlayerPos* md) {
if (md->req_flag) {
sAdo_MDPlayerPos(&md->pos, md->angle, md->md_type_no, md->ongen_no);
md->req_flag = FALSE;
}
}
static void mBGMPsComp_arm_delete();
static void mBGMPsComp_Arm_main_inform_sound(mBGMPsComp_Arm* arm) {
if (arm->req_flag) {
if (mBGMPsComp_execute_bgm_num_get() == 43) {
sAdos_TTKK_ARM(arm->arm_state);
if (arm->arm_state == 0) {
mBGMPsComp_arm_delete();
}
}
else {
mBGMPsComp_arm_delete();
}
}
}
static void mBGMPsComp_Stop_main_inform_sound(mBGMPsComp_Stop* stop) {
if (stop->req_flag) {
sAdo_BgmStop(stop->type);
stop->req_flag = FALSE;
}
}
static void mBGMPsComp_arm_make(u8 state);
static void mBGMPsComp_Start_main_inform_sound(mBGMPsComp_Start* start) {
if (start->req_flag) {
if (start->flags != 0) {
sAdo_BgmCrossfadeStart(start->bgm_num);
}
else {
sAdo_BgmStart(start->bgm_num);
if (start->bgm_num == 43) {
if (Save_Get(scene_no) == SCENE_PLAYERSELECT_2) {
mBGMPsComp_arm_make(1);
}
else {
mBGMPsComp_arm_make(0);
}
}
}
start->req_flag = FALSE;
}
}
static void mBGMPsComp_Volume_main_inform_sound(mBGMPsComp_Volume* volume) {
if (volume->main_req_flag) {
sAdo_BGMVolume(volume->main_volume, volume->main_volume_move_ctr);
volume->main_req_flag = FALSE;
}
}
static void mBGMPsComp_Pause_main_inform_sound(mBGMPsComp_Pause* pause) {
if (pause->req_flag) {
sAdo_Pause(pause->mode);
pause->req_flag = FALSE;
}
}
static void mBGMPsComp_Museum_main_inform_sound(mBGMPsComp_Museum* museum) {
if (museum->req_flag) {
museum->req_flag--;
if (museum->req_flag == 0) {
sAdo_Museum(museum->type);
}
}
}
static void mBGMPsComp_main_inform_sound(mBGMPsComp* ps_comp) {
mBGMPsComp_MDPlayerPos_main_inform_sound(&ps_comp->md);
mBGMPsComp_Arm_main_inform_sound(&ps_comp->arm);
mBGMPsComp_Stop_main_inform_sound(&ps_comp->stop);
mBGMPsComp_Start_main_inform_sound(&ps_comp->start);
mBGMPsComp_Pause_main_inform_sound(&ps_comp->pause);
mBGMPsComp_Volume_main_inform_sound(&ps_comp->volume);
mBGMPsComp_Museum_main_inform_sound(&ps_comp->museum);
}
static void mBGMPsComp_main_counter_dec(mBGMPsComp* ps_comp) {
mBGMPs* ps = ps_comp->ps;
int i;
int max = ps_comp->ps_num;
for (i = 0; i < max; i++, ps++) {
mBGMPs_counter_dec(ps);
}
}
static void mBGMPsComp_main_fo_check(mBGMPsComp* ps_comp) {
mBGMPs* ps = ps_comp->ps;
int i;
int max = ps_comp->ps_num;
for (i = 0; i < max; i++, ps++) {
if (ps->cf_flags & mBGMPs_FLAG_FADEOUT) {
int execute_pos = mBGMPsComp_execute_ps_pos_get(ps_comp);
if (
(execute_pos >= i || execute_pos < 0) ||
(ps_comp->ps[execute_pos].elem.bgm_num == 127) ||
(ps_comp->ps[execute_pos].cf_flags & mBGMPs_FLAG_SILENT)
) {
if (sAdo_BgmFadeoutCheck() == FALSE) {
continue; /* don't clear the fadeout flag */
}
}
ps->cf_flags &= ~mBGMPs_FLAG_FADEOUT;
ps->cf_flags |= mBGMPs_FLAG_REMOVE;
}
}
}
static void mBGMPsComp_main_lost(mBGMPsComp* ps_comp) {
mBGMPs* ps = ps_comp->ps;
int i;
int max = ps_comp->ps_num;
for (i = 0; i < max; i++, ps++) {
if ((ps->cf_flags & mBGMPs_FLAG_LOST)) {
ps->cf_flags |= mBGMPs_FLAG_REMOVE;
}
}
}
static int mBGMPsComp_make_ps(mBGMPsComp* ps_comp, mBGMElem* elem, int kategorie, s16 counter, u16 cf_flags, u8 priority) {
int pos = mBGMPsComp_search_insert_pos_kategorie(ps_comp, kategorie, priority);
if (pos >= 0) {
mBGMPs* dst_ps = &ps_comp->ps[pos];
mBGMPsComp_shift_behind(ps_comp, pos);
bcopy(elem, &dst_ps->elem, sizeof(mBGMElem));
dst_ps->kategorie = kategorie;
dst_ps->counter = counter;
dst_ps->cf_flags = cf_flags;
dst_ps->priority = priority;
}
return pos;
}
static void _mBGMPsComp_make_ps_fanfare(u8 bgm_num, u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_FANFARE, -1, 0, 0xFF);
}
extern void mBGMPsComp_make_ps_fanfare(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_make_ps_fanfare(bgm_num, stop_type);
}
static void _mBGMPsComp_make_ps_lost_fanfare(u8 bgm_num, u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_FANFARE, -1, mBGMPs_FLAG_LOST, 0xFF);
}
extern void mBGMPsComp_make_ps_lost_fanfare(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_make_ps_lost_fanfare(bgm_num, stop_type);
}
static void _mBGMPsComp_make_ps_wipe(u16 stop_type) {
mBGMForce* force = &M_bgm.force;
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
mBGMElem elem;
if (mBGMForce_wipe_ps_make_permit(force) && mBGMPsComp_search_pos_kategorie_bgm_num(ps_comp, mBGM_KATEGORIE_WIPE, 127, FALSE, FALSE) < 0) {
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_WIPE, -1, mBGMPs_FLAG_SILENT, 0xFF);
}
}
extern void mBGMPsComp_make_ps_wipe(u16 stop_type) {
_mBGMPsComp_make_ps_wipe(stop_type);
}
static void _mBGMPsComp_make_ps_quiet(u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_QUIET, -1, mBGMPs_FLAG_SILENT, 0xFF);
}
extern void mBGMPsComp_make_ps_quiet(u16 stop_type) {
_mBGMPsComp_make_ps_quiet(stop_type);
}
static void _mBGMPsComp_make_ps_co_quiet(u16 stop_type, s16 counter) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_QUIET, counter, mBGMPs_FLAG_SILENT, 0xFF);
}
extern void mBGMPsComp_make_ps_co_quiet(u16 stop_type, s16 counter) {
_mBGMPsComp_make_ps_co_quiet(stop_type, counter);
}
static void _mBGMPsComp_make_ps_fc_quiet(u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_QUIET, -1, mBGMPs_FLAG_SILENT | mBGMPs_FLAG_FADEOUT, 0xFF);
}
extern void mBGMPsComp_make_ps_fc_quiet(u16 stop_type) {
_mBGMPsComp_make_ps_fc_quiet(stop_type);
}
static void _mBGMPsComp_make_ps_demo(u8 bgm_num, u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_DEMO, -1, 0, 0xFF);
}
extern void mBGMPsComp_make_ps_demo(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_make_ps_demo(bgm_num, stop_type);
}
static void _mBGMPsComp_make_ps_happening(u8 bgm_num, u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_HAPPENING, -1, 0, 0xFF);
}
extern void mBGMPsComp_make_ps_happening(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_make_ps_happening(bgm_num, stop_type);
}
static void mBGMPsComp_make_ps_quietRoom(u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_QUIETROOM, -1, mBGMPs_FLAG_SILENT, 0xFF);
}
static void _mBGMPsComp_make_ps_room(u8 bgm_num, u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_ROOM, -1, 0, 0xFF);
}
extern void mBGMPsComp_make_ps_room(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_make_ps_room(bgm_num, stop_type);
}
static void mBGMPsComp_make_ps_time() {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = 0x870;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_TIME, -1, mBGMPs_FLAG_SILENT, 0xFF);
}
static void _mBGMPsComp_make_ps_quietField(u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_QUIETFIELD, -1, mBGMPs_FLAG_SILENT, 0xFF);
}
extern void mBGMPsComp_make_ps_quietField(u16 stop_type) {
_mBGMPsComp_make_ps_quietField(stop_type);
}
static void _mBGMPsComp_make_ps_fc_quietField(u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_QUIETFIELD, -1, mBGMPs_FLAG_SILENT | mBGMPs_FLAG_FADEOUT, 0xFF);
}
extern void mBGMPsComp_make_ps_fc_quietField(u16 stop_type) {
_mBGMPsComp_make_ps_fc_quietField(stop_type);
}
static void _mBGMPsComp_make_ps_fieldSuddenEv(u8 bgm_num, u16 stop_type, u8 priority) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_FIELDSUDDENEV, -1, 0, priority);
}
extern void mBGMPsComp_make_ps_fieldSuddenEv(u8 bgm_num, u16 stop_type, u8 priority) {
_mBGMPsComp_make_ps_fieldSuddenEv(bgm_num, stop_type, priority);
}
static void mBGMPsComp_make_ps_fieldSchedEv(u8 bgm_num, int update_volume_move_ctr, int update_volume_level, int cf_flag, u16 stop_type, u8 priority) {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
mBGMElem elem;
u16 flags;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
flags = 0;
if (update_volume_move_ctr) {
flags |= mBGMPs_FLAG_UPDATE_VOLUME_MOVE_CTR;
}
if (update_volume_level) {
flags |= mBGMPs_FLAG_UPDATE_VOLUME_LEVEL;
}
if (cf_flag) {
flags |= mBGMPs_FLAG_CROSSFADE;
}
if (bgm_num == 127) {
flags |= mBGMPs_FLAG_SILENT;
}
mBGMPsComp_make_ps(ps_comp, &elem, mBGM_KATEGORIE_FIELDSCHEDEV, -1, flags, priority);
}
static void mBGMPsComp_make_ps_fieldNorm(u8 bgm_num, u16 stop_type) {
mBGMElem elem;
mBGMElem_default_set(&elem);
elem.bgm_num = bgm_num;
elem.stop_type1 = stop_type;
mBGMPsComp_make_ps(&M_bgm.ps_comp, &elem, mBGM_KATEGORIE_FIELDNORM, -1, 0, 255);
}
static void mBGMPsComp_delete_ps(mBGMPsComp* ps_comp, int kategorie, u8 bgm_num, u16 stop_type, int counter_flag) {
int num = mBGMPsComp_search_pos_kategorie_bgm_num(ps_comp, kategorie, bgm_num, counter_flag, FALSE);
if (num >= 0 && num < ps_comp->ps_num) {
ps_comp->ps[num].cf_flags |= mBGMPs_FLAG_REMOVE;
ps_comp->ps[num].elem.stop_type0 = stop_type;
}
}
static void _mBGMPsComp_delete_ps_fanfare(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_FANFARE, bgm_num, stop_type, FALSE);
}
extern void mBGMPsComp_delete_ps_fanfare(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_delete_ps_fanfare(bgm_num, stop_type);
}
static void mBGMPsComp_delete_ps_wipe() {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_WIPE, 127, 0x168, FALSE);
}
static void _mBGMPsComp_delete_ps_quiet() {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_QUIET, 127, 0x168, TRUE);
}
extern void mBGMPsComp_delete_ps_quiet() {
_mBGMPsComp_delete_ps_quiet();
}
static void _mBGMPsComp_delete_ps_demo(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_DEMO, bgm_num, stop_type, FALSE);
}
extern void mBGMPsComp_delete_ps_demo(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_delete_ps_demo(bgm_num, stop_type);
}
static void _mBGMPsComp_delete_ps_happening(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_HAPPENING, bgm_num, stop_type, FALSE);
}
extern void mBGMPsComp_delete_ps_happening(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_delete_ps_happening(bgm_num, stop_type);
}
static void mBGMPsComp_delete_ps_quietRoom() {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_QUIETROOM, 127, 0x168, TRUE);
}
static void _mBGMPsComp_delete_ps_room(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_ROOM, bgm_num, stop_type, FALSE);
}
extern void mBGMPsComp_delete_ps_room(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_delete_ps_room(bgm_num, stop_type);
}
static void mBGMPsComp_delete_ps_time() {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_TIME, 127, 0x168, FALSE);
}
static void _mBGMPsComp_delete_ps_quietField() {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_QUIETFIELD, 127, 0x168, TRUE);
}
extern void mBGMPsComp_delete_ps_quietField() {
_mBGMPsComp_delete_ps_quietField();
}
static void _mBGMPsComp_delete_ps_fieldSuddenEv(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_FIELDSUDDENEV, bgm_num, stop_type, FALSE);
}
extern void mBGMPsComp_delete_ps_fieldSuddenEv(u8 bgm_num, u16 stop_type) {
_mBGMPsComp_delete_ps_fieldSuddenEv(bgm_num, stop_type);
}
static void mBGMPsComp_delete_ps_fieldSchedEv(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_FIELDSCHEDEV, bgm_num, stop_type, FALSE);
}
static void mBGMPsComp_delete_ps_fieldNorm(u8 bgm_num, u16 stop_type) {
mBGMPsComp_delete_ps(&M_bgm.ps_comp, mBGM_KATEGORIE_FIELDNORM, bgm_num, stop_type, FALSE);
}
static void mBGMPsComp_volume_change_fieldSchedEv(u8 bgm_num, int update_volume_move_ctr, int update_volume_level) {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
int idx = mBGMPsComp_search_pos_kategorie_bgm_num(ps_comp, mBGM_KATEGORIE_FIELDSCHEDEV, bgm_num, FALSE, FALSE);
if (idx >= 0) {
mBGMPs* ps = &ps_comp->ps[idx];
if (update_volume_move_ctr) {
ps->cf_flags |= mBGMPs_FLAG_UPDATE_VOLUME_MOVE_CTR;
}
if (update_volume_level) {
ps->cf_flags |= mBGMPs_FLAG_UPDATE_VOLUME_LEVEL;
}
else {
ps->cf_flags &= ~mBGMPs_FLAG_UPDATE_VOLUME_LEVEL;
}
ps->cf_flags |= mBGMPs_FLAG_UPDATE_VOLUME;
}
}
static void mBGMPsComp_search_cf_set_field(u8 bgm_num, int kategorie) {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
int pos = mBGMPsComp_search_pos_kategorie_bgm_num(ps_comp, kategorie, bgm_num, FALSE, TRUE);
if (pos >= 0) {
int i;
for (i = pos + 1; i < ps_comp->ps_num; i++) {
if (
ps_comp->ps[i].kategorie == mBGM_KATEGORIE_FIELDSUDDENEV ||
ps_comp->ps[i].kategorie == mBGM_KATEGORIE_FIELDSCHEDEV ||
ps_comp->ps[i].kategorie == mBGM_KATEGORIE_FIELDNORM
) {
ps_comp->ps[i].cf_flags |= (mBGMPs_FLAG_UPDATE_VOLUME_MOVE_CTR | mBGMPs_FLAG_CROSSFADE);
}
}
}
}
extern void mBGMPsComp_volume_fishing_start() {
M_bgm.ps_comp.fishing_state = 1;
}
extern void mBGMPsComp_volume_fishing_end() {
M_bgm.ps_comp.fishing_state = 3;
}
extern void mBGMPsComp_volume_collect_insects_start() {
M_bgm.ps_comp.collect_insects_state = 1;
}
extern void mBGMPsComp_volume_collect_insects_end() {
M_bgm.ps_comp.collect_insects_state = 3;
}
extern void mBGMPsComp_volume_talk_start() {
M_bgm.ps_comp.talk_state = 1;
}
extern void mBGMPsComp_volume_talk_end() {
if (M_bgm.ps_comp.talk_state != 0) {
M_bgm.ps_comp.talk_state = 3;
}
}
/* @unused */
extern void mBGMPsComp_volume_boat_start() {
M_bgm.ps_comp.boat_state = 1;
}
extern void mBGMPsComp_volume_boat_end() {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
if (ps_comp->boat_state != 0) {
ps_comp->boat_state = 3;
}
}
extern void mBGMPsComp_pause(int state) {
M_bgm.ps_comp.pause_state = state;
}
extern void mBGMPsComp_MDPlayerPos_make() {
M_bgm.ps_comp.md.make_flag = TRUE;
}
extern void mBGMPsComp_MDPlayerPos_delete() {
M_bgm.ps_comp.md.delete_flag = TRUE;
}
extern void mBGMPsComp_MDPlayerPos_param_set(const xyz_t* pos, u16 angle, u16 md_type, u32 ongen_no) {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
xyz_t_move(&ps_comp->md.pos, pos);
ps_comp->md.angle = angle;
ps_comp->md.md_type_no = md_type;
ps_comp->md.ongen_no = ongen_no;
}
extern void mBGMPsComp_scene_mode(u8 mode) {
sAdo_SceneMode(mode);
}
static void mBGMPsComp_arm_make(u8 state) {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
ps_comp->arm.req_flag = TRUE;
ps_comp->arm.arm_state = state;
}
static void mBGMPsComp_arm_delete() {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
ps_comp->arm.req_flag = FALSE;
ps_comp->arm.arm_state = 0;
}
extern void mBGMPsComp_museum_status(u8 status) {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
if (status == 0) {
ps_comp->museum.req_flag = 1;
}
else {
ps_comp->museum.req_flag = 2;
}
ps_comp->museum.type = status;
}
extern int mBGMPsComp_execute_bgm_num_get() {
mBGMPsComp* ps_comp = &M_bgm.ps_comp;
int pos = mBGMPsComp_execute_ps_pos_get(ps_comp);
if (pos >= 0 && ps_comp->ps[pos].elem.bgm_num != 127 && (ps_comp->ps[pos].cf_flags & mBGMPs_FLAG_SILENT) == 0) {
return ps_comp->ps[pos].elem.bgm_num;
}
return -1;
}
static void mBGMPsComp_ct(mBGMPsComp* ps_comp) {
bzero(ps_comp, sizeof(mBGMPsComp));
ps_comp->volume.main_volume = -1.0f;
ps_comp->volume.main_volume_move_ctr = 0;
ps_comp->volume.ps_volume = -1.0f;
ps_comp->volume.ps_volume_move_ctr = 0;
ps_comp->volume.fishing_volume = -1.0f;
ps_comp->volume.fishing_volume_move_ctr = 100;
ps_comp->volume.collect_insects_volume = -1.0f;
ps_comp->volume.collect_insects_volume_move_ctr = 100;
ps_comp->volume.talk_volume = -1.0f;
ps_comp->volume.boat_volume = -1.0f;
ps_comp->volume.pause_volume = -1.0f;
ps_comp->volume.pause_volume_move_ctr = 2;
}
/* mBGMForce */
static int mBGMForce_wipe_ps_make_permit(mBGMForce* force) {
if (force->room_nonstop != 0) {
return FALSE;
}
else {
return TRUE;
}
}
static void mBGMForce_move_inform(mBGMForce* force) {
if (force->inform == mBGMForce_INFORM_1) {
int field_ok = mFI_CheckFieldData();
if (field_ok == FALSE || (field_ok != FALSE && mFI_GET_TYPE(mFI_GetFieldId()) != mFI_FIELD_FG)) {
force->flag = TRUE;
mBGMPsComp_make_ps_wipe(0x195);
}
force->inform = mBGMForce_INFORM_2;
}
else if (force->inform == mBGMForce_INFORM_3) {
force->inform = mBGMForce_INFORM_4;
}
else if (force->inform == mBGMForce_INFORM_5) {
if (force->flag) {
mBGMPsComp_make_ps_wipe(0x249);
}
force->inform = mBGMForce_INFORM_6;
}
else if (force->inform == mBGMForce_INFORM_7) {
force->inform = mBGMForce_INFORM_0;
force->flag = FALSE;
}
}
static void mBGMForce_move_room_nonstop(mBGMForce* force) {
if (force->room_nonstop == 1) {
force->room_nonstop = 2;
}
else if (force->room_nonstop == 3) {
force->room_nonstop = 0;
}
}
static void mBGMForce_move(mBGMForce* force) {
mBGMForce_move_inform(force);
mBGMForce_move_room_nonstop(force);
}
static void mBGMForce_ct(mBGMForce* force) {
bzero(force, sizeof(mBGMForce));
}
static void mBGMForce_inform_cleanup(mBGMForce* force) {
if (force->inform == mBGMForce_INFORM_2) {
force->inform = mBGMForce_INFORM_3;
}
else if (force->inform == mBGMForce_INFORM_6) {
force->inform = mBGMForce_INFORM_7;
}
}
static void mBGMForce_room_nonstop_cleanup(mBGMForce* force) {
if (force->room_nonstop == 2) {
force->room_nonstop = 3;
}
}
static void mBGMForce_cleanup(mBGMForce* force) {
mBGMForce_inform_cleanup(force);
mBGMForce_room_nonstop_cleanup(force);
}
extern void mBGMForce_inform_start() {
M_bgm.force.inform = mBGMForce_INFORM_1;
}
extern void mBGMForce_inform_end() {
M_bgm.force.inform = mBGMForce_INFORM_5;
}
static void _mBGMForce_room_nonstop_start() {
M_bgm.force.room_nonstop = 1;
}
extern void mBGMForce_room_nonstop_start() {
_mBGMForce_room_nonstop_start();
}
static void mBGM_main_control(mBGM* bgm) {
mBGMPsComp* ps_comp = &bgm->ps_comp;
mBGMPsComp_main_req_md(ps_comp);
mBGMPsComp_main_req_stop(ps_comp);
mBGMPsComp_main_remove(ps_comp);
mBGMPsComp_main_req_start(ps_comp);
mBGMPsComp_main_req_pause(ps_comp);
mBGMPsComp_main_req_volume(ps_comp);
mBGMPsComp_main_inform_sound(ps_comp);
mBGMPsComp_main_md_move(ps_comp);
mBGMPsComp_main_counter_dec(ps_comp);
mBGMPsComp_main_fo_check(ps_comp);
mBGMPsComp_main_lost(ps_comp);
}
static void mBGM_weather_set() {
s16 weather = Common_Get(weather);
if (weather >= mEnv_WEATHER_LEAVES) {
weather = mEnv_WEATHER_SAKURA;
}
else if (weather < 0) {
weather = mEnv_WEATHER_CLEAR;
}
sAdo_Tenki(weather);
}
extern void mBGM_main(GAME* game) {
mBGMClock_move(&M_bgm.clock, game);
mBGMDemo_move(&M_bgm.demo, game);
mBGMRoom_move(&M_bgm.room, game);
mBGMFieldSuddenEv_move(&M_bgm.field_sudden_ev, game);
mBGMFieldSchedEv_move(&M_bgm.field_sched_ev, game);
mBGMFieldNorm_move(&M_bgm.field_norm, game);
mBGMTime_move(&M_bgm.time, game);
mBGM_main_control(&M_bgm);
mBGMForce_move(&M_bgm.force);
mBGM_weather_set();
}
extern 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.field_sudden_ev);
mBGMFieldSchedEv_ct(&M_bgm.field_sched_ev);
mBGMFieldNorm_ct(&M_bgm.field_norm);
mBGMPsComp_ct(&M_bgm.ps_comp);
mBGMForce_ct(&M_bgm.force);
}
extern void mBGM_init() {
mBGMPsComp_delete_ps_wipe();
if (mFI_CheckFieldData()) {
mActor_name_t field_id = mFI_GetFieldId();
mActor_name_t field_type = mFI_GET_TYPE(field_id);
mBGMForce* force = &M_bgm.force;
if (field_type == mFI_FIELD_FG) {
if (mEv_CheckTitleDemo() > 0) {
mBGMPsComp_make_ps_demo(70, 0x168); // Play title music
}
else {
if ((force->inform != mBGMForce_INFORM_3 && force->inform != mBGMForce_INFORM_7) || force->flag) {
mBGMFieldNorm_make_req();
}
if (force->inform == mBGMForce_INFORM_3 && force->flag) {
mBGMPsComp_make_ps_quiet(0x168);
}
}
}
else if (field_type == mFI_FIELD_ROOM0 || field_type == mFI_FIELD_NPCROOM0 || field_type == mFI_FIELD_PLAYER0_ROOM) {
if (force->room_nonstop != 3) {
mBGMRoom_shop_close_time_set(&M_bgm.room);
mBGMRoom_scene_bgm_make_req();
}
}
else {
mBGMDemo_scene_bgm_make_req();
}
}
}
extern void mBGM_cleanup() {
mBGMForce* force = &M_bgm.force;
mBGMForce_cleanup(force);
if (mFI_CheckFieldData()) {
mActor_name_t field_id = mFI_GetFieldId();
mActor_name_t field_type = mFI_GET_TYPE(field_id);
if (field_type == mFI_FIELD_FG) {
if (mEv_CheckTitleDemo() > 0) {
mBGMPsComp_delete_ps_demo(70, 0x168); // Stop title music
}
else {
if ((force->inform != mBGMForce_INFORM_3 && force->inform != mBGMForce_INFORM_7) || force->flag) {
mBGMFieldNorm_delete_req();
}
if (force->inform == mBGMForce_INFORM_7 && force->flag) {
mBGMPsComp_delete_ps_quiet();
}
}
}
else if (field_type == mFI_FIELD_ROOM0 || field_type == mFI_FIELD_NPCROOM0 || field_type == mFI_FIELD_PLAYER0_ROOM) {
if (force->room_nonstop != 3) {
mBGMRoom_scene_bgm_delete_req();
}
}
else {
mBGMDemo_scene_bgm_delete_req();
}
}
}
extern void mBGM_reset() {
mBGM* bgm = &M_bgm;
mBGMPsComp* ps_comp = &bgm->ps_comp;
mBGMPs* ps = ps_comp->ps;
int i;
int max = ps_comp->ps_num;
for (i = 0; i < max; i++, ps++) {
ps->cf_flags |= mBGMPs_FLAG_REMOVE;
ps->elem.stop_type0 = 0x168;
}
if (ps_comp->fishing_state != 0) {
mBGMPsComp_volume_fishing_end();
}
if (ps_comp->collect_insects_state != 0) {
mBGMPsComp_volume_collect_insects_end();
}
if (ps_comp->talk_state != 0) {
mBGMPsComp_volume_talk_end();
}
if (ps_comp->boat_state != 0) {
mBGMPsComp_volume_boat_end();
}
if (ps_comp->pause_state != 0) {
mBGMPsComp_pause(5);
}
mBGMDemo_ct(&bgm->demo);
mBGMRoom_ct(&bgm->room);
mBGMTime_ct(&bgm->time);
mBGMFieldSuddenEv_ct(&bgm->field_sudden_ev);
mBGMFieldSchedEv_ct(&bgm->field_sched_ev);
mBGMFieldNorm_ct(&bgm->field_norm);
mBGMForce_ct(&bgm->force);
}