OSDN Git Service

[Fix/Refactor] BGMの選択処理
[hengbandforosx/hengbandosx.git] / src / main / sound-of-music.c
index 2885976..032bb1f 100644 (file)
@@ -41,109 +41,144 @@ errr play_music(int type, int val)
     return term_xtra(type, val);
 }
 
-/*
- * @brief ã\83\80ã\83³ã\82¸ã\83§ã\83³ç\94¨ã\81®é\80\9a常BGMã\81¾ã\81\9fã\81¯ã\82¯ã\82¨ã\82¹ã\83\88ç\94¨BGM
+/*!
+ * @brief ã\82¯ã\82¨ã\82¹ã\83\88BGMã\82\92é\81¸æ\8a\9e
  * @param player_ptr プレーヤーへの参照ポインタ
- * @return BGMを鳴らすか後続処理で鳴らすBGMを決めるならばTRUE、鳴らさないならばFALSE
- * @details v3.0.0現在、フロアクエストとはワーグクエストとランダムクエストのみ該当する
+ * @return BGMを鳴らしたらTRUE、それ以外はFALSE
+ * @details
+ *  v3.0.0現在、フロアクエストとはワーグクエストとランダムクエストのみ該当する。
+ *  設定がない場合は鳴らさない。
  */
-bool dungeon_quest_music(player_type *player_ptr)
+bool select_quest_music(player_type *player_ptr)
 {
     QUEST_IDX quest_id = player_ptr->current_floor_ptr->inside_quest;
-    if (quest_id == 0)
-        quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
+
+    if (quest_id > 0) {
+        if (play_music(TERM_XTRA_MUSIC_QUEST, quest_id) == 0)
+            return TRUE;
+        return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST) == 0;
+    }
+
+    //ダンジョン内のクエスト
+    quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
 
     if (quest_id == 0)
-        return TRUE;
-    
-    if (!play_music(TERM_XTRA_MUSIC_QUEST, quest_id))
         return FALSE;
-    
-    return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST) != 0;
+
+    if (play_music(TERM_XTRA_MUSIC_QUEST, quest_id) == 0)
+        return TRUE;
+
+    return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST) == 0;
 }
 
-/*
- * Hack -- Select floor music.
+/*!
+ * @brief 街と荒野のBGMを選択
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @return BGMを鳴らしたらTRUE、それ以外はFALSE
+ * @details
+ *  街にいるときは街に該当する音楽があれば鳴らす。
+ *  なければ基本の街の音楽を鳴らす。
+ *  荒野ではレベル45以上に該当する音楽があれば鳴らす。
+ *  また25以上に該当する音楽があれば鳴らす。
+ *  荒野低レベル時の音楽があれば鳴らすが、なければ鳴らさない。
  */
-void select_floor_music(player_type *player_ptr)
+bool select_wilderness_music(player_type *player_ptr)
 {
-    if (!use_music)
-        return;
 
-    if (player_ptr->ambush_flag) {
-        if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH))
-            return;
+    if (player_ptr->town_num) {
+        if (play_music(TERM_XTRA_MUSIC_TOWN, player_ptr->town_num) == 0)
+            return TRUE;
+        return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN) == 0;
     }
 
-    if (player_ptr->wild_mode) {
-        if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD))
-            return;
-    }
+    if (player_ptr->lev >= 45)
+        if (play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3) == 0)
+            return TRUE;
+    if (player_ptr->lev >= 25)
+        if (play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2) == 0)
+            return TRUE;
 
-    if (player_ptr->current_floor_ptr->inside_arena) {
-        if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA))
-            return;
-    }
+    return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1) == 0;
+}
 
