OSDN Git Service

a958d19cf45e29c578a8af89b5bf22b391e131cd
[hengband/hengband.git] / src / quest.c
1 #include "angband.h"
2 #include "floor-events.h"
3 #include "quest.h"
4
5
6 /*!
7  * @brief クエストを達成状態にする /
8  * @param quest_num 達成状態にしたいクエストのID
9  * @return なし
10  */
11 void complete_quest(QUEST_IDX quest_num)
12 {
13         quest_type* const q_ptr = &quest[quest_num];
14
15         switch (q_ptr->type)
16         {
17         case QUEST_TYPE_RANDOM:
18                 if (record_rand_quest) do_cmd_write_nikki(NIKKI_RAND_QUEST_C, quest_num, NULL);
19                 break;
20         default:
21                 if (record_fix_quest) do_cmd_write_nikki(NIKKI_FIX_QUEST_C, quest_num, NULL);
22                 break;
23         }
24
25         q_ptr->status = QUEST_STATUS_COMPLETED;
26         q_ptr->complev = p_ptr->lev;
27         update_playtime();
28         q_ptr->comptime = playtime;
29
30         if (!(q_ptr->flags & QUEST_FLAG_SILENT))
31         {
32                 play_music(TERM_XTRA_MUSIC_BASIC, MUSIC_BASIC_QUEST_CLEAR);
33                 msg_print(_("クエストを達成した!", "You just completed your quest!"));
34                 msg_print(NULL);
35         }
36 }
37
38
39
40 /*!
41  * @brief 特定の敵を倒した際にクエスト達成処理 /
42  * Check for "Quest" completion when a quest monster is killed or charmed.
43  * @param m_ptr 撃破したモンスターの構造体参照ポインタ
44  * @return なし
45  */
46 void check_quest_completion(monster_type *m_ptr)
47 {
48         POSITION y, x;
49         QUEST_IDX quest_num;
50
51         bool create_stairs = FALSE;
52         bool reward = FALSE;
53
54         object_type forge;
55         object_type *o_ptr;
56
57         y = m_ptr->fy;
58         x = m_ptr->fx;
59
60         /* Inside a quest */
61         quest_num = p_ptr->inside_quest;
62
63         /* Search for an active quest on this dungeon level */
64         if (!quest_num)
65         {
66                 QUEST_IDX i;
67
68                 for (i = max_q_idx - 1; i > 0; i--)
69                 {
70                         quest_type* const q_ptr = &quest[i];
71
72                         /* Quest is not active */
73                         if (q_ptr->status != QUEST_STATUS_TAKEN)
74                                 continue;
75
76                         /* Quest is not a dungeon quest */
77                         if (q_ptr->flags & QUEST_FLAG_PRESET)
78                                 continue;
79
80                         /* Quest is not on this level */
81                         if ((q_ptr->level != dun_level) &&
82                                 (q_ptr->type != QUEST_TYPE_KILL_ANY_LEVEL))
83                                 continue;
84
85                         /* Not a "kill monster" quest */
86                         if ((q_ptr->type == QUEST_TYPE_FIND_ARTIFACT) ||
87                                 (q_ptr->type == QUEST_TYPE_FIND_EXIT))
88                                 continue;
89
90                         /* Interesting quest */
91                         if ((q_ptr->type == QUEST_TYPE_KILL_NUMBER) ||
92                                 (q_ptr->type == QUEST_TYPE_TOWER) ||
93                                 (q_ptr->type == QUEST_TYPE_KILL_ALL))
94                                 break;
95
96                         /* Interesting quest */
97                         if (((q_ptr->type == QUEST_TYPE_KILL_LEVEL) ||
98                                 (q_ptr->type == QUEST_TYPE_KILL_ANY_LEVEL) ||
99                                 (q_ptr->type == QUEST_TYPE_RANDOM)) &&
100                                 (q_ptr->r_idx == m_ptr->r_idx))
101                                 break;
102                 }
103
104                 quest_num = i;
105         }
106
107         /* Handle the current quest */
108         if (quest_num && (quest[quest_num].status == QUEST_STATUS_TAKEN))
109         {
110                 /* Current quest */
111                 quest_type* const q_ptr = &quest[quest_num];
112
113                 switch (q_ptr->type)
114                 {
115                 case QUEST_TYPE_KILL_NUMBER:
116                 {
117                         q_ptr->cur_num++;
118
119                         if (q_ptr->cur_num >= q_ptr->num_mon)
120                         {
121                                 complete_quest(quest_num);
122
123                                 q_ptr->cur_num = 0;
124                         }
125                         break;
126                 }
127                 case QUEST_TYPE_KILL_ALL:
128                 {
129                         if (!is_hostile(m_ptr)) break;
130
131                         if (count_all_hostile_monsters() == 1)
132                         {
133                                 if (q_ptr->flags & QUEST_FLAG_SILENT)
134                                 {
135                                         q_ptr->status = QUEST_STATUS_FINISHED;
136                                 }
137                                 else
138                                 {
139                                         complete_quest(quest_num);
140                                 }
141                         }
142                         break;
143                 }
144                 case QUEST_TYPE_KILL_LEVEL:
145                 case QUEST_TYPE_RANDOM:
146                 {
147                         /* Only count valid monsters */
148                         if (q_ptr->r_idx != m_ptr->r_idx)
149                                 break;
150
151                         q_ptr->cur_num++;
152
153                         if (q_ptr->cur_num >= q_ptr->max_num)
154                         {
155                                 complete_quest(quest_num);
156
157                                 if (!(q_ptr->flags & QUEST_FLAG_PRESET))
158                                 {
159                                         create_stairs = TRUE;
160                                         p_ptr->inside_quest = 0;
161                                 }
162
163                                 /* Finish the two main quests without rewarding */
164                                 if ((quest_num == QUEST_OBERON) || (quest_num == QUEST_SERPENT))
165                                 {
166                                         q_ptr->status = QUEST_STATUS_FINISHED;
167                                 }
168
169                                 if (q_ptr->type == QUEST_TYPE_RANDOM)
170                                 {
171                                         reward = TRUE;
172                                         q_ptr->status = QUEST_STATUS_FINISHED;
173                                 }
174                         }
175                         break;
176                 }
177                 case QUEST_TYPE_KILL_ANY_LEVEL:
178                 {
179                         q_ptr->cur_num++;
180                         if (q_ptr->cur_num >= q_ptr->max_num)
181                         {
182                                 complete_quest(quest_num);
183                                 q_ptr->cur_num = 0;
184                         }
185                         break;
186                 }
187                 case QUEST_TYPE_TOWER:
188                 {
189                         if (!is_hostile(m_ptr)) break;
190
191                         if (count_all_hostile_monsters() == 1)
192                         {
193                                 q_ptr->status = QUEST_STATUS_STAGE_COMPLETED;
194
195                                 if ((quest[QUEST_TOWER1].status == QUEST_STATUS_STAGE_COMPLETED) &&
196                                         (quest[QUEST_TOWER2].status == QUEST_STATUS_STAGE_COMPLETED) &&
197                                         (quest[QUEST_TOWER3].status == QUEST_STATUS_STAGE_COMPLETED))
198                                 {
199
200                                         complete_quest(QUEST_TOWER1);
201                                 }
202                         }
203                         break;
204                 }
205                 }
206         }
207
208         /* Create a magical staircase */
209         if (create_stairs)
210         {
211                 POSITION ny, nx;
212
213                 /* Stagger around */
214                 while (cave_perma_bold(y, x) || cave[y][x].o_idx || (cave[y][x].info & CAVE_OBJECT))
215                 {
216                         /* Pick a location */
217                         scatter(&ny, &nx, y, x, 1, 0);
218
219                         /* Stagger */
220                         y = ny; x = nx;
221                 }
222
223                 /* Explain the staircase */
224                 msg_print(_("魔法の階段が現れた...", "A magical staircase appears..."));
225
226                 /* Create stairs down */
227                 cave_set_feat(y, x, feat_down_stair);
228
229                 /* Remember to update everything */
230                 p_ptr->update |= (PU_FLOW);
231         }
232
233         /*
234          * Drop quest reward
235          */
236         if (reward)
237         {
238                 int i;
239
240                 for (i = 0; i < (dun_level / 15) + 1; i++)
241                 {
242                         o_ptr = &forge;
243                         object_wipe(o_ptr);
244
245                         /* Make a great object */
246                         make_object(o_ptr, AM_GOOD | AM_GREAT);
247                         (void)drop_near(o_ptr, -1, y, x);
248                 }
249         }
250 }
251
252 /*!
253  * @brief 特定のアーティファクトを入手した際のクエスト達成処理 /
254  * Check for "Quest" completion when a quest monster is killed or charmed.
255  * @param o_ptr 入手したオブジェクトの構造体参照ポインタ
256  * @return なし
257  */
258 void check_find_art_quest_completion(object_type *o_ptr)
259 {
260         QUEST_IDX i;
261         /* Check if completed a quest */
262         for (i = 0; i < max_q_idx; i++)
263         {
264                 if ((quest[i].type == QUEST_TYPE_FIND_ARTIFACT) &&
265                         (quest[i].status == QUEST_STATUS_TAKEN) &&
266                         (quest[i].k_idx == o_ptr->name1))
267                 {
268                         complete_quest(i);
269                 }
270         }
271 }
272