OSDN Git Service

Merge branch 'master' of git.osdn.net:/gitroot/hengband/hengband
[hengband/hengband.git] / src / object / object-flags.c
1 #include "object/object-flags.h"
2 #include "cmd-item/cmd-smith.h" // todo 相互参照している.
3 #include "mind/mind-weaponsmith.h"
4 #include "object-enchant/object-ego.h"
5 #include "object-enchant/tr-types.h"
6 #include "object-hook/hook-enchant.h"
7 #include "object/object-kind.h"
8 #include "perception/object-perception.h"
9 #include "sv-definition/sv-lite-types.h"
10 #include "system/artifact-type-definition.h"
11 #include "util/bit-flags-calculator.h"
12
13 /*!
14  * @brief オブジェクトのフラグ類を配列に与える
15  * Obtain the "flags" for an item
16  * @param o_ptr フラグ取得元のオブジェクト構造体ポインタ
17  * @param flgs フラグ情報を受け取る配列
18  * @return なし
19  */
20 void object_flags(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
21 {
22     object_kind *k_ptr = &k_info[o_ptr->k_idx];
23
24     /* Base object */
25     for (int i = 0; i < TR_FLAG_SIZE; i++) {
26         flgs[i] = k_ptr->flags[i];
27     }
28
29     if (object_is_fixed_artifact(o_ptr)) {
30         artifact_type *a_ptr = &a_info[o_ptr->name1];
31         for (int i = 0; i < TR_FLAG_SIZE; i++) {
32             flgs[i] = a_ptr->flags[i];
33         }
34     }
35
36     if (object_is_ego(o_ptr)) {
37         ego_item_type *e_ptr = &e_info[o_ptr->name2];
38         for (int i = 0; i < TR_FLAG_SIZE; i++) {
39             flgs[i] |= e_ptr->flags[i];
40         }
41
42         if ((o_ptr->name2 == EGO_LITE_AURA_FIRE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN)) {
43             remove_flag(flgs, TR_SH_FIRE);
44         } else if ((o_ptr->name2 == EGO_LITE_INFRA) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN)) {
45             remove_flag(flgs, TR_INFRA);
46         } else if ((o_ptr->name2 == EGO_LITE_EYE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN)) {
47             remove_flag(flgs, TR_RES_BLIND);
48             remove_flag(flgs, TR_SEE_INVIS);
49         }
50     }
51
52     /* Random artifact ! */
53     for (int i = 0; i < TR_FLAG_SIZE; i++) {
54         flgs[i] |= o_ptr->art_flags[i];
55     }
56
57     if (object_is_smith(player_ptr, o_ptr)) {
58         int add = o_ptr->xtra3 - 1;
59         if (add < TR_FLAG_MAX) {
60             add_flag(flgs, add);
61         } else if (add == ESSENCE_TMP_RES_ACID) {
62             add_flag(flgs, TR_RES_ACID);
63             add_flag(flgs, TR_ACTIVATE);
64         } else if (add == ESSENCE_TMP_RES_ELEC) {
65             add_flag(flgs, TR_RES_ELEC);
66             add_flag(flgs, TR_ACTIVATE);
67         } else if (add == ESSENCE_TMP_RES_FIRE) {
68             add_flag(flgs, TR_RES_FIRE);
69             add_flag(flgs, TR_ACTIVATE);
70         } else if (add == ESSENCE_TMP_RES_COLD) {
71             add_flag(flgs, TR_RES_COLD);
72             add_flag(flgs, TR_ACTIVATE);
73         } else if (add == ESSENCE_SH_FIRE) {
74             add_flag(flgs, TR_RES_FIRE);
75             add_flag(flgs, TR_SH_FIRE);
76         } else if (add == ESSENCE_SH_ELEC) {
77             add_flag(flgs, TR_RES_ELEC);
78             add_flag(flgs, TR_SH_ELEC);
79         } else if (add == ESSENCE_SH_COLD) {
80             add_flag(flgs, TR_RES_COLD);
81             add_flag(flgs, TR_SH_COLD);
82         } else if (add == ESSENCE_RESISTANCE) {
83             add_flag(flgs, TR_RES_ACID);
84             add_flag(flgs, TR_RES_ELEC);
85             add_flag(flgs, TR_RES_FIRE);
86             add_flag(flgs, TR_RES_COLD);
87         } else if (add == TR_IMPACT) {
88             add_flag(flgs, TR_ACTIVATE);
89         }
90     }
91 }
92
93 /*!
94  * @brief オブジェクトの明示されているフラグ類を取得する
95  * Obtain the "flags" for an item which are known to the player
96  * @param o_ptr フラグ取得元のオブジェクト構造体ポインタ
97  * @param flgs フラグ情報を受け取る配列
98  * @return なし
99  */
100 void object_flags_known(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
101 {
102     bool spoil = FALSE;
103     object_kind *k_ptr = &k_info[o_ptr->k_idx];
104     for (int i = 0; i < TR_FLAG_SIZE; i++) {
105         flgs[i] = 0;
106     }
107
108     if (!object_is_aware(o_ptr))
109         return;
110
111     /* Base object */
112     for (int i = 0; i < TR_FLAG_SIZE; i++) {
113         flgs[i] = k_ptr->flags[i];
114     }
115
116     if (!object_is_known(o_ptr))
117         return;
118
119     if (object_is_ego(o_ptr)) {
120         ego_item_type *e_ptr = &e_info[o_ptr->name2];
121         for (int i = 0; i < TR_FLAG_SIZE; i++) {
122             flgs[i] |= e_ptr->flags[i];
123         }
124
125         if ((o_ptr->name2 == EGO_LITE_AURA_FIRE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN)) {
126             remove_flag(flgs, TR_SH_FIRE);
127         } else if ((o_ptr->name2 == EGO_LITE_INFRA) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN)) {
128             remove_flag(flgs, TR_INFRA);
129         } else if ((o_ptr->name2 == EGO_LITE_EYE) && !o_ptr->xtra4 && (o_ptr->sval <= SV_LITE_LANTERN)) {
130             remove_flag(flgs, TR_RES_BLIND);
131             remove_flag(flgs, TR_SEE_INVIS);
132         }
133     }
134
135     if (spoil || object_is_fully_known(o_ptr)) {
136         if (object_is_fixed_artifact(o_ptr)) {
137             artifact_type *a_ptr = &a_info[o_ptr->name1];
138
139             for (int i = 0; i < TR_FLAG_SIZE; i++) {
140                 flgs[i] = a_ptr->flags[i];
141             }
142         }
143
144         /* Random artifact ! */
145         for (int i = 0; i < TR_FLAG_SIZE; i++) {
146             flgs[i] |= o_ptr->art_flags[i];
147         }
148     }
149
150     if (!object_is_smith(player_ptr, o_ptr))
151         return;
152
153     int add = o_ptr->xtra3 - 1;
154     if (add < TR_FLAG_MAX) {
155         add_flag(flgs, add);
156     } else if (add == ESSENCE_TMP_RES_ACID) {
157         add_flag(flgs, TR_RES_ACID);
158     } else if (add == ESSENCE_TMP_RES_ELEC) {
159         add_flag(flgs, TR_RES_ELEC);
160     } else if (add == ESSENCE_TMP_RES_FIRE) {
161         add_flag(flgs, TR_RES_FIRE);
162     } else if (add == ESSENCE_TMP_RES_COLD) {
163         add_flag(flgs, TR_RES_COLD);
164     } else if (add == ESSENCE_SH_FIRE) {
165         add_flag(flgs, TR_RES_FIRE);
166         add_flag(flgs, TR_SH_FIRE);
167     } else if (add == ESSENCE_SH_ELEC) {
168         add_flag(flgs, TR_RES_ELEC);
169         add_flag(flgs, TR_SH_ELEC);
170     } else if (add == ESSENCE_SH_COLD) {
171         add_flag(flgs, TR_RES_COLD);
172         add_flag(flgs, TR_SH_COLD);
173     } else if (add == ESSENCE_RESISTANCE) {
174         add_flag(flgs, TR_RES_ACID);
175         add_flag(flgs, TR_RES_ELEC);
176         add_flag(flgs, TR_RES_FIRE);
177         add_flag(flgs, TR_RES_COLD);
178     }
179 }