-    if (player_ptr->phase_out) {
-        if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE))
-            return;
-    }
+/*!
+ * @brief ダンジョンBGMを選択
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @return BGMを鳴らしたらTRUE、それ以外はFALSE
+ * @details
+ *  階の雰囲気に該当する音楽があれば鳴らす。
+ *  ダンジョンの種類に該当する音楽があれば鳴らす。
+ *  80階以上に該当する音楽があれば鳴らす。
+ *  40階以上に該当する音楽があれば鳴らす。
+ *  それ以外の場合、浅い階に該当する音楽があれば鳴らし、なければ鳴らさない。
+ */
+bool select_dungeon_music(player_type *player_ptr)
+{
 
-    if (player_ptr->current_floor_ptr->inside_quest) {
-        if (!play_music(TERM_XTRA_MUSIC_QUEST, player_ptr->current_floor_ptr->inside_quest))
-            return;
-        if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST))
-            return;
-    }
+    if (player_ptr->feeling == 2)
+        if (play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2) == 0)
+            return TRUE;
+    if (player_ptr->feeling >= 3 && player_ptr->feeling <= 5)
+        if (play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1) == 0)
+            return TRUE;
+
+    if (player_ptr->dungeon_idx)
+        if (play_music(TERM_XTRA_MUSIC_DUNGEON, player_ptr->dungeon_idx) == 0)
+            return TRUE;
+
+    if (player_ptr->current_floor_ptr->dun_level >= 80)
+        if (play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH) == 0)
+            return TRUE;
+    if (player_ptr->current_floor_ptr->dun_level >= 40)
+        if (play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED) == 0)
+            return TRUE;
+
+    return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW) == 0;
+}
 
-    if (!dungeon_quest_music(player_ptr))
-        return;
+/*!
+ * @brief BGMの選択実行部
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @return BGMを鳴らしたらTRUE、それ以外はFALSE
+ * @details
+ *  設定がない場合は鳴らさない。
+ *  クエストBGMがない場合は階のBGM。
+ */
+bool exe_select_floor_music(player_type *player_ptr)
+{
+    if (player_ptr->ambush_flag)
+        return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_AMBUSH) == 0;
 
-    if (player_ptr->dungeon_idx) {
-        if (player_ptr->feeling == 2) {
-            if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL2))
-                return;
-        } else if (player_ptr->feeling >= 3 && player_ptr->feeling <= 5) {
-            if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_FEEL1))
-                return;
-        } else {
-            if (!play_music(TERM_XTRA_MUSIC_DUNGEON, player_ptr->dungeon_idx))
-                return;
-
-            if (player_ptr->current_floor_ptr->dun_level < 40) {
-                if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_LOW))
-                    return;
-            } else if (player_ptr->current_floor_ptr->dun_level < 80) {
-                if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_MED))
-                    return;
-            } else {
-                if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_DUN_HIGH))
-                    return;
-            }
-        }
-    }
+    if (player_ptr->wild_mode)
+        return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_WILD) == 0;
 
-    if (player_ptr->town_num) {
-        if (!play_music(TERM_XTRA_MUSIC_TOWN, player_ptr->town_num))
-            return;
-        if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_TOWN))
-            return;
+    if (player_ptr->current_floor_ptr->inside_arena)
+        return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_ARENA) == 0;
+
+    if (player_ptr->phase_out)
+        return play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_BATTLE) == 0;
+
+    if (select_quest_music(player_ptr))
+        return TRUE;
+
+    if (player_ptr->current_floor_ptr->dun_level == 0)
+        return select_wilderness_music(player_ptr);
+
+    return select_dungeon_music(player_ptr);
+}
+
+/*!
+ * @brief BGMの選択
+ * @param player_ptr プレーヤーへの参照ポインタ
+ * @details 設定がない場合はミュートする。
+ */
+void select_floor_music(player_type *player_ptr)
+{
+    if (!use_music)
         return;
-    }
 
-    if (!player_ptr->current_floor_ptr->dun_level) {
-        if (player_ptr->lev >= 45) {
-            if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD3))
-                return;
-        } else if (player_ptr->lev >= 25) {
-            if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD2))
-                return;
-        } else {
-            if (!play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_FIELD1))
-                return;
-        }
-    }
+    if (exe_select_floor_music(player_ptr))
+        return;
 
     play_music(TERM_XTRA_MUSIC_MUTE, 0);
-}
\ No newline at end of file
+}