OSDN Git Service

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