OSDN Git Service

Merge pull request #646 from sikabane-works/release/3.0.0Alpha14
[hengbandforosx/hengbandosx.git] / src / main / scene-table.cpp
1 #include "main/scene-table.h"
2 #include "dungeon/quest.h"
3 #include "main/music-definitions-table.h"
4 #include "system/floor-type-definition.h"
5
6 static bool scene_basic(player_type *player_ptr, scene_type *value)
7 {
8     if (player_ptr->ambush_flag) {
9         value->type = TERM_XTRA_MUSIC_BASIC;
10         value->val = MUSIC_BASIC_AMBUSH;
11         return true;
12     }
13
14     if (player_ptr->wild_mode) {
15         value->type = TERM_XTRA_MUSIC_BASIC;
16         value->val = MUSIC_BASIC_WILD;
17         return true;
18     }
19
20     if (player_ptr->current_floor_ptr->inside_arena) {
21         value->type = TERM_XTRA_MUSIC_BASIC;
22         value->val = MUSIC_BASIC_ARENA;
23         return true;
24     }
25
26     if (player_ptr->phase_out) {
27         value->type = TERM_XTRA_MUSIC_BASIC;
28         value->val = MUSIC_BASIC_BATTLE;
29         return true;
30     }
31
32     return false;
33 }
34
35 static bool scene_quest(player_type *player_ptr, scene_type *value)
36 {
37     const QUEST_IDX quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
38     const bool enable = (quest_id > 0);
39     if (enable) {
40         value->type = TERM_XTRA_MUSIC_QUEST;
41         value->val = quest_id;
42     }
43
44     return enable;
45 }
46
47 static bool scene_quest_basic(player_type *player_ptr, scene_type *value)
48 {
49     const QUEST_IDX quest_id = quest_number(player_ptr, player_ptr->current_floor_ptr->dun_level);
50     const bool enable = (quest_id > 0);
51     if (enable) {
52         value->type = TERM_XTRA_MUSIC_BASIC;
53         value->val = MUSIC_BASIC_QUEST;
54     }
55
56     return enable;
57 }
58
59 static bool scene_town(player_type *player_ptr, scene_type *value)
60 {
61     const bool enable = !is_in_dungeon(player_ptr) && (player_ptr->town_num > 0);
62     if (enable) {
63         value->type = TERM_XTRA_MUSIC_TOWN;
64         value->val = player_ptr->town_num;
65     }
66     return enable;
67 }
68
69 static bool scene_town_basic(player_type *player_ptr, scene_type *value)
70 {
71     const bool enable = !is_in_dungeon(player_ptr) && (player_ptr->town_num > 0);
72     if (enable) {
73         value->type = TERM_XTRA_MUSIC_BASIC;
74         value->val = MUSIC_BASIC_TOWN;
75     }
76     return enable;
77 }
78
79 static bool scene_field(player_type *player_ptr, scene_type *value)
80 {
81     const bool enable = !is_in_dungeon(player_ptr);
82     if (enable) {
83         value->type = TERM_XTRA_MUSIC_BASIC;
84
85         if (player_ptr->lev >= 45)
86             value->val = MUSIC_BASIC_FIELD3;
87         else if (player_ptr->lev >= 25)
88             value->val = MUSIC_BASIC_FIELD2;
89         else
90             value->val = MUSIC_BASIC_FIELD1;
91     }
92     return enable;
93 }
94
95 static bool scene_dungeon_feeling(player_type *player_ptr, scene_type *value)
96 {
97     const bool enable = (player_ptr->feeling >= 2);
98     if (enable) {
99         value->type = TERM_XTRA_MUSIC_BASIC;
100
101         if (player_ptr->feeling == 2)
102             value->val = MUSIC_BASIC_DUN_FEEL2;
103         else
104             value->val = MUSIC_BASIC_DUN_FEEL1;
105     }
106     return enable;
107 }
108
109 static bool scene_dungeon(player_type *player_ptr, scene_type *value)
110 {
111     const bool enable = (player_ptr->dungeon_idx > 0);
112     if (enable) {
113         value->type = TERM_XTRA_MUSIC_DUNGEON;
114         value->val = player_ptr->dungeon_idx;
115     }
116     return enable;
117 }
118
119 static bool scene_dungeon_basic(player_type *player_ptr, scene_type *value)
120 {
121     const bool enable = is_in_dungeon(player_ptr);
122     if (enable) {
123         value->type = TERM_XTRA_MUSIC_BASIC;
124
125         const auto dun_level = player_ptr->current_floor_ptr->dun_level;
126         if (dun_level >= 80)
127             value->val = MUSIC_BASIC_DUN_HIGH;
128         else if (dun_level >= 40)
129             value->val = MUSIC_BASIC_DUN_MED;
130         else
131             value->val = MUSIC_BASIC_DUN_LOW;
132     }
133     return enable;
134 }
135
136 static bool scene_mute(player_type *player_ptr, scene_type *value)
137 {
138     (void)player_ptr;
139     value->type = TERM_XTRA_MUSIC_MUTE;
140     value->val = 0;
141     return true;
142 }
143
144 /*! シチュエーション選択のフォールバック設定。
145  * 先頭から適用する(先にある方を優先する)。
146  */
147 std::vector<scene_type> playfallback = {
148     // scene_basic : ambush, wild, arena, battleの判定
149     { scene_basic },
150     // scene_quest : questの判定(クエストの個別BGMを指定)
151     { scene_quest },
152     // scene_quest_basic : questの判定 (Basicのquest指定)
153     { scene_quest_basic },
154     // scene_town : townの判定(町の個別BGMを指定)
155     { scene_town },
156     // scene_town_basic : townの判定 (Basicのtown指定)
157     { scene_town_basic },
158     // scene_field : field1/2/3の判定(プレイヤーレベル25未満、25以上45未満、45以上時の荒野)
159     { scene_field },
160     // scene_dungeon_feeling : feed1/2の判定(ダンジョンの雰囲気が「悪い予感」~「とても危険」、「死の幻」)
161     { scene_dungeon_feeling },
162     // scene_dungeon : dungeonの判定(ダンジョンの個別BGMを指定)
163     { scene_dungeon },
164     // scene_dungeon_basic : dun_low/med/highの判定(ダンジョンレベルが40未満、40以上80未満、80以上)
165     { scene_dungeon_basic },
166     // scene_mute : 最後にミュートを配置する
167     { scene_mute }
168 };
169
170 void refresh_scene_table(player_type *player_ptr)
171 {
172     for (auto &item : playfallback) {
173         if (!item.update(player_ptr, &item)) {
174             // Note -- 特に定義を設けていないが、type = 0は無効な値とする。
175             item.type = 0;
176             item.val = 0;
177         }
178     }
179 }
180
181 std::vector<scene_type>::iterator get_scene_table_iterator()
182 {
183     return playfallback.begin();
184 }