OSDN Git Service

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