OSDN Git Service

Merge pull request #1015 from sikabane-works/release/3.0.0Alpha21
[hengbandforosx/hengbandosx.git] / src / view / object-describer.cpp
1 #include "view/object-describer.h"
2 #include "cmd-action/cmd-spell.h"
3 #include "flavor/flavor-describer.h"
4 #include "flavor/object-flavor-types.h"
5 #include "object-enchant/special-object-flags.h"
6 #include "object/object-generator.h"
7 #include "perception/object-perception.h"
8 #include "realm/realm-names-table.h"
9 #include "spell/spell-info.h"
10 #include "system/object-type-definition.h"
11 #include "system/player-type-definition.h"
12 #include "term/term-color-types.h"
13 #include "view/display-messages.h"
14
15 /*!
16  * @brief 魔道具の使用回数の残量を示すメッセージを表示する /
17  * Describe the charges on an item in the inventory.
18  * @param owner_ptr プレーヤーへの参照ポインタ
19  * @param item 残量を表示したいプレイヤーのアイテム所持スロット
20  */
21 void inven_item_charges(player_type *owner_ptr, INVENTORY_IDX item)
22 {
23     object_type *o_ptr = &owner_ptr->inventory_list[item];
24     if ((o_ptr->tval != TV_STAFF) && (o_ptr->tval != TV_WAND))
25         return;
26     if (!object_is_known(o_ptr))
27         return;
28
29 #ifdef JP
30     if (o_ptr->pval <= 0) {
31         msg_print("もう魔力が残っていない。");
32     } else {
33         msg_format("あと %d 回分の魔力が残っている。", o_ptr->pval);
34     }
35 #else
36     if (o_ptr->pval != 1) {
37         msg_format("You have %d charges remaining.", o_ptr->pval);
38     }
39
40     else {
41         msg_format("You have %d charge remaining.", o_ptr->pval);
42     }
43 #endif
44 }
45
46 /*!
47  * @brief アイテムの残り所持数メッセージを表示する /
48  * Describe an item in the inventory.
49  * @param owner_ptr プレーヤーへの参照ポインタ
50  * @param item 残量を表示したいプレイヤーのアイテム所持スロット
51  */
52 void inven_item_describe(player_type *owner_ptr, INVENTORY_IDX item)
53 {
54     object_type *o_ptr = &owner_ptr->inventory_list[item];
55     GAME_TEXT o_name[MAX_NLEN];
56     describe_flavor(owner_ptr, o_name, o_ptr, 0);
57 #ifdef JP
58     if (o_ptr->number <= 0) {
59         msg_format("もう%sを持っていない。", o_name);
60     } else {
61         msg_format("まだ %sを持っている。", o_name);
62     }
63 #else
64     msg_format("You have %s.", o_name);
65 #endif
66 }
67
68 /*!
69  * @brief 現在アクティブになっているウィンドウにオブジェクトの詳細を表示する /
70  * Hack -- display an object kind in the current window
71  * @param owner_ptr プレーヤーへの参照ポインタ
72  * @param k_idx ベースアイテムの参照ID
73  * @details
74  * Include list of usable spells for readible books
75  */
76 void display_koff(player_type *owner_ptr, KIND_OBJECT_IDX k_idx)
77 {
78     object_type forge;
79     object_type *q_ptr;
80     int sval;
81     REALM_IDX use_realm;
82     GAME_TEXT o_name[MAX_NLEN];
83     for (int y = 0; y < Term->hgt; y++) {
84         term_erase(0, y, 255);
85     }
86
87     if (!k_idx)
88         return;
89     q_ptr = &forge;
90
91     object_prep(owner_ptr, q_ptr, k_idx);
92     describe_flavor(owner_ptr, o_name, q_ptr, (OD_OMIT_PREFIX | OD_NAME_ONLY | OD_STORE));
93
94     term_putstr(0, 0, -1, TERM_WHITE, o_name);
95     sval = q_ptr->sval;
96     use_realm = tval2realm(q_ptr->tval);
97
98     if (owner_ptr->realm1 || owner_ptr->realm2) {
99         if ((use_realm != owner_ptr->realm1) && (use_realm != owner_ptr->realm2))
100             return;
101     } else {
102         if ((owner_ptr->pclass != CLASS_SORCERER) && (owner_ptr->pclass != CLASS_RED_MAGE))
103             return;
104         if (!is_magic(use_realm))
105             return;
106         if ((owner_ptr->pclass == CLASS_RED_MAGE) && (use_realm != REALM_ARCANE) && (sval > 1))
107             return;
108     }
109
110     int num = 0;
111     SPELL_IDX spells[64];
112
113     for (int spell = 0; spell < 32; spell++) {
114         if (fake_spell_flags[sval] & (1UL << spell)) {
115             spells[num++] = spell;
116         }
117     }
118
119     print_spells(owner_ptr, 0, spells, num, 2, 0, use_realm);
120 }