OSDN Git Service

[Refactor] #40498 Separated player-redraw-types.h from player-status.h
[hengband/hengband.git] / src / spell-kind / spells-detection.c
1 #include "spell-kind/spells-detection.h"
2 #include "dungeon/dungeon.h"
3 #include "floor/floor-save.h"
4 #include "floor/floor.h"
5 #include "grid/grid.h"
6 #include "grid/trap.h"
7 #include "monster-race/monster-race.h"
8 #include "monster-race/race-flags2.h"
9 #include "monster-race/race-flags3.h"
10 #include "monster-race/monster-race-hook.h"
11 #include "monster/monster-flag-types.h"
12 #include "monster/monster-info.h"
13 #include "monster/monster-status.h"
14 #include "monster/monster-update.h"
15 #include "object-hook/hook-checker.h"
16 #include "object-hook/hook-enchant.h"
17 #include "object/object-mark-types.h"
18 #include "object/tval-types.h"
19 #include "realm/realm-song-numbers.h"
20 #include "realm/realm-song.h"
21 #include "system/object-type-definition.h"
22 #include "util/bit-flags-calculator.h"
23 #include "util/string-processor.h"
24 #include "view/display-messages.h"
25
26 /*!
27  * @brief プレイヤー周辺の地形を感知する
28  * @param caster_ptr プレーヤーへの参照ポインタ
29  * @param range 効果範囲
30  * @param flag 特定地形ID
31  * @param known 地形から危険フラグを外すならTRUE
32  * @return 効力があった場合TRUEを返す
33  */
34 static bool detect_feat_flag(player_type *caster_ptr, POSITION range, int flag, bool known)
35 {
36     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
37         range /= 3;
38
39     grid_type *g_ptr;
40     bool detect = FALSE;
41     for (POSITION y = 1; y < caster_ptr->current_floor_ptr->height - 1; y++) {
42         for (POSITION x = 1; x <= caster_ptr->current_floor_ptr->width - 1; x++) {
43             int dist = distance(caster_ptr->y, caster_ptr->x, y, x);
44             if (dist > range)
45                 continue;
46             g_ptr = &caster_ptr->current_floor_ptr->grid_array[y][x];
47             if (flag == FF_TRAP) {
48                 /* Mark as detected */
49                 if (dist <= range && known) {
50                     if (dist <= range - 1)
51                         g_ptr->info |= (CAVE_IN_DETECT);
52
53                     g_ptr->info &= ~(CAVE_UNSAFE);
54
55                     lite_spot(caster_ptr, y, x);
56                 }
57             }
58
59             if (cave_have_flag_grid(g_ptr, flag)) {
60                 disclose_grid(caster_ptr, y, x);
61                 g_ptr->info |= (CAVE_MARK);
62                 lite_spot(caster_ptr, y, x);
63                 detect = TRUE;
64             }
65         }
66     }
67
68     return detect;
69 }
70
71 /*!
72  * @brief プレイヤー周辺のトラップを感知する / Detect all traps on current panel
73  * @param caster_ptr プレーヤーへの参照ポインタ
74  * @param range 効果範囲
75  * @param known 感知外範囲を超える警告フラグを立てる場合TRUEを返す
76  * @return 効力があった場合TRUEを返す
77  */
78 bool detect_traps(player_type *caster_ptr, POSITION range, bool known)
79 {
80     bool detect = detect_feat_flag(caster_ptr, range, FF_TRAP, known);
81
82     if (known)
83         caster_ptr->dtrap = TRUE;
84
85     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 0)
86         detect = FALSE;
87     if (detect) {
88         msg_print(_("トラップの存在を感じとった!", "You sense the presence of traps!"));
89     }
90
91     return detect;
92 }
93
94 /*!
95  * @brief プレイヤー周辺のドアを感知する / Detect all doors on current panel
96  * @param caster_ptr プレーヤーへの参照ポインタ
97  * @param range 効果範囲
98  * @return 効力があった場合TRUEを返す
99  */
100 bool detect_doors(player_type *caster_ptr, POSITION range)
101 {
102     bool detect = detect_feat_flag(caster_ptr, range, FF_DOOR, TRUE);
103
104     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 0)
105         detect = FALSE;
106     if (detect) {
107         msg_print(_("ドアの存在を感じとった!", "You sense the presence of doors!"));
108     }
109
110     return detect;
111 }
112
113 /*!
114  * @brief プレイヤー周辺の階段を感知する / Detect all stairs on current panel
115  * @param caster_ptr プレーヤーへの参照ポインタ
116  * @param range 効果範囲
117  * @return 効力があった場合TRUEを返す
118  */
119 bool detect_stairs(player_type *caster_ptr, POSITION range)
120 {
121     bool detect = detect_feat_flag(caster_ptr, range, FF_STAIRS, TRUE);
122
123     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 0)
124         detect = FALSE;
125     if (detect) {
126         msg_print(_("階段の存在を感じとった!", "You sense the presence of stairs!"));
127     }
128
129     return detect;
130 }
131
132 /*!
133  * @brief プレイヤー周辺の地形財宝を感知する / Detect any treasure on the current panel
134  * @param caster_ptr プレーヤーへの参照ポインタ
135  * @param range 効果範囲
136  * @return 効力があった場合TRUEを返す
137  */
138 bool detect_treasure(player_type *caster_ptr, POSITION range)
139 {
140     bool detect = detect_feat_flag(caster_ptr, range, FF_HAS_GOLD, TRUE);
141
142     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 6)
143         detect = FALSE;
144     if (detect) {
145         msg_print(_("埋蔵された財宝の存在を感じとった!", "You sense the presence of buried treasure!"));
146     }
147
148     return detect;
149 }
150 /*!
151  * @brief プレイヤー周辺のアイテム財宝を感知する / Detect all "gold" objects on the current panel
152  * @param caster_ptr プレーヤーへの参照ポインタ
153  * @param range 効果範囲
154  * @return 効力があった場合TRUEを返す
155  */
156 bool detect_objects_gold(player_type *caster_ptr, POSITION range)
157 {
158     POSITION range2 = range;
159     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
160         range2 /= 3;
161
162     /* Scan objects */
163     bool detect = FALSE;
164     POSITION y, x;
165     for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) {
166         object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i];
167
168         if (!object_is_valid(o_ptr))
169             continue;
170         if (object_is_held_monster(o_ptr))
171             continue;
172
173         y = o_ptr->iy;
174         x = o_ptr->ix;
175         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range2)
176             continue;
177
178         if (o_ptr->tval == TV_GOLD) {
179             o_ptr->marked |= OM_FOUND;
180             lite_spot(caster_ptr, y, x);
181             detect = TRUE;
182         }
183     }
184
185     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 6)
186         detect = FALSE;
187     if (detect) {
188         msg_print(_("財宝の存在を感じとった!", "You sense the presence of treasure!"));
189     }
190
191     if (detect_monsters_string(caster_ptr, range, "$")) {
192         detect = TRUE;
193     }
194
195     return detect;
196 }
197
198 /*!
199  * @brief 通常のアイテムオブジェクトを感知する / Detect all "normal" objects on the current panel
200  * @param caster_ptr プレーヤーへの参照ポインタ
201  * @param range 効果範囲
202  * @return 効力があった場合TRUEを返す
203  */
204 bool detect_objects_normal(player_type *caster_ptr, POSITION range)
205 {
206     POSITION range2 = range;
207     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
208         range2 /= 3;
209
210     bool detect = FALSE;
211     for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) {
212         object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i];
213
214         if (!object_is_valid(o_ptr))
215             continue;
216         if (object_is_held_monster(o_ptr))
217             continue;
218
219         POSITION y = o_ptr->iy;
220         POSITION x = o_ptr->ix;
221
222         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range2)
223             continue;
224
225         if (o_ptr->tval != TV_GOLD) {
226             o_ptr->marked |= OM_FOUND;
227             lite_spot(caster_ptr, y, x);
228             detect = TRUE;
229         }
230     }
231
232     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 6)
233         detect = FALSE;
234     if (detect) {
235         msg_print(_("アイテムの存在を感じとった!", "You sense the presence of objects!"));
236     }
237
238     if (detect_monsters_string(caster_ptr, range, "!=?|/`")) {
239         detect = TRUE;
240     }
241
242     return detect;
243 }
244
245 /*!
246  * @brief 魔法効果のあるのアイテムオブジェクトを感知する / Detect all "magic" objects on the current panel.
247  * @param caster_ptr プレーヤーへの参照ポインタ
248  * @param range 効果範囲
249  * @return 効力があった場合TRUEを返す
250  * @details
251  * <pre>
252  * This will light up all spaces with "magic" items, including artifacts,
253  * ego-items, potions, scrolls, books, rods, wands, staffs, amulets, rings,
254  * and "enchanted" items of the "good" variety.
255  *
256  * It can probably be argued that this function is now too powerful.
257  * </pre>
258  */
259 bool detect_objects_magic(player_type *caster_ptr, POSITION range)
260 {
261     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
262         range /= 3;
263
264     tval_type tv;
265     bool detect = FALSE;
266     for (OBJECT_IDX i = 1; i < caster_ptr->current_floor_ptr->o_max; i++) {
267         object_type *o_ptr = &caster_ptr->current_floor_ptr->o_list[i];
268
269         if (!object_is_valid(o_ptr))
270             continue;
271         if (object_is_held_monster(o_ptr))
272             continue;
273
274         POSITION y = o_ptr->iy;
275         POSITION x = o_ptr->ix;
276
277         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
278             continue;
279
280         tv = o_ptr->tval;
281         if (object_is_artifact(o_ptr) || object_is_ego(o_ptr) || (tv == TV_WHISTLE) || (tv == TV_AMULET) || (tv == TV_RING) || (tv == TV_STAFF)
282             || (tv == TV_WAND) || (tv == TV_ROD) || (tv == TV_SCROLL) || (tv == TV_POTION) || (tv == TV_LIFE_BOOK) || (tv == TV_SORCERY_BOOK)
283             || (tv == TV_NATURE_BOOK) || (tv == TV_CHAOS_BOOK) || (tv == TV_DEATH_BOOK) || (tv == TV_TRUMP_BOOK) || (tv == TV_ARCANE_BOOK)
284             || (tv == TV_CRAFT_BOOK) || (tv == TV_DAEMON_BOOK) || (tv == TV_CRUSADE_BOOK) || (tv == TV_MUSIC_BOOK) || (tv == TV_HISSATSU_BOOK)
285             || (tv == TV_HEX_BOOK) || ((o_ptr->to_a > 0) || (o_ptr->to_h + o_ptr->to_d > 0))) {
286             o_ptr->marked |= OM_FOUND;
287             lite_spot(caster_ptr, y, x);
288             detect = TRUE;
289         }
290     }
291
292     if (detect) {
293         msg_print(_("魔法のアイテムの存在を感じとった!", "You sense the presence of magic objects!"));
294     }
295
296     return detect;
297 }
298
299 /*!
300  * @brief 一般のモンスターを感知する / Detect all "normal" monsters on the current panel
301  * @param caster_ptr プレーヤーへの参照ポインタ
302  * @param range 効果範囲
303  * @return 効力があった場合TRUEを返す
304  */
305 bool detect_monsters_normal(player_type *caster_ptr, POSITION range)
306 {
307     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
308         range /= 3;
309
310     bool flag = FALSE;
311     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
312         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
313         monster_race *r_ptr = &r_info[m_ptr->r_idx];
314         if (!monster_is_valid(m_ptr))
315             continue;
316
317         POSITION y = m_ptr->fy;
318         POSITION x = m_ptr->fx;
319         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
320             continue;
321
322         if (!(r_ptr->flags2 & RF2_INVISIBLE) || caster_ptr->see_inv) {
323             repair_monsters = TRUE;
324             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
325             update_monster(caster_ptr, i, FALSE);
326             flag = TRUE;
327         }
328     }
329
330     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 3)
331         flag = FALSE;
332     if (flag) {
333         msg_print(_("モンスターの存在を感じとった!", "You sense the presence of monsters!"));
334     }
335
336     return flag;
337 }
338
339 /*!
340  * @brief 不可視のモンスターを感知する / Detect all "invisible" monsters around the player
341  * @param caster_ptr プレーヤーへの参照ポインタ
342  * @param range 効果範囲
343  * @return 効力があった場合TRUEを返す
344  */
345 bool detect_monsters_invis(player_type *caster_ptr, POSITION range)
346 {
347     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
348         range /= 3;
349
350     bool flag = FALSE;
351     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
352         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
353         monster_race *r_ptr = &r_info[m_ptr->r_idx];
354
355         if (!monster_is_valid(m_ptr))
356             continue;
357
358         POSITION y = m_ptr->fy;
359         POSITION x = m_ptr->fx;
360
361         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
362             continue;
363
364         if (r_ptr->flags2 & RF2_INVISIBLE) {
365             if (caster_ptr->monster_race_idx == m_ptr->r_idx) {
366                 caster_ptr->window |= (PW_MONSTER);
367             }
368
369             repair_monsters = TRUE;
370             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
371             update_monster(caster_ptr, i, FALSE);
372             flag = TRUE;
373         }
374     }
375
376     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 3)
377         flag = FALSE;
378     if (flag) {
379         msg_print(_("透明な生物の存在を感じとった!", "You sense the presence of invisible creatures!"));
380     }
381
382     return flag;
383 }
384
385 /*!
386  * @brief 邪悪なモンスターを感知する / Detect all "evil" monsters on current panel
387  * @param caster_ptr プレーヤーへの参照ポインタ
388  * @param range 効果範囲
389  * @return 効力があった場合TRUEを返す
390  */
391 bool detect_monsters_evil(player_type *caster_ptr, POSITION range)
392 {
393     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
394         range /= 3;
395
396     bool flag = FALSE;
397     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
398         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
399         monster_race *r_ptr = &r_info[m_ptr->r_idx];
400         if (!monster_is_valid(m_ptr))
401             continue;
402
403         POSITION y = m_ptr->fy;
404         POSITION x = m_ptr->fx;
405
406         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
407             continue;
408
409         if (r_ptr->flags3 & RF3_EVIL) {
410             if (is_original_ap(m_ptr)) {
411                 r_ptr->r_flags3 |= (RF3_EVIL);
412                 if (caster_ptr->monster_race_idx == m_ptr->r_idx) {
413                     caster_ptr->window |= (PW_MONSTER);
414                 }
415             }
416
417             repair_monsters = TRUE;
418             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
419             update_monster(caster_ptr, i, FALSE);
420             flag = TRUE;
421         }
422     }
423
424     if (flag) {
425         msg_print(_("邪悪なる生物の存在を感じとった!", "You sense the presence of evil creatures!"));
426     }
427
428     return flag;
429 }
430
431 /*!
432  * @brief 無生命のモンスターを感知する(アンデッド、悪魔系を含む) / Detect all "nonliving", "undead" or "demonic" monsters on current panel
433  * @param caster_ptr プレーヤーへの参照ポインタ
434  * @param range 効果範囲
435  * @return 効力があった場合TRUEを返す
436  */
437 bool detect_monsters_nonliving(player_type *caster_ptr, POSITION range)
438 {
439     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
440         range /= 3;
441
442     bool flag = FALSE;
443     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
444         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
445         if (!monster_is_valid(m_ptr))
446             continue;
447
448         POSITION y = m_ptr->fy;
449         POSITION x = m_ptr->fx;
450         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
451             continue;
452
453         if (!monster_living(m_ptr->r_idx)) {
454             if (caster_ptr->monster_race_idx == m_ptr->r_idx) {
455                 caster_ptr->window |= (PW_MONSTER);
456             }
457
458             repair_monsters = TRUE;
459             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
460             update_monster(caster_ptr, i, FALSE);
461             flag = TRUE;
462         }
463     }
464
465     if (flag) {
466         msg_print(_("自然でないモンスターの存在を感じた!", "You sense the presence of unnatural beings!"));
467     }
468
469     return flag;
470 }
471
472 /*!
473  * @brief 精神のあるモンスターを感知する / Detect all monsters it has mind on current panel
474  * @param caster_ptr プレーヤーへの参照ポインタ
475  * @param range 効果範囲
476  * @return 効力があった場合TRUEを返す
477  */
478 bool detect_monsters_mind(player_type *caster_ptr, POSITION range)
479 {
480     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
481         range /= 3;
482
483     bool flag = FALSE;
484     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
485         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
486         monster_race *r_ptr = &r_info[m_ptr->r_idx];
487         if (!monster_is_valid(m_ptr))
488             continue;
489
490         POSITION y = m_ptr->fy;
491         POSITION x = m_ptr->fx;
492
493         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
494             continue;
495
496         if (!(r_ptr->flags2 & RF2_EMPTY_MIND)) {
497             if (caster_ptr->monster_race_idx == m_ptr->r_idx) {
498                 caster_ptr->window |= (PW_MONSTER);
499             }
500
501             repair_monsters = TRUE;
502             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
503             update_monster(caster_ptr, i, FALSE);
504             flag = TRUE;
505         }
506     }
507
508     if (flag) {
509         msg_print(_("殺気を感じとった!", "You sense the presence of someone's mind!"));
510     }
511
512     return flag;
513 }
514
515 /*!
516  * @brief 該当シンボルのモンスターを感知する / Detect all (string) monsters on current panel
517  * @param caster_ptr プレーヤーへの参照ポインタ
518  * @param range 効果範囲
519  * @param Match 対応シンボルの混じったモンスター文字列(複数指定化)
520  * @return 効力があった場合TRUEを返す
521  */
522 bool detect_monsters_string(player_type *caster_ptr, POSITION range, concptr Match)
523 {
524     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
525         range /= 3;
526
527     bool flag = FALSE;
528     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
529         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
530         monster_race *r_ptr = &r_info[m_ptr->r_idx];
531         if (!monster_is_valid(m_ptr))
532             continue;
533
534         POSITION y = m_ptr->fy;
535         POSITION x = m_ptr->fx;
536
537         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
538             continue;
539
540         if (angband_strchr(Match, r_ptr->d_char)) {
541             if (caster_ptr->monster_race_idx == m_ptr->r_idx) {
542                 caster_ptr->window |= (PW_MONSTER);
543             }
544
545             repair_monsters = TRUE;
546             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
547             update_monster(caster_ptr, i, FALSE);
548             flag = TRUE;
549         }
550     }
551
552     if (music_singing(caster_ptr, MUSIC_DETECT) && SINGING_COUNT(caster_ptr) > 3)
553         flag = FALSE;
554     if (flag) {
555         msg_print(_("モンスターの存在を感じとった!", "You sense the presence of monsters!"));
556     }
557
558     return flag;
559 }
560
561 /*!
562  * @brief flags3に対応するモンスターを感知する / A "generic" detect monsters routine, tagged to flags3
563  * @param caster_ptr プレーヤーへの参照ポインタ
564  * @param range 効果範囲
565  * @param match_flag 感知フラグ
566  * @return 効力があった場合TRUEを返す
567  */
568 bool detect_monsters_xxx(player_type *caster_ptr, POSITION range, u32b match_flag)
569 {
570     if (d_info[caster_ptr->dungeon_idx].flags1 & DF1_DARKNESS)
571         range /= 3;
572
573     bool flag = FALSE;
574     for (MONSTER_IDX i = 1; i < caster_ptr->current_floor_ptr->m_max; i++) {
575         monster_type *m_ptr = &caster_ptr->current_floor_ptr->m_list[i];
576         monster_race *r_ptr = &r_info[m_ptr->r_idx];
577         if (!monster_is_valid(m_ptr))
578             continue;
579
580         POSITION y = m_ptr->fy;
581         POSITION x = m_ptr->fx;
582
583         if (distance(caster_ptr->y, caster_ptr->x, y, x) > range)
584             continue;
585
586         if (r_ptr->flags3 & (match_flag)) {
587             if (is_original_ap(m_ptr)) {
588                 r_ptr->r_flags3 |= (match_flag);
589                 if (caster_ptr->monster_race_idx == m_ptr->r_idx) {
590                     caster_ptr->window |= (PW_MONSTER);
591                 }
592             }
593
594             repair_monsters = TRUE;
595             m_ptr->mflag2 |= (MFLAG2_MARK | MFLAG2_SHOW);
596             update_monster(caster_ptr, i, FALSE);
597             flag = TRUE;
598         }
599     }
600
601     concptr desc_monsters = _("変なモンスター", "weird monsters");
602     if (flag) {
603         switch (match_flag) {
604         case RF3_DEMON:
605             desc_monsters = _("デーモン", "demons");
606             break;
607         case RF3_UNDEAD:
608             desc_monsters = _("アンデッド", "the undead");
609             break;
610         }
611
612         msg_format(_("%sの存在を感じとった!", "You sense the presence of %s!"), desc_monsters);
613         msg_print(NULL);
614     }
615
616     return flag;
617 }
618
619 /*!
620  * @brief 全感知処理 / Detect everything
621  * @param caster_ptr プレーヤーへの参照ポインタ
622  * @param range 効果範囲
623  * @return 効力があった場合TRUEを返す
624  */
625 bool detect_all(player_type *caster_ptr, POSITION range)
626 {
627     bool detect = FALSE;
628     if (detect_traps(caster_ptr, range, TRUE))
629         detect = TRUE;
630     if (detect_doors(caster_ptr, range))
631         detect = TRUE;
632     if (detect_stairs(caster_ptr, range))
633         detect = TRUE;
634     if (detect_objects_gold(caster_ptr, range))
635         detect = TRUE;
636     if (detect_objects_normal(caster_ptr, range))
637         detect = TRUE;
638     if (detect_monsters_invis(caster_ptr, range))
639         detect = TRUE;
640     if (detect_monsters_normal(caster_ptr, range))
641         detect = TRUE;
642     return (detect);
643 }