OSDN Git Service

Since struct dirent only holds the last element in the path, build the full path...
[hengband/hengband.git] / src / artifact / random-art-pval-investor.c
1 /*!
2  * @brief ランダムアーティファクトにpvalを追加する処理
3  * @date 2020/07/14
4  * @author Hourier
5  */
6
7 #include "artifact/random-art-pval-investor.h"
8 #include "artifact/random-art-bias-types.h"
9 #include "object-enchant/tr-types.h"
10 #include "object-hook/hook-weapon.h"
11 #include "sv-definition/sv-armor-types.h"
12 #include "system/object-type-definition.h"
13 #include "util/bit-flags-calculator.h"
14
15 static bool random_art_bias_strength(object_type *o_ptr)
16 {
17     if (has_flag(o_ptr->art_flags, TR_STR))
18         return FALSE;
19
20     add_flag(o_ptr->art_flags, TR_STR);
21     return one_in_(2);
22 }
23
24 static bool random_art_bias_intelligence(object_type *o_ptr)
25 {
26     if (has_flag(o_ptr->art_flags, TR_INT))
27         return FALSE;
28
29     add_flag(o_ptr->art_flags, TR_INT);
30     return one_in_(2);
31 }
32
33 static bool random_art_bias_wisdom(object_type *o_ptr)
34 {
35     if (has_flag(o_ptr->art_flags, TR_WIS))
36         return FALSE;
37
38     add_flag(o_ptr->art_flags, TR_WIS);
39     return one_in_(2);
40 }
41
42 static bool random_art_bias_dexterity(object_type *o_ptr)
43 {
44     if (has_flag(o_ptr->art_flags, TR_DEX))
45         return FALSE;
46
47     add_flag(o_ptr->art_flags, TR_DEX);
48     return one_in_(2);
49 }
50
51 static bool random_art_bias_constitution(object_type *o_ptr)
52 {
53     if (has_flag(o_ptr->art_flags, TR_CON))
54         return FALSE;
55
56     add_flag(o_ptr->art_flags, TR_CON);
57     return one_in_(2);
58 }
59
60 static bool random_art_bias_charisma(object_type *o_ptr)
61 {
62     if (has_flag(o_ptr->art_flags, TR_CHR))
63         return FALSE;
64
65     add_flag(o_ptr->art_flags, TR_CHR);
66     return one_in_(2);
67 }
68
69 static bool random_art_bias_magic_mastery(object_type *o_ptr)
70 {
71     if ((o_ptr->tval != TV_GLOVES) || has_flag(o_ptr->art_flags, TR_MAGIC_MASTERY))
72         return FALSE;
73
74     add_flag(o_ptr->art_flags, TR_MAGIC_MASTERY);
75     return one_in_(2);
76 }
77
78 static bool random_art_bias_stealth(object_type *o_ptr)
79 {
80     if (has_flag(o_ptr->art_flags, TR_STEALTH))
81         return FALSE;
82
83     add_flag(o_ptr->art_flags, TR_STEALTH);
84     return one_in_(2);
85 }
86
87 static bool random_art_bias_search(object_type *o_ptr)
88 {
89     if (has_flag(o_ptr->art_flags, TR_SEARCH))
90         return FALSE;
91
92     add_flag(o_ptr->art_flags, TR_SEARCH);
93     return one_in_(2);
94 }
95
96 static bool switch_random_art_bias(object_type *o_ptr)
97 {
98     switch (o_ptr->artifact_bias) {
99     case BIAS_WARRIOR:
100         return random_art_bias_strength(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_dexterity(o_ptr);
101     case BIAS_MAGE:
102         return random_art_bias_intelligence(o_ptr) || random_art_bias_magic_mastery(o_ptr);
103     case BIAS_RANGER:
104         return random_art_bias_dexterity(o_ptr) || random_art_bias_constitution(o_ptr) || random_art_bias_strength(o_ptr);
105     case BIAS_ROGUE:
106         return random_art_bias_stealth(o_ptr) || random_art_bias_search(o_ptr);
107     case BIAS_STR:
108         return random_art_bias_strength(o_ptr);
109     case BIAS_INT:
110         return random_art_bias_intelligence(o_ptr);
111     case BIAS_PRIESTLY:
112     case BIAS_WIS:
113         return random_art_bias_wisdom(o_ptr);
114     case BIAS_DEX:
115         return random_art_bias_dexterity(o_ptr);
116     case BIAS_CON:
117         return random_art_bias_constitution(o_ptr);
118     case BIAS_CHR:
119         return random_art_bias_charisma(o_ptr);
120     default:
121         return FALSE;
122     }
123 }
124
125 static bool random_art_bias_decrease_mana(object_type *o_ptr)
126 {
127     if (((o_ptr->artifact_bias != BIAS_MAGE) && (o_ptr->artifact_bias != BIAS_PRIESTLY)) || (o_ptr->tval != TV_SOFT_ARMOR) || (o_ptr->sval != SV_ROBE)
128         || has_flag(o_ptr->art_flags, TR_DEC_MANA) || !one_in_(3))
129         return FALSE;
130
131     add_flag(o_ptr->art_flags, TR_DEC_MANA);
132     return one_in_(2);
133 }
134
135 /*!
136  * @brief ランダムアーティファクト生成中、対象のオブジェクトにpval能力を付加する。/ Add one pval on generation of randam artifact.
137  * @details 優先的に付加されるpvalがランダムアーティファクトバイアスに依存して存在する。
138  * 原則的候補は腕力、知力、賢さ、器用さ、耐久、魅力、探索、隠密、赤外線視力、加速。武器のみ採掘、追加攻撃も候補に入る。
139  * @attention オブジェクトのtval、svalに依存したハードコーディング処理がある。
140  * @param o_ptr 対象のオブジェクト構造体ポインタ
141  * @return なし
142  */
143 void random_plus(object_type *o_ptr)
144 {
145     if (switch_random_art_bias(o_ptr) || random_art_bias_decrease_mana(o_ptr))
146         return;
147
148     int this_type = object_is_weapon_ammo(o_ptr) ? 23 : 19;
149     switch (randint1(this_type)) {
150     case 1:
151     case 2:
152         add_flag(o_ptr->art_flags, TR_STR);
153         if (!o_ptr->artifact_bias && !one_in_(13))
154             o_ptr->artifact_bias = BIAS_STR;
155         else if (!o_ptr->artifact_bias && one_in_(7))
156             o_ptr->artifact_bias = BIAS_WARRIOR;
157
158         break;
159     case 3:
160     case 4:
161         add_flag(o_ptr->art_flags, TR_INT);
162         if (!o_ptr->artifact_bias && !one_in_(13))
163             o_ptr->artifact_bias = BIAS_INT;
164         else if (!o_ptr->artifact_bias && one_in_(7))
165             o_ptr->artifact_bias = BIAS_MAGE;
166
167         break;
168     case 5:
169     case 6:
170         add_flag(o_ptr->art_flags, TR_WIS);
171         if (!o_ptr->artifact_bias && !one_in_(13))
172             o_ptr->artifact_bias = BIAS_WIS;
173         else if (!o_ptr->artifact_bias && one_in_(7))
174             o_ptr->artifact_bias = BIAS_PRIESTLY;
175
176         break;
177     case 7:
178     case 8:
179         add_flag(o_ptr->art_flags, TR_DEX);
180         if (!o_ptr->artifact_bias && !one_in_(13))
181             o_ptr->artifact_bias = BIAS_DEX;
182         else if (!o_ptr->artifact_bias && one_in_(7))
183             o_ptr->artifact_bias = BIAS_ROGUE;
184
185         break;
186     case 9:
187     case 10:
188         add_flag(o_ptr->art_flags, TR_CON);
189         if (!o_ptr->artifact_bias && !one_in_(13))
190             o_ptr->artifact_bias = BIAS_CON;
191         else if (!o_ptr->artifact_bias && one_in_(9))
192             o_ptr->artifact_bias = BIAS_RANGER;
193
194         break;
195     case 11:
196     case 12:
197         add_flag(o_ptr->art_flags, TR_CHR);
198         if (!o_ptr->artifact_bias && !one_in_(13))
199             o_ptr->artifact_bias = BIAS_CHR;
200
201         break;
202     case 13:
203     case 14:
204         add_flag(o_ptr->art_flags, TR_STEALTH);
205         if (!o_ptr->artifact_bias && one_in_(3))
206             o_ptr->artifact_bias = BIAS_ROGUE;
207
208         break;
209     case 15:
210     case 16:
211         add_flag(o_ptr->art_flags, TR_SEARCH);
212         if (!o_ptr->artifact_bias && one_in_(9))
213             o_ptr->artifact_bias = BIAS_RANGER;
214
215         break;
216     case 17:
217     case 18:
218         add_flag(o_ptr->art_flags, TR_INFRA);
219         break;
220     case 19:
221         add_flag(o_ptr->art_flags, TR_SPEED);
222         if (!o_ptr->artifact_bias && one_in_(11))
223             o_ptr->artifact_bias = BIAS_ROGUE;
224
225         break;
226     case 20:
227     case 21:
228         add_flag(o_ptr->art_flags, TR_TUNNEL);
229         break;
230     case 22:
231     case 23:
232         if (o_ptr->tval == TV_BOW) {
233             random_plus(o_ptr);
234             break;
235         }
236
237         add_flag(o_ptr->art_flags, TR_BLOWS);
238         if (!o_ptr->artifact_bias && one_in_(11))
239             o_ptr->artifact_bias = BIAS_WARRIOR;
240
241         break;
242     }
243 }