OSDN Git Service

Merge pull request #3664 from Hourier/release/3.0.0.90-Alpha
[hengbandforosx/hengbandosx.git] / src / main / scene-table.cpp
1 /*!
2  * @file scene-table.cpp
3  * @brief BGM選曲の基本処理部分実装
4  */
5
6 #include "main/scene-table.h"
7 #include "main/scene-table-floor.h"
8 #include "main/scene-table-monster.h"
9 #include "system/floor-type-definition.h"
10 #include "term/z-term.h"
11
12 int interrupt_scene_type;
13 int interrupt_scene_val;
14
15 scene_type_list scene_list;
16
17 static void resize_scene_list()
18 {
19     const int monster_def_count = get_scene_monster_count();
20     const int interrupt_def_count = 1;
21     const int floor_def_count = get_scene_floor_count();
22     scene_list.resize(monster_def_count + interrupt_def_count + floor_def_count);
23 }
24
25 /*!
26  * @brief 選曲の割り込み通知
27  * @details 選曲テーブル外の曲(クエストクリア等)の再生を取得しておく。
28  * モンスターBGMを含む選曲テーブルを構築する場合に、
29  * 1.モンスターBGM
30  * 2.割り込みBGM
31  * 3.通常BGM
32  * の順に設定する。
33  * 街の施設等で、コマンド実行→視界内モンスターリスト更新(空のリスト:再生なし)→割り込みBGMに戻るようにする。
34  * 選曲テーブルでは割り込みBGMは2番目だが、
35  * 一時的に優先するためにBGM対象のモンスターを忘れ、モンスターBGMに制限期間を設定する。
36  * @param type action-type
37  * @param val action-val
38  */
39 void interrupt_scene(int type, int val)
40 {
41     interrupt_scene_type = type;
42     interrupt_scene_val = val;
43
44     // forget BGM-target monster
45     clear_scene_target_monster();
46     // モンスターBGMの再生を一時的に抑制する
47     set_temp_mute_scene_monster(2);
48 }
49
50 /*!
51  * @brief 現在のフロアに合ったBGM選曲
52  * @param player_ptr プレイヤーへの参照ポインタ
53  */
54 void refresh_scene_table(PlayerType *player_ptr)
55 {
56     // clear interrupt_scene
57     interrupt_scene(0, 0);
58
59     resize_scene_list();
60     refresh_scene_floor(player_ptr, scene_list, 0);
61 }
62
63 /*!
64  * @brief 見かけたモンスターを含め、現在のフロアに合ったBGM選曲
65  * @param player_ptr プレイヤーへの参照ポインタ
66  * @param monster_list 視界内モンスターリスト
67  */
68 void refresh_scene_table(PlayerType *player_ptr, const std::vector<MONSTER_IDX> &monster_list)
69 {
70     resize_scene_list();
71     int index = 0;
72
73     refresh_scene_monster(player_ptr, monster_list, scene_list, index);
74     index += get_scene_monster_count();
75
76     // interrupt scene
77     scene_type &item = scene_list[index];
78     item.type = interrupt_scene_type;
79     item.val = interrupt_scene_val;
80     ++index;
81
82     refresh_scene_floor(player_ptr, scene_list, index);
83 }
84
85 /*!
86  * @brief BGM選曲リスト取得
87  * @param type 未使用
88  */
89 scene_type_list &get_scene_type_list(int type)
90 {
91     (void)type;
92     return scene_list;
93 }