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"
14 * @brief オブジェクトのフラグ類を配列に与える
15 * Obtain the "flags" for an item
16 * @param o_ptr フラグ取得元のオブジェクト構造体ポインタ
17 * @param flgs フラグ情報を受け取る配列
20 void object_flags(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
22 object_kind *k_ptr = &k_info[o_ptr->k_idx];
25 for (int i = 0; i < TR_FLAG_SIZE; i++) {
26 flgs[i] = k_ptr->flags[i];
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];
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];
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);
52 /* Random artifact ! */
53 for (int i = 0; i < TR_FLAG_SIZE; i++) {
54 flgs[i] |= o_ptr->art_flags[i];
57 if (object_is_smith(player_ptr, o_ptr)) {
58 int add = o_ptr->xtra3 - 1;
59 if (add < TR_FLAG_MAX) {
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);
94 * @brief オブジェクトの明示されているフラグ類を取得する
95 * Obtain the "flags" for an item which are known to the player
96 * @param o_ptr フラグ取得元のオブジェクト構造体ポインタ
97 * @param flgs フラグ情報を受け取る配列
100 void object_flags_known(player_type *player_ptr, object_type *o_ptr, BIT_FLAGS flgs[TR_FLAG_SIZE])
103 object_kind *k_ptr = &k_info[o_ptr->k_idx];
104 for (int i = 0; i < TR_FLAG_SIZE; i++) {
108 if (!object_is_aware(o_ptr))
112 for (int i = 0; i < TR_FLAG_SIZE; i++) {
113 flgs[i] = k_ptr->flags[i];
116 if (!object_is_known(o_ptr))
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];
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);
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];
139 for (int i = 0; i < TR_FLAG_SIZE; i++) {
140 flgs[i] = a_ptr->flags[i];
144 /* Random artifact ! */
145 for (int i = 0; i < TR_FLAG_SIZE; i++) {
146 flgs[i] |= o_ptr->art_flags[i];
150 if (!object_is_smith(player_ptr, o_ptr))
153 int add = o_ptr->xtra3 - 1;
154 if (add < TR_FLAG_MAX) {
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);