OSDN Git Service

v3.0.0 Alpha5 OSDN最終版
[hengband/hengband.git] / src / main / sound-of-music.c
1 #include "main/sound-of-music.h"
2 #include "dungeon/quest.h"
3 #include "game-option/disturbance-options.h"
4 #include "game-option/special-options.h"
5 #include "main/music-definitions-table.h"
6 #include "system/floor-type-definition.h"
7 #include "term/screen-processor.h"
8
9 /*
10  * Flush the screen, make a noise
11  */
12 void bell(void)
13 {
14     term_fresh();
15     if (ring_bell)
16         term_xtra(TERM_XTRA_NOISE, 0);
17
18     flush();
19 }
20
21 /*
22  * todo intをsound_typeに差し替える
23  * @brief 音を鳴らす
24  */
25 void sound(int val)
26 {
27     if (!use_sound)
28         return;
29
30     term_xtra(TERM_XTRA_SOUND, val);
31 }
32
33 /*
34  * Hack -- Play a music
35  */
36 errr play_music(int type, int val)
37 {
38     if (!use_music)
39         return 1;
40
41     return term_xtra(type, val);
42 }
43
44 /*
45  * @brief ダンジョン用の通常BGMまたはクエスト用BGM
46  * @param player_ptr プレーヤーへの参照ポインタ
47  * @return BGMを鳴らすか後続処理で鳴らすBGMを決めるならばTRUE、鳴らさないならばFALSE
48  * @details v3.0.0現在、フロアクエストとはワーグクエストとランダムクエストのみ該当する
49  */
50 bool dungeon_quest_music(player_type *player_ptr)
51 {
52     QUEST_IDX quest_id = player_ptr->current_floor_ptr->inside_quest;
53     if (quest_id == 0)
54         quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
55
56     if (quest_id == 0)
57         return TRUE;
58     
59     if (!play_music(TERM_XTRA_MUSIC_QUEST, quest_id))
60         return FALSE;
61     
62     return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST) != 0;
63 }
64
65 /*
66  * Hack -- Select floor music.
67  */
68 void select_floor_music(player_type *player_ptr)
69 {
70     if (!use_music)
71         return;
72
73     if (player_ptr->ambush_flag) {
74         if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH))
75             return;
76     }
77
78     if (player_ptr->wild_mode) {
79         if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD))
80             return;
81     }
82
83     if (player_ptr->current_floor_ptr->inside_arena) {
84         if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA))
85             return;
86     }
87
88     if (player_ptr->phase_out) {
89         if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE))
90             return;
91     }
92
93     if (player_ptr->current_floor_ptr->inside_quest) {
94         if (!play_music(TERM_XTRA_MUSIC_QUEST, player_ptr->current_floor_ptr->inside_quest))
95             return;
96         if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST))
97             return;
98     }
99
100     if (!dungeon_quest_music(player_ptr))
101         return;
102
103     if (player_ptr->dungeon_idx) {
104         if (player_ptr->feeling == 2) {
105             if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2))
106                 return;
107         } else if (player_ptr->feeling >= 3 && player_ptr->feeling <= 5) {
108             if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1))
109                 return;
110         } else {
111             if (!play_music(TERM_XTRA_MUSIC_DUNGEON, player_ptr->dungeon_idx))
112                 return;
113
114             if (player_ptr->current_floor_ptr->dun_level < 40) {
115                 if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW))
116                     return;
117             } else if (player_ptr->current_floor_ptr->dun_level < 80) {
118                 if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED))
119                     return;
120             } else {
121                 if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH))
122                     return;
123             }
124         }
125     }
126
127     if (player_ptr->town_num) {
128         if (!play_music(TERM_XTRA_MUSIC_TOWN, player_ptr->town_num))
129             return;
130         if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN))
131             return;
132         return;
133     }
134
135     if (!player_ptr->current_floor_ptr->dun_level) {
136         if (player_ptr->lev >= 45) {
137             if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3))
138                 return;
139         } else if (player_ptr->lev >= 25) {
140             if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2))
141                 return;
142         } else {
143             if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1))
144                 return;
145         }
146     }
147
148     play_music(TERM_XTRA_MUSIC_MUTE, 0);
149 }