OSDN Git Service

[Refactor] #37353 モンスター定義番号を monster.h へ移動。闘技場の対戦相手テーブルを bldg.c へ移動。
[hengband/hengband.git] / src / object-hook.c
1 
2 #include "angband.h"
3 #include "object-hook.h"
4 #include "monster.h"
5 #include "artifact.h"
6
7 /*!
8 * @brief 対象のアイテムが矢やクロスボウの矢の材料になるかを返す。/
9 * Hook to determine if an object is contertible in an arrow/bolt
10 * @param o_ptr オブジェクトの構造体の参照ポインタ。
11 * @return 材料にできるならTRUEを返す
12 */
13 bool item_tester_hook_convertible(object_type *o_ptr)
14 {
15         if ((o_ptr->tval == TV_JUNK) || (o_ptr->tval == TV_SKELETON)) return TRUE;
16         if ((o_ptr->tval == TV_CORPSE) && (o_ptr->sval == SV_SKELETON)) return TRUE;
17         return (FALSE);
18 }
19
20 /*!
21 * @brief 武器匠の「武器」鑑定対象になるかを判定する。/ Hook to specify "weapon"
22 * @param o_ptr オブジェクトの構造体の参照ポインタ。
23 * @return 対象になるならTRUEを返す。
24 */
25 bool item_tester_hook_orthodox_melee_weapons(object_type *o_ptr)
26 {
27         switch (o_ptr->tval)
28         {
29         case TV_HAFTED:
30         case TV_POLEARM:
31         case TV_DIGGING:
32         {
33                 return (TRUE);
34         }
35         case TV_SWORD:
36         {
37                 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
38         }
39         }
40
41         return (FALSE);
42 }
43
44 /*!
45 * @brief オブジェクトが右手か左手に装備できる武器かどうかの判定
46 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
47 * @return 右手か左手の武器として装備できるならばTRUEを返す。
48 */
49 bool item_tester_hook_melee_weapon(object_type *o_ptr)
50 {
51         /* Check for a usable slot */
52         if ((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) return (TRUE);
53         return (FALSE);
54 }
55
56
57 /*!
58 * @brief 武器匠の「矢弾」鑑定対象になるかを判定する。/ Hook to specify "weapon"
59 * @param o_ptr オブジェクトの構造体の参照ポインタ。
60 * @return 対象になるならTRUEを返す。
61 */
62 bool item_tester_hook_ammo(object_type *o_ptr)
63 {
64         switch (o_ptr->tval)
65         {
66         case TV_SHOT:
67         case TV_ARROW:
68         case TV_BOLT:
69         {
70                 return (TRUE);
71         }
72         }
73
74         return (FALSE);
75 }
76
77 /*!
78 * @brief 修復対象となる壊れた武器かを判定する。 / Hook to specify "broken weapon"
79 * @param o_ptr オブジェクトの構造体の参照ポインタ。
80 * @return 修復対象になるならTRUEを返す。
81 */
82 bool item_tester_hook_broken_weapon(object_type *o_ptr)
83 {
84         if (o_ptr->tval != TV_SWORD) return FALSE;
85
86         switch (o_ptr->sval)
87         {
88         case SV_BROKEN_DAGGER:
89         case SV_BROKEN_SWORD:
90                 return TRUE;
91         }
92
93         return FALSE;
94 }
95
96 /*!
97 * @brief オブジェクトが投射可能な武器かどうかを返す。
98 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
99 * @return 投射可能な武器ならばTRUE
100 */
101 bool item_tester_hook_boomerang(object_type *o_ptr)
102 {
103         if ((o_ptr->tval == TV_DIGGING) || (o_ptr->tval == TV_SWORD) || (o_ptr->tval == TV_POLEARM) || (o_ptr->tval == TV_HAFTED)) return (TRUE);
104         return (FALSE);
105 }
106
107 /*!
108 * @brief オブジェクトをプレイヤーが食べることができるかを判定する /
109 * Hook to determine if an object is eatable
110 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
111 * @return 食べることが可能ならばTRUEを返す
112 */
113 bool item_tester_hook_eatable(object_type *o_ptr)
114 {
115         if (o_ptr->tval == TV_FOOD) return TRUE;
116
117 #if 0
118         if (prace_is_(RACE_SKELETON))
119         {
120                 if (o_ptr->tval == TV_SKELETON ||
121                         (o_ptr->tval == TV_CORPSE && o_ptr->sval == SV_SKELETON))
122                         return TRUE;
123         }
124         else
125 #endif
126
127         if (prace_is_(RACE_SKELETON) ||
128                 prace_is_(RACE_GOLEM) ||
129                 prace_is_(RACE_ZOMBIE) ||
130                 prace_is_(RACE_SPECTRE))
131         {
132                 if (o_ptr->tval == TV_STAFF || o_ptr->tval == TV_WAND)
133                         return TRUE;
134         }
135         else if (prace_is_(RACE_DEMON) || (mimic_info[p_ptr->mimic_form].MIMIC_FLAGS & MIMIC_IS_DEMON))
136         {
137                 if (o_ptr->tval == TV_CORPSE &&
138                         o_ptr->sval == SV_CORPSE &&
139                         my_strchr("pht", r_info[o_ptr->pval].d_char))
140                         return TRUE;
141         }
142
143         return (FALSE);
144 }
145
146 /*!
147 * @brief オブジェクトがどちらの手にも装備できる武器かどうかの判定
148 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
149 * @return 左右両方の手で装備できるならばTRUEを返す。
150 */
151 bool item_tester_hook_mochikae(object_type *o_ptr)
152 {
153         /* Check for a usable slot */
154         if (((o_ptr->tval >= TV_DIGGING) && (o_ptr->tval <= TV_SWORD)) ||
155                 (o_ptr->tval == TV_SHIELD) || (o_ptr->tval == TV_CAPTURE) ||
156                 (o_ptr->tval == TV_CARD)) return (TRUE);
157         return (FALSE);
158 }
159
160 /*!
161 * @brief オブジェクトをプレイヤーが魔道具として発動できるかを判定する /
162 * Hook to determine if an object is activatable
163 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
164 * @return 魔道具として発動可能ならばTRUEを返す
165 */
166 bool item_tester_hook_activate(object_type *o_ptr)
167 {
168         BIT_FLAGS flgs[TR_FLAG_SIZE];
169
170         /* Not known */
171         if (!object_is_known(o_ptr)) return (FALSE);
172         object_flags(o_ptr, flgs);
173
174         /* Check activation flag */
175         if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
176
177         return (FALSE);
178 }
179
180 /*!
181 * @brief オブジェクトを防具として装備できるかの判定 / The "wearable" tester
182 * @param o_ptr 判定するオブジェクトの構造体参照ポインタ
183 * @return オブジェクトが防具として装備できるならTRUEを返す。
184 */
185 bool item_tester_hook_wear(object_type *o_ptr)
186 {
187         if ((o_ptr->tval == TV_SOFT_ARMOR) && (o_ptr->sval == SV_ABUNAI_MIZUGI))
188                 if (p_ptr->psex == SEX_MALE) return FALSE;
189
190         /* Check for a usable slot */
191         if (wield_slot(o_ptr) >= INVEN_RARM) return (TRUE);
192
193         return (FALSE);
194 }
195
196
197 /*!
198 * @brief オブジェクトをプレイヤーが簡易使用コマンドで利用できるかを判定する /
199 * Hook to determine if an object is useable
200 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
201 * @return 利用可能ならばTRUEを返す
202 */
203 bool item_tester_hook_use(object_type *o_ptr)
204 {
205         BIT_FLAGS flgs[TR_FLAG_SIZE];
206
207         /* Ammo */
208         if (o_ptr->tval == p_ptr->tval_ammo)
209                 return (TRUE);
210
211         /* Useable object */
212         switch (o_ptr->tval)
213         {
214         case TV_SPIKE:
215         case TV_STAFF:
216         case TV_WAND:
217         case TV_ROD:
218         case TV_SCROLL:
219         case TV_POTION:
220         case TV_FOOD:
221         {
222                 return (TRUE);
223         }
224
225         default:
226         {
227                 int i;
228
229                 /* Not known */
230                 if (!object_is_known(o_ptr)) return (FALSE);
231
232                 /* HACK - only items from the equipment can be activated */
233                 for (i = INVEN_RARM; i < INVEN_TOTAL; i++)
234                 {
235                         if (&inventory[i] == o_ptr)
236                         {
237                                 object_flags(o_ptr, flgs);
238
239                                 /* Check activation flag */
240                                 if (have_flag(flgs, TR_ACTIVATE)) return (TRUE);
241                         }
242                 }
243         }
244         }
245
246         return (FALSE);
247 }
248
249
250 /*!
251 * @brief オブジェクトをプレイヤーが飲むことができるかを判定する /
252 * Hook to determine if an object can be quaffed
253 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
254 * @return 飲むことが可能ならばTRUEを返す
255 */
256 bool item_tester_hook_quaff(object_type *o_ptr)
257 {
258         if (o_ptr->tval == TV_POTION) return TRUE;
259
260         if (prace_is_(RACE_ANDROID))
261         {
262                 if (o_ptr->tval == TV_FLASK && o_ptr->sval == SV_FLASK_OIL)
263                         return TRUE;
264         }
265         return FALSE;
266 }
267
268
269 /*!
270 * @brief オブジェクトをプレイヤーが読むことができるかを判定する /
271 * Hook to determine if an object is readable
272 * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
273 * @return 読むことが可能ならばTRUEを返す
274 */
275 bool item_tester_hook_readable(object_type *o_ptr)
276 {
277         if ((o_ptr->tval == TV_SCROLL) || (o_ptr->tval == TV_PARCHMENT) || (o_ptr->name1 == ART_GHB) || (o_ptr->name1 == ART_POWER)) return (TRUE);
278         return (FALSE);
279 }
280
281
282 /*!
283 * @brief エッセンスの付加可能な武器や矢弾かを返す
284 * @param o_ptr チェックしたいオブジェクトの構造体参照ポインタ
285 * @return エッセンスの付加可能な武器か矢弾ならばTRUEを返す。
286 */
287 bool item_tester_hook_melee_ammo(object_type *o_ptr)
288 {
289         switch (o_ptr->tval)
290         {
291         case TV_HAFTED:
292         case TV_POLEARM:
293         case TV_DIGGING:
294         case TV_BOLT:
295         case TV_ARROW:
296         case TV_SHOT:
297         {
298                 return (TRUE);
299         }
300         case TV_SWORD:
301         {
302                 if (o_ptr->sval != SV_DOKUBARI) return (TRUE);
303         }
304         }
305
306         return (FALSE);
307 }
308
309 /*!
310 * @brief 呪術領域の武器呪縛の対象にできる武器かどうかを返す。 / An "item_tester_hook" for offer
311 * @param o_ptr オブジェクト構造体の参照ポインタ
312 * @return 呪縛可能な武器ならばTRUEを返す
313 */
314 bool item_tester_hook_weapon_except_bow(object_type *o_ptr)
315 {
316         switch (o_ptr->tval)
317         {
318         case TV_SWORD:
319         case TV_HAFTED:
320         case TV_POLEARM:
321         case TV_DIGGING:
322         {
323                 return (TRUE);
324         }
325         }
326
327         return (FALSE);
328 }
329
330 /*!
331 * @brief 呪術領域の各処理に使える呪われた装備かどうかを返す。 / An "item_tester_hook" for offer
332 * @param o_ptr オブジェクト構造体の参照ポインタ
333 * @return 使える装備ならばTRUEを返す
334 */
335 bool item_tester_hook_cursed(object_type *o_ptr)
336 {
337         return (bool)(object_is_cursed(o_ptr));
338 }
339
340
341 /*!
342 * @brief アイテムが並の価値のアイテムかどうか判定する /
343 * Check if an object is nameless weapon or armour
344 * @param o_ptr 判定するアイテムの情報参照ポインタ
345 * @return 並ならばTRUEを返す
346 */
347 bool item_tester_hook_nameless_weapon_armour(object_type *o_ptr)
348 {
349         /* Require weapon or armour */
350         if (!object_is_weapon_armour_ammo(o_ptr)) return FALSE;
351
352         /* Require nameless object if the object is well known */
353         if (object_is_known(o_ptr) && !object_is_nameless(o_ptr))
354                 return FALSE;
355
356         return TRUE;
357 }
358
359
360 /*!
361 * @brief アイテムが鑑定済みかを判定する /
362 * @param o_ptr 判定するアイテムの情報参照ポインタ
363 * @return 実際に鑑定済みならばTRUEを返す
364 */
365 bool item_tester_hook_identify(object_type *o_ptr)
366 {
367         return (bool)!object_is_known(o_ptr);
368 }
369
370 /*!
371 * @brief アイテムが鑑定済みの武器防具かを判定する /
372 * @param o_ptr 判定するアイテムの情報参照ポインタ
373 * @return 実際に鑑定済みならばTRUEを返す
374 */
375 bool item_tester_hook_identify_weapon_armour(object_type *o_ptr)
376 {
377         if (object_is_known(o_ptr))
378                 return FALSE;
379         return object_is_weapon_armour_ammo(o_ptr);
380 }
381
382 /*!
383 * @brief アイテムが*鑑定*済みかを判定する /
384 * @param o_ptr 判定するアイテムの情報参照ポインタ
385 * @return 実際に鑑定済みならばTRUEを返す
386 */
387 bool item_tester_hook_identify_fully(object_type *o_ptr)
388 {
389         return (bool)(!object_is_known(o_ptr) || !(o_ptr->ident & IDENT_MENTAL));
390 }
391
392 /*!
393 * @brief アイテムが*鑑定*済みの武器防具かを判定する /
394 * @param o_ptr 判定するアイテムの情報参照ポインタ
395 * @return 実際に鑑定済みならばTRUEを返す
396 */
397 bool item_tester_hook_identify_fully_weapon_armour(object_type *o_ptr)
398 {
399         if (!item_tester_hook_identify_fully(o_ptr))
400                 return FALSE;
401         return object_is_weapon_armour_ammo(o_ptr);
402 }
403
404
405 /*!
406 * @brief 魔力充填が可能なアイテムかどうか判定する /
407 * Hook for "get_item()".  Determine if something is rechargable.
408 * @param o_ptr 判定するアイテムの情報参照ポインタ
409 * @return 魔力充填が可能ならばTRUEを返す
410 */
411 bool item_tester_hook_recharge(object_type *o_ptr)
412 {
413         /* Recharge staffs */
414         if (o_ptr->tval == TV_STAFF) return (TRUE);
415
416         /* Recharge wands */
417         if (o_ptr->tval == TV_WAND) return (TRUE);
418
419         /* Hack -- Recharge rods */
420         if (o_ptr->tval == TV_ROD) return (TRUE);
421
422         return (FALSE);
423 }
424
425 /*!
426  * @brief オブジェクトがプレイヤーが使用可能な魔道書かどうかを判定する
427  * @param o_ptr 判定したいオブ会ジェクトの構造体参照ポインタ
428  * @return 学習できる魔道書ならばTRUEを返す
429  */
430 bool item_tester_learn_spell(object_type *o_ptr)
431 {
432         s32b choices = realm_choices2[p_ptr->pclass];
433
434         if (p_ptr->pclass == CLASS_PRIEST)
435         {
436                 if (is_good_realm(p_ptr->realm1))
437                 {
438                         choices &= ~(CH_DEATH | CH_DAEMON);
439                 }
440                 else
441                 {
442                         choices &= ~(CH_LIFE | CH_CRUSADE);
443                 }
444         }
445
446         if ((o_ptr->tval < TV_LIFE_BOOK) || (o_ptr->tval > (TV_LIFE_BOOK + MAX_REALM - 1))) return (FALSE);
447         if ((o_ptr->tval == TV_MUSIC_BOOK) && (p_ptr->pclass == CLASS_BARD)) return (TRUE);
448         else if (!is_magic(tval2realm(o_ptr->tval))) return FALSE;
449         if ((REALM1_BOOK == o_ptr->tval) || (REALM2_BOOK == o_ptr->tval)) return (TRUE);
450         if (choices & (0x0001 << (tval2realm(o_ptr->tval) - 1))) return (TRUE);
451         return (FALSE);
452 }
453
454 /*!
455  * @brief オブジェクトが高位の魔法書かどうかを判定する
456  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
457  * @return オブジェクトが高位の魔法書ならばTRUEを返す
458  */
459 bool item_tester_high_level_book(object_type *o_ptr)
460 {
461         if ((o_ptr->tval == TV_LIFE_BOOK) ||
462                 (o_ptr->tval == TV_SORCERY_BOOK) ||
463                 (o_ptr->tval == TV_NATURE_BOOK) ||
464                 (o_ptr->tval == TV_CHAOS_BOOK) ||
465                 (o_ptr->tval == TV_DEATH_BOOK) ||
466                 (o_ptr->tval == TV_TRUMP_BOOK) ||
467                 (o_ptr->tval == TV_CRAFT_BOOK) ||
468                 (o_ptr->tval == TV_DAEMON_BOOK) ||
469                 (o_ptr->tval == TV_CRUSADE_BOOK) ||
470                 (o_ptr->tval == TV_MUSIC_BOOK) ||
471                 (o_ptr->tval == TV_HEX_BOOK))
472         {
473                 if (o_ptr->sval > 1)
474                         return TRUE;
475                 else
476                         return FALSE;
477         }
478
479         return FALSE;
480 }
481
482 /*!
483  * @brief オブジェクトがランタンの燃料になるかどうかを判定する
484  * An "item_tester_hook" for refilling lanterns
485  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
486  * @return オブジェクトがランタンの燃料になるならばTRUEを返す
487  */
488 bool item_tester_refill_lantern(object_type *o_ptr)
489 {
490         /* Flasks of oil are okay */
491         if (o_ptr->tval == TV_FLASK) return (TRUE);
492
493         /* Laterns are okay */
494         if ((o_ptr->tval == TV_LITE) &&
495                 (o_ptr->sval == SV_LITE_LANTERN)) return (TRUE);
496
497         /* Assume not okay */
498         return (FALSE);
499 }
500
501
502 /*!
503  * @brief オブジェクトが薬であるかを返す
504  * @param o_ptr 対象のオブジェクト構造体ポインタ
505  * @return オブジェクトが薬ならばTRUEを返す
506  */
507 bool object_is_potion(object_type *o_ptr)
508 {
509         return (k_info[o_ptr->k_idx].tval == TV_POTION);
510 }
511
512
513 /*!
514  * @brief オブジェクトが賞金首の報酬対象になるかを返す
515  * @param o_ptr 対象のオブジェクト構造体ポインタ
516  * @return オブジェクトが報酬対象になるならTRUEを返す
517  */
518 bool object_is_shoukinkubi(object_type *o_ptr)
519 {
520         int i;
521
522         /* Require corpse or skeleton */
523         if (o_ptr->tval != TV_CORPSE) return FALSE;
524
525         /* No wanted monsters in vanilla town */
526         if (vanilla_town) return FALSE;
527
528         /* Today's wanted */
529         if (p_ptr->today_mon > 0 && (streq(r_name + r_info[o_ptr->pval].name, r_name + r_info[today_mon].name))) return TRUE;
530
531         /* Tsuchinoko */
532         if (o_ptr->pval == MON_TSUCHINOKO) return TRUE;
533
534         /* Unique monster */
535         for (i = 0; i < MAX_KUBI; i++)
536                 if (o_ptr->pval == current_world_ptr->bounty_r_idx[i]) break;
537         if (i < MAX_KUBI) return TRUE;
538
539         /* Not wanted */
540         return FALSE;
541 }
542
543 /*!
544  * @brief オブジェクトがプレイヤーの職業に応じた適正武器か否かを返す / Favorite weapons
545  * @param o_ptr 対象のオブジェクト構造体ポインタ
546  * @return オブジェクトが適正武器ならばTRUEを返す
547  */
548 bool object_is_favorite(object_type *o_ptr)
549 {
550         /* Only melee weapons match */
551         if (!(o_ptr->tval == TV_POLEARM ||
552                 o_ptr->tval == TV_SWORD ||
553                 o_ptr->tval == TV_DIGGING ||
554                 o_ptr->tval == TV_HAFTED))
555         {
556                 return FALSE;
557         }
558
559         /* Favorite weapons are varied depend on the class */
560         switch (p_ptr->pclass)
561         {
562         case CLASS_PRIEST:
563         {
564                 BIT_FLAGS flgs[TR_FLAG_SIZE];
565                 object_flags_known(o_ptr, flgs);
566
567                 if (!have_flag(flgs, TR_BLESSED) &&
568                         !(o_ptr->tval == TV_HAFTED))
569                         return FALSE;
570                 break;
571         }
572
573         case CLASS_MONK:
574         case CLASS_FORCETRAINER:
575                 /* Icky to wield? */
576                 if (!(s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval]))
577                         return FALSE;
578                 break;
579
580         case CLASS_BEASTMASTER:
581         case CLASS_CAVALRY:
582         {
583                 BIT_FLAGS flgs[TR_FLAG_SIZE];
584                 object_flags_known(o_ptr, flgs);
585
586                 /* Is it known to be suitable to using while riding? */
587                 if (!(have_flag(flgs, TR_RIDING)))
588                         return FALSE;
589
590                 break;
591         }
592
593         case CLASS_NINJA:
594                 /* Icky to wield? */
595                 if (s_info[p_ptr->pclass].w_max[o_ptr->tval - TV_WEAPON_BEGIN][o_ptr->sval] <= WEAPON_EXP_BEGINNER)
596                         return FALSE;
597                 break;
598
599         default:
600                 /* All weapons are okay for non-special classes */
601                 return TRUE;
602         }
603
604         return TRUE;
605 }
606
607
608 /*!
609  * @brief オブジェクトがレアアイテムかどうかを返す /
610  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
611  * @param o_ptr 対象のオブジェクト構造体ポインタ
612  * @return レアアイテムならばTRUEを返す
613  */
614 bool object_is_rare(object_type *o_ptr)
615 {
616         switch (o_ptr->tval)
617         {
618         case TV_HAFTED:
619                 if (o_ptr->sval == SV_MACE_OF_DISRUPTION ||
620                         o_ptr->sval == SV_WIZSTAFF) return TRUE;
621                 break;
622
623         case TV_POLEARM:
624                 if (o_ptr->sval == SV_SCYTHE_OF_SLICING ||
625                         o_ptr->sval == SV_DEATH_SCYTHE) return TRUE;
626                 break;
627
628         case TV_SWORD:
629                 if (o_ptr->sval == SV_BLADE_OF_CHAOS ||
630                         o_ptr->sval == SV_DIAMOND_EDGE ||
631                         o_ptr->sval == SV_DOKUBARI ||
632                         o_ptr->sval == SV_HAYABUSA) return TRUE;
633                 break;
634
635         case TV_SHIELD:
636                 if (o_ptr->sval == SV_DRAGON_SHIELD ||
637                         o_ptr->sval == SV_MIRROR_SHIELD) return TRUE;
638                 break;
639
640         case TV_HELM:
641                 if (o_ptr->sval == SV_DRAGON_HELM) return TRUE;
642                 break;
643
644         case TV_BOOTS:
645                 if (o_ptr->sval == SV_PAIR_OF_DRAGON_GREAVE) return TRUE;
646                 break;
647
648         case TV_CLOAK:
649                 if (o_ptr->sval == SV_ELVEN_CLOAK ||
650                         o_ptr->sval == SV_ETHEREAL_CLOAK ||
651                         o_ptr->sval == SV_SHADOW_CLOAK) return TRUE;
652                 break;
653
654         case TV_GLOVES:
655                 if (o_ptr->sval == SV_SET_OF_DRAGON_GLOVES) return TRUE;
656                 break;
657
658         case TV_SOFT_ARMOR:
659                 if (o_ptr->sval == SV_KUROSHOUZOKU ||
660                         o_ptr->sval == SV_ABUNAI_MIZUGI) return TRUE;
661                 break;
662
663         case TV_DRAG_ARMOR:
664                 return TRUE;
665
666         default:
667                 break;
668         }
669
670         /* Any others are not "rare" objects. */
671         return FALSE;
672 }
673
674
675 /*!
676  * @brief オブジェクトが武器として装備できるかどうかを返す / Check if an object is weapon (including bows and ammo)
677  * @param o_ptr 対象のオブジェクト構造体ポインタ
678  * @return 武器として使えるならばTRUEを返す
679  */
680 bool object_is_weapon(object_type *o_ptr)
681 {
682         if (TV_WEAPON_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
683
684         return FALSE;
685 }
686
687
688 /*!
689  * @brief オブジェクトが武器や矢弾として使用できるかを返す / Check if an object is weapon (including bows and ammo)
690  * Rare weapons/aromors including Blade of Chaos, Dragon armors, etc.
691  * @param o_ptr 対象のオブジェクト構造体ポインタ
692  * @return 武器や矢弾として使えるならばTRUEを返す
693  */
694 bool object_is_weapon_ammo(object_type *o_ptr)
695 {
696         if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEAPON_END) return TRUE;
697
698         return FALSE;
699 }
700
701 /*!
702  * @brief オブジェクトが矢弾として使用できるかどうかを返す / Check if an object is ammo
703  * @param o_ptr 対象のオブジェクト構造体ポインタ
704  * @return 矢弾として使えるならばTRUEを返す
705  */
706 bool object_is_ammo(object_type *o_ptr)
707 {
708         if (TV_MISSILE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_MISSILE_END) return TRUE;
709
710         return FALSE;
711 }
712
713 /*!
714  * @brief オブジェクトが防具として装備できるかどうかを返す / Check if an object is armour
715  * @param o_ptr 対象のオブジェクト構造体ポインタ
716  * @return 矢弾として使えるならばTRUEを返す
717  */
718 bool object_is_armour(object_type *o_ptr)
719 {
720         if (TV_ARMOR_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_ARMOR_END) return TRUE;
721
722         return FALSE;
723 }
724
725 /*!
726  * @brief オブジェクトが武器、防具、矢弾として使用できるかを返す / Check if an object is weapon, armour or ammo
727  * @param o_ptr 対象のオブジェクト構造体ポインタ
728  * @return 武器、防具、矢弾として使えるならばTRUEを返す
729  */
730 bool object_is_weapon_armour_ammo(object_type *o_ptr)
731 {
732         if (object_is_weapon_ammo(o_ptr) || object_is_armour(o_ptr)) return TRUE;
733
734         return FALSE;
735 }
736
737
738 /*!
739  * @brief オブジェクトが近接武器として装備できるかを返す / Melee weapons
740  * @param o_ptr 対象のオブジェクト構造体ポインタ
741  * @return 近接武器として使えるならばTRUEを返す
742  */
743 bool object_is_melee_weapon(object_type *o_ptr)
744 {
745         if (TV_DIGGING <= o_ptr->tval && o_ptr->tval <= TV_SWORD) return TRUE;
746
747         return FALSE;
748 }
749
750
751 /*!
752  * @brief オブジェクトが装備可能であるかを返す / Wearable including all weapon, all armour, bow, light source, amulet, and ring
753  * @param o_ptr 対象のオブジェクト構造体ポインタ
754  * @return 装備可能ならばTRUEを返す
755  */
756 bool object_is_wearable(object_type *o_ptr)
757 {
758         if (TV_WEARABLE_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_WEARABLE_END) return TRUE;
759
760         return FALSE;
761 }
762
763
764 /*!
765  * @brief オブジェクトが装備品であるかを返す(object_is_wearableに矢弾を含む) / Equipment including all wearable objects and ammo
766  * @param o_ptr 対象のオブジェクト構造体ポインタ
767  * @return 装備品ならばTRUEを返す
768  */
769 bool object_is_equipment(object_type *o_ptr)
770 {
771         if (TV_EQUIP_BEGIN <= o_ptr->tval && o_ptr->tval <= TV_EQUIP_END) return TRUE;
772
773         return FALSE;
774 }
775
776
777 /*!
778  * @brief オブジェクトが強化不能武器であるかを返す / Poison needle can not be enchanted
779  * @param o_ptr 対象のオブジェクト構造体ポインタ
780  * @return 強化不能ならばTRUEを返す
781  */
782 bool object_refuse_enchant_weapon(object_type *o_ptr)
783 {
784         if (o_ptr->tval == TV_SWORD && o_ptr->sval == SV_DOKUBARI) return TRUE;
785
786         return FALSE;
787 }
788
789
790 /*!
791  * @brief オブジェクトが強化可能武器であるかを返す /
792  * Check if an object is weapon (including bows and ammo) and allows enchantment
793  * @param o_ptr 対象のオブジェクト構造体ポインタ
794  * @return 強化可能ならばTRUEを返す
795  */
796 bool object_allow_enchant_weapon(object_type *o_ptr)
797 {
798         if (object_is_weapon_ammo(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
799
800         return FALSE;
801 }
802
803
804 /*!
805  * @brief オブジェクトが強化可能な近接武器であるかを返す /
806  * Check if an object is melee weapon and allows enchantment
807  * @param o_ptr 対象のオブジェクト構造体ポインタ
808  * @return 強化可能な近接武器ならばTRUEを返す
809  */
810 bool object_allow_enchant_melee_weapon(object_type *o_ptr)
811 {
812         if (object_is_melee_weapon(o_ptr) && !object_refuse_enchant_weapon(o_ptr)) return TRUE;
813
814         return FALSE;
815 }
816
817
818 /*!
819  * @brief オブジェクトが鍛冶師のエッセンス付加済みかを返す /
820  * Check if an object is made by a smith's special ability
821  * @param o_ptr 対象のオブジェクト構造体ポインタ
822  * @return エッセンス付加済みならばTRUEを返す
823  */
824 bool object_is_smith(object_type *o_ptr)
825 {
826         if (object_is_weapon_armour_ammo(o_ptr) && o_ptr->xtra3) return TRUE;
827
828         return FALSE;
829 }
830
831 /*!
832  * @brief オブジェクトがアーティファクトかを返す /
833  * Check if an object is artifact
834  * @param o_ptr 対象のオブジェクト構造体ポインタ
835  * @return アーティファクトならばTRUEを返す
836  */
837 bool object_is_artifact(object_type *o_ptr)
838 {
839         if (object_is_fixed_artifact(o_ptr) || o_ptr->art_name) return TRUE;
840
841         return FALSE;
842 }
843
844
845 /*!
846  * @brief オブジェクトがランダムアーティファクトかを返す /
847  * Check if an object is random artifact
848  * @param o_ptr 対象のオブジェクト構造体ポインタ
849  * @return ランダムアーティファクトならばTRUEを返す
850  */
851 bool object_is_random_artifact(object_type *o_ptr)
852 {
853         if (object_is_artifact(o_ptr) && !object_is_fixed_artifact(o_ptr)) return TRUE;
854
855         return FALSE;
856 }
857
858 /*!
859  * @brief オブジェクトが通常のアイテム(アーティファクト、エゴ、鍛冶師エッセンス付加いずれでもない)かを返す /
860  * Check if an object is neither artifact, ego, nor 'smith' object
861  * @param o_ptr 対象のオブジェクト構造体ポインタ
862  * @return 通常のアイテムならばTRUEを返す
863  */
864 bool object_is_nameless(object_type *o_ptr)
865 {
866         if (!object_is_artifact(o_ptr) && !object_is_ego(o_ptr) && !object_is_smith(o_ptr))
867                 return TRUE;
868
869         return FALSE;
870 }
871
872 /*!
873  * @brief オブジェクトが両手持ち可能な武器かを返す /
874  * Check if an object is melee weapon and allows wielding with two-hands
875  * @param o_ptr 対象のオブジェクト構造体ポインタ
876  * @return 両手持ち可能ならばTRUEを返す
877  */
878 bool object_allow_two_hands_wielding(object_type *o_ptr)
879 {
880         if (object_is_melee_weapon(o_ptr) && ((o_ptr->weight > 99) || (o_ptr->tval == TV_POLEARM))) return TRUE;
881
882         return FALSE;
883 }
884
885 /*!
886  * @brief オブジェクトが松明に束ねられるかどうかを判定する
887  * An "item_tester_hook" for refilling torches
888  * @param o_ptr 判定したいオブジェクトの構造体参照ポインタ
889  * @return オブジェクトが松明に束ねられるならばTRUEを返す
890  */
891 bool object_can_refill_torch(object_type *o_ptr)
892 {
893         /* Torches are okay */
894         if ((o_ptr->tval == TV_LITE) &&
895                 (o_ptr->sval == SV_LITE_TORCH)) return (TRUE);
896
897         /* Assume not okay */
898         return (FALSE);
899 }
900
901
902 /*!
903  * @brief 破壊可能なアイテムかを返す /
904  * Determines whether an object can be destroyed, and makes fake inscription.
905  * @param o_ptr 破壊可能かを確認したいオブジェクトの構造体参照ポインタ
906  * @return オブジェクトが破壊可能ならばTRUEを返す
907  */
908 bool can_player_destroy_object(object_type *o_ptr)
909 {
910         /* Artifacts cannot be destroyed */
911         if (!object_is_artifact(o_ptr)) return TRUE;
912
913         /* If object is unidentified, makes fake inscription */
914         if (!object_is_known(o_ptr))
915         {
916                 byte feel = FEEL_SPECIAL;
917
918                 /* Hack -- Handle icky artifacts */
919                 if (object_is_cursed(o_ptr) || object_is_broken(o_ptr)) feel = FEEL_TERRIBLE;
920
921                 /* Hack -- inscribe the artifact */
922                 o_ptr->feeling = feel;
923
924                 /* We have "felt" it (again) */
925                 o_ptr->ident |= (IDENT_SENSE);
926                 p_ptr->update |= (PU_COMBINE);
927                 p_ptr->window |= (PW_INVEN | PW_EQUIP);
928
929                 return FALSE;
930         }
931
932         /* Identified artifact -- Nothing to do */
933         return FALSE;
934 }
935
936 /*!
937  * @brief オブジェクトがクエストの達成目的か否かを返す。
938  * @param o_ptr 特性短縮表記を得たいオブジェクト構造体の参照ポインタ
939  * @return 現在クエスト達成目的のアイテムならばTRUEを返す。
940  */
941 bool object_is_quest_target(object_type *o_ptr)
942 {
943         if (p_ptr->inside_quest)
944         {
945                 ARTIFACT_IDX a_idx = quest[p_ptr->inside_quest].k_idx;
946                 if (a_idx)
947                 {
948                         artifact_type *a_ptr = &a_info[a_idx];
949                         if (!(a_ptr->gen_flags & TRG_INSTA_ART))
950                         {
951                                 if ((o_ptr->tval == a_ptr->tval) && (o_ptr->sval == a_ptr->sval))
952                                 {
953                                         return TRUE;
954                                 }
955                         }
956                 }
957         }
958         return FALSE;
959 }
